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

用 RL 把仿真 humanoid 训成一个通用的 physics-based controller,能鲁棒跟踪噪声很大的输入(如视频姿态估计),并具备跌倒自动爬起的容错恢复能力。它是「视频→人体动作→物理执行」pipeline 的代表性打通者,也是后续 PULSE/UHC/ExBody/OmniH2O 的直接技术底座。在 action_gen 里它把感知驱动的动作生成与物理仿真控制缝合起来。

数据集AMASS
物理感知
实时
输入模态proprioception

论文:Luo, Cao, Winkler, Kitani, Xu. Perpetual Humanoid Control (PHC),ICCV 2023;arXiv:2305.06456。🌐 续作 Universal Humanoid Motion Representations (UHC/PULSE),ICLR 2024;arXiv:2310.04582。本页统一讲两篇——PHC 是基座 controller,UHC/PULSE 是它的升级 + 蒸馏

一句话直觉

让仿真人形学会模仿几乎所有人类动作。

跌倒了还能爬起来。

秘诀是分阶段加码训练 + 一个按难度投票的总指挥。

PHC 之于 humanoid 控制,就像老匠人带徒弟。

一个师傅教不动,就请下一位按难度分工。

是什么·为什么

要解决的问题:让人形 policy 模仿大规模人类动捕数据 AMASS

AMASS 有 1 万多段、40 多小时动作。

到 2023 年初,单 policy 在整个 AMASS 上高保真模仿没人做到。📎

老办法的痛点:之前的方法用"上帝之手"。

就是在仿真里加一个额外的外力把人形 puppet 起来。

能 cover 97% AMASS,但力破坏物理真实感。

人形会飞、漂浮、甩来甩去。

还有的 policy 一跌倒就 reset。

没法用 webcam 实时驱动 avatar。📎

PHC 的转身:不用外力,单 policy 覆盖 98.9% AMASS。

而且自带 fall recovery——跌倒了能自然爬起来。📎

关键三件套:分阶段训练、AMP 判别器、跌倒降级。

方法核心(大白话):分阶段加码训练 + 总指挥投票。

Step A 训第一个 primitive P1。

P1 在整个数据集训到收敛。

总有一些"难 clip"它学不会。

Step B 把 P1 冻结,新初始化 P2。

P2 只在那些难 clip 上训。

P2 还学不会的更难 clip,再开 P3 训。

最后开一个 P_F。

它专门处理"跌倒/faraway"三类失败态。

不学逐关节模仿,只学"爬起来走到参考 root 位置"。

Step C 训一个 composer 网络。

它看当前状态,输出每个 primitive 的权重。

所有 primitive 同时激活。

按权重投票决定最终动作。

权重高的 primitive 主导这一步的动作。

📎

reward 三件套:模仿、AMP、energy。

模仿 reward 衡量"和参考姿态有多近"。

AMP 判别器是关键——跌倒姿态在动捕里没有。

AMP 仍能约束"爬起来的动作像人"。

energy 惩罚防 policy 抖脚。📎

跌倒降级:三类失败态——躺在地上、偏离参考太远、两者组合。

触发时 goal 从"逐关节模仿"降级成"point-goal 导航"。

意思是只跟踪 root 的位置和朝向,其他关节 goal 全部置零。

P_F 只在 locomotion 子集上训,让 AMP 偏简单分布。📎

UHC/PULSE 的升级

PHC 是 98.9%。

UHC(PHC+)清洗脏数据 + 改训练节奏,拉到 100%。🌐

PULSE 把 PHC+ 的 motor skill 蒸馏成一个 latent

下游任务不再需要从零训,也不需要对抗学习。

直接在 latent space 上做 RL 就能产生自然动作。

一句话类比:PHC 之于 humanoid 控制,就像老匠人带徒弟。

一个师傅教不动,就请下一位按难度分工。

composer 是总指挥,按当前任务的难度投票决定听谁的。

跌倒降级是"先别学跑步,先爬回起点"。

你会看到:单 policy 无外力覆盖 98.9% AMASS。

PHC+ 升级到 100%。

PULSE latent 让下游任务零对抗学习复用 motor skill。

