Skip to content

ROS 2 Topic Reference

Complete reference of the ROS 2 topics exposed by the robot's onboard software over CycloneDDS.

There is no separate driver node to run. The core software (Network / DdsBridge) speaks ROS 2-compatible DDS directly, so ros2 topic, rviz2, and rqt interoperate with the robot without launching any bridge process. (The legacy rbq_driver node and start_ros_driver.bash are removed — the script is now a deprecated no-op.)

  • Pub — robot publishes, your node subscribes
  • Sub — your node publishes, robot subscribes

Custom message types (rbq_msgs/*, api/*) require sourcing the built workspace:

bash
source rbq_sdk/ros2/install/setup.bash

Topics whose name contains a token starting with _ (e.g. /rbq/_sim, /rbq/_user_command, /rbq/ref/motion/_0) are hiddenros2 topic list shows them only with --include-hidden-topics.

Publish rateNetwork/DdsBridge republishes every Pub state topic in one ~500 Hz loop, so the Hz below is that publish rate (measured with ros2 topic hz), not the underlying sensor/value update rate.


Motion Commands

/rbq/cmd/auto_start

FieldValue
Typestd_msgs/Bool
DirectionSub
DescriptionFull initialization sequence: CAN check → Find Home → Control Start. Robot must be in the correct initial pose. Monitor progress via /rbq/robot_status (can_check, find_home, con_start flags).

/rbq/cmd/switch_gait

FieldValue
Typestd_msgs/Int8
DirectionSub
DescriptionSwitch to the target gait by gait_id. See Gait State Reference below.

/rbq/cmd/switch_control_mode

FieldValue
Typestd_msgs/Bool
DirectionSub
Descriptiontrue → HighLevel Command mode (accepts /rbq/cmd/high_level). false → Joystick mode (default).

/rbq/cmd/emergency

FieldValue
Typestd_msgs/Bool
DirectionSub
DescriptionImmediately set all joints to high-damping mode. Robot collapses instantly. Sit the robot down first if testing.

/rbq/cmd/dock

FieldValue
Typestd_msgs/Int8MultiArray
DirectionSub
DescriptionStart the auto-docking sequence. data[0]: walk mode — 0 = wave (default), 1 = trot. data[1]: vision mode — 0 = blind (default), 1 = vision height feedback (trot only). Robot must be in Standing mode and the rear camera must see the ArUco marker (≤ 5 m). Monitor via robot_status.docking_state.

/rbq/ref/payload_params

FieldValue
Typestd_msgs/Float64MultiArray
DirectionSub
DescriptionSet external payload parameters for CoM compensation. data: [mass_kg, com_x, com_y, com_z] (meters). Used when carrying additional loads.

Gait State Reference

One gait enum is used in both directions: send it on HighLevelCommand.gait_state (also used by switch_gait), and read the same value back on robot_status.gait_id.

gait_idNameDescription
-2Fall ModeTriggered by unexpected loss of balance
-1Control OffAll actuators disabled
0SittingLow posture, resting on ground
1StandingNeutral posture, ready to walk
2Aim ModeAiming posture for targeting
3Walk (Trot)Walking trot gait
4StairsStair-adaptive gait (uses camera)
5WaveWalking wave gait
6RunHigh-speed gait (if supported)
30RL TrotReinforcement Learning trot
31RL Front WalkRL forward walking
33RL Left WalkRL left-side walking
34RL Right WalkRL right-side walking
35RL BoundRL bounding gait
36RL PaceRL pace gait
37RL PronkRL pronk gait
3841RL 3-LegRL 3-legged gaits (HR, HL, FR, FL)
42RL Trot VisionRL trot with vision integration
45RL Trot RunRL high-speed trot
46RL SilentRL silent gait
47RL StairsRL stair gait
Gait state transition diagram

High-Level Control

/rbq/cmd/high_level

FieldValue
Typerbq_msgs/HighLevelCommand
DirectionSub
DescriptionVelocity and posture command. Behavior and valid ranges depend on the current gait. Requires HighLevel mode (switch_control_mode: true).

Fields:

FieldTypeUnitDescription
headerstd_msgs/HeaderROS header with timestamp
identifierstringOptional label for logging/tracking
rollfloat32degBody roll. Standing [-25, +25]
pitchfloat32degBody pitch. Standing [-20, +20], Walk (body tilt angle), RL Walk [-25, +25]
yawfloat32degBody yaw twist. Standing [-25, +25]
vel_xfloat32m/sForward speed. Walk [-1.0, +1.2] / Run [-1.0, +1.8] / RL Trot [-1.5, +2.0] / RL Walk [-1.5, +2.5] / Stairs [-1.0, +1.0]
vel_yfloat32m/sLateral speed. Walk [-0.4, +0.4] / Run [-0.6, +0.6] / RL Trot [-1.0, +1.0] / RL Walk [-1.0, +1.0] / Stairs [-0.4, +0.4]
omega_zfloat32deg/sYaw rate. Walk [-75, +75] / Stairs [-17, +17] / Wave [-20, +20] / RL Walk [-86, +86]
delta_body_hfloat32mBody height offset from default. Standing/Walk [-0.15, +0.05] / RL Walk [-0.25, +0.10]
delta_foot_hfloat32mSwing foot lift offset. [-0.06, +0.04]
gait_stateint8Target gait ID (see Gait State Reference)
gait_transitionbooltrue = transition to gait_state first, then apply command

Example commands:

bash
# Walk forward at 0.5 m/s (gait_state: 3 = Walk/Trot)
ros2 topic pub --once /rbq/cmd/high_level rbq_msgs/msg/HighLevelCommand \
'{header: {stamp: {sec: 0, nanosec: 0}, frame_id: "base"},
  identifier: "walk_fwd", roll: 0.0, pitch: 0.0, yaw: 0.0,
  vel_x: 0.5, vel_y: 0.0, omega_z: 0.0,
  delta_body_h: 0.0, delta_foot_h: 0.0,
  gait_state: 3, gait_transition: false}'

# Rotate in place at 30°/s
ros2 topic pub --once /rbq/cmd/high_level rbq_msgs/msg/HighLevelCommand \
'{header: {stamp: {sec: 0, nanosec: 0}, frame_id: "base"},
  identifier: "turn", roll: 0.0, pitch: 0.0, yaw: 0.0,
  vel_x: 0.0, vel_y: 0.0, omega_z: 30.0,
  delta_body_h: 0.0, delta_foot_h: 0.0,
  gait_state: 3, gait_transition: false}'

# Stop (zero velocity)
ros2 topic pub --once /rbq/cmd/high_level rbq_msgs/msg/HighLevelCommand \
'{header: {stamp: {sec: 0, nanosec: 0}, frame_id: "base"},
  identifier: "stop", roll: 0.0, pitch: 0.0, yaw: 0.0,
  vel_x: 0.0, vel_y: 0.0, omega_z: 0.0,
  delta_body_h: 0.0, delta_foot_h: 0.0,
  gait_state: 3, gait_transition: false}'

# Custom standing posture (roll: 15°, pitch: 30°, yaw: 20°)
ros2 topic pub --once /rbq/cmd/high_level rbq_msgs/msg/HighLevelCommand \
'{header: {stamp: {sec: 0, nanosec: 0}, frame_id: "base"},
  identifier: "standing_pose", roll: 15.0, pitch: 30.0, yaw: 20.0,
  vel_x: 0.0, vel_y: 0.0, omega_z: 0.0,
  delta_body_h: 0.0, delta_foot_h: 0.0,
  gait_state: 1, gait_transition: true}'

/rbq/cmd/navigate_to

FieldValue
Typegeometry_msgs/Pose2D
DirectionSub
DescriptionMove to an absolute world-frame pose. x, y set the target position in meters; theta sets the target yaw in radians. Available in Standing and Wave modes.

/rbq/cmd/target_go

FieldValue
Typerbq_msgs/TargetGo
DirectionSub
DescriptionRelative "go to target" navigation command (gait, mode, x/y/theta, offsets, and slow/wide/vision flags). See the Target-Go example.

Robot Status

/rbq/robot_status

FieldValue
Typerbq_msgs/RobotStatus
DirectionPub
Hz500
DescriptionOverall robot status flags, gait state, and docking progress.

Fields:

FieldTypeDescription
headerstd_msgs/HeaderROS header
con_startboolMotor control enabled
ready_posboolRobot is in ready position
ground_posboolRobot is in ground/sitting position
force_conboolForce control mode active
ext_joyboolExternal joystick connected
is_standingboolRobot is physically standing
can_checkboolCAN communication verified
find_homeboolEncoder homing complete
gait_idint8Current gait. See Gait State Reference.
is_fallboolFall detected
docking_stateint8Docking progress (see table below)
imu_successboolIMU connected and operational

Docking State Values:

ValueConstantDescription
-6DOCKING_MAX_FAIL_CNT_REACHEDMax retry count (10×) reached — aborted
-5DOCKING_MARKER_POS_INVALID_ROTATIONMarker rotation > ±40° — aborted
-4DOCKING_MARKER_POS_INVALID_TOO_FARMarker > 5 m — aborted
-3DOCKING_MARKER_POS_INVALID_WRONG_DIRMarker detected on front side — aborted
-2DOCKING_MARKER_NOT_FOUNDMarker not found — aborted
-1DOCKING_FAILEDDocking failed — auto retry
0DOCKING_OPERATION_MODENormal operation (not docking)
1DOCKING_APPROACH_OFFSETStage 1: offset approach
2DOCKING_APPROACHStage 2: direct approach
3DOCKING_APPROACH_WIDEStage 3: wide-stance approach
4DOCKING_SIT_DOWNSitting down to connect
5DOCKING_SUCCESSDocked — charger physically connected
6DOCKING_SUCCESS_CHARGINGDocked and charging
7DOCKING_SUCCESS_NO_CHARGINGDocked but not charging

/rbq/system_log

FieldValue
Typerbq_msgs/SystemLog
DirectionPub
DescriptionRobot-side log stream. Fields: header, string log_level, string log_msg.

State Estimation

/rbq/odometry

FieldValue
Typenav_msgs/Odometry
DirectionPub
Hz500
DescriptionBody pose and velocity in the world frame. Origin resets at startup. Fused from IMU and leg odometry.

/rbq/foot_states

FieldValue
Typerbq_msgs/FootStates
DirectionPub
Hz500
DescriptionFoot positions, velocities, and contact states for all 4 legs relative to the body center frame.

Fields:

FieldTypeDescription
headerstd_msgs/HeaderROS header
foot_position_rt_bodygeometry_msgs/Point[4]Foot position relative to body center. +X=forward, +Y=left, +Z=up
foot_velocity_rt_bodygeometry_msgs/Point[4]Foot velocity relative to body frame
foot_contact_estuint8[4]Contact state per foot: 0 = CONTACT_LOST, 1 = CONTACT_MADE
foot_force_estfloat32[4]Estimated contact force [N]

Leg order: [0] = Front-Left, [1] = Front-Right, [2] = Rear-Left, [3] = Rear-Right


Sensor Feedback

/rbq/imu

FieldValue
Typesensor_msgs/Imu
DirectionPub
Hz500
DescriptionRaw IMU data. Sensor offset from body center: (0.00665, 0.0, -0.0404) m. Frame: +X = forward, +Y = left, +Z = up. Angular velocity range ±2000 °/s, acceleration range ±16 g.

/rbq/joint_states

FieldValue
Typesensor_msgs/JointState
DirectionPub
Hz500
DescriptionJoint positions [rad], velocities [rad/s], and efforts [Nm] for all 12 leg joints in standard ROS format.

/rbq/leg_joint

FieldValue
Typerbq_msgs/LegJointInfo
DirectionPub
Hz500
DescriptionDetailed per-joint status for all 12 leg joints. LegJointInfo wraps JointInfo[12] joint — one JointInfo per joint (there is no JointStatus message).

Joint order (conventional): [0]HRR [1]HRP [2]HRK [3]HLR [4]HLP [5]HLK [6]FRR [7]FRP [8]FRK [9]FLR [10]FLP [11]FLK — but each joint[i] carries its own 3-letter name, which is the authoritative identifier.

JointInfo fields (each element of joint[12]):

FieldTypeUnitDescription
posfloat32radMeasured position
velfloat32rad/sAngular velocity
accfloat32rad/s²Angular acceleration
torquefloat32N·mMeasured torque
kpfloat32Nm/radPosition gain
kdfloat32Nm·s/radDamping gain
ownerint8Process owning the joint (040)
ref_ff_torquefloat32N·mReference feed-forward torque
ref_positionfloat32radReference (target) position
ref_velfloat32rad/sReference velocity
currentfloat32AMotor current
temperature_boardint8°CControl board temperature
temperature_coilint8°CMotor coil temperature
namestring≤33-letter joint name, e.g. "HRR"
statusstring≤33-letter lifecycle: NON/CON/HOM/RUN
error_msgstring≤33-letter error code, e.g. "JAM", "OK"

Torque limits: Roll/Pitch ±104 Nm — Knee −70 / +140 Nm


Power Control

/rbq/cmd/switch_power

FieldValue
Typestd_msgs/Int8MultiArray
DirectionSub
DescriptionToggle a PDU power port. data: [port_id, state]state: 1=ON, 0=OFF.

Port ID Reference:

port_idPort
0 (0x00)48 V — Leg actuators
1 (0x01)48 V — Add-on device (top)
2 (0x02)48 V — External port (top)
16 (0x10)12 V — Vision PC (internal)
17 (0x11)12 V — LAN comm port (top)
18 (0x12)12 V — LiDAR port (top)
19 (0x13)12 V — CCTV port (top)
20 (0x14)12 V — Thermal cam port (top)
21 (0x15)12 V — IR LED (front/rear panel)
22 (0x16)12 V — Speaker amplifier
32 (0x20)5 V — Camera USB hub
33 (0x21)5 V — Audio / side-cam USB hub
cpp
// PDU port ID enum (used as data[0] in switch_power)
enum PDU_PORT_IDs_e : unsigned char {
    PDU_PORT_48V_LEG                   = 0x00,  // Leg actuators
    PDU_PORT_48V_ADD                   = 0x01,  // Add-on device
    PDU_PORT_48V_EXT                   = 0x02,  // External port
    PDU_PORT_12V_VisionPC              = 0x10,  // Vision PC
    PDU_PORT_12V_COMM                  = 0x11,  // LAN comm port
    PDU_PORT_12V_Lidar                 = 0x12,  // LiDAR port
    PDU_PORT_12V_CCTV                  = 0x13,  // CCTV port
    PDU_PORT_12V_THER                  = 0x14,  // Thermal camera
    PDU_PORT_12V_IRLed                 = 0x15,  // IR LED
    PDU_PORT_12V_Speaker               = 0x16,  // Speaker amplifier
    PDU_PORT_5V_CAMERAS                = 0x20,  // Camera USB hub
    PDU_PORT_5V_AUDIO_SIDE_CAM_USBHUB  = 0x21,  // Audio/side-cam USB hub
};

Example: turn on 12V LiDAR port (PDU_PORT_12V_Lidar = 0x12 → decimal 18)

bash
ros2 topic pub --once /rbq/cmd/switch_power std_msgs/msg/Int8MultiArray "{data: [18, 1]}"

/rbq/battery

FieldValue
Typerbq_msgs/BatteryState
DirectionPub
Hz500
DescriptionBattery status for the dual battery pack. Every field is a 2-element array ([0] = pack 0, [1] = pack 1).

Fields:

FieldTypeDescription
headerstd_msgs/HeaderROS header
identifieruint32[2]Per-pack identifier
statusuint8[2]0=Unknown 1=Missing 2=Charging 3=Discharging
charge_percentageuint8[2]State of charge [0, 100] %
temperatureint8[2]Pack temperature [°C]
currentfloat32[2]Load current [A]
voltagefloat32[2]Pack voltage [V]

Vision — Camera Sensors

All camera topics are published by the robot (Pub). Sensors are identified by numeric idsensor_0sensor_5 (the old name-based sensor_bottom_N / sensor_front / sensor_rear topics are gone). Each stream has /compressed, /camera_info, and a per-stream /tf (geometry_msgs/PoseStamped).

Sensor idLocationStreams
sensor_0sensor_3Bottom/body depth sensorsdepth, ir
sensor_4Front RGB-Ddepth, rgb
sensor_5Rear RGB-D (also ArUco docking)depth, rgb

Topic pattern: /rbq/vision/sensor_{N}/{stream}/{sub}

TopicTypeDescription
/rbq/vision/sensor_{N}/{stream}/compressedsensor_msgs/CompressedImageCompressed frame (depth = PNG, ir/rgb = JPEG)
/rbq/vision/sensor_{N}/{stream}/camera_infosensor_msgs/CameraInfoIntrinsics + distortion
/rbq/vision/sensor_{N}/{stream}/tfgeometry_msgs/PoseStampedSensor pose relative to the body

{stream} is depth/ir for sensor_0sensor_3, and depth/rgb for sensor_4/sensor_5.

Camera threads publish only while a subscriber is attached (hasSubscribers gate) — subscribe first, then read.


TF

/tf

FieldValue
Typetf2_msgs/TFMessage
DirectionPub
DescriptionDynamic transforms broadcast at runtime: odom → base_link, body → leg links, body → sensor frames.

/tf_static (URDF fixed transforms) is published by the rbq_description robot_state_publisher, i.e. only when you run ros2 launch rbq_description description.launch.py — it is not emitted by the robot's core software.

/rbq/joy

FieldValue
Typesensor_msgs/Joy
DirectionPub
DescriptionThe robot's current joystick input state (passthrough). Axes [0–5]: left-X, left-Y, right-X, right-Y, L2, R2. Buttons [0–15].

Topic Subscription Examples

bash
# Robot status (50 Hz)
ros2 topic echo --once /rbq/robot_status

# Per-joint leg status (50 Hz)
ros2 topic echo --once /rbq/leg_joint

# IMU data (200 Hz)
ros2 topic echo --once /rbq/imu

# Battery state (10 Hz)
ros2 topic echo --once /rbq/battery

# Foot contact states (50 Hz)
ros2 topic echo --once /rbq/foot_states

# Odometry (50 Hz)
ros2 topic echo --once /rbq/odometry

This user manual is intended for RBQ users.