Q1:H2O 能直接装到我自己的 humanoid 上吗?
开源的是 LeCAR-LAB/human2humanoid 的 privileged teacher 与 sim2real imitator 入口。
H1 URDF 公开。
但 retargeting + privileged 过滤需要 AMASS 数据库自己跑一遍,工程量大。
其它 humanoid(G1、H1-2 等)需要重新做 SMPL shape fitting + β′ 拟合。📎
论文: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-DoF 单 RGB 相机驱动)。
一个 RGB 摄像头,让全尺寸人形机器人跟你走、跳、踢、推、打拳。
H2O 之于人形遥操,就像数字「提线木偶」。
摄像头拍下你的动作,提取 8 个关键点当「线」。
机器人靠学习到的策略追这些线,做出和你一样的动作。
要解决的问题:用一个 RGB 相机在线驱动一台全尺寸 humanoid。📎
动作要多样:走、跳、踢、推、打拳都能跟。
老办法的两条死胡同:📎
用模型预测控制。
为算力妥协必须用简化动力学。
能跟踪的动作很有限。
还依赖接触测量 / 外部传感器。
比如 exoskeleton、force plate。
部署门槛高、不能 scale。
用 RL 让 avatar 跟踪摄像头。
但假设不切实际的 torque / joint limit。
还靠非物理的辅助力。
离真机很远。
H2O 要回答的问题:能不能把 graphics 那套 RL 跟踪搬到真机?
且只用一个 RGB 相机在线驱动?📎
关键障碍是训练数据。
AMASS 里大量动作(cartwheel 等)对电机驱动的人形根本不可行。
naive 训出的 policy 会被这些不可行样本带坏。
方法核心(大白话):整套 pipeline 分三段,像流水线串起来。
先把 AMASS 1.3 万段动捕序列翻译到 humanoid 骨架。
得到 1 万段 retargeted 序列。
里面有不可行样本(如 cartwheel),直接训会带坏 policy。
H2O 训一个 privileged imitator(特权模仿者)。
它在仿真里能看到全刚体状态——真实速度、真实参数。
把它当「可行性裁判」。
跑一遍 1 万段序列,把跟踪失败的丢掉。
最终留下 8.5 千段「干净」序列。📎
在干净数据上训能上真机的 policy。
用强化学习(PPO)。
配合 domain randomization 和早停。
state 只用真机能拿到的量。
包括关节、projected gravity、8 个 keypoints。
reward 三类共 16 项。
把「跟得准」「不摔倒」「动作自然」都写进去。📎
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 部署设计):
还有 projected gravity、上一动作。
共 66 维(19+19+3+3+3+19)。
没有全关节角目标——实时 RGB 只能稳定给到 keypoint。
Reward(三类共 16 项,Table I 精确表达式 + 权重):
torque 超限、DoF 超位置限、termination、DoF 加速度 / 速度。
还有 action rate、torque L1、feet contact force 防脚侧向力过大。
以及 stumble、slippage。
这是 H2O 的核心步态奖励。
后续被 OmniH2O 用「max-feet-height-per-step」替换。
因为 feet-air-time 会导致「原地跺脚」伪影。
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):📎
注意 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 | 状态维 | Sim2Real | Succ ↑ | Eg-MPJPE ↓ | Empjpe ↓ |
|---|---|---|---|---|---|
| Privileged(上限) | 778 | ✗ | 85.5% | 50.0 | 43.6 |
| H2O-reduced(仅 keypoints 位置) | 90 | ✓ | 53.2% | 200.2 | 115.8 |
| H2O w/o sim-to-data | – | ✓ | 67.9% | 176.6 | 95.0 |
| H2O(full) | – | ✓ | 72.5% | 166.7 | 91.7 |
消融结论:
(1) sim-to-data 清洗提升 Succ 约 5 个点;
(2) goal state 加 position-difference + velocity(不止 raw keypoints)贡献最大;
(3) privileged 用了 778 维特权信息,sim2Real 退化到 72.5%——这是关键的 sim-real gap 量化。
真机演示:走、后跳、踢球、转、挥手、推、打拳、推婴儿车、抓箱丢桶。📎
局限:
OmniH2O 用 max-feet-height-per-step + standing/squatting augmentation 直接解决。📎
灵巧手 teleop 由 Bunny-VisionPro / Open-TeleVision 接力。
OmniH2O 把 goal 抽象为 kinematic pose 后统一了 4 种输入。🌐
ASAP [2502.01143] 用 residual delta dynamics 部分修复。🌐
图谱定位:H2O 是 T07 人形遥操栈的第一个 learning-based 全身实时 teleop 节点。📎
在 H2O 之前,「全身 teleop」是 MPC 的领地,且要 exoskeleton / force sensor。
H2O 用 RL + 单 RGB 跑通,把硬件门槛从「实验室全套动捕」降到「一个摄像头」。
是 2024 全身 teleop 爆发的起点。
核心贡献的三条独立线:
这一思路被后续 ExBody、OmniH2O、BeyondMimic 直接复用。
成为 humanoid RL 数据准备的标配。📎
给后续工作一个明确的「蒸馏要补的 13 个点」目标——OmniH2O 用 25 步历史 + DAgger 把这个 gap 拉回到 94.1%。
演化谱系:
副产品·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:
如何在保留 tracking 精度的同时让 policy 学会「能静止就静止」,由 OmniH2O 部分回答但未完全解决。[未确认]
ASAP 用 residual delta dynamics 是部分解,未根治。[未确认]
OmniH2O 把 goal 抽象为 kinematic pose 后统一了 4 种输入,但 hand 部分仍各自为政。[未确认]
半自主(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 把它的精度和接口通用性都推上新台阶。
老办法里 MPC 派和 Graphics 派分别卡在什么地方?H2O 把 graphics 那套搬到真机的关键障碍是什么?
💡 参考答案
H2O 的「sim-to-data」流程是什么?为什么不直接拿 AMASS 训,要先训一个 privileged imitator 来过滤?
💡 参考答案
用「数字提线木偶」或你自己举的类比,向一个没学过的朋友解释:H2O 是怎么让 humanoid 跟着操作员动的?「线」对应什么、为什么不直接传全关节角?
💡 参考答案
H2O 的 privileged imitator(数据过滤用)和 Sim2Real imitator(部署用)哪个加 domain randomization、哪个不加?为什么?
💡 参考答案
H2O 在真机上演示了走、跳、踢、推、打拳都跟得上,但它有个明显的步态病——是什么?这个病的根源在哪里?
💡 参考答案
开源的是 LeCAR-LAB/human2humanoid 的 privileged teacher 与 sim2real imitator 入口。
H1 URDF 公开。
但 retargeting + privileged 过滤需要 AMASS 数据库自己跑一遍,工程量大。
其它 humanoid(G1、H1-2 等)需要重新做 SMPL shape fitting + β′ 拟合。📎
因为实时 RGB(pose estimator 输出)只能稳定给到 keypoint——给不了全关节角。
keypoint 是「线」,policy 学怎么拉这些线让机器人保持平衡。
全关节的跟踪由 dense 全身 reward 隐式完成。
这是「goal 稀疏 + reward dense」的关键 trade-off。📎
privileged imitator:在仿真里有特权信息(全刚体状态),不加 DR,作为「可行性 oracle」过滤数据。
Sim2Real imitator:部署到真机没特权信息,加 DR 提鲁棒性,跟踪 keypoints。
前者训来过滤数据,后者训来上真机。📎
同团队前后作。
H2O 是第一个 learning-based 全身实时 teleop(单 RGB)。
但 72.5% Succ、有跺脚病。
OmniH2O 把 goal 抽象为 kinematic pose(统一 4 种输入),加 teacher-student DAgger 蒸馏。
94.1% Succ、修了跺脚。
H2O 跑通了「learning-based 全身 teleop 可行」,OmniH2O 把它推到生产级。🌐
先查 reward。
feet-air-time 权重 800 鼓励每步抬脚 ≥0.25s——但 reference velocity 一直在。
policy 学会「原地踏步保平衡」。
两个修法(任选):(1) 参照 OmniH2O 把 feet-air-time 换成 max-feet-height-per-step;(2) 加 standing / squatting augmentation 让训练分布含足够静止 / 蹲姿。📎