Platform reference

Unitree Go2 — Technical Reference

Compute tiers, network and DDS layout, SportClient control surface, sensing options and the practical limits of the Go2 quadruped.

FACTS VERIFIED 6 AUG 2026 · 6 MIN READ

Reference, not instruction. Confidence tags mark how each claim was established: VerifiedReportedInferredNot established. Firmware and SDKs move: re-verify anything you are about to act on against the code you have. These are heavy machines, see the Product Safety Notice.

1. TIER MATRIX — who gets low-level SDK Verifiedquadruped.de

AIRPROEDU
Speed0-2.5 (max 5) m/s0-3.50-3.7
Payload~7 (max 10) kg~8~8 (max 12)
Computenone8-core CPU8-core + optional Jetson Orin dock
L1/L2 LiDARyesyesyes
Foot-force sensorsnonoyes
Battery8000 mAh800015000 (2-4 h)
Low-level SDK / secondary devNONOYES
4G / Voice / wireless-positionnoyesyes

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::LowCmd on rt/lowcmd, read rt/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

  • multi-robot + foot-force**. Humble/Iron/Rolling. Joint states ~1 Hz cap on fw ≥1.1.7; AES
  • 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_rosrobots/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.730.1
    thigh FRONT (FR/FL)-1.5708 … +3.4907 (-90°…+200°)23.730.1
    thigh REAR (RR/RL)-0.5236 … +4.5379 (-30°…+260°)23.730.1
    calf (all 4)-2.7227 … -0.83776 (-156°…-48°)45.4315.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.

    Buying or specifying

    We import, commission and support these robots.

    Official distributor for South Africa. Talk to the people who wrote this page.

    View the fleet Talk to us →