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.
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()
| 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.