后续 OmniH2O、HOVER 都依赖 PHC 的 recovery 机制。📎

怎么做

核心机制·三件套📎

  1. PMCP:分阶段加码训练多个 primitive + composer 投票组合。
  2. AMP reward:判别器约束动作"像人",覆盖动捕里没有的姿态(如跌倒爬起)。
  3. 三类失败态 + point-goal 降级:跌倒了不学逐关节模仿,只学爬回参考 root。

PMCP(Progressive Multiplicative Control Policy)📎

  • 先训 P1 在整个数据集 Q̂ 上到收敛。
  • 评估 P1 失败的 sequence 组成 Q̂_hard^(1)。
  • 冻结 P1,新初始化 P2,只训 Q̂_hard^(1)。
  • 递归得到 Q̂_hard^(2),P3 训 Q̂_hard^(2),依此类推。
  • 论文主模型 4 个 primitive(含 P_F)。UHC/PHC+ 改进后只用 3 个就到 100%。
  • 最后训 composer 网络,输出每个 primitive 的权重向量。

Multiplicative Control Policy(MCP)的合并方式:所有 primitive 同时激活。

按权重相乘 policy 分布。

不是 MoE 的 top-1 选一个。

是"top-inf MoE"——所有 primitive 都参与。

合并后是高斯。

mean 和 variance 都按权重加权。📎

reward 公式(Eq. 1):📎

$$r_t = 0.5\,r^g_t + 0.5\,r^\text{amp}_t + r^\text{energy}_t$$

读法:三项相加。

第一项 r^g 是模仿 reward。

含 joint position / rotation / linear vel / angular vel 四项指数加权和。

第二项 r^amp 是 AMP 判别器 reward。

10 帧窗口的 proprioception 判别。

第三项 r^energy 是 energy 惩罚。

系数 -0.0005,关节扭矩乘角速度求和。

精确 imitation reward 权重(PHC 附录 hyperparameter 表):📎

joint position 权重 0.5。

joint rotation 0.3。

linear vel 0.1。

angular vel 0.1。

三类失败态 + point-goal 降级(Eq. 3):📎

  • Fallen on the ground:人形躺在地上。
  • Faraway from reference(> 0.5 m):姿态没倒但位置偏离参考。
  • Fallen + faraway:上述两者组合。

P_F 的 trick:fail-state 下屏蔽非 root 的参考信息。

$s^g$ 只保留 root 的位置和朝向,非 root 关节 goal 全部置 identity。

这把目标从"逐关节 imitation"降级成 point-goal navigation。

P_F 的 reward 是 point-goal + AMP + energy(Eq. 4)。

关键工程细节·Relaxed Early Termination(RET)📎

UHC 旧的终止条件是所有关节离参考 > 0.5 m 就 reset。

PHC 发现 ankle/toe 关节因仿真脚和真人多段脚 dynamics mismatch 硬跟会失衡。

所以把 ankle 和 toe 移出 termination 条件。

imitation/discriminator reward 仍保留这些关节,防动作不人类。

这个小细节对成功率影响显著。

PULSE 的 latent space 蒸馏(UHC,Sec. 4):🌐

encoder-decoder + learnable prior 三件套。

encoder 把状态压成 latent z。

decoder 从 z 还原 action。

prior 是 conditioned on proprioception 的 learnable 分布(不是 VAE 的零均值高斯)。

loss 是 PHC+ action 的 L2 回归 + latent 平滑 + KL。

下游任务 action 是 residual 到 prior mean,固定 variance 0.22。

latent dim = 32(约 humanoid DoF 69 的一半)。

常见误区(先抛一个):以为"98.9% AMASS"意味着 PHC 能生成 100% 想得到的人形动作。

错。

PHC 是 tracker——只能模仿参考动作,不是 generative model。

"100% 覆盖"指能模仿 100% AMASS,不是能生成 AMASS 之外的新行为。📎

深度

PHC 的 goal state 构成📎

goal state $s^g_t$ 是参考姿态和当前姿态的差。

含 root rotation $\hat\theta_{t+1}\ominus\theta_t$、translation、linear/angular velocity 等。

