Skip to main content

Topics & services

Index of the ROS topics and services that Humanoid Control publishes, subscribes, or serves. Use this page to find "who publishes X" or "what topic carries Y".

Topics

Always-on (any bringup)

TopicTypeQoSPublisherNotes
/lite/joint_statessensor_msgs/JointStateRELIABLE depth 10joint_state_broadcaster (remapped at bringup)Position/velocity/effort in joint frame (post-calibration). Owner-prefixed — there is no global /joint_states. 50 Hz real, 200 Hz sim.
/imu/datasensor_msgs/ImuRELIABLEIMU driverSubscribed by RLPolicyController (in-process, for the imu_* observation terms).
/robot_descriptionstd_msgs/StringRELIABLE TRANSIENT_LOCAL depth 1robot_state_publisherURDF XML. Latched — subscribers can join any time.
/tf, /tf_statictf2_msgs/TFMessageRELIABLErobot_state_publisherKinematic chain from /lite/joint_states.
/clockrosgraph_msgs/ClockRELIABLEmujoco_sim (sim only)Sim-time on the MuJoCo path. Every other node consumes when use_sim_time:=true.

Bringup-dependent

TopicTypeQoSPublisherWhen present
/safety_statushumanoid_control_msgs/SafetyStatusRELIABLE TRANSIENT_LOCAL depth 1every hardware pluginPer-bus (humanoid_devices_robstride/can0, humanoid_devices_robstride/can1 for Lite). Published only on change. Telemetry — no automatic consumer now (native fallback_controllers handles faults; operator reacts to the rest).
/standby_controller_a/statehumanoid_control_msgs/StandbyStateRELIABLE TRANSIENT_LOCAL depth 1humanoid_control/StandbyController instance standby_controller_a (when active)Pose A. Telemetry only — is_finished no longer gates anything.
/standby_controller_b/statehumanoid_control_msgs/StandbyStateRELIABLE TRANSIENT_LOCAL depth 1humanoid_control/StandbyController instance standby_controller_b (when active)Pose B. Telemetry only. (Lite also spawns standby_controller_y/standby_controller_y/state.)
/joysensor_msgs/JoySENSOR_DATAjoy_nodeWhen enable_gamepad:=true (default). Consumed by joy_teleop (not mode_manager). The launch hard-fails on missing /dev/input/js*.

Active-controller-dependent

TopicTypeQoSDirectionWhen
/remote_policy_controller/commandhumanoid_control_msgs/MITCommandRELIABLE depth 4subscribed by RemotePolicyControllerWhen RemotePolicyController is active. Published by a System 1/2 external-command source (gravity-comp runner today, VLA / manipulation later). Not used by the learned policies — those run in-process.
/piano/key_statestd_msgs/Float32MultiArrayRELIABLE KEEP_LAST(1)sim: pianist_policy/piano_state_bridge; real: pianist_policy/midi_keyboard_driverPiano runs. Live key state (0.0/1.0 per key). Consumed by the in-process RLPolicyController as the key_pressed extern observation term.
/forward_mit_controller/commandsstd_msgs/Float64MultiArrayRELIABLE depth 10subscribed by upstream forward_command_controller/MultiInterfaceForwardCommandControllerUsed by mit_slider_gui.

/parameter_events and friends

Every node (controllers, joy_teleop, plugins) publishes the standard ROS infrastructure topics:

  • /parameter_events, /rosout
  • ~/get_parameters, ~/set_parameters, etc. (per node)

These are conventional ROS — not specific to Humanoid Control. Mentioned here so ros2 topic list output isn't confusing.

Services

Mode switching

There are no /humanoid_control/mode/* std_srvs/Trigger services anymore — the mode_manager node that hosted them has been removed. Mode switching now goes through the standard controller-manager service /controller_manager/switch_controller (controller_manager_msgs/srv/SwitchController), driven by joy_teleop from the gamepad or by ros2 control switch_controllers on the command line. See the controller_manager-side services below.

controller_manager-side (under /controller_manager)

Standard controller_manager services. Useful ones:

ServiceTypePurpose
/controller_manager/list_controllerscontroller_manager_msgs/ListControllersWhat's loaded, active state per controller
/controller_manager/list_hardware_componentscontroller_manager_msgs/ListHardwareComponentsWhich <ros2_control> blocks are active
/controller_manager/load_controllercontroller_manager_msgs/LoadControllerBacking for ros2 control load_controller
/controller_manager/switch_controllercontroller_manager_msgs/SwitchControllerBacking for ros2 control switch_controllers
/controller_manager/configure_controllercontroller_manager_msgs/ConfigureControllerForce on_configure

joy_teleop is a client of /controller_manager/switch_controller (each button → one activate + sibling deactivates, BEST_EFFORT strictness). You can call it directly from ros2 control for operator-driven debug — see How-to → Switch without the FSM.

Per-node services (parameter handling)

Every node hosts the standard rclcpp parameter services:

  • ~/get_parameters, ~/set_parameters, ~/list_parameters, etc.

rqt_reconfigure is a generic frontend for these.

QoS reference

Used in the tables above:

QoS profileReliabilityDurabilityHistoryWhen
RELIABLE (default)RELIABLEVOLATILEKEEP_LAST 10Most topics
SENSOR_DATABEST_EFFORTVOLATILEKEEP_LAST 5High-rate sensors — IMU, joy
TRANSIENT_LOCALRELIABLETRANSIENT_LOCALKEEP_LAST 1Latched — late subscribers see the most-recent value (URDF, SafetyStatus, StandbyState)

If a publisher's QoS doesn't match a subscriber's, ROS may silently drop messages. The TRANSIENT_LOCAL combo is the most common mismatch source — subscribers must also request TRANSIENT_LOCAL durability to receive the latched value.

Inspecting at runtime

From a sourced workspace env (cd humanoid_control_ws && pixi shell):

# What's published right now?
ros2 topic list

# Who's publishing X?
ros2 topic info /lite/joint_states --verbose

# What's the QoS?
ros2 topic info /safety_status --verbose

# Recent rate
ros2 topic hz /lite/joint_states

# What service does X expose?
ros2 service list | grep controller_manager
ros2 service info /controller_manager/switch_controller

See also