Skip to content
WE BUILDHUMANOIDS

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.

ROS 2 support by robot, from each robot's sourced development table.
ROBOTROS 2PACKAGES AND DISTRIBUTIONS
4NE1 Gen 3.5OfficialROS 2 interface
4NE1 MiniOfficialROS 2 interface
AGIBOT A2 (A2 Ultra / A2 Lite)Not published—
AGIBOT A2-WNot published—
AGIBOT A3Not published—
AGIBOT A3 UltraNot published—
AGIBOT Genie G1Not published—
AGIBOT Genie G2Not published—
AGIBOT X2OfficialAimDK_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 5Not published—
Apollo 2Not published—
Astribot S1OfficialROS 1 and ROS 2 interfaces bridging sim and real robot.
Booster K1Not published—
Booster T1Officialbooster_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 T2Not published—
Boston Dynamics AtlasNot published—
EngineAI PM01Not published—
EngineAI T800Not published—
Figure 03Not published—
Fourier GR-3Not published—
Galbot ET1Not published—
Galbot G1Not published—
HMND 01 Alpha BipedalNot published—
HMND 01 Alpha WheeledNot published—
iCubNot published—
IRON (next-generation)Not published—
LimX LunaNot published—
LimX OliNot published—
MenteeBot V3Not published—
NEONot published—
Noetix BumiNot published—
Noetix E1Not published—
Noetix N2Not published—
PAL Robotics KANGAROOOfficialkangaroo_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 TALOSOfficialtalos_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 humanoidNot published—
PhantomNot published—
Pollen Robotics Reachy 2OfficialRuns 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 L7OfficialSDK built on ROS 2 Humble + CycloneDDS (ROS_DOMAIN_ID=211).
ROBOTERA M7Officialrobotera_vla targets M7 with ROS 2 Humble, ROS_DOMAIN_ID=211, rmw_cyclonedds_cpp.
ROBOTERA Q5Not published—
SproutNot published—
ToroboNot published—
Unitree G1Officialunitree_ros2 · Foxy, Humble
Unitree H1Officialunitree_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 H2Officialunitree_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 R1Not published—
VegaNot published—
Walker S2Not 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 talker
Humble on Ubuntu 22.04: install, source the environment, run the talker demo (from the official instructions).

For 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]:

  1. Connect the computer to the robot with an Ethernet cable and find the network interface it uses (for example enp3s0).
  2. 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.
  3. 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.
  4. 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.