action $a_t \in \mathbb{R}^{23\times 3}$ 是 SMPL 23 个 actuated joint 的 PD target。

关键决定:$q^d_t = a_t$,完全移除对参考的依赖。

之前方法用 $q^d_t = \hat q_t + a_t$(参考 + 残差),但 PHC 直接用 action 当 PD target——这才能处理 noisy/ill-posed reference。

网络架构📎

所有 discriminator/primitive/value/composer 网络 2 层 MLP [1024, 512]。

primitive 输出 Gaussian action。

PULSE 的 encoder/decoder/prior 是 3 层 MLP,policy/primitive 是 6 层 MLP。

discount 0.99。Isaac Gym 仿真,SMPL 24 rigid body(23 actuated)结构,$\beta \in \mathbb{R}^{10}$ body shape。

*实验·PHC vs UHC+RFC(Table 1,AMASS-Train)**:📎

  • PHC 98.9% success rate(无外力)。
  • UHC + RFC(带"上帝之手")97.0%。
  • UHC 去掉 RFC 跌到 84.5%。
  • PHC 在无外力下匹配/超过带外力的 UHC+RFC,且 E-acc(3.3 vs 4.4)、E-vel(4.9 vs 5.9)都更优。
  • PHC keypoint 变体(兼容视觉 pose estimator)98.7%。
  • AMASS-Test*:PHC 96.4%(持平 UHC+RFC 96.4%,远超 UHC-RFC 62.6%)。

UHC/PULSE 的实验🌐

  • PHC+ 拉到 100% AMASS(清洗脏数据 + 让 $P^{(t)}$ 先在 hard negative 上充分训再加 $P^{(t+1)}$)。
  • PULSE 的 prior 直接采样就能产生 stable human-like motion(ASE latent 做不到,必须 high-level 指挥)。
  • 4 类下游任务(speed / strike / complex terrain / VR tracking)用同一个 PULSE latent,无需 AMP。

应用 demo:webcam 30 fps 实时驱动多 avatar。

OCSort 多人追踪 + Gaussian filter 平滑。

in-betweening 用 PHC 的 recovery 能力填补 MDM 生成的 disjoint 片段。📎

为什么 AMP 对 fall recovery 关键:跌倒姿态在 MoCap 里没有。

纯 imitation reward 在 fail-state 没参考可比。

AMP 判别器从所有 MoCap 里学了"动作整体分布像人"的标准。

所以爬起来的动作虽没逐帧参考,但仍被约束"像人"。📎

局限

  1. PMCP 部署重:3+ primitive + composer 网络在 inference 时全激活,参数量和延迟不友好。这也是 BFM 后来压缩成单 policy 的动机之一。📎
  2. 依赖 SMPL kinematic 结构:是"人形 avatar"controller,不能直接迁移到非人形(四足、轮式)或不同自由度的机器人。retarget 到真机人形还需额外工作(OmniH2O 才补上)。
  3. PHC 不是 generative model:100% 覆盖指能模仿 100% AMASS,不是能生成 100% 想象得到的人形动作。这是 PHC/UHC(tracker + latent distillation)和 BFM(generative foundation)的本质区别。
  4. PULSE latent 没语义寻址:每个 z 对应什么行为要靠可视化,不能按"走路""踢"直接调用。这是 CALM 路线解决的问题,PULSE 没继承。
  5. 训练成本:primitive 训练 + composer 训练 + PULSE distillation 三段,总体时长以周计。

研究者视角

图谱定位:PHC/UHC 是 T04 motion prior 线索的转折 4。📎

是 BFM(2025)的直接前身——把 ASE/CALM 的"技能库"升级成"单 policy 覆盖全 AMASS"。

PHC 干净地移除了"上帝之手"residual force,让物理仿真人形从"demo"走向"基础设施"。

PULSE 是第一个真正 universal 的 motion latent space,是 BFM "motor foundation" 概念的雏形。

