1. TIER MATRIX — who gets low-level SDK Verifiedquadruped.de
| AIR | PRO | EDU | |
|---|---|---|---|
| Speed | 0-2.5 (max 5) m/s | 0-3.5 | 0-3.7 |
| Payload | ~7 (max 10) kg | ~8 | ~8 (max 12) |
| Compute | none | 8-core CPU | 8-core + optional Jetson Orin dock |
| L1/L2 LiDAR | yes | yes | yes |
| Foot-force sensors | no | no | yes |
| Battery | 8000 mAh | 8000 | 15000 (2-4 h) |
| Low-level SDK / secondary dev | NO | NO | YES |
| 4G / Voice / wireless-position | no | yes | yes |
EDU is the only tier with out-of-box low-level joint control + full SDK + foot-force sensors.
LiDAR by model year: 2023-25 units ship the 4D L1 (USB-serial, unilidar_sdk); current
production ships the 4D L2 (Ethernet, unilidar_sdk2) on all trims — per a related reference §1.
AIR/PRO ship high-level Sport only. Unlock on AIR/PRO is community-documented (TheRoboVerse
firmware/secondary_development) — reportedly removes firmware speed/torque caps; unofficial,
warranty-risking Reported. 12 DOF (4 legs × hip/thigh/calf).
2. SDK — unitree_go + SportClient
- unitree_sdk2 (C++) Verified: latest release v2.0.2 (2025-07-07); GO2 examples in
example/go2/. - unitree_sdk2_python Verified: 739★; cyclonedds 0.10.2; SportClient/VuiClient/
ObstaclesAvoidClient/VideoClient; DDS pub-sub, hi+lo control, wireless-controller read, camera.
- Low-level Verified: publish
unitree_go::msg::LowCmdonrt/lowcmd, readrt/lowstate;
20-slot motor_cmd[] (GO2 uses first 12), each {mode,q,dq,tau,kp,kd}.
- ⚠️ JOINT-ORDER TRAP (mirrors the G1 reorder trap): hardware low-level order is FR-first
(0 FR_hip,1 FR_thigh,2 FR_calf, 3-5 FL, 6-8 RR, 9-11 RL) but legged_gym/RL configs are
FL-first (FL,FR,RL,RR) — remap policy output ↔ motor_cmd[] or sim2real fails ReportedVerified.
2a. SportClient API (from sport_client.hpp / .py) Verified — 0 = success
Damp 1001 · BalanceStand 1002 · StopMove 1003 · StandUp 1004 · StandDown 1005 (do BEFORE
ReleaseMode) · RecoveryStand 1006 · Euler(r,p,y) 1007 · Move(vx,vy,vyaw) 1008 · Sit 1009 ·
RiseSit 1010 · SpeedLevel 1015 · Hello 1016 · Stretch 1017 · Content 1020 · Dance1 1022 ·
Dance2 1023 · SwitchJoystick 1027 · Pose 1028 · Scrape 1029 · **FrontFlip 1030 · FrontJump 1031
· FrontPounce 1032 · Heart 1036 · StaticWalk 1061 · TrotRun 1062 · LeftFlip 2041 · BackFlip
2043 · HandStand 2044** · FreeWalk 2045 · FreeBound 2046 · FreeJump 2047 · FreeAvoid 2048 ·
ClassicWalk 2049 · WalkUpright 2050 · CrossStep 2051 · AutoRecoverySet/Get 2054/2055 ·
SwitchAvoidMode 2058. PathPoint struct for trajectory tracking. **Flips/handstand/upright/
dances = EDU-tier / advanced firmware.**
Other clients: VuiClient (LED/volume/brightness), ObstaclesAvoidClient, RobotStateClient,
AudioClient (TTS; GO2 additionally exposes audio rx via the WebRTC path — §3. G1 has mic input
too, via UDP multicast 239.168.123.161:5555 — a related reference), VideoClient, MotionSwitcherClient.
2b. Mode arbitration — release Sport before low-level Verified
(1) SportClient.StandDown() (lie down safe) → (2) MotionSwitcherClient SetTimeout(5.0),
Init(), ReleaseMode() (0=ok) → (3) publish your rt/lowcmd. Skip = two controllers fighting
= loss of control. Re-enable via SelectMode.
3. WEBRTC — the non-EDU control path (AIR/PRO/EDU, no jailbreak)
Official apps drive GO2 over WebRTC; community drivers replicate it:
- legion1581/go2_webrtc_connect Verified — 356★ MIT, the reference driver. 3 methods: LocalAP
(robot hotspot), LocalSTA (LAN by IP or by serial via multicast — Go2-only), Remote
(Unitree TURN + account). AES KEY WALL: fw <1.1.15 = static GCM key; **fw ≥1.1.15 = per-
device AES-128-GCM key** at /unitree/etc/key/aes_key.bin via cloud API. Serial B42D2000….
Exposes SportMode, LiDAR cloud+viz, low-level IMU/motor, audio (rx/playback/radio), video, VUI.
- legion1581/unitree_webrtc_connect (superset, PyPI) — Go2 fw 1.0.19-1.1.25+ AND G1
fw 1.2.0-1.5.1+ Verified.
- tfoldi/go2-webrtc — 190★, original reverse-engineering, now superseded Verified.
- Tokenless = one connection; token allows app+WebRTC simultaneously Reported.
4. ROS 2 + AUTONOMY
- unitree_ros2 (official) Verified: Go2/B2/H1/G1/H1-2; pkgs unitree_go / unitree_hg / unitree_api;
topics rt/lowstate, rt/sportmodestate, rt/lowcmd, rt/wirelesscontroller; Humble recommended.
- abizovnuralem/go2_ros2_sdk Verified — 981★, the popular all-in-one: WebRTC OR CycloneDDS, joint
state, IMU + LiDAR cloud + camera, joystick, **slam_toolbox + Nav2 + COCO detection + Foxglove
key via unitree-fetch-aes-key.
- jizhang-cmu/autonomy_stack_go2 Verified — 507★, SLAM+autonomy on built-in L1 LiDAR + IMU only
(Point-LIO + CMU AEDE + FAR Planner). Smart-joystick / waypoint / manual.
- CHAMP stacks (Jazzy+Gazebo): RobInLabUJI, khaledgabr77; legubiao/quadruped_ros2_control (OCS2
MPC + RL); Sayantani-Bhattacharya/unitree_go2_nav Reported.
5. RL / SIM
- unitree_rl_gym Verified: Go2/H1/H1_2/G1.
train.py --task=go2; sim2sim deploy_mujoco.py;
sim2real deploy_real.py {iface} {config} via unitree_sdk2py → rt/lowcmd. Go2 cfg: 12 DOF,
num_obs 42, stiffness 25, damping 0.6, action_scale 0.25, decimation 4.
- unitree_mujoco Verified: Go2 MJCF
unitree_robots/go2/. **⚠️ DDS DOMAIN: sim=domain 1, real=
domain 0** (vs the G1 sim-lab which uses iface isolation — for GO2 use the domain-id split; iface
lo local). Same-code sim↔real = the a related reference pattern.
- abizovnuralem/go2_omniverse Verified — 1000★+, Isaac Lab/Sim (Go2+G1), PPO, RTX LiDAR/cam/IMU→
ROS2, digital twin, Nav2+SLAM.
- Pretrained/ported: Teddy-Liao/walk-these-ways-go2 Verified (MoB gait-conditioned, off sdk2);
go2_dreamwaq / Dreamwaq (blind-terrain); alexeiplatzer mjx-rl; darshmenon quadruped-dog-rl Reported.
6. SENSORS / MEDIA
- L1/L2 LiDAR — model-year split (a related reference §1): 2023-25 units = 4D L1 (USB-serial) →
unilidar_sdk Verified (139★, C++/ROS/ROS2); current production = 4D L2 (Ethernet) →
unilidar_sdk2. On-robot topics rt/utlidar/cloud (PointCloud2), rt/utlidar/imu,
switch rt/utlidar/switch Reported.
- Front camera Reported: H.264 over UDP multicast 230.1.1.1:1720, 1280×720. GStreamer
udpsrc address=230.1.1.1 port=1720 … rtph264depay ! h264parse ! avdec_h264. Or
VideoClient.GetImageSample().
- Voice persona "BenBen" (GPT-3.5) Reported.
7. AGENTIC / MCP
- lpigeon/unitree-go2-mcp-server Verified — 86★, built for Claude Desktop (claude_desktop_
config.json), NL→ROS2 (reads /wirelesscontroller, drives cmd). = the GO2 Claude agent. Needs
unitree_ros2, Humble/Foxy.
- wso2-incubator/unitree-go2-realtime-agent (OpenAI Realtime voice, EDU) Reported; ros-claw
unitree-mujoco-mcp + unitree-sdk2-mcp (cross-robot, also R1) Verified.
8. OPS FACTS (verify per unit)
- Subnet 192.168.123.x; robot MCU = .161 (don't take it); host NIC
.99/24. EDU Jetson dock
= Orin Nano ~40 TOPS; onboard Jetson SSH 192.168.123.18 unitree/123 Reportedverify.
- Max joint torque ~45 N·m, weight ~15 kg, max step ~16 cm, climb 40°.
- Firmware traps: AES key wall (fw ≥1.1.15), joint-state ~1 Hz throttle, secondary-dev unlock on
AIR/PRO, serial-number multicast discovery is Go2-only.
8a. E-STOP / EMERGENCY DAMP (added 2026-07-16)
- Software kill =
SportClient.Damp()(api id 1001) Verified§2a — joints go passive, robot
collapses in place. StopMove() (1003) Verified§2a halts locomotion but keeps balance active —
it is a soft stop, NOT a damp.
- Controlled shutdown discipline:
StandDown()(1005) before MotionSwitcherClient
ReleaseMode() Verified§2a/§2b — never release Sport while the robot is standing.
- After any damp, remember AutoRecovery (2054/2055) Verified§2a may be configured to stand the
robot back up — check/disable before gantry or bench work Not established exact post-damp behavior —
verify on unit.
- Remote e-stop combo (e.g. an L2+B damp chord as on other Unitree remotes) Not established — not
source-cited for GO2 in this doc; verify on unit before relying on it.
- App soft-stop (official app over the §3 WebRTC path) Not established — verify on unit.
8b. GLASS TABLE — per-joint limits (official URDF) Verified
Source: unitreerobotics/unitree_ros → robots/go2_description/urdf/go2_description.urdf
(raw.githubusercontent.com/unitreerobotics/unitree_ros/master/robots/go2_description/urdf/
go2_description.urdf, fetched 2026-07-16). 12 revolute joints; limits identical across legs
except the front/rear thigh ranges.
| Joint (×4 legs FR/FL/RR/RL) | Position range (rad) | Effort (N·m) | Velocity (rad/s) |
|---|---|---|---|
| hip (all 4) | -1.0472 … +1.0472 (±60°) | 23.7 | 30.1 |
| thigh FRONT (FR/FL) | -1.5708 … +3.4907 (-90°…+200°) | 23.7 | 30.1 |
| thigh REAR (RR/RL) | -0.5236 … +4.5379 (-30°…+260°) | 23.7 | 30.1 |
| calf (all 4) | -2.7227 … -0.83776 (-156°…-48°) | 45.43 | 15.70 |
Calf is the strong joint (45.43 N·m — matches the "~45 N·m max torque" figure above); hips and
thighs are 23.7 N·m units. Calf range never crosses zero (always bent). These are URDF limits —
firmware clamps per tier may be tighter Not established.
9. PAPERS (2024-26) Reported
Helpful DoggyBot (2410.00231, Finray gripper + VLM fetch), Playful DoggyBot (2409.19920),
Jailbreaking LLM-Controlled Robots / RoboPAIR (2410.13691 — jailbroke the GPT-3.5 Go2),
SoloParkour (2409.13678), StairMaster (2606.25765), PA-LOCO (2407.04224), SigLoMa (2605.03846).
10. FIRST-CLONE LIST + G1→GO2 DIFFS THAT BITE
Clone: official unitree_sdk2 + _python + unitree_ros2 → then abizovnuralem/go2_ros2_sdk (ROS2
all-in-one) + legion1581/go2_webrtc_connect (non-EDU parity). Diffs: unitree_go vs
unitree_hg; SportClient vs LocoClient; FR-first low-level order (RL is FL-first → remap);
sim = DDS domain 1; AES key for WebRTC on modern fw; ladderman = NOT a GO2 repo (it's the G1
climbing paper — a related reference §8). ⚠️ UniPwn BLE vuln applies to GO2 too (a related reference §7 / fleet security).
Maintained by MCM Robotics, the official Unitree Robotics distributor for South Africa. This is our own engineering documentation: it is not Unitree's official documentation and is not endorsed by Unitree. Trademarks belong to their respective owners. Provided as-is, without warranty. Found an error? Tell us and we will correct it.