GUIDE · 4 MIN READ
Getting started with ROS 2 for humanoid robots
Choose a ROS 2 distribution, install it, connect to a humanoid's DDS interface, and simulate first. With the ROS 2 support of every robot in the WBH database.
REVIEWED BY WBH · · DRAFTED WITH AI ASSISTANCE FROM THE CITED SOURCES
For: Developers who know Linux and Python or C++ and are setting up ROS 2 for a humanoid robot for the first time.
What ROS 2 does in a humanoid project
ROS 2 is the middleware most humanoid software stacks meet sooner or later. Programs run as nodes that exchange typed messages over a publish/subscribe graph [1], so a perception node, a planner and a controller can be developed, replaced and inspected independently. Under the hood ROS 2 runs on DDS, an industry-standard middleware with implementations from several vendors [2].
For a humanoid this brings three practical things: the robot's joint states, IMU and camera streams become topics any tool can read; the ecosystem's control and planning frameworks, ros2_control [3] and MoveIt 2 [4], work with your robot once it is described in URDF [5]; and simulators speak the same interfaces, so code moves between simulation and hardware with little change.
ROS 2 is not required to program most humanoids: several manufacturers ship their own SDK, and ROS 2 support is published separately. Check the robot's development table first; the table below lists what each maker publishes.
What each humanoid publishes for ROS 2
Official ROS 2 support differs widely: some makers publish complete ROS 2 workspaces with robot descriptions, simulation and MoveIt configurations, others publish message definitions for their own DDS interface, and some publish nothing. The table is built from the WBH robot records, where each row links to its source.
| ROBOT | ROS 2 | PACKAGES AND DISTRIBUTIONS |
|---|---|---|
| 4NE1 Gen 3.5 | Official | ROS 2 interface |
| 4NE1 Mini | Official | ROS 2 interface |
| AGIBOT A2 (A2 Ultra / A2 Lite) | Not published | — |
| AGIBOT A2-W | Not published | — |
| AGIBOT A3 | Not published | — |
| AGIBOT A3 Ultra | Not published | — |
| AGIBOT Genie G1 | Not published | — |
| AGIBOT Genie G2 | Not published | — |
| AGIBOT X2 | Official | AimDK_X2 is built on ROS 2 (Humble); ships a custom aimdk_msgs message package plus 'py_examples' and 'x2_rl_deploy_controller' ROS 2 nodes/topics for joint state, IMU and motion commands. |
| Agility Digit 5 | Not published | — |
| Apollo 2 | Not published | — |
| Astribot S1 | Official | ROS 1 and ROS 2 interfaces bridging sim and real robot. |
| Booster K1 | Not published | — |
| Booster T1 | Official | booster_ros2_interface (booster_robotics_sdk_ros2 repo) provides ROS 2 message/service definitions (LowState, MotorState, ImuState, etc.); the SDK's Fast DDS transport is compatible with ROS 2's DDS mechanism, and booster_deploy's real-robot path requires 'ROS 2 with booster_interface', already installed on the robot. |
| Booster T2 | Not published | — |
| Boston Dynamics Atlas | Not published | — |
| EngineAI PM01 | Not published | — |
| EngineAI T800 | Not published | — |
| Figure 03 | Not published | — |
| Fourier GR-3 | Not published | — |
| Galbot ET1 | Not published | — |
| Galbot G1 | Not published | — |
| HMND 01 Alpha Bipedal | Not published | — |
| HMND 01 Alpha Wheeled | Not published | — |
| iCub | Not published | — |
| IRON (next-generation) | Not published | — |
| LimX Luna | Not published | — |
| LimX Oli | Not published | — |
| MenteeBot V3 | Not published | — |
| NEO | Not published | — |
| Noetix Bumi | Not published | — |
| Noetix E1 | Not published | — |
| Noetix N2 | Not published | — |
| PAL Robotics KANGAROO | Official | kangaroo_robot (2.15.1/2.16.0), kangaroo_simulation (2.7.0) and kangaroo_moveit_config (2.2.2) are PAL's own GitHub repositories with humble-devel as the default (and, for kangaroo_robot, only non-fork) branch, ROS 2 Humble, bloom-released into the official ROS 2 Humble rosdistro index. No entries exist in the Jazzy (ROS 2) or Noetic (ROS 1) rosdistro indices; unlike TALOS, KANGAROO's repositories never had a ROS 1 branch, so ROS 2 Humble is the only distro it has ever officially supported. |
| PAL Robotics TALOS | Official | talos_robot (2.10.3), talos_simulation/talos_gazebo (2.0.3) and talos_moveit_config (2.0.4) are PAL's own GitHub repositories with humble-devel as the default branch (ROS 2 Humble), and are bloom-released into the official ROS 2 Humble rosdistro index. No entries exist in the Jazzy (ROS 2) or Noetic (ROS 1) rosdistro indices, and older kinetic-devel/indigo-devel (ROS 1) branches are stale, so ROS 2 Humble is the only currently supported distro. |
| Persona humanoid | Not published | — |
| Phantom | Not published | — |
| Pollen Robotics Reachy 2 | Official | Runs on ROS 2 Humble. The reachy2_core GitHub repo provides the full ROS 2 workspace: reachy_bringup, reachy_config, reachy_controllers, reachy_description (URDF), reachy_fake, reachy_gazebo, reachy_gazebo_gripper_glue, reachy_utils; Apache-2.0. The Python SDK sits on top of, and can be bypassed in favour of, the ROS 2 stack for advanced use. |
| ROBOTERA L7 | Official | SDK built on ROS 2 Humble + CycloneDDS (ROS_DOMAIN_ID=211). |
| ROBOTERA M7 | Official | robotera_vla targets M7 with ROS 2 Humble, ROS_DOMAIN_ID=211, rmw_cyclonedds_cpp. |
| ROBOTERA Q5 | Not published | — |
| Sprout | Not published | — |
| Torobo | Not published | — |
| Unitree G1 | Official | unitree_ros2 · Foxy, Humble |
| Unitree H1 | Official | unitree_ros2: DDS-based low-level control confirmed for H1 in the top-level README; example tree has a dedicated h1-2 low-level example and shared read_low_state_hg example for G1/H1/H1-2. |
| Unitree H2 | Official | unitree_ros2's example/src/src tree has a dedicated h2 folder (high_level, low_level: h2_ankle_swing_example.cpp, h2_loco_client.cpp), even though the repository's own introduction paragraph predates H2 and names only Go2/B2/H1. |
| Unitree R1 | Not published | — |
| Vega | Not published | — |
| Walker S2 | Not published | — |
Choose a distribution
A ROS distribution is a versioned set of packages that stays stable once released [6]. Two long-term-support distributions matter for humanoid work today: Humble Hawksbill, supported until May 2027 on Ubuntu 22.04, and Jazzy Jalisco, supported until May 2029 on Ubuntu 24.04 [7]. The newest release is Lyrical Luth (May 2026) [6].
- Use the distribution your robot's official packages are released for, as named in its row above. Unitree, for example, lists Foxy for Ubuntu 20.04 and recommends Humble on Ubuntu 22.04 [8].
- Match the operating system to the distribution: deb packages for Humble are built for Ubuntu Jammy (22.04) [9], those for Jazzy for Ubuntu Noble (24.04) [10].
- Plan the upgrade: Humble reaches end of life in May 2027 [7]. A new project that has no robot constraint can start on Jazzy.
Install ROS 2
Follow the official installation page for your distribution; it sets up the package repository and keys before installing. On Ubuntu 22.04 the documented desktop install for Humble is [9]:
sudo apt install ros-humble-desktop
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_cpp talkerFor Jazzy on Ubuntu 24.04 the package is ros-jazzy-desktop [10]. Source the setup file in every new terminal, or add it to your shell profile, but keep only one ROS distribution sourced at a time.
Connect to the robot
Most humanoids with ROS 2 support talk DDS over a wired Ethernet link to a computer on the robot's network. The details are the manufacturer's, so read their package's README; Unitree's unitree_ros2 is a representative example [8]:
- Connect the computer to the robot with an Ethernet cable and find the network interface it uses (for example enp3s0).
- Give that interface a static address on the robot's subnet; Unitree's instructions use 192.168.123.99 with mask 255.255.255.0.
- Select the DDS implementation the robot uses and bind it to that interface. Unitree robots use Cyclone DDS, set with RMW_IMPLEMENTATION=rmw_cyclonedds_cpp and a CYCLONEDDS_URI that names the interface.
- Source the manufacturer's workspace and list the robot's topics with ros2 topic list before sending any command.
ROS 2 picks Fast DDS by default when several implementations are installed [2], which is why robots that use another vendor ask you to set the implementation explicitly.
Send low-level commands only with the robot secured and an emergency stop within reach. Start by reading state topics; command topics can move joints at full torque.
Simulate before hardware
Every ROS 2 distribution has an officially paired Gazebo release (Gazebo Fortress for Humble), installed with ros-${ROS_DISTRO}-ros-gz [11]. Several humanoid makers publish MuJoCo models instead of, or as well as, Gazebo launch files; MuJoCo loads both MJCF and URDF [12]. Test controllers there first, with the same topics you will use on the robot.
From here, the ROS 2 topic hub collects the core documentation, and the sim-to-real hub explains how controllers move from simulation to hardware.