深度⏱ ~4 min
里程碑
⭐ 为何重要

首个开源的真人形(Unitree H1)全身实时遥操作框架,用单目 RGB 捕捉人体关键点并实时映射为全身控制。打通了『用真人示教驱使人形采集大规模数据』的链路,是后续 OmniH2O、HumanPlus、HOVER 等人形遥操作与数据收集工作的开山之作。

机器人Unitree H1
数据集AMASS
上真机
物理感知
实时
输入模态vision,proprioception

论文:He, Luo, Xiao, Zhang, Kitani, Liu, Shi et al. Learning Human-to-Humanoid Real-Time Whole-Body Teleoperation. IROS 2024 / arXiv:2403.04436. 🌐 · 真机平台:Unitree H1(19-DoFRGB 相机驱动)。

一句话直觉

一个 RGB 摄像头,让全尺寸人形机器人跟你走、跳、踢、推、打拳。

H2O 之于人形遥操,就像数字「提线木偶」。

摄像头拍下你的动作,提取 8 个关键点当「线」。

机器人靠学习到的策略追这些线,做出和你一样的动作。

是什么·为什么

要解决的问题:用一个 RGB 相机在线驱动一台全尺寸 humanoid。📎

动作要多样:走、跳、踢、推、打拳都能跟。

老办法的两条死胡同📎

  • MPC(model-based):Darvish、Zhang 等的工作。

用模型预测控制。

为算力妥协必须用简化动力学

能跟踪的动作很有限。

还依赖接触测量 / 外部传感器。

比如 exoskeleton、force plate。

部署门槛高、不能 scale。

  • Graphics 派:PHC、PULSE。

RL 让 avatar 跟踪摄像头。

但假设不切实际的 torque / joint limit。

还靠非物理的辅助力。

离真机很远。

H2O 要回答的问题:能不能把 graphics 那套 RL 跟踪搬到真机?

且只用一个 RGB 相机在线驱动?📎

关键障碍是训练数据。

AMASS 里大量动作(cartwheel 等)对电机驱动的人形根本不可行。

naive 训出的 policy 会被这些不可行样本带坏。

方法核心(大白话):整套 pipeline 分三段,像流水线串起来。

  • 第一段·数据清洗(sim-to-data)。

先把 AMASS 1.3 万段动捕序列翻译到 humanoid 骨架。

得到 1 万段 retargeted 序列。

里面有不可行样本(如 cartwheel),直接训会带坏 policy。

H2O 训一个 privileged imitator(特权模仿者)。

它在仿真里能看到全刚体状态——真实速度、真实参数。

把它当「可行性裁判」。

跑一遍 1 万段序列,把跟踪失败的丢掉。

最终留下 8.5 千段「干净」序列。📎

  • 第二段·Sim2Real RL imitator 训练

在干净数据上训能上真机的 policy。

用强化学习(PPO)。

配合 domain randomization 和早停。

state 只用真机能拿到的量。

包括关节、projected gravity、8 个 keypoints。

reward 三类共 16 项。

把「跟得准」「不摔倒」「动作自然」都写进去。📎

  • 第三段·RGB 在线部署:30 Hz 摄像头拍操作员。

pose estimator 提取 8 个 keypoints 当 goal。

RL policy @ 50 Hz 出动作。

PD 控制器 @ 200 Hz onboard 转 torque 驱动 H1。

整套只靠一个相机。

不需要动捕服 / exoskeleton / 力板。📎

关键设计·keypoint goal:policy 跟踪的不是全关节角。

是 8 个身体关键点(双肩、双肘、双手、双踝)。

因为 RGB 实时只能稳定给到 keypoint——给不了全关节角。

keypoint 是「线」,policy 学怎么拉这些线让机器人保持平衡。

为什么「先过滤」是关键创新:直接拿 AMASS 训会被 cartwheel 带坏。

privileged imitator 能跑起来 = 动作可行。

跑不起来 = 丢掉。

这是把「仿真跟踪上限」当数据质量度量。

