OPENZROB

宇树 G1 EDU 开发说明

平台第二台机器人采用 G1 EDU 23 自由度模型。用户在本地安装、导入和调用宇树官方 unitree_sdk2_python;平台提供物理仿真、外接相机、DDS 桥接和任务验收。识别、导航与任务状态机由用户编写。

官方资料与版本

使用流程

  1. 安装平台 0.4.0 或更高版本桥接,选择“宇树 G1 EDU”并连接。旧版桥接仅支持 Bumi。
  2. 登录网页,选择宇树 G1 EDU,再进入任务场景。看到“桥接:已连接”后运行程序。
  3. 按宇树文档安装官方 SDK。Linux 官方常规安装方式如下;依赖与编译要求以官方仓库说明为准。
git clone https://github.com/unitreerobotics/unitree_sdk2_python.git
cd unitree_sdk2_python
pip3 install -e .
  1. 下载本关开发模板 g1_student.py。默认只查询状态,不自动完成任务。
python3 g1_student.py --interface lo --domain 0

这是 SDK、桥接均在同一台 Linux 机器上的示例。桥接与 SDK 的 DDS domain 必须一致。SDK 位于 WSL、虚拟机或另一台机器时,lo 不会连接宿主机,需要按官方 DDS 网络方式配置双方可达的网卡。

本项目的 Windows 开发验证使用原版 SDK 源码、Python 3.12 和 CycloneDDS 11.0.1;官方仓库依赖声明是 CycloneDDS 0.10.2,因此此验证环境不等于官方对 Windows 的支持承诺。Windows 回环网卡示例为 --interface "Loopback Pseudo-Interface 1"。该版本 SDK 会写入 /tmp/cdds.LOG,Windows 下需要在当前驱动器创建 tmp 目录。不要修改 SDK 的客户端接口来适配平台。

高层运动开发

与官方示例一样,先初始化 DDS,再创建、初始化 LocoClient。仿真修改的是网络连接目标;导入路径、方法名称、参数及返回码协议保持官方格式。

from unitree_sdk2py.core.channel import ChannelFactoryInitialize
from unitree_sdk2py.g1.loco.g1_loco_client import LocoClient

ChannelFactoryInitialize(0, "lo")
robot = LocoClient()
robot.SetTimeout(3.0)
robot.Init()
code, fsm = robot.GetFsmId()
# 按用户程序的决策调用:
# robot.Start()
# code = robot.SetVelocity(vx, vy, omega, duration)
# robot.StopMove()

速度单位为 m/s、rad/s,不是 Bumi 的归一化摇杆量。平台当前范围:前后 ±0.6 m/s、横向 ±0.3 m/s、转向 ±0.5 rad/s。SetVelocity 的 duration 到期后停止;Move 和 StopMove 调用同一套官方速度 API。Start 为 FSM 500,Damp 为 1,ZeroTorque 为 0。未实现功能返回 3203,参数不合法返回 3204,未处于允许的控制模式返回 3202。

G1 公开步态在零速度下仍会原地踏步维持平衡。停车验收衡量一个 0.8 秒步态周期内的机体位移速度,并要求程序给出零速度,不能靠键盘获得通关积分。

底层关节开发

遵循官方开发顺序:订阅状态 → 获取 mode_machine → MotionSwitcherClient.ReleaseMode() 释放运动服务 → 周期发布带 CRC 的 LowCmd_。重新启用运动服务使用 SelectMode("sport") 或网页复位。

通道 官方类型 当前支持
rt/lowcmd unitree_hg.msg.dds_.LowCmd_ PR 坐标下 23 个关节的位置、速度、力矩、kp、kd
rt/lowstate unitree_hg.msg.dds_.LowState_ 关节、骨盆 IMU、tick、CRC
rt/odommodestate unitree_go.msg.dds_.SportModeState_ 仿真位置、速度、骨盆姿态
rt/secondary_imu unitree_hg.msg.dds_.IMUState_ 躯干 IMU 姿态、角速度和加速度
rt/api/sport/request、response unitree_api.msg.dds_.Request_ / Response_ 上述 LocoClient 子集
rt/api/motion_switcher/request、response 同上 CheckMode、ReleaseMode、SelectMode("sport")

23 自由度版本保留官方稀疏编号:左腿 0–5、右腿 6–11、腰 12、左臂 15–19、右臂 22–26。消息仍有 35 个电机槽位,其余关节不在本型号上。mode_pr=0;请使用状态消息中的 mode_machine,当前仿真值为 0。消息 CRC 按官方 C 结构体布局计算,不等于 CDR 字节流的 CRC。低层流超过 500 ms 未更新后进入阻尼。

状态由浏览器物理帧更新,桥接约 50 Hz 发布。真实硬件时序、温度、电池、电机告警和触觉未模拟;保留字段为零,不应当作真实硬件测量。

相机与任务

平台相机是附加的虚拟 RGB 相机。所有场景均配备前视、下视两路相机,两路光心均安装在头部前缘向前 5 cm;网页同时显示两个画面。本机桥接 /v1/camera、/v1/camera/info 提供当前任务指定的相机画面和标定;可使用平台 bumi_sim.py 的相机读取适配器,它不是宇树 SDK 模块。相机标定返回实际安装坐标。它不模拟 G1 的 RealSense、激光雷达或真机视频服务。

五个任务顺序不变:运动控制 → 视觉巡线 → 人物跟随 → 指令卡交互 → 综合返航。Bumi 与 G1 分别保存解锁、通关和积分。

当前不支持 AB 并联电机坐标、rt/arm_sdk、灵巧手、音频、真机相机服务、坐下、起身恢复或固件手势。官方 Python SDK 的公开调用可以直接使用,但只有上面列出的功能在仿真中实现。迁移到真机仍需按官方手册选择硬件版本、网卡和开发模式,并重新验证控制参数;仿真不保证真机运动效果相同。

项目内复现

python scripts/import-g1.py /path/to/unitree_rl_gym
python scripts/extract-g1-schema.py /path/to/unitree_sdk2_python
node node_modules/tsx/dist/cli.mjs scripts/test-g1-walking.ts
python dds/adapter.py --robot g1 --domain 0

导入器生成模型、网格、ONNX 与元数据;修改导入器后重新生成,不手改这些产物。桥接只包含消息类型描述,不捆绑或替换宇树 SDK。