Part I: The ROS 2 stack · §6 of 43

On zeus: use openarm_launch.sh

bash /root/scripts/openarm_launch.sh real    # real robot
bash /root/scripts/openarm_launch.sh sim     # simulation (mock hardware)

It runs the bringup launch below with zeus’s fixed settings, so they’re never typed by hand:

  • real: arm_type:=v10 use_fake_hardware:=false left_can_interface:=can0 right_can_interface:=can1 can_fd:=true. zeus’s cables are the reverse of the ROS defaults (§22); a launch typed without these arguments on 2026-10-10 sent the right arm’s motions to the left arm (log).
  • Refuses to start if a launch is already running, or (for real) if can0/can1 aren’t up.
  • Saves the output to /root/launch_<mode>_<date>.log with tee -i.
  • For real, reminds you to power the arms first and prints the identification step (§12.2).

Stop the real robot with bash /root/scripts/openarm_stop.sh, not Ctrl+C (§12.4). The MoveIt demo isn’t covered by the wrapper yet: on the real robot it needs the same CAN arguments.

openarm_bringup/launch/openarm.bimanual.launch.py: robot only

Starts robot_state_publisher, ros2_control_node (controller manager), RViz (openarm_description/rviz/bimanual.rviz), and after 1 s the spawners for joint_state_broadcaster, both arm controllers and both gripper controllers.

ArgumentDefaultNotes
arm_typeopenarm_v2.0Use v10.
use_fake_hardwaretruefalse = real motors via CAN.
robot_controllerjoint_trajectory_controlleror forward_position_controller.
right_can_interfacecan0zeus: can1 (cabling reversed, §22)
left_can_interfacecan1zeus: can0
can_fdtruefalse = classic CAN 2.0 (must match how the motors are configured).
arm_prefix""Puts everything under a namespace and switches to openarm_bimanual_controllers_namespaced.yaml. That file doesn’t exist on main, so leave this empty.
controllers_fileopenarm_bimanual_controllers.yaml
runtime_config_packageopenarm_bringup
description_packageopenarm_description
description_filev20.urdf.xacroIgnored.

openarm_bimanual_moveit_config/launch/demo.launch.py: robot + MoveIt

Starts everything above (its own robot_state_publisher and controller manager, at 100 Hz) plus move_group and RViz with the MotionPlanning panel. Same arguments (arm_type, use_fake_hardware, can_fd, CAN interfaces, robot_controller).

Run one or the other, never both at once. Each starts its own controller manager, and two /controller_manager nodes conflict.

Other launch files in the MoveIt package (move_group.launch.py, moveit_rviz.launch.py, spawn_controllers.launch.py, static_virtual_joint_tfs.launch.py, setup_assistant.launch.py) are MoveIt Setup Assistant boilerplate and not needed for normal use.