后被 ExBody、OmniH2O、BeyondMimic 直接沿用。

成为 humanoid RL 数据准备的标配。📎

一句话类比:H2O 之于人形遥操,就像数字「提线木偶」。

摄像头提取 8 个关键点当「线」。

机器人靠学习到的策略追这些线。

注意边界:它学到「不停小碎步、无法静止站立」。

后续 OmniH2O 修补了这个缺陷。

怎么做

三段 pipeline:retargeting → sim-to-data 过滤 → Sim2Real RL 训练。📎

Retargeting(Sec.IV.A):humanoid 骨架(H1,19 DoF)与 SMPL 差异显著。

H2O 不直接拷贝 joint angle(会让末端位置漂移)。

是先把 SMPL 的 shape 参数 β 拟合到 H1。

选 12 个对应关节,在 rest pose 上对 β 做梯度下降

最小化这 12 个关节位置误差,得到 β′。📎

关键 motivation:H1 在 rest pose 两脚间距远大于 SMPL 默认值。

naive 拟合会产生「in-toed」(脚尖内八)伪影。

用 β′(人造一个「宽站距」的 SMPL body)能消除这个伪影。

之后用 Adam 优化器对每段 AMASS 序列做 IK

AMASS 13K 序列 → 10K retargeted 序列。

Sim-to-data:privileged 做清洗(Sec.IV.B):训一个 privileged imitator。

仿 PULSE。

输入含全刚体状态。

即位置、朝向、线速度、角速度。

不加 domain randomization,让它上限尽量高,作为「可行性 oracle」。

训完后跑一遍 retargeted 序列,把跟踪失败的丢掉。

筛出约 8.5K / 10K 序列,得 clean dataset。

这是把「仿真里的 tracking 上限」当数据质量度量。

本质是 sim-as-data-critic 思路。📎

Sim2Real imitator(Sec.IV.C):三件套:reward + DR + early termination。

状态空间(专为 real-time RGB 部署设计):

  • proprioception:关节位置 / 速度、根线 / 角速度。

还有 projected gravity、上一动作。

共 66 维(19+19+3+3+3+19)。

  • goal:8 个 keypoints 的参考位置 + 与当前对应点的位置差 + 速度。

没有全关节角目标——实时 RGB 只能稳定给到 keypoint。

  • action:19 维关节 target,由 PD 控制器转 torque。

Reward(三类共 16 项,Table I 精确表达式 + 权重):

  • Penalty(防 undesired 行为):

torque 超限、DoF 超位置限、termination、DoF 加速度 / 速度。

还有 action rate、torque L1、feet contact force 防脚侧向力过大。

以及 stumble、slippage。

  • Regularizationfeet air time 鼓励每步抬脚 ≥0.25s。

这是 H2O 的核心步态奖励。

后续被 OmniH2O 用「max-feet-height-per-step」替换

因为 feet-air-time 会导致「原地跺脚」伪影。

  • Task reward:6 项 dense 指数核。

DoF position / velocity、body position / rotation。

还有 body velocity / angular velocity。

注意 goal state 只跟 8 个 keypoints,但 task reward 给全关节

这是用 dense 全身 reward 弥补稀疏 keypoint goal 的设计。📎

Domain Randomization(Table II,sim2real 关键):

随机化摩擦、link mass、base CoM offset、PD gains。

还有 torque RFI、control delay、外部推扰、地形

详见下方深度部分。

Early termination(提采样效率):base height < 0.3 m。

projected gravity 在 x 或 y 轴 > 0.7。

平均 link 距离参考 > 0.5 m。📎

训练:PPO(Isaac Gym,200 Hz 仿真)。

policy 输出 50 Hz,部署 50 Hz。

推理用 3D pose estimator(HybrIK,[27])。

从 RGB 出 keypoints 作 goal。📎

部署(Sec.IV.D):30 Hz RGB → pose estimator 30 Hz。

然后 8 keypoints goal → RL policy 50 Hz。

