GR00T-WholeBodyControl 总览#

1. 这个仓库是什么#

GR00T-WholeBodyControl 是 NVIDIA GEAR 团队的人形机器人全身控制代码库,目标平台是 Unitree G1(29 DoF,带灵巧手时 43 DoF)。它不是一个单一模型,而是三条并列的技术路线外加一套共享的部署/遥操作基础设施:

子项目 定位 状态 详细文档
Decoupled WBC 下半身 RL + 上半身 IK 的解耦控制器,GR00T N1.5 / N1.6 实际使用的方案 2025-11 首发 Decoupled WBC 架构
GEAR-SONIC 通用 token 全身控制器,单一策略统管全身,兼作 VLA 的动作空间 2026-02 发布,训练码 2026-04 开源 GEAR-SONIC 架构
MotionBricks 实时隐式生成模型,15,000 FPS 零样本运动合成 2026-04-27 预览 MotionBricks 架构

理解这个仓库的关键是抓住分层:MotionBricks 生成"要做什么运动",SONIC 或 Decoupled WBC 负责"把这个运动执行出来",最上层还可以挂一个 VLA(GR00T N1.7)来决定"该做什么任务"。

graph TB subgraph L3["任务层"] VLA["Isaac-GR00T N1.7 (VLA)
2.5 Hz · 78 维动作
= 64 token + 7 左手 + 7 右手"] HUMAN["人类遥操作
VR / Pico / 键盘 · 20 Hz"] end subgraph L2["运动生成层"] MB["MotionBricks
VQVAE + Root + Pose
PyTorch, 研究/离线"] PLANNER["SONIC Kinematic Planner
ONNX, C++ 部署形态"] end subgraph L1["全身控制层 (二选一)"] SONIC["GEAR-SONIC
Universal Token 策略
50 Hz · 单一策略管全身"] DWBC["Decoupled WBC
下半身 RL + 上半身 IK
50 Hz · 上下分治"] end subgraph L0["机器人"] G1["Unitree G1
29 DoF (+14 手指)
PD 控制 · DDS / MuJoCo"] end VLA -->|64 维 token| SONIC HUMAN -->|SMPL / VR-3pt| SONIC HUMAN -->|IK 目标 + 速度指令| DWBC MB -->|qpos 序列| SONIC PLANNER -->|qpos 序列| SONIC SONIC --> G1 DWBC --> G1 style SONIC fill:#e8f5e9 style DWBC fill:#e1f5ff style MB fill:#fff4e1

2. 两条控制路线的分野#

Decoupled WBC 和 GEAR-SONIC 解决的是同一个问题,但假设完全不同。

2.1 核心差异#

维度 Decoupled WBC GEAR-SONIC
控制结构 腰部劈开:下半身 RL(ONNX)+ 上半身 QP-IK 单一 RL 策略输出全部 29 DoF
上半身反馈 —— 开环插值 IK 目标 有 —— 全身状态进策略观测
上下耦合 4 个显式通道:q_armsbase_height_command、躯干相对腰部 RPY、navigate_cmd 隐式,统一潜空间
指令接口 关节角目标 + (vx, vy, ωz) 速度指令 64 维运动 token
观测维度 86 × 6 = 516 因配置而异,token 版策略约 154 维
策略数量 2 个(‖cmd‖ < 0.05 时切站立,否则切行走) 1 个
训练码 不在仓库内(仅发布 ONNX) 开源,Isaac Lab + PPO,4096 环境
运动能力 稳态操作、行走 + 手臂作业 走、爬、大幅度全身动态动作
末端精度 高 —— 由 QP 求解器直接保证 较低 —— 受策略跟踪误差影响
可解释性 高 —— 每层都能单独观察 低 —— token 不可直接解读
用于 GR00T N1.5 / N1.6 N1.7 及之后的 VLA 动作空间

2.2 该选哪个#

两者不是迭代替换关系,在仓库里是并列维护的。


3. 三个子项目的关键数字速查#

3.1 Decoupled WBC#

控制频率 / 仿真频率 / 遥操作频率 50 / 200 / 20 Hz
单帧观测 86 维(3 cmd + 1 height + 3 躯干 RPY + 3 ω + 3 gravity + 29 q + 29 dq + 15 last action)
观测历史 6 帧 → 516 维
动作 15 维(12 腿 + 3 腰)× action_scale 0.25 + default_angles
ONNX 策略 GR00T-WholeBodyControl-Balance.onnx / -Walk.onnx(配置里为 ft92.onnx / ft109.onnx)
策略切换阈值 ‖cmd‖ < 0.05
默认基座高度 0.74 m
IK 求解 pink + pinocchio + qpsolvers(quadprog),dt 0.05,3 步/帧
IK 代价 手部 position 8.0 / orientation 2.0 / lm_damping 3.0,posture_cost 0.01
数据导出 43 维(29 身体 + 14 手指),LeRobot 格式

3.2 GEAR-SONIC#

Token 2 个 × 32 维 = 64,每维 FSQ 量化 32 级
编码器 3 个(g1_mf_mlp / teleop_mlp / smpl_mlp),均 MLP [2048,1024,512,512] + SiLU
解码器 g1_dyn_mlp(上真机,6 层最宽 2048)、g1_kin_mf_mlp(仅辅助损失)
辅助损失 g1_recon 0.01;4 项潜空间对齐各 1.0
训练 Isaac Lab ManagerBasedRLEnv,4096 环境,PPO,100k iter
学习率 actor 2e-5 / critic 1e-3,adaptive desired_kl 0.01
前瞻 默认 10 帧 × 20 ms ≈ 200 ms;低延迟版 4 帧 ≈ 80 ms
跟踪奖励参考点 torso_link(+0.5 m)、双 wrist_yaw_link
部署 C++ / TensorRT,model_encoder.onnx + model_decoder.onnx + observation_config.yaml
输入接口 keyboard / gamepad / zmq / ros2 / manager

3.3 MotionBricks#

合成吞吐 15,000 FPS 零样本
运动表征 DualRootGlobalJoints 418 维 = 409 body + 5 global root + 4 local root
骨架 G1Skeleton34(32 G1 关节 + 2 虚拟脚趾)
VQVAE 码本 nb_code = 1e8 = 每头 10 码 × 8 头,code_dim 256 → 每头 32 维
Token 数范围 6 – 16
Root 模型 n_embd 512,3 层共享 + 3 层 root-token,不看文本
Pose 模型 n_embd 1024,16 层,masked_token_ratio 0.8,文本概率 0.2
Checkpoint 合计 ~2.2 GB(pose 1.6 GB 占大头)
论文 arXiv:2604.24833

4. 共享基础设施#

三条路线共用同一套外围,理解它们能省很多调试时间。

4.1 坐标系与关节序#

这是跨子项目最容易踩的坑:

空间 Up Forward 四元数
Isaac Lab / MuJoCo Z X wxyz
SMPL / BVH Y
scipy Rotation xyzw
MotionBricks 运动空间 Y Z

详见 docs/source/references/conventions.md

4.2 MuJoCo qpos 36 维#

贯穿 MotionBricks 输出、SONIC 规划器输入输出的通用格式:

索引 内容
0–2 根平移 (x, y, z),Z-up 世界系
3–6 根四元数 (w, x, y, z)
7–35 29 个关节角(弧度,MuJoCo body 树序)

4.3 遥操作栈#

VR(Apple Vision Pro / Pico / CloudXR)→ 头 + 双手 6D 位姿 + 手指 (25, 4, 4)。两条路线的用法不同:

激活流程一致:按 ltoggle_activation → 倒计时 → calibrate() 记录基准姿态;按 k 重置。

4.4 数据采集与 VLA 工作流#

graph LR A["1. 采集
VR 遥操作
launch_data_collection.py"] --> A2["process_dataset.py
清洗丢弃 episode"] A2 --> B["2. 微调
Isaac-GR00T N1.7"] B --> C["3. 部署
launch_inference.py
PolicyServer + SONIC"]

产出标准 LeRobot v2.1 数据集:

outputs/<timestamp>-G1-robot01/
├── data/train-00000.parquet
├── videos/observation.images.ego_view/episode_000000.mp4
└── meta/{info,modality,episodes,tasks}.json(l)

官方建议单任务 50–100 条演示。采集时按 x 标记丢弃,采集后必须跑 process_dataset.py 清掉这些 episode 和残留的 SMPL 帧。

VLA 的动作空间是 78 维 = 64 维 SONIC token + 7 维左手 + 7 维右手,推理 2.5 Hz、每次出 40 步,由 SONIC 以 50 Hz 解码 —— 正好填满 20 倍频率差。

4.5 真机部署要点#

Docker 镜像 docker.io/nvgear
机器人静态 IP 192.168.123.222 / 255.255.255.0
相机服务器 192.168.123.164
tmux 会话 g1_deployment(scripts/deploy_g1.py 分窗格拉起)
SONIC 构建 just build,just run g1_deploy_onnx_ref <iface> <model> <motion_dir>
日志 CSV @50 Hz:base_quat / base_ang_vel / torso_quat / torso_ang_vel / q / dq / action
可视化 visualize_motion.py --realtime_debug_url tcp://localhost:5557(4 个机器人:目标彩色 / 零平移绿 / 实测红 / 温度热力图)

5. 仓库结构#

GR00T-WholeBodyControl/
├── decoupled_wbc/          # 路线一:RL 下半身 + IK 上半身
│   ├── control/
│   │   ├── policy/         # 解耦策略、ONNX RL、插值、遥操作
│   │   ├── teleop/         # IK 求解器栈 (pink/pinocchio)
│   │   ├── envs/g1/        # G1Env
│   │   └── main/teleop/    # ROS 控制循环 + 配置
│   └── sim2mujoco/         # MuJoCo 资产与**实际加载的** RL 配置
├── gear_sonic/             # 路线二:训练侧 (Python / Isaac Lab)
│   ├── config/             # Hydra 配置树 (exp / actor_critic / encoder / decoder / algo)
│   ├── trl/modules/        # UniversalTokenModule 等
│   └── scripts/            # 数据采集、评估、推理启动
├── gear_sonic_deploy/      # 路线二:部署侧 (C++ / TensorRT / ONNX)
├── motionbricks/           # 路线三:运动生成
│   ├── motionbricks/       # 模型代码 (vqvae / motion_backbone)
│   ├── out/                # 三个 checkpoint 及其 config.yaml
│   ├── docs/               # 运动表征文档
│   └── scripts/            # 交互式 demo
├── docs/source/            # Sphinx 文档 (references / tutorials / user_guide)
├── external_dependencies/  # 外部依赖
├── install_scripts/        # 环境安装
└── download_from_hf.py     # 从 HuggingFace 拉模型

6. 阅读顺序建议#

如果是第一次看这个仓库:

  1. 先读 Decoupled WBC —— 结构最简单、每一层都能对应到具体的物理量,读完就理解了 G1 的观测/动作接口、PD 控制、遥操作 IK 这些共性概念。
  2. 再读 GEAR-SONIC —— 带着上一步建立的接口直觉,去看"如果不分治、全部交给一个策略,该怎么设计潜空间"。重点是 §2.4 的辅助损失表(对齐 1.0 vs 重建 0.01)。
  3. 最后读 MotionBricks —— 它与控制无关,是纯生成模型;但它的 qpos 输出格式和 SONIC 规划器完全一致,读完能把整条"生成 → 跟踪"链路串起来。

如果目标是接 VLA,可以跳过 Decoupled WBC,直接读 GEAR-SONIC 的 §2.1(token 从哪来)和 §5(与 VLA 的连接)。


7. 与其他 VLA 工作的关系#

项目 与 GR00T-WBC 的关系
Isaac-GR00T N1.5 / N1.6 用 Decoupled WBC 作为全身控制器
Isaac-GR00T N1.7 用 SONIC token 作动作空间,见 GR00T N1.5 架构 / N1.6 架构
BONES-SEED 训练语料。motionbricks/README.md 称 35 万条产品级动捕片段;主 README 的开源公告为 14.2 万+ 条(约 288 小时)并附 G1 MuJoCo 轨迹
SOMA Retargeter 人体动捕 → G1 骨架重定向
Kimodo 同系列文生运动模型,SONIC 的网页 demo 用它做文本入口

许可:代码 Apache 2.0,模型权重 NVIDIA Open Model License。