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

ros2 launch openarm_bimanual_moveit_config demo.launch.py arm_type:=v10                         # sim
ros2 launch openarm_bimanual_moveit_config demo.launch.py arm_type:=v10 use_fake_hardware:=false # real

Planning groups (SRDF config/openarm_v1.0/openarm_bimanual.srdf):

GroupJointsNamed states
left_armopenarm_left_joint1…7home (all 0), hands_up (joint4 = 2.0)
right_armopenarm_right_joint1…7home, hands_up
left_gripperopenarm_left_finger_joint1closed (0), half closed (0.022)
right_gripperopenarm_right_finger_joint1closed, half_closed
  • IK: KDL (kdl_kinematics_plugin), 5 ms timeout. Planner: OMPL.
  • Execution goes to left/right_joint_trajectory_controller via follow_joint_trajectory.

Using RViz:

  1. In the MotionPlanning panel → Planning tab, choose Planning Group (left_arm / right_arm).
  2. Drag the interactive marker (or choose a named Goal State, e.g. hands_up).
  3. Plan, check the ghost trajectory, then Execute (or Plan & Execute).
  4. In the Planning tab, lower Velocity Scaling and Acceleration Scaling (e.g. 0.1) before executing on the real robot.

Programmatic access:

  • Action /move_action (moveit_msgs/action/MoveGroup) to plan and execute.
  • Action /execute_trajectory to execute an already-planned trajectory.
  • From C++, use moveit::planning_interface::MoveGroupInterface. From Python, use moveit_py (package ros-jazzy-moveit-py, needs its own config/launch).

Gripper caveat: MoveIt is configured to drive the grippers as GripperCommand controllers on /left_gripper_controller/gripper_cmd, but the gripper controllers are JointTrajectoryControllers, which only serve follow_joint_trajectory. Arm planning works, but executing a plan for a gripper group from MoveIt will fail. Command the grippers as in §8.1, or change the gripper entries in config/openarm_v1.0/moveit_controllers.yaml to type: FollowJointTrajectory with action_ns: follow_joint_trajectory, then rebuild.