再到 PD 200 Hz onboard → H1。

常见误区(先抛一个,完整版见末尾):「H2O 解决了静止站立」——错。

H2O 学到「不停小碎步」。

feet-air-time reward + 始终跟踪 reference velocity。

这让 policy 学「原地踏步保平衡」。

后续 OmniH2O 用 max-feet-height-per-step 修复。

配合 standing/squatting augmentation。📎

深度

SMPL shape fitting 的细节:选 12 个对应关节(肩、肘、腕、髋、膝、踝)。

在 rest pose 上对 β 做梯度下降,最小化 12 个关节位置误差,得 β′。

之后用 Adam 优化器对每段 AMASS 序列做 IK:固定 translation p 与 pose θ、换上 β′,最小化 12 个关节位置差。📎

privileged imitator 的特权 state:sp_privileged = [p_t, θ_t, v_t, ω_t](全刚体位置 / 朝向 / 线速度 / 角速度,real-world 拿不到的特权信息)。

goal 含一阶差分 sg_privileged = [θ̂_{t+1} ⊖ θ_t, p̂_{t+1} − p_t, ...]。

不加 domain randomization,让它作为「可行性 oracle」。📎

Reward 16 项精确权重(Table I)📎

  • Penalty:torque 超限 −0.2、DoF 超位置限 −100、termination −200、DoF 加速度 −8.4×10⁻⁶、DoF 速度 −3×10⁻³、action rate $\|a_t - a_{t-1}\|^2$ 权重 −0.9、torque L1 −9×10⁻⁵、feet contact force $\|F^{feet}_{xy}\|^2$ 权重 −1e−1(−0.1)(防脚侧向力过大)、stumble $\mathbb{1}(F^{xy}_{feet} > 5F^z_{feet})$ 权重 −1e3(−1000)、slippage $\|v^{feet}_t\|^2 \mathbb{1}(F_{feet}\ge1)$ 权重 −30。
  • Regularizationfeet air time $T_{air} - 0.25$ 权重 8×10²(鼓励每步抬脚 ≥0.25s)——H2O 的核心步态奖励,后续被 OmniH2O 用「max-feet-height-per-step」替换,因为它会导致「原地跺脚」伪影。
  • Task reward(6 项 dense 指数核):DoF position $\exp(-0.25\|\hat{q}_t - q_t\|^2)$ 权重 24、DoF velocity $\exp(-0.25\|\dot{\hat{q}}_t - \dot{q}_t\|^2)$ 权重 24、body position $\exp(-0.5\|p_t - \hat{p}_t\|^2)$ 权重 40、body rotation $\exp(-0.1\|\theta_t \ominus \hat{\theta}_t\|)$ 权重 16、body velocity $\exp(-10\|v_t - \hat{v}_t\|^2)$ 权重 60、body angular velocity $\exp(-0.01\|\omega_t - \hat{\omega}_t\|^2)$ 权重 60。

注意 goal state 只跟 8 个 keypoints,但 task reward 给全关节

这是用 dense 全身 reward 弥补稀疏 keypoint goal 的设计。

Domain Randomization(Table II):摩擦 U(0.2, 1.1)、link mass U(0.7, 1.3)×default、base CoM offset U(−0.1, 0.1) m、PD gains U(0.75, 1.25)×default、torque RFI 0.1×limit、control delay U(20, 60) ms、外部推扰每 5s 推 0.5 m/s、地形(flat/rough/low obstacles)。📎

关键实验(Table III):在 clean dataset 上的 motion imitation:📎

Policy状态维Sim2RealSucc ↑Eg-MPJPE ↓Empjpe ↓
Privileged(上限)77885.5%50.043.6
H2O-reduced(仅 keypoints 位置)9053.2%200.2115.8
H2O w/o sim-to-data67.9%176.695.0
H2O(full)72.5%166.791.7

消融结论:

(1) sim-to-data 清洗提升 Succ 约 5 个点;