演化谱系

  • 建立在:AMP(判别器 reward)、ASE(latent skill + fall recovery 初始化思路)、UHC 旧版 + RFC(residual force baseline,PHC 直接对标)、PNN(progressive network 骨架)、HuMoR(learnable prior on proprioception)、NPMP(AR(1) latent 平滑)。
  • 引出:OmniH2O(用 PHC 当 motor policy,VR/RGB 驱动真人形)、HOVER(多模式 policy distillation)、ExBody(expressive whole-body 真机)、BFM(最终升级成 generative motor foundation,把 PHC/UHC 压回单 policy)、BeyondMimic(tracker + diffusion 合流)。

副产品

  1. fall recovery 三类失败态分类法 + point-goal 降级——后续所有 teleop 真机系统的基础能力。OmniH2O/HOVER/H2O 全部依赖这个 recovery 机制处理 VR 输入抖动和失衡。📎
  2. PMCP 是 scale RL 的实用范式:progressive primitive + composer 的"先专后合"思路,比单纯 hard-negative mining 更能抗 catastrophic forgetting。
  3. PULSE 范式:把已解 controller 蒸馏成 universal latent + residual-to-prior 下游 RL,这套范式被 humanoid RL 后续工作大量沿用。

Open problems

  1. PMCP 部署成本:3+ primitive 全激活对真机带宽不友好。

能否压回单 policy 且保留 100% 覆盖?BFM 给了部分答案但未完全解决。[未确认]

  1. latent 语义寻址:PULSE latent 没语义。

能否让 latent 既 universal 又可按"走路/踢/跳"寻址?CALM 路线的开放问题。

  1. 跨形态迁移:PHC/UHC 绑定 SMPL kinematic 结构。

到四足、灵巧手的迁移需要重新设计。[未确认]

  1. 从 tracker 到 generative foundation:PHC 只能模仿,不能生成。

BFM 走向 generative,但是否能保持 PHC 的物理真实性仍是开放问题。

常见误区

"PHC 解决了 humanoid 控制问题" —— 部分错。

PHC 解决的是"单 policy 无外力覆盖全 AMASS + fall recovery"。

它不解决 task goal、不解决真机部署(要 retarget)、不解决 generative。

PHC 是 motion tracker + latent foundation,不是 end-to-end robot controller。📎

"98.9% 意味着能生成 98.9% 的人形动作" —— 错。

98.9% 指"能模仿 98.9% 的 AMASS clip"。

PHC 是 tracker,需要参考动作做输入。

不是 generative model。📎

"PHC 用了上帝之手" —— 错。

PHC 的核心卖点就是没有外力。

UHC(旧版)+ RFC 才用 residual force。

PHC 直接对标并移除了 RFC。📎

"PMCP 是 MoE(mixture of experts)" —— 不准确。

MoE 通常是 top-1 选一个 expert。

PMCP 是 top-inf:所有 primitive 同时激活,按权重相乘 policy 分布。

composer 输出权重不是 hard 选一个。📎

"PULSE latent 维度是 64–128" —— 错。

论文 §5.1 明确 latent dim = 32(约 humanoid DoF 69 的一半)。

32 维是经验最优,更高 latent 维度下游 RL 探索失败。🌐

"PHC 主模型用 5+ primitive" —— 不准确。

PHC 主模型 §5.1 实际是 4 个 primitive(含 $P^{(F)}$)

消融 §C 测了 2–8 个。

UHC/PHC+ 改进后只用 3 个(含 $P^{(F)}$)就到 100%。📎

检查点

Q1

PHC 训练时一个 primitive 不够,要开 P2、P3……最后还有个 P_F。每个新 primitive 训什么数据?P_F 又为什么和别的 primitive 不一样?

💡 参考答案

  • 新 primitive 训什么:P2 训 P1 学不会的'难 clip'子集(Q̂_hard^(1));P3 训 P2 还学不会的更难子集,依此类推。前一个 primitive 被冻结。
  • P_F 的特殊性:它不学逐关节模仿,专攻三类失败态(跌倒、偏离参考太远、两者组合)。
  • P_F 的目标降级:在 fail-state 下只学'爬起来走到参考 root 位置'(point-goal navigation),因为跌倒时逐关节模仿没意义;P_F 只在 locomotion 子集上训。
Q2

PHC 的 reward 三件套是什么?AMP 判别器在 fall recovery 这种"动捕里没有的姿态"上为什么还能起作用?

