Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/qualcomm-qrb-ros/qrb_ros_simulation/llms.txt

Use this file to discover all available pages before exploring further.

The RML-63 is a 6-DOF robotic arm with an attached gripper, simulated in Gazebo via the qrb_ros_sim_gazebo package. It is controlled through the ros2_control stack, which exposes a JointTrajectoryController for the arm and a separate controller for the gripper. Launching the arm is a two-step process: you start Gazebo first, then load the controllers once the simulation is running.

Launch the simulation

1

Launch Gazebo with the RML-63 arm

In your first terminal, source your install overlay and launch the arm:
source ~/qrb_ros_simulation_ws/install/local_setup.sh
ros2 launch qrb_ros_sim_gazebo gazebo_rml_63_gripper.launch.py
Gazebo opens and spawns the arm in the default warehouse world. The robot state publisher starts immediately and begins publishing /robot_description, /tf, and /tf_static.
2

Press Play in Gazebo

Click the Play button in the Gazebo toolbar. The simulation clock starts and the ros2_control controller manager becomes reachable. Do not proceed to the next step until you have pressed Play.
The controller manager is not active until the simulation is running. Loading controllers before pressing Play will fail with a timeout error.
3

Load the arm and gripper controllers

Open a new terminal, source the install overlay, and run the controller loader launch file:
source ~/qrb_ros_simulation_ws/install/local_setup.sh
ros2 launch qrb_ros_sim_gazebo gazebo_rml_63_gripper_load_controller.launch.py
This spawns three controllers in sequence:
  • joint_state_broadcaster — broadcasts joint positions and velocities to /joint_states.
  • rm_group_controller — a JointTrajectoryController for joints 1–6 of the arm.
  • hand_controller — a JointTrajectoryController for the four gripper joints.

Sending arm commands

Once the controllers are loaded, send joint trajectory goals to the arm using the FollowJointTrajectory action:
/rm_group_controller/follow_joint_trajectory
The action type is control_msgs/action/FollowJointTrajectory. The arm controller accepts position commands for six joints (joint1 through joint6). The gripper controller accepts position commands for joints joint01, joint11, joint02, and joint22.

ROS topics

TopicTypeDescription
/joint_statessensor_msgs/msg/JointStateCurrent position and velocity of all joints
/robot_descriptionstd_msgs/msg/StringURDF model published by robot_state_publisher
/tftf2_msgs/msg/TFMessageReal-time coordinate frame transforms
/tf_statictf2_msgs/msg/TFMessageStatic coordinate frame transforms
/clockrosgraph_msgs/msg/ClockSimulation time
/camera/color/image_rawsensor_msgs/msg/ImageRGB camera image stream
/camera/color/camera_infosensor_msgs/msg/CameraInfoRGB camera intrinsic parameters
/camera/depth/image_rawsensor_msgs/msg/ImageDepth image stream
/camera/depth/camera_infosensor_msgs/msg/CameraInfoDepth camera intrinsic parameters
/camera/depth/pointssensor_msgs/msg/PointCloud23D point cloud from depth camera
The RML-63 arm is also available as part of the Mobile Manipulator model, which mounts the arm on an AMR base. See Mobile Manipulator for details.

Build docs developers (and LLMs) love