宇树 Unitree SDK 集成
概念速览
- Unitree SDK:宇树官方 Python / C++ 客户端,控制 G1 / H1 / Go2 / B2 / Z1 等机型
- 两代并存:SDK2 (新) 用 DDS 走 UDP/以太网,SDK1 (旧) 用自研 RPC over UDP
- 通信方式:以太网直连 (网线) / 路由器 (DHCP) / WiFi (Go2 自带热点)
- 关键包:
unitree_sdk2py(Python 3.8+) ·unitree_sdk2(C++)
SDK1 vs SDK2
| 项 | SDK1 (旧) | SDK2 (新, 2024+) |
|---|---|---|
| 协议 | 自研 RPC | DDS (与 ROS 2 同协议) |
| 机型 | Go1 / 旧 Go2 | G1 / H1 / 新 Go2 / B2 / Z1 |
| 实时性 | 1 kHz | 1 kHz |
| Python 包 | unitree_legged_sdk | unitree_sdk2py |
| ROS 2 桥 | 需手写 adapter | 原生 DDS topic |
| 推荐 | 仅维护旧项目 | 新项目默认 SDK2 |
安装 SDK2 (Python)
# 1. 创建 conda 环境 (避免污染系统 Python)conda create -n unitree python=3.10 -yconda activate unitree
# 2. 装 SDK2pip install unitree_sdk2py
# 3. 装 CycloneDDS (SDK2 默认用这个 RMW)sudo apt install ros-${ROS_DISTRO}-rmw-cyclonedds-cppexport RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
# 4. (可选) 装 unitree_ros2 — 把 SDK 桥到 ROS 2 topicmkdir -p ~/unitree_ws/src && cd ~/unitree_ws/srcgit clone https://github.com/unitreerobotics/unitree_ros2.git -b ironcd ~/unitree_ws && rosdep install --from-paths src --ignore-src -r -ycolcon build --symlink-install物理连接
flowchart LR
A["宇树 G1 / H1<br/>IP: 192.168.123.x<br/>静态"]
B["PC / 工控<br/>192.168.123.99"]
A <-->|以太网直连| B
# PC 端配同网段sudo ip addr add 192.168.123.99/24 dev eth0ip route add 192.168.123.0/24 dev eth0
# ping 测试ping 192.168.123.161 # G1 默认 IP最小 Python 控制示例 (SDK2)
"""G1 站立 + 挥手示例"""from unitree_sdk2py.core.channel import ChannelFactoryInitializefrom unitree_sdk2py.g1.loco.g1_loco_client import LocoClient
# 1. 初始化 DDS 通道ChannelFactoryInitialize(0, "192.168.123.99") # 0 = domain 0
# 2. 创建运动控制客户端loco = LocoClient()loco.SetTimeout(3.0)loco.Init()
# 3. 站起来loco.Start()
# 4. 挥手 (左手)loco.WaveHand()
# 5. 蹲下loco.Squat()常见机型 IP 默认值
| 机型 | 默认 IP (机器人) | 网口 |
|---|---|---|
| G1 | 192.168.123.161 | ETH0 (背部) |
| H1 | 192.168.123.161 | ETH0 (背部) |
| Go2 | 192.168.123.18 | WiFi 热点 Unitree_Go2_xxxx |
| B2 | 192.168.123.18 | ETH0 |
| Z1 (机械臂) | 192.168.123.121 | ETH0 |
进阶
- 多机协同:改
ROS_DOMAIN_ID(0-232) + 改 PC IP 段 (192.168.123.y) - VLA 接入:把
LocoClient.Move(vx, vy, omega)替换为Octo / OpenVLA输出 - 仿真对接:
unitree_ros2的simtopic 直接桥接 Isaac Sim / MuJoCo - 云端控制:用 Tailscale / ZeroTier 把 SDK2 暴露到公网 (注意延迟 50ms+)
📋 复现条件
| 类别 | 必备 | 备注 |
|---|---|---|
| 硬件 | 宇树 G1 / H1 / Go2 (任一) · 千兆网线 · Linux PC | Windows 不支持 DDS |
| 操作系统 | Ubuntu 22.04 / 24.04 (LTS) | Mac 缺 CycloneDDS 编译链 |
| 软件版本 | Python 3.10+ · ROS 2 Humble/Iron/Jazzy · CycloneDDS | Docker 镜像 unitree/ros2 |
| 网络 | 192.168.123.0/24 直连 (机器人) | 路由器需禁 AP 隔离 |
| 账号 | 无 | 宇树 GitHub 公开仓库 |
| 时间 | SDK 装 30 min · DDS 配通 20 min · 跑通 WaveHand 1 h | Sim2Real 1 周 |
| 难度 | ⭐⭐⭐ 中 | DDS 概念 + ROS 2 基础 |
| 预算 | 宇树机器 ¥100,000+ | 二手 G1 EDU ¥85,000 |
⛔ 别这么做 (Anti-patterns)
经验证的坑 —— 跳过 = 至少浪费半天,严重的烧板 / 锁机。
| ❌ 错误做法 | 💥 后果 | ⚠️ 风险 | 范围 |
|---|---|---|---|
| 不要把 SDK2 与 SDK1 在同一项目混用 | 两套 RPC 协议互不兼容,话题会断。 | 🟡 | G1 / H1 / Go2 |
| 不要在 WiFi 模式下跑低延迟控制 | WiFi 抖动 10-50 ms = G1 摔倒。永远用网线。 | 🔴 | 所有宇树机型 |
不要用 pip install unitree_legged_sdk 装给 G1 | 老 SDK 完全没有 G1 驱动,会 ImportError。 | 🟡 | G1 / H1 |
不要在没设 RMW_IMPLEMENTATION 的情况下用 SDK2 + ROS 2 | 默认 FastDDS 与 SDK2 CycloneDDS 互不认,话题隔离。 | 🟡 | SDK2 + ROS 2 桥接 |
| 不要在真机启用 SDK 之前不接急停按钮 | 失控 = 撞人 / 撞墙。永远物理急停触手边。 | 🔴 | 所有真机 |
| 不要把机器人 IP 设在 192.168.1.x (家用网段) | 与路由器 DHCP 冲突。永远用 192.168.123.x。 | 🟢 | 所有宇树机型 |
🚨 风险总览 (Risk Matrix)
| 风险等级 | 含义 | 例子 |
|---|---|---|
| 🟢 低 | 改错可回滚 / 几分钟恢复 | IP 段冲突,IP 写死 |
| 🟡 中 | 需要重新刷机 / 重装 / 1-2 小时恢复 | SDK 混用,RMW 没配 |
| 🔴 高 | 不可逆 / 烧板 / 安全风险 | WiFi 跑控制,没急停 |