ROS 2 Topic Reference

Topics

The complete per-topic roster: production and sim

LOADING LIMIT

Topic Reference complete roster

Every topic in the Limit stack: the production (live driving) and sim (Gazebo) sides, with location, type, owner, purpose, and status. This page is the reference roster.

Two Nav2 stacks. The Limit system runs two complete, independent Nav2 stacks, both on the bare-metal server (ROS_DOMAIN_ID=0), kept deliberately separate so simulation logic never mixes with live driving. The production stack uses standard Nav2 naming. The sim stack uses sim_* or /gazebo/* prefixes. Disjoint namespaces prevent collision. The robot runs sensor drivers only: no Nav2 nodes. Topic naming follows ROS REP 103 (Topic Names).

Topic Roster

Each row is one functional channel, showing the production (robot) topic name and the sim (Gazebo) name where one exists.

ChannelProduction (robot)Sim (Gazebo)
Odometry/odom/sim_odom · /sim_odom_gt
Map-frame pose/amcl_pose/sim_amcl_pose
TF/tf · /tf_static/sim_tf · /sim_tf_static
Commanded velocity/cmd_vel/sim_cmd_vel · /sim_cmd_vel_smooth
Joint states/joint_states/sim_joint_states/joint_states
Leg trajectory/joint_group_effort_controller/joint_trajectory/sim_joint_group_effort_controller/joint_trajectory
Foot contacts/foot_contacts/sim_foot_contacts · /gazebo/contact/{lf,rf,lr,rr}
IMU/zed2i_front/zed_node/imu/data → /imu_corrected/sim_imu
GNSS/fix · /vel/sim_gps
Camera/zed2i_front/zed_node/rgb/color/rect/image/compressed/sim_rgb_image
LiDAR/ouster/points · /ouster/scannone
Nav2/controller_server · /planner_server · /behavior_server · /bt_navigatornone
Map/map · /goal_posenone

Costmaps: Global

All topics on the server: Nav2 global_costmap. Each consumed by Dash and the Nav2 stack.

TopicPurpose
/global_costmap/costmapCombined occupancy grid → Dash
/global_costmap/costmap_rawRaw (unthresholded) grid → Dash
/global_costmap/costmap_updatesCombined region updates (delta grids) → Dash
/global_costmap/costmap_raw_updatesRaw region updates (delta grids) → Dash
/global_costmap/footprintFootprint echo of /footprint
/global_costmap/published_footprintFootprint echo → Dash
/global_costmap/obstacle_layerObstacle layer grid → Dash
/global_costmap/obstacle_layer_rawObstacle layer raw → Dash
/global_costmap/obstacle_layer_updatesObstacle layer updates → Dash
/global_costmap/obstacle_layer_raw_updatesObstacle layer raw updates → Dash
/global_costmap/static_layerStatic map layer grid → Dash
/global_costmap/static_layer_rawStatic layer raw → Dash
/global_costmap/static_layer_updatesStatic layer updates → Dash
/global_costmap/static_layer_raw_updatesStatic layer raw updates → Dash
/global_costmap/transition_eventCostmap2D component lifecycle state → Dash
/global_costmap/global_costmap/transition_eventCostmap2D component lifecycle state → Dash

Costmaps: Local

The local costmap's obstacle layer is the voxel layer (3D, point-cloud-based): hence the /voxel_layer* rows. All on the server.

TopicPurpose
/local_costmap/costmapCombined occupancy grid → Dash
/local_costmap/costmap_rawRaw (unthresholded) grid → Dash, behavior_server
/local_costmap/costmap_updatesCombined region updates → Dash
/local_costmap/costmap_raw_updatesRaw region updates → Dash
/local_costmap/footprintFootprint echo of /footprint
/local_costmap/published_footprintFootprint echo → Dash
/local_costmap/obstacle_layerObstacle layer grid → Dash
/local_costmap/obstacle_layer_rawObstacle layer raw → Dash
/local_costmap/obstacle_layer_updatesObstacle layer updates → Dash
/local_costmap/obstacle_layer_raw_updatesObstacle layer raw updates → Dash
/local_costmap/static_layerStatic map layer grid → Dash
/local_costmap/static_layer_rawStatic layer raw → Dash
/local_costmap/static_layer_updatesStatic layer updates → Dash
/local_costmap/static_layer_raw_updatesStatic layer raw updates → Dash
/local_costmap/transition_eventCostmap2D lifecycle state → Dash
/local_costmap/local_costmap/transition_eventCostmap2D lifecycle state → Dash

Unscoped Costmap Layer Mirrors

Nav2 publishes costmap data both scoped and unscoped. These are unscoped mirrors of the corresponding /global_costmap/<layer> or /local_costmap/<layer> topics.

Unscoped topicDescription
/costmapMirror of /global_costmap/costmap or /local_costmap/costmap
/costmap_rawMirror of /global_costmap/costmap_raw
/costmap_raw_updatesMirror of /global_costmap/costmap_raw_updates
/costmap_updatesMirror of /global_costmap/costmap_updates
/obstacle_layerMirror of /global_costmap/obstacle_layer or /local_costmap/obstacle_layer
/obstacle_layer_rawMirror of /global_costmap/obstacle_layer_raw
/obstacle_layer_raw_updatesMirror of /global_costmap/obstacle_layer_raw_updates
/obstacle_layer_updatesMirror of /global_costmap/obstacle_layer_updates
/published_footprintMirror of /global_costmap/published_footprint
/static_layerMirror of /global_costmap/static_layer
/static_layer_rawMirror of /global_costmap/static_layer_raw
/static_layer_raw_updatesMirror of /global_costmap/static_layer_raw_updates
/static_layer_updatesMirror of /global_costmap/static_layer_updates
/voxel_layerMirror of /local_costmap/voxel_layer (3D point-cloud layer)
/voxel_layer_rawMirror of /local_costmap/voxel_layer_raw
/voxel_layer_raw_updatesMirror of /local_costmap/voxel_layer_raw_updates
/voxel_layer_updatesMirror of /local_costmap/voxel_layer_updates

ROS Internals & Lifecycle

TopicLocation & purpose
/amcl/transition_eventserver: Nav2 amcl · AMCL lifecycle state → Dash
/behavior_server/transition_eventserver: Nav2 behavior_server · Backup/rotate/wait actions lifecycle → Dash
/bondrobot: ros2_control · rclcpp_lifecycle bond keepalive between lifecycle nodes and lifecycle_manager
/bt_navigator/transition_eventserver: Nav2 bt_navigator · Action router lifecycle → Dash
/bt_navigator_navigate_through_poses_rclcpp_node/transition_eventserver · navigate_through_poses action server lifecycle → Dash
/bt_navigator_navigate_to_pose_rclcpp_node/transition_eventserver · navigate_to_pose action server lifecycle → Dash
/clockserver · Sim-time clock. With use_sim_time:=true, all Nav2 nodes stall until this flows (25 subscribers). Gazebo gz-sim publishes when sim is up.
/controller_server/transition_eventserver: Nav2 controller_server · Pure Pursuit lifecycle → Dash
/diagnosticsshared · Aggregated diagnostics. Publishers: lifecycle_manager, zed_node → Dash
/joint_group_effort_controller/joint_trajectoryrobot: CHAMP quadruped_controller (live) · joint-effort trajectory from the gait + IK loop. Sim path: /sim_joint_group_effort_controller/joint_trajectory
/lifecycle_manager/managed_nodes_activatedserver: lifecycle_manager · Which managed nodes (AMCL, map_server) are activated
/map_server/transition_eventserver: Nav2 map_server · Map server lifecycle → Dash
/parameter_eventsshared · Parameter-change events, emitted by every node
/planner_server/transition_eventserver: Nav2 planner_server · NavFn lifecycle → Dash
/rosoutshared · System log stream: every node publishes log records
/smoother_server/transition_eventserver: Nav2 smoother_server · Smoother lifecycle → Dash
/tfshared · Live TF. Publishers: amcl (map→odom), zed_node, zed2i_front_state_publisher
/tf_staticshared · Static TF: base_link_to_os_sensor, base_link_to_zed_camera, navsat_transform, os_driver, zed2i_front_state_publisher
/velocity_smoother/transition_eventserver: Nav2 velocity_smoother · Velocity smoother lifecycle → Dash

Sim Tier (on-demand: live only when sim stack is up)

No publisher in the current capture: sim stack not launched. These exist in code (gazebo_relay.yaml, limit_limit_launch.py, gazebo_topic_relay.py) and are subscribed by limit_dash_bridge (Dash Tier-1/2 fallbacks).

TopicPurpose
/sim_amcl_poseMap-frame sim pose = GT + constant (5,5) offset, published by gt_pose_bridge → Dash Tier-3 pose
/sim_cmd_vel_smoothcmd_vel_stamped_to_twist → quadruped_controller. The single way a velocity command reaches the Gazebo legs
/sim_foot_contactsFoot contacts (champ_msgs/ContactsStamped), bridged by foot_contacts_bridge
/sim_gpsGazebo navsat fix (~zero)
/sim_imuGazebo IMU
/sim_joint_group_effort_controller/joint_trajectoryJoint-effort trajectory → Gazebo joint_group_effort_controller, published by quadruped_controller
/sim_joint_states/joint_statesSim joint states (namespaced variant; robot keeps bare /joint_states exclusively)
/sim_odom_gtGazebo ground-truth odometry (world frame). Authoritative in sim; consumed by gt_pose_bridge
/sim_rgb_imageGazebo camera image → Dash

/gazebo/* Relay Mirrors (on-demand)

Passive mirrors published by gazebo_topic_relay; visible only while sim stack runs; each /gazebo/* name has exactly one publisher.

TopicMirrors
/gazebo/base_to_footprint_pose/sim_base_to_footprint_pose
/gazebo/body_pose/sim_body_pose
/gazebo/camera/image/sim_rgb_image
/gazebo/cmd_vel/cmd_vel (TwistStamped view)
/gazebo/contact/lf/sim_lf_foot_contacts
/gazebo/contact/lr/sim_lr_foot_contacts
/gazebo/contact/rf/sim_rf_foot_contacts
/gazebo/contact/rr/sim_rr_foot_contacts
/gazebo/fix/sim_gps
/gazebo/foot/sim_foot (foot contact/pose)
/gazebo/foot_contacts/sim_foot_contacts
/gazebo/imu_corrected/sim_imu
/gazebo/odom/sim_odom (fused sim odometry)
/gazebo/odom_ground_truth/sim_odom_gt
/gazebo/odom_raw/sim_odom_raw

Command & Control

TopicTypeOwnerPurpose
/cmd_velgeometry_msgs/Twist (CHAMP) / TwistStamped (Nav2)Dash (drive) / velocity_smoother (autonomous)Robot velocity command: single bus. All motion arrives here: Nav2 FollowPath (via smoother, 20 Hz, accel-limited), behavior_server Spin/BackUp, operator teleop.
/cmd_vel_rawgeometry_msgs/TwistStampedNav2 controller_serverPre-smoother velocity from controller_server
/safety/e_stopstd_srvs/srv/TriggerDash / operatorMandatory. Request → immediate all-axis stop
/safety/resetstd_srvs/srv/TriggerDash / operatorMandatory. Clear stop/fault state, re-enter closed loop
/locomotion/statusstd_msgs/String (JSON)CHAMP (robot)Health summary: per-motor {node_id, ok, last_heartbeat_age_ms, iq_a, fault_code}, watchdog state, e-stop state. 1 Hz + on-change. For Dash/monitoring.
/locomotion/canstd_msgs/String (hex frames)CHAMP (robot)Verbose CAN trace for bring-up; default OFF
/limit/handshakestd_msgs/String (latched)limit_handshakeDash↔robot handshake status (latched): handshake channel
/limit/handshake_requeststd_msgs/Stringlimit_dash_bridgeHandshake request channel: Dash / launch tooling request, the robot (limit_handshake) responds on /limit/handshake

Sensors

TopicTypeRateStatus
/ouster/pointssensor_msgs/PointCloud2~3–6 Hz (driver reader cap)LIVE Obstacle + AMCL source
/ouster/scansensor_msgs/LaserScan~3–6 HzLIVE Ouster 2D scan (pointcloud_to_laserscan)
/scan_correctedsensor_msgs/LaserScan~3–6 HzTimestamp-corrected scan → AMCL (stamp_shift)
/imu_correctedsensor_msgs/Imu~80–99 HzLIVE Timestamp-corrected IMU → EKF imu0 (stamp_shift)
/zed2i_front/zed_node/odomnav_msgs/Odometry~20–28 HzLIVE ZED 2i VIO odometry: EKF odom0 is /zed_odom_corrected (stamp-shifted)
/zed2i_front/zed_node/imu/datasensor_msgs/Imu~99 HzLIVE IMU source of record
/zed2i_front/zed_node/posegeometry_msgs/PoseWithCovarianceStamped~10.8 Hzdisplay only frame_id="map", read by the dash for display, not fused into EKF/AMCL
/zed2i_front/zed_node/point_cloud/cloud_registeredsensor_msgs/PointCloud2~4.9 Hz (448×256)LIVE Not in any costmap
/zed2i_front/zed_node/rgb/color/rect/image/compressedsensor_msgs/CompressedImage~2.3 HzLIVE → dash viewer
/fixsensor_msgs/NavSatFix~1 Hzstandby active with sky view; standby indoors
/odometry/gpsnav_msgs/Odometrynonestandby navsat_transform output: flows when a GNSS fix is available
/joint_statessensor_msgs/JointState≥ 50 HzLIVE 12-joint state. Robot-exclusive
/foot_contactschamp_msgs/ContactsStamped≥ 50 HzLIVE contacts = bool[4] in order lf, rf, lr, rr