💡 参考答案

  • 三件套:模仿 reward、AMP 判别器 reward、energy 惩罚。模仿 reward 衡量'和参考姿态有多近';energy 防抖脚。
  • AMP 在 fall recovery 起作用的原因:AMP 判别器不是逐帧对比参考,而是从整个 MoCap 数据集学了'动作整体分布像人'的判别标准。
  • 关键:跌倒姿态虽没逐帧参考可比,但爬起来的动作仍被 AMP 约束'像人'——这是 PHC fall recovery 自然感的核心。
Q3

用"老匠人带徒弟——一个师傅教不动就请下一位按难度分工"或自己举的类比,用自己的话解释 PMCP 是怎么工作的。

💡 参考答案

  • 类比核心:师傅 P1 教整个动作集,教不动(剩下的难 clip)就请师傅 P2 专攻难 clip,P2 教不动的更难 clip 再请 P3。
  • composer = 总指挥:看当前任务难度,决定这一步主要听哪位师傅的(按权重投票);不是 hard 切换、是所有师傅同时发言按权重相加。
  • 关键映射:'按难度分工' = primitive 递归训 hard subset;'总指挥投票' = composer 输出权重 multiplicative 合成。
Q4

PHC 的 P_F 在三类失败态下,把目标从"逐关节模仿"降级成什么?为什么要降级?

💡 参考答案

  • 降级成什么:point-goal navigation——只跟踪 root 的位置和朝向,非 root 关节 goal 全部置零(identity)。
  • 为什么降级:跌倒时逐关节模仿参考没意义(不能在地上'模仿跑步')。先把'爬起来 + 走到参考 root 位置'当成目标,恢复到正常状态再恢复模仿。
  • 关键:P_F 只在 locomotion 子集(Qloco)上训,让 AMP 偏简单分布;距离 > 5 m 时 goal 位置归一化防梯度爆炸。
Q5

PHC 的 composer 决定动作时,是像传统 MoE 那样"选一个 primitive 用",还是别的方式?请用话描述。

💡 参考答案

  • 不是 MoE 的 top-1 选一个;是 'top-inf MoE'——所有 primitive 同时激活。
  • composer 输出权重,按权重相乘 policy 分布;权重高的 primitive 主导这一步但不排除其他。
  • 关键:合并后是高斯分布,mean 和 variance 都按权重加权;这种 design 让 composer 在 hard/easy 边界模糊时能平滑过渡。

FAQ

Q1:PHC 和 UHC 是同一篇论文吗?

不是。PHC 是 ICCV 2023 论文(arXiv 2305.06456),讲第一个无外力覆盖 98.9% AMASS 的 controller。

UHC/PULSE 是 ICLR 2024 续作(arXiv 2310.04582),把 PHC 升级到 100% 并蒸馏成 latent space。

注意:UHC 旧版(2023.02)是另一篇会议文,是 PHC 的 baseline(带 RFC)。🌐

Q2:PHC 能直接用在真机人形上吗?

不能直接用。

PHC 在 SMPL 仿真结构上训,retarget 到真机人形还需额外工作。

OmniH2O 才补上这一步——把 PHC 当 motor policy,VR/RGB 驱动 Unitree H1 真机。📎

Q3:为什么 PMCP 比 hard-negative mining 强?

hard-negative mining 是把难 clip 加权重新训同一个 policy。

PMCP 是冻结已学好的 primitive,新 primitive 专攻难 clip——抗 catastrophic forgetting。

加上 composer 平滑过渡,比单一 policy 反复"学新的忘旧的"稳得多。📎

Q4:PULSE latent 为什么不直接用 RL 训?

作者试过。

RL-only 训不出好 latent(探索噪声大)。

RL + supervised 混合反而更差(RL 噪声污染 latent)。

所以 PULSE 完全 supervised distillation,硬约束在 PHC+ 的 action 分布上。🌐

Q5:PHC 复现难度?

高。

PHC 复现 1–2 个月(数据清洗 + 多 primitive 训练 + composer)。

PULSE distillation 再 2–3 周。

代码已开源(项目页 zhengyiluo.github.io/PHC/),是直接起点。🌐