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.
| Channel | Production (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/scan | none |
| Nav2 | /controller_server · /planner_server · /behavior_server · /bt_navigator | none |
| Map | /map · /goal_pose | none |
Costmaps: Global
All topics on the server: Nav2 global_costmap. Each consumed by Dash and the Nav2 stack.
| Topic | Purpose |
|---|---|
| /global_costmap/costmap | Combined occupancy grid → Dash |
| /global_costmap/costmap_raw | Raw (unthresholded) grid → Dash |
| /global_costmap/costmap_updates | Combined region updates (delta grids) → Dash |
| /global_costmap/costmap_raw_updates | Raw region updates (delta grids) → Dash |
| /global_costmap/footprint | Footprint echo of /footprint |
| /global_costmap/published_footprint | Footprint echo → Dash |
| /global_costmap/obstacle_layer | Obstacle layer grid → Dash |
| /global_costmap/obstacle_layer_raw | Obstacle layer raw → Dash |
| /global_costmap/obstacle_layer_updates | Obstacle layer updates → Dash |
| /global_costmap/obstacle_layer_raw_updates | Obstacle layer raw updates → Dash |
| /global_costmap/static_layer | Static map layer grid → Dash |
| /global_costmap/static_layer_raw | Static layer raw → Dash |
| /global_costmap/static_layer_updates | Static layer updates → Dash |
| /global_costmap/static_layer_raw_updates | Static layer raw updates → Dash |
| /global_costmap/transition_event | Costmap2D component lifecycle state → Dash |
| /global_costmap/global_costmap/transition_event | Costmap2D 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.
| Topic | Purpose |
|---|---|
| /local_costmap/costmap | Combined occupancy grid → Dash |
| /local_costmap/costmap_raw | Raw (unthresholded) grid → Dash, behavior_server |
| /local_costmap/costmap_updates | Combined region updates → Dash |
| /local_costmap/costmap_raw_updates | Raw region updates → Dash |
| /local_costmap/footprint | Footprint echo of /footprint |
| /local_costmap/published_footprint | Footprint echo → Dash |
| /local_costmap/obstacle_layer | Obstacle layer grid → Dash |
| /local_costmap/obstacle_layer_raw | Obstacle layer raw → Dash |
| /local_costmap/obstacle_layer_updates | Obstacle layer updates → Dash |
| /local_costmap/obstacle_layer_raw_updates | Obstacle layer raw updates → Dash |
| /local_costmap/static_layer | Static map layer grid → Dash |
| /local_costmap/static_layer_raw | Static layer raw → Dash |
| /local_costmap/static_layer_updates | Static layer updates → Dash |
| /local_costmap/static_layer_raw_updates | Static layer raw updates → Dash |
| /local_costmap/transition_event | Costmap2D lifecycle state → Dash |
| /local_costmap/local_costmap/transition_event | Costmap2D 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 topic | Description |
|---|---|
| /costmap | Mirror of /global_costmap/costmap or /local_costmap/costmap |
| /costmap_raw | Mirror of /global_costmap/costmap_raw |
| /costmap_raw_updates | Mirror of /global_costmap/costmap_raw_updates |
| /costmap_updates | Mirror of /global_costmap/costmap_updates |
| /obstacle_layer | Mirror of /global_costmap/obstacle_layer or /local_costmap/obstacle_layer |
| /obstacle_layer_raw | Mirror of /global_costmap/obstacle_layer_raw |
| /obstacle_layer_raw_updates | Mirror of /global_costmap/obstacle_layer_raw_updates |
| /obstacle_layer_updates | Mirror of /global_costmap/obstacle_layer_updates |
| /published_footprint | Mirror of /global_costmap/published_footprint |
| /static_layer | Mirror of /global_costmap/static_layer |
| /static_layer_raw | Mirror of /global_costmap/static_layer_raw |
| /static_layer_raw_updates | Mirror of /global_costmap/static_layer_raw_updates |
| /static_layer_updates | Mirror of /global_costmap/static_layer_updates |
| /voxel_layer | Mirror of /local_costmap/voxel_layer (3D point-cloud layer) |
| /voxel_layer_raw | Mirror of /local_costmap/voxel_layer_raw |
| /voxel_layer_raw_updates | Mirror of /local_costmap/voxel_layer_raw_updates |
| /voxel_layer_updates | Mirror of /local_costmap/voxel_layer_updates |
ROS Internals & Lifecycle
| Topic | Location & purpose |
|---|---|
| /amcl/transition_event | server: Nav2 amcl · AMCL lifecycle state → Dash |
| /behavior_server/transition_event | server: Nav2 behavior_server · Backup/rotate/wait actions lifecycle → Dash |
| /bond | robot: ros2_control · rclcpp_lifecycle bond keepalive between lifecycle nodes and lifecycle_manager |
| /bt_navigator/transition_event | server: Nav2 bt_navigator · Action router lifecycle → Dash |
| /bt_navigator_navigate_through_poses_rclcpp_node/transition_event | server · navigate_through_poses action server lifecycle → Dash |
| /bt_navigator_navigate_to_pose_rclcpp_node/transition_event | server · navigate_to_pose action server lifecycle → Dash |
| /clock | server · 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_event | server: Nav2 controller_server · Pure Pursuit lifecycle → Dash |
| /diagnostics | shared · Aggregated diagnostics. Publishers: lifecycle_manager, zed_node → Dash |
| /joint_group_effort_controller/joint_trajectory | robot: 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_activated | server: lifecycle_manager · Which managed nodes (AMCL, map_server) are activated |
| /map_server/transition_event | server: Nav2 map_server · Map server lifecycle → Dash |
| /parameter_events | shared · Parameter-change events, emitted by every node |
| /planner_server/transition_event | server: Nav2 planner_server · NavFn lifecycle → Dash |
| /rosout | shared · System log stream: every node publishes log records |
| /smoother_server/transition_event | server: Nav2 smoother_server · Smoother lifecycle → Dash |
| /tf | shared · Live TF. Publishers: amcl (map→odom), zed_node, zed2i_front_state_publisher |
| /tf_static | shared · Static TF: base_link_to_os_sensor, base_link_to_zed_camera, navsat_transform, os_driver, zed2i_front_state_publisher |
| /velocity_smoother/transition_event | server: 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).
| Topic | Purpose |
|---|---|
| /sim_amcl_pose | Map-frame sim pose = GT + constant (5,5) offset, published by gt_pose_bridge → Dash Tier-3 pose |
| /sim_cmd_vel_smooth | cmd_vel_stamped_to_twist → quadruped_controller. The single way a velocity command reaches the Gazebo legs |
| /sim_foot_contacts | Foot contacts (champ_msgs/ContactsStamped), bridged by foot_contacts_bridge |
| /sim_gps | Gazebo navsat fix (~zero) |
| /sim_imu | Gazebo IMU |
| /sim_joint_group_effort_controller/joint_trajectory | Joint-effort trajectory → Gazebo joint_group_effort_controller, published by quadruped_controller |
| /sim_joint_states/joint_states | Sim joint states (namespaced variant; robot keeps bare /joint_states exclusively) |
| /sim_odom_gt | Gazebo ground-truth odometry (world frame). Authoritative in sim; consumed by gt_pose_bridge |
| /sim_rgb_image | Gazebo 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.
| Topic | Mirrors |
|---|---|
| /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
| Topic | Type | Owner | Purpose |
|---|---|---|---|
| /cmd_vel | geometry_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_raw | geometry_msgs/TwistStamped | Nav2 controller_server | Pre-smoother velocity from controller_server |
| /safety/e_stop | std_srvs/srv/Trigger | Dash / operator | Mandatory. Request → immediate all-axis stop |
| /safety/reset | std_srvs/srv/Trigger | Dash / operator | Mandatory. Clear stop/fault state, re-enter closed loop |
| /locomotion/status | std_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/can | std_msgs/String (hex frames) | CHAMP (robot) | Verbose CAN trace for bring-up; default OFF |
| /limit/handshake | std_msgs/String (latched) | limit_handshake | Dash↔robot handshake status (latched): handshake channel |
| /limit/handshake_request | std_msgs/String | limit_dash_bridge | Handshake request channel: Dash / launch tooling request, the robot (limit_handshake) responds on /limit/handshake |
Sensors
| Topic | Type | Rate | Status |
|---|---|---|---|
| /ouster/points | sensor_msgs/PointCloud2 | ~3–6 Hz (driver reader cap) | LIVE Obstacle + AMCL source |
| /ouster/scan | sensor_msgs/LaserScan | ~3–6 Hz | LIVE Ouster 2D scan (pointcloud_to_laserscan) |
| /scan_corrected | sensor_msgs/LaserScan | ~3–6 Hz | Timestamp-corrected scan → AMCL (stamp_shift) |
| /imu_corrected | sensor_msgs/Imu | ~80–99 Hz | LIVE Timestamp-corrected IMU → EKF imu0 (stamp_shift) |
| /zed2i_front/zed_node/odom | nav_msgs/Odometry | ~20–28 Hz | LIVE ZED 2i VIO odometry: EKF odom0 is /zed_odom_corrected (stamp-shifted) |
| /zed2i_front/zed_node/imu/data | sensor_msgs/Imu | ~99 Hz | LIVE IMU source of record |
| /zed2i_front/zed_node/pose | geometry_msgs/PoseWithCovarianceStamped | ~10.8 Hz | display only frame_id="map", read by the dash for display, not fused into EKF/AMCL |
| /zed2i_front/zed_node/point_cloud/cloud_registered | sensor_msgs/PointCloud2 | ~4.9 Hz (448×256) | LIVE Not in any costmap |
| /zed2i_front/zed_node/rgb/color/rect/image/compressed | sensor_msgs/CompressedImage | ~2.3 Hz | LIVE → dash viewer |
| /fix | sensor_msgs/NavSatFix | ~1 Hz | standby active with sky view; standby indoors |
| /odometry/gps | nav_msgs/Odometry | none | standby navsat_transform output: flows when a GNSS fix is available |
| /joint_states | sensor_msgs/JointState | ≥ 50 Hz | LIVE 12-joint state. Robot-exclusive |
| /foot_contacts | champ_msgs/ContactsStamped | ≥ 50 Hz | LIVE contacts = bool[4] in order lf, rf, lr, rr |