Skip to content

Unitree G1

29 joints over CycloneDDS. Motion is gated by the robot's FSM: a command outside the allowed FSM state is refused by name, never sent.

python3 -m pip install "strands-robots[unitree]"
from strands_robots import Robot

g1 = Robot("g1", mode="real", port="eth0")   # the DDS network interface
obs = g1.observe()                        # 29 joints; imu, battery, fsm_id in sensors
print(obs.sensors["fsm_id"])              # the current FSM id
g1.act({"left_shoulder_pitch": 0.1})     # arm joints only in the arm FSM
g1.close()
from strands_robots import Robot

g1 = Robot("g1", mode="sim")             # the MuJoCo model, same joint table
fact value
wire DDS lowstate / lowcmd, motion switcher RPC 7001
joints the 29-joint table, ported verbatim from the bench
native frame radians
policy loop run_policy at 500 Hz on the driver's own clock
whole body make_policy("wbc") (ONNX, gait=True for walking)

go2 shares the DDS engine with sport-mode verbs. Both require the vendor SDK on the control host; doctor reports it.