(2) goal state 加 position-difference + velocity(不止 raw keypoints)贡献最大;

(3) privileged 用了 778 维特权信息,sim2Real 退化到 72.5%——这是关键的 sim-real gap 量化

真机演示:走、后跳、踢球、转、挥手、推、打拳、推婴儿车、抓箱丢桶。📎

局限

  1. 不停小碎步、无法静止站立:feet-air-time reward + 始终跟踪 reference velocity 导致 policy 学会「原地踏步保平衡」。

OmniH2O 用 max-feet-height-per-step + standing/squatting augmentation 直接解决📎

  1. 只覆盖躯干 19 DoF、不含灵巧手:H2O 的 goal 是 keypoints,没定义 hand 接口。

灵巧手 teleop 由 Bunny-VisionPro / Open-TeleVision 接力。

  1. 单一输入模态(RGB)VR、外骨骼、MoCap 都不能直接接入。

OmniH2O 把 goal 抽象为 kinematic pose 后统一了 4 种输入。🌐

  1. 敏捷动作 sim-real gap 大:踢 / 跳 / 转在真机易失败。

ASAP [2502.01143] 用 residual delta dynamics 部分修复。🌐

  1. 跟踪误差仍大(Eg-MPJPE 166.7 mm)——OmniH2O 把它压到 141 mm。

研究者视角

图谱定位:H2O 是 T07 人形遥操栈的第一个 learning-based 全身实时 teleop 节点📎

在 H2O 之前,「全身 teleop」是 MPC 的领地,且要 exoskeleton / force sensor。

H2O 用 RL + 单 RGB 跑通,把硬件门槛从「实验室全套动捕」降到「一个摄像头」。

是 2024 全身 teleop 爆发的起点。

核心贡献的三条独立线

  1. 第一个 learning-based 全身实时人形 teleop——硬件门槛从「整套动捕」降到「一个 RGB 相机」。
  2. sim-to-data 范式:用 privileged policy 作为 motion feasibility oracle 过滤 AMASS。

这一思路被后续 ExBody、OmniH2O、BeyondMimic 直接复用。

成为 humanoid RL 数据准备的标配。📎

  1. 量化了 sim-real gap:privileged 778 维 → 85.5%,部署版 → 72.5%。

给后续工作一个明确的「蒸馏要补的 13 个点」目标——OmniH2O 用 25 步历史 + DAgger 把这个 gap 拉回到 94.1%。

演化谱系

  • 建立在:PHC [Luo 2023, arXiv:2305.06456]、PULSE [Luo 2023](privileged motion imitator)、AMASS [Mahmood 2019]、PPO、DeepMimic [Peng 2018](motion imitation RL 范式)。🌐
  • 直接引出OmniH2O [He 2024, arXiv:2406.08858](同团队,kinematic pose 通用接口 + teacher-student DAgger);ExBody [Yoshida 2024](同期的 motion tracking 后端);HumanPlus [Fu 2024](用 HST transformer 替代 MLP policy);HOVER [He 2024](多模式蒸馏)。🌐
  • 下游数据管道:GR00T N1、Helix、π0 等 humanoid VLA 依赖的 teleop 数据大多源自 H2O / OmniH2O 这套采集栈。

副产品·humanoid RL 工程包:SMPL shape fitting + privileged feasibility filter + keypoint goal + feet-air-time reward + 大范围 DR。

这套 trick 被后续 humanoid RL 工作大量复用。[未确认]

注意:feet-air-time reward 的「跺脚」病是教训。

后续工作(OmniH2O、BeyondMimic)换 max-feet-height-per-step 才解决。

Open problems

  1. 静止站立 / 步态自然度:H2O 的「不停小碎步」是核心缺陷。

如何在保留 tracking 精度的同时让 policy 学会「能静止就静止」,由 OmniH2O 部分回答但未完全解决。[未确认]

  1. 敏捷动作的 sim-real gap:踢 / 跳 / 转在真机易失败。

ASAP 用 residual delta dynamics 是部分解,未根治。[未确认]

  1. 多模态输入的统一:H2O 只支持 RGB。

OmniH2O 把 goal 抽象为 kinematic pose 后统一了 4 种输入,但 hand 部分仍各自为政。[未确认]

  1. 认知负荷:单操作员长时间全身 teleop 疲劳严重。

半自主(HOMIE 那种)或多操作员协同是开放方向。[未确认]

常见误区

「H2O 解决了全身静态平衡」 —— 错。

H2O 学到「不停小碎步」。

feet-air-time reward + 始终跟踪 reference velocity 让 policy 学「原地踏步保平衡」。

后续 OmniH2O 用 max-feet-height-per-step + standing/squatting augmentation 修复。

H2O 是「动起来稳」,不是「站得住」。📎

「直接拿 AMASS 训就行」 —— 错。

AMASS 里大量动作(cartwheel、超 wide step)对电机驱动的人形根本不可行。

直接训会让 policy 被不可行样本带坏。

必须先用 privileged imitator 过滤掉不可行序列(sim-to-data),再训。📎

「privileged imitator 要加 domain randomization」 —— 错。

privileged imitator 的角色是「可行性 oracle」,故意不加 DR 让它上限尽量高。

DR 是部署用的 Sim2Real imitator 才加。

privileged 上限越高,过滤越严格;加 DR 反而让它「能跑通」太多本来不可行的样本。📎

「goal 必须是全关节角才能跟踪好」 —— 错。

H2O 的 goal 只有 8 个 keypoints(位置 + 与当前点的差 + 速度),没有全关节角目标

因为实时 RGB(pose estimator 输出)只能稳定给到 keypoint。

全关节的跟踪由 dense 全身 reward 隐式完成。

goal 稀疏不要紧,关键是 reward dense——这是 H2O 的关键 trade-off。📎

「H2O 和 OmniH2O 是同一篇」 —— 错。

H2O(arXiv:2403.04436)是同团队前作,单 RGB teleop。

72.5% Succ / 166.7 mm MPJPE,有跺脚病。

OmniH2O(arXiv:2406.08858)是后作。

通用 kinematic pose 接口 + teacher-student DAgger。

94.1% Succ / 141 mm MPJPE,修了跺脚。

H2O 是第一个 learning-based 全身实时 teleop。

OmniH2O 把它的精度和接口通用性都推上新台阶。

检查点

Q1

老办法里 MPC 派和 Graphics 派分别卡在什么地方?H2O 把 graphics 那套搬到真机的关键障碍是什么?

💡 参考答案

  • MPC 派(model-based):为算力妥协用简化动力学,能跟踪的动作有限;依赖接触测量 / 外部传感器(exoskeleton、force plate),部署门槛高、不能 scale。
  • Graphics 派(PHC、PULSE):用 RL 让 avatar 跟踪摄像头,但假设不切实际的 torque / joint limit、还靠非物理的辅助力,离真机远。
  • H2O 搬到真机的关键障碍:训练数据——AMASS 里大量动作(如 cartwheel)对电机驱动的人形根本不可行,naive 拿来训会带坏 policy。
Q2

H2O 的「sim-to-data」流程是什么?为什么不直接拿 AMASS 训,要先训一个 privileged imitator 来过滤?

💡 参考答案

  • sim-to-data 流程:先把 AMASS 翻译到 humanoid 骨架(10K 段);训一个 privileged imitator(在仿真里能看到全刚体真实状态);让它跑一遍这些序列,跟踪失败的丢掉,最终留下约 8.5K 段「干净」序列。
  • 为什么不能直接训:AMASS 里有 cartwheel 这种电机不可行动作,直接训会让 policy 被不可行样本带坏。
  • 为什么 privileged imitator 能当裁判:它在仿真里跑得起来 = 动作对这台 humanoid 可行;跑不起来 = 丢掉。本质是把「仿真跟踪上限」当数据质量度量。
Q3

用「数字提线木偶」或你自己举的类比,向一个没学过的朋友解释:H2O 是怎么让 humanoid 跟着操作员动的?「线」对应什么、为什么不直接传全关节角?

💡 参考答案

  • 提线木偶类比:摄像头拍下操作员动作,pose estimator 提取 8 个身体关键点(双肩、双肘、双手、双踝),这些点就是「线」。
  • policy 学怎么拉这些线让机器人保持平衡 + 做出对应动作。
  • 为什么不传全关节角:实时 RGB(pose estimator)只能稳定给到 keypoint,给不了全关节角;全关节的跟踪由 dense 全身 reward 隐式完成。
Q4

H2O 的 privileged imitator(数据过滤用)和 Sim2Real imitator(部署用)哪个加 domain randomization、哪个不加?为什么?

💡 参考答案

  • privileged imitator:不加 DR。Sim2Real imitator:加 DR。
  • 为什么 privileged 不加:它是「可行性 oracle」,故意不加 DR 让它上限尽量高——上限越高,过滤越严格。
  • 为什么 Sim2Real 要加:部署到真机会遇到摩擦 / mass / delay 等扰动,加 DR 提鲁棒性。加 DR 反而会让 privileged「能跑通」太多本来不可行的样本,破坏裁判功能。
Q5

H2O 在真机上演示了走、跳、踢、推、打拳都跟得上,但它有个明显的步态病——是什么?这个病的根源在哪里?

💡 参考答案

  • 步态病:不停小碎步、无法静止站立——policy 学会「原地踏步保平衡」。
  • 根源一:feet-air-time reward 鼓励每步抬脚 ≥0.25s,policy 学会不停抬脚刷分。
  • 根源二:始终跟踪 reference velocity(一直在动),policy 没机会学「静止站立」状态。后续 OmniH2O 用 max-feet-height-per-step + standing/squatting augmentation 修复。

FAQ

Q1:H2O 能直接装到我自己的 humanoid 上吗?

开源的是 LeCAR-LAB/human2humanoid 的 privileged teacher 与 sim2real imitator 入口。

H1 URDF 公开。

但 retargeting + privileged 过滤需要 AMASS 数据库自己跑一遍,工程量大。

其它 humanoid(G1、H1-2 等)需要重新做 SMPL shape fitting + β′ 拟合。📎

Q2:为什么用 8 个 keypoints,不用全关节角?

因为实时 RGB(pose estimator 输出)只能稳定给到 keypoint——给不了全关节角。

keypoint 是「线」,policy 学怎么拉这些线让机器人保持平衡。

全关节的跟踪由 dense 全身 reward 隐式完成。

这是「goal 稀疏 + reward dense」的关键 trade-off。📎

Q3:H2O 的 privileged imitator 和 Sim2Real imitator 区别是什么?

privileged imitator:在仿真里有特权信息(全刚体状态),不加 DR,作为「可行性 oracle」过滤数据。

Sim2Real imitator:部署到真机没特权信息,加 DR 提鲁棒性,跟踪 keypoints。

前者训来过滤数据,后者训来上真机。📎

Q4:H2O 和 OmniH2O 是什么关系?

同团队前后作。

H2O 是第一个 learning-based 全身实时 teleop(单 RGB)。

但 72.5% Succ、有跺脚病。

OmniH2O 把 goal 抽象为 kinematic pose(统一 4 种输入),加 teacher-student DAgger 蒸馏。

94.1% Succ、修了跺脚。

H2O 跑通了「learning-based 全身 teleop 可行」,OmniH2O 把它推到生产级。🌐

Q5:为什么我的 H2O 复现跺脚严重?

先查 reward。

feet-air-time 权重 800 鼓励每步抬脚 ≥0.25s——但 reference velocity 一直在。

policy 学会「原地踏步保平衡」。

两个修法(任选):(1) 参照 OmniH2O 把 feet-air-time 换成 max-feet-height-per-step;(2) 加 standing / squatting augmentation 让训练分布含足够静止 / 蹲姿。📎