专题:动作模仿理论——从参考追踪到可部署全身运动¶
专题.0 前置自测¶
答不出两题以上,建议先复习 足式/190_腿足RL训练栈、复合/40_RL全身控制基础 与 复合/50_操作技能接口。
- 为什么浮动基座机器人的运动不能只用关节角轨迹描述?
- 用 MoCap 动作训练机器人时,为什么必须做 retargeting?
- DeepMimic 中 reference state initialization 解决的是什么训练困难?
- AMP 为什么可以不手写每一项姿态追踪奖励?
- 人体动作迁移到人形机器人时,为什么“几何像”不等于“动力学可执行”?
本章目标¶
本章建立动作模仿的理论主线。
学完后,你应能解释参考动作追踪、对抗运动先验、技能潜空间、动作重定向和部署验证之间的关系。
你还应能写出一个最小 motion tracking 奖励,识别 retargeting 中的几何与动力学陷阱,并设计从 MoCap 到机器人策略训练的完整流程。
知识树¶
动作模仿的根问题是:如何把外部运动示例变成机器人可以稳定执行的闭环控制策略。
动作模仿
├── 数据来源
│ ├── MoCap
│ ├── 手持夹爪
│ ├── 遥操作
│ ├── 人体视频(HMR2/WHAM/SLAHMR)
│ └── 仿真专家轨迹
├── 运动表示
│ ├── root pose
│ ├── joint rotation
│ ├── end-effector pose
│ ├── contact phase
│ └── task-frame trajectory
├── 重定向
│ ├── 骨架映射
│ ├── IK 拟合(完整优化公式)
│ ├── 关节限位
│ ├── 接触一致性
│ └── 动力学过滤
├── 训练范式
│ ├── DeepMimic 参考追踪
│ ├── AMP 对抗运动先验(GAIL→AMP 推导)
│ ├── ASE 技能潜空间(编码器-解码器-先验)
│ ├── CALM 条件对抗潜模型
│ ├── PHC 大规模追踪(渐进训练/难负例挖掘)
│ ├── 视频动作模仿
│ └── 上下体解耦追踪
├── 跨形态迁移
│ ├── MaskedMimic
│ ├── HumanPlus
│ ├── H2O / OmniH2O
│ ├── ExBody / ExBody2
│ └── 运动基础模型
├── 部署鲁棒性
│ ├── Domain Randomization
│ ├── Teacher-Student 蒸馏流水线
│ ├── residual action(尺度调度)
│ ├── sim2sim 验证
│ └── 真机渐进测试协议
└── 评估
├── tracking error
├── fall rate
├── contact consistency
├── energy
└── task success
这棵树强调两条线。
第一条是数据线:从动作数据到机器人参考轨迹。
第二条是控制线:从参考轨迹到闭环策略。
只做第一条会得到“能回放但一推就倒”的轨迹。
只做第二条会缺少自然动作来源。
动作模仿的价值正是把两条线接起来。
专题.1 为什么动作模仿是复合机器人的桥梁 ⭐⭐¶
这一节解决的问题是:为什么复合机器人需要动作模仿,而不是只靠手写奖励或传统轨迹规划。
动机:自然全身运动很难手写 ⭐⭐¶
复合机器人有腿、臂、腰、头、夹爪和浮动基座。
如果任务只是平地前进,速度跟踪奖励足够表达目标。
如果任务是边走边挥手、蹲下拿物体、转身开门、搬运箱子或模仿人类上身动作,手写奖励会迅速变得复杂。
你需要同时描述脚步节奏、上身姿态、手臂轨迹、头部朝向、身体重心、接触相位和动作自然性。
这些内容不是互相独立的。
手臂抬起会改变角动量。
蹲下会改变腿部可用力矩。
转身时脚步和躯干必须协调。
手写一个奖励项鼓励手到目标,可能破坏平衡。
手写一个奖励项鼓励身体稳定,又可能让手臂动作僵硬。
动作模仿提供了一种替代路径:先给出“合理运动长什么样”的示例,再让策略在物理仿真中学习闭环执行。
反面案例:只奖励末端目标的僵硬动作 ⭐⭐¶
考虑一个人形机器人要从桌上拿起杯子。
如果奖励只写末端位置误差:
策略可能学会把躯干极端前倾,手臂伸到限位附近,脚几乎不动。
末端接近杯子,但姿态非常不自然。
这种动作可能在仿真中完成一次抓取,却很难对不同桌面高度泛化。
人类做这个动作时会自然弯膝、前移重心、调整另一只手和躯干。
这些协调结构很难只靠一个末端奖励表达。
动作模仿可以把这些协调结构作为先验引入训练。
历史线索:从角色动画到真实机器人 ⭐⭐¶
动作模仿最早在物理角色动画中形成系统方法。
DeepMimic 把 MoCap 参考动作转成强化学习奖励,让物理角色学会跑、跳和翻滚。
AMP 进一步用判别器学习“自然运动”的奖励,减少手写追踪项。
ASE 把大量动作压缩到技能潜空间,让下游任务可以调用可复用运动技能。
PHC 一类工作把运动追踪扩展到大规模人体动作集合,强调长时间不摔倒和失败恢复。
机器人领域随后吸收这些思想。
四足机器人用运动先验学到更自然的步态。
人形机器人用人体动作重定向训练全身控制。
四足臂和人形操作又把上半身动作、末端任务和下半身平衡结合起来。
这条历史脉络说明:动作模仿不是动画领域的技巧,而是高维全身控制中的一种结构化先验。
理论:模仿学习与强化学习的分工 ⭐⭐¶
设参考运动为:
机器人策略为:
动作模仿的目标不是简单复制参考状态。
真实目标是在物理转移下生成与参考相似且稳定的轨迹:
并让:
尽可能小,同时满足动力学、接触和执行器限制。
模仿信号提供“应该像什么”。
强化学习提供“在物理世界中怎样闭环实现”。
这两者缺一不可。
只有模仿,没有物理闭环,轨迹一受扰就偏离。
只有强化学习,没有动作先验,高维动作空间探索非常低效。
本质洞察:动作模仿不是把 MoCap 轨迹当作控制命令播放,而是把参考运动变成学习信号。 策略最终学到的是抗扰动的闭环行为,而不是一段开环动画。
双重解读:动作模仿像什么 ⭐⭐¶
从控制角度看,动作模仿像“带参考轨迹的跟踪控制”。
参考轨迹提供期望姿态、速度、末端位置和接触相位。
策略学习的是在模型误差、接触扰动和动作限制下跟踪它。
从数据角度看,动作模仿像“运动分布建模”。
数据集定义了自然动作的统计结构。
策略不一定逐帧追踪某一段动作,而是生成落在这个分布附近的运动。
DeepMimic 更靠近第一种理解。
AMP 更靠近第二种理解。
现代系统常把两者结合。
例如用追踪奖励保证任务对齐,用运动先验保证动作自然。
跨章连接 ⭐⭐¶
回顾 复合/40_RL全身控制基础:全身 RL 通过观测、动作、奖励和随机化学习复合机器人控制。
在那里,末端目标来自命令采样或高层策略。
本章的动作模仿可以为这些命令和奖励提供更强先验。
回顾 复合/50_操作技能接口:高层操作策略通过 task-frame EE 轨迹接入低层。
动作模仿中的手部、上身和物体交互轨迹也应尽量转成这种接口,而不是直接绑死在某个机器人关节空间。
⚠️ 常见陷阱¶
⚠️ 编程陷阱:把参考轨迹当成控制命令直接播放
错误做法:按时间把 retarget 后的关节角直接发给电机。
现象:仿真回放看似正常,稍有扰动就摔倒。
根本原因:开环轨迹没有根据当前状态修正误差。
正确做法:用参考轨迹构造奖励或观测,让策略学习闭环跟踪。
💡 概念误区:动作越像人越好
错误想法:人体动作还原得越精确,机器人表现越好。
实际情况:机器人关节、质量分布和接触能力与人体不同,过度追求人形相似可能不可执行。
正确理解:模仿的是任务相关运动结构,而不是机械复制每个关节角。
🧠 思维陷阱:把动作模仿和任务控制对立起来
错误想法:要么模仿数据,要么完成任务。
实际情况:实际系统常用任务奖励加模仿奖励。
正确做法:用任务奖励定义目标,用模仿信号限制动作分布和探索空间。
小节练习¶
- 以“人形机器人端盘子行走”为例,列出哪些运动结构适合从人类示例中学习,哪些必须由机器人控制器重新适配。
- 解释为什么开环播放 retarget 轨迹无法替代 RL 闭环策略。
- 设计一个奖励函数,同时包含末端任务、参考姿态和基座稳定三类项。
专题.2 参考运动表示:MoCap 到机器人状态 ⭐⭐¶
这一节解决的问题是:动作数据应该怎样表示,才能进入机器人训练。
动机:同一段动作有很多种描述方式 ⭐⭐¶
一段人类挥手动作可以用视频像素描述。
也可以用 3D 关键点描述。
可以用 SMPL 关节旋转描述。
可以用手腕末端轨迹描述。
可以用机器人关节角描述。
这些表示之间不是等价的。
视频包含外观但不直接包含关节角。
关键点直观但缺少关节旋转。
SMPL 表示适合人体但不适合机器人直接执行。
机器人关节轨迹可执行但失去跨平台性。
选择表示的原则是:训练目标需要什么,就保留什么。
如果任务是手部操作,手腕和夹爪相对物体的轨迹很重要。
如果任务是全身舞蹈,躯干、手脚和节奏都重要。
如果任务是稳定行走,上身动作可以作为扰动条件,而下身接触相位必须可靠。
常见运动数据 ⭐⭐¶
| 表示 | 内容 | 优点 | 风险 |
|---|---|---|---|
| BVH | 骨架层级 + 关节旋转 | 传统 MoCap 常见 | 坐标系和骨长不统一 |
| C3D | 标记点轨迹 | 接近原始测量 | 需要骨架拟合 |
| SMPL/SMPL-X | 人体形状 + 姿态参数 | 数据集统一 | 与机器人骨架差异大 |
| 3D keypoints | 关节点坐标 | 视觉估计方便 | 缺少姿态和接触 |
| EE trajectory | 手脚末端轨迹 | 接口清晰 | 缺少全身细节 |
| robot q | 机器人关节轨迹 | 可直接训练追踪 | 平台绑定 |
参考状态 ⭐⭐¶
动作追踪通常把参考状态写成:
其中 \(c^{ref}\) 是接触相位。
并不是每个方法都需要所有量。
DeepMimic 类方法常用姿态、速度、末端和质心。
人形全身追踪常加入关键点、root 高度和接触信息。
四足臂操作可能更关注末端轨迹、基座稳定和上身姿态。
Root 对齐 ⭐⭐¶
参考动作的全局位置通常不能直接使用。
MoCap 数据中的人体可能在世界中从左到右走。
训练时机器人环境的初始位置每个 episode 都不同。
因此常做 root 对齐。
例如把参考 root 的初始位置设为机器人初始位置:
朝向也可以对齐:
其中:
这样策略追踪的是相对运动,而不是某个数据集中的绝对世界位置。
速度计算 ⭐⭐¶
参考速度通常由离散轨迹差分得到。
位置速度:
关节速度:
旋转速度不能直接对旋转矩阵相减。
应使用:
速度差分对噪声敏感。
因此 MoCap 预处理通常需要平滑。
但平滑不能破坏接触事件。
脚落地瞬间的速度变化对控制很重要。
接触相位 ⭐⭐¶
接触相位告诉策略哪只脚或手应该接触环境。
可以由足端高度和速度估计:
也可以来自力板或仿真标注。
接触相位错误会严重影响训练。
如果参考说脚在支撑,但实际轨迹脚还在滑动,策略会收到矛盾信号。
如果参考说脚摆动,但奖励又要求脚不离地,策略也会混乱。
代码:参考轨迹采样器 ⭐⭐¶
import numpy as np
class MotionReference:
"""参考动作采样器,支持按相位读取参考状态。"""
def __init__(self, q, dq, root_pos, root_rot, ee_pos, contact, dt):
self.q = q
self.dq = dq
self.root_pos = root_pos
self.root_rot = root_rot
self.ee_pos = ee_pos
self.contact = contact
self.dt = dt
self.length = q.shape[0]
def sample(self, phase):
"""phase 在 [0, 1) 中,返回最近帧参考。"""
idx = int(phase * self.length) % self.length
return {
"q": self.q[idx],
"dq": self.dq[idx],
"root_pos": self.root_pos[idx],
"root_rot": self.root_rot[idx],
"ee_pos": self.ee_pos[idx],
"contact": self.contact[idx],
}
def random_phase(self, batch_size):
"""Reference State Initialization 使用随机相位启动。"""
return np.random.rand(batch_size)
这个采样器只做最近帧读取。
实际训练中更推荐按时间插值。
但即使是这个简化版本,也体现了动作模仿环境的核心:策略每一步都能拿到当前参考相位对应的目标。
⚠️ 常见陷阱¶
⚠️ 编程陷阱:旋转速度用矩阵元素差分
错误做法:
omega = (R_next - R_now) / dt。现象:速度维度不对,奖励和观测出现不可解释数值。
根本原因:旋转矩阵在 SO(3) 上,切向量应在李代数中表达。
正确做法:用
log(R_now.T @ R_next) / dt计算角速度近似。💡 概念误区:参考动作的世界坐标可以直接追踪
错误想法:MoCap 里人走到哪里,机器人就追到哪里。
实际情况:训练环境初始位置、朝向和任务场景不同,绝对坐标没有意义。
正确做法:做 root 对齐或用相对任务帧表示。
🧠 思维陷阱:平滑越强越好
错误想法:MoCap 有噪声,强低通会让训练更稳定。
实际情况:过强平滑会抹掉脚落地、抓取接触和快速转身等关键事件。
正确做法:分别处理连续姿态和离散接触,保留物理事件。
小节练习¶
- 写出一个 root 对齐公式,让参考动作从机器人当前 yaw 方向开始。
- 设计接触相位估计规则,并说明足端滑动会造成什么误判。
- 读取一段关节轨迹,分别用前向差分和中心差分计算速度,对比噪声。
专题.3 DeepMimic:手工参考追踪奖励 ⭐⭐⭐¶
这一节解决的问题是:如何把一段参考运动转成可训练的强化学习奖励。
动机:为什么需要分项追踪 ⭐⭐⭐¶
直接比较完整状态向量是不够的。
不同状态量的单位、尺度和重要性不同。
root 位置以米计。
关节角以弧度计。
末端位置以米计。
速度以米每秒或弧度每秒计。
如果把它们简单拼接求平方误差,数值大的量会主导训练。
DeepMimic 的思路是把运动相似性拆成多个有物理意义的分项。
典型分项包括姿态、速度、末端和质心。
奖励形式及其设计逻辑 ⭐⭐⭐¶
为什么用指数型奖励而不是线性惩罚?
在 RL 训练中,奖励函数的形状直接影响梯度方向和策略探索。考虑两种候选:
- 线性惩罚:\(r = -k \cdot \|e\|^2\)。误差越大惩罚越大,梯度恒定。但当误差很大时(比如策略刚开始训练),巨大的负奖励会让 value function 的方差很大,训练不稳定。
- 指数型奖励:\(r = \exp(-k \cdot \|e\|^2)\)。奖励在 \([0,1]\) 内有界,误差很大时奖励接近零但不会负无穷。梯度在误差附近集中,远离目标时梯度自然衰减。
DeepMimic 选择指数型的核心原因是**训练稳定性**。在高维全身运动中,初始策略的跟踪误差很大,如果用线性惩罚,value function 需要估计从 \(-10^4\) 到 \(0\) 的范围,对 PPO 的 critic 来说非常困难。指数型把范围压缩到 \([0,1]\),critic 只需要估计"大约 0.3 还是 0.6",训练效率大大提高。
跨领域类比:指数型奖励与控制论中的 Lyapunov 函数有相似性——Lyapunov 函数也是正定的、在平衡点取最大值(零)、远离平衡点衰减。DeepMimic 的每个奖励项可以理解为"距离参考动作的运动 Lyapunov 函数"。
总奖励:
姿态奖励——测量关节旋转是否接近参考:
这里 \(\log((R_j^{sim})^T R_j^{ref})\) 是 SO(3) 上的旋转距离。\(R_{sim}^T R_{ref}\) 是从仿真到参考的相对旋转,取对数得到轴角表示,其范数就是旋转角度。这比直接比较四元数或欧拉角在数学上更严格,因为它在 SO(3) 流形上度量真实的测地距离。
速度奖励——测量关节速度是否接近参考:
末端奖励——测量手脚关键点位置是否接近参考:
质心奖励——测量整体质心是否接近参考:
为什么需要分项而不是一个总误差? 不同运动目标之间可能存在冲突。例如精确跟踪手部位置(\(r_e\))可能要求躯干前倾,但跟踪躯干姿态(\(r_p\))要求保持直立。分项加权让设计者可以对不同任务调整优先级。
系数 \(k\) 的物理含义。\(k\) 的倒数 \(1/k\) 可以理解为"容许的误差方差"。\(k_p = 5.0\) 意味着关节角偏差约 \(\sqrt{1/5} \approx 0.45\) rad 时奖励衰减到 \(1/e\)。\(k_e = 40.0\) 意味着末端位置偏差约 \(\sqrt{1/40} \approx 0.16\) m 时奖励衰减到 \(1/e\)。这些数值需要根据机器人尺寸和任务精度调整。
Reference State Initialization ⭐⭐⭐¶
如果每个 episode 都从动作开头开始,策略只会先学开头附近的状态。
后半段动作很少被访问。
一旦前面追踪失败,后面更没有机会学习。
Reference State Initialization 让 episode 从参考动作的随机相位开始。
这样策略必须在任意相位都能接管。
对于循环动作,例如行走、跑步和挥手,RSI 尤其重要。
它相当于把长动作拆成很多局部控制问题。
每个局部都能被训练到。
反事实推理:如果不用 RSI ⭐⭐⭐¶
如果不用 RSI,训练会出现前段好、后段差。
策略在动作开头附近获得大量样本。
后面相位只有当前面不摔倒时才会出现。
早期策略很差,后面相位几乎没有数据。
这会形成恶性循环。
RSI 打破这个循环,让所有相位都有训练机会。
代码:DeepMimic 风格奖励 ⭐⭐⭐¶
import torch
def exp_neg_sq(error, scale):
"""指数型误差奖励,error shape = [batch, dim]。"""
return torch.exp(-scale * torch.sum(error * error, dim=-1))
def deepmimic_reward(sim, ref):
"""计算简化版 DeepMimic 奖励。"""
# 关节角误差:这里假设已经是最小角度差
pose_err = sim["q"] - ref["q"]
r_pose = exp_neg_sq(pose_err, scale=5.0)
# 关节速度误差
vel_err = sim["dq"] - ref["dq"]
r_vel = exp_neg_sq(vel_err, scale=0.1)
# 末端位置误差,包含双脚和双手
ee_err = (sim["ee_pos"] - ref["ee_pos"]).reshape(sim["ee_pos"].shape[0], -1)
r_ee = exp_neg_sq(ee_err, scale=40.0)
# 质心误差
com_err = sim["com_pos"] - ref["com_pos"]
r_com = exp_neg_sq(com_err, scale=10.0)
reward = 0.65 * r_pose + 0.10 * r_vel + 0.15 * r_ee + 0.10 * r_com
terms = {
"pose": r_pose,
"velocity": r_vel,
"end_effector": r_ee,
"com": r_com,
}
return reward, terms
代码中姿态误差被简化成关节角差。
对于球关节或浮动基座,应使用 SO(3) 对数误差。
否则大角度旋转会出现跳变。
DeepMimic 的优点 ⭐⭐⭐¶
第一,它非常直接。
每个奖励项都能解释。
第二,它适合精确追踪特定动作。
第三,它容易调试。
当动作失败时,可以看是姿态、速度、末端还是质心误差主导。
第四,它适合作为 retargeting 质量验证。
如果参考轨迹本身不合理,追踪奖励会很难提高。
DeepMimic 的局限 ⭐⭐⭐¶
第一,奖励权重需要手工调。
不同动作可能需要不同权重。
翻滚、跑步、挥手和抓取的重点不同。
第二,它容易过拟合单段动作。
一个策略可能只会执行某个固定片段。
第三,它对参考质量敏感。
如果参考脚底滑动,策略也会被奖励去滑动。
第四,它不能自动判断“自然动作”的分布。
只要逐帧误差小,奖励就高,即使动作风格僵硬。
这正是 AMP 引入运动先验的动机。
⚠️ 常见陷阱¶
⚠️ 编程陷阱:姿态误差没有处理角度周期
错误做法:直接
q_sim - q_ref,其中角度可能跨越 \(\pi\) 和 \(-\pi\)。现象:动作接近时误差突然很大。
根本原因:角度是周期变量。
正确做法:用最小角度差或 SO(3) 对数误差。
💡 概念误区:追踪误差越小,动作越自然
错误想法:逐帧误差小就说明动作质量好。
实际情况:机器人可能用高频抖动或不合理接触达到低误差。
正确理解:追踪奖励需要配合能耗、平滑、接触一致性和稳定性。
🧠 思维陷阱:一套权重适用所有动作
错误想法:找到 DeepMimic 的经典权重后直接用于所有任务。
实际情况:不同平台、动作和关节定义会改变误差尺度。
正确做法:先统计每个误差项的典型范围,再调权重。
小节练习¶
- 为“人形双臂挥手但下半身保持站立”设计 DeepMimic 奖励权重。
- 实现 RSI:每个 episode 从随机参考相位初始化,并记录不同相位成功率。
- 设计一个检测参考脚底滑动的指标,并说明滑动参考会如何误导策略。
专题.4 AMP:对抗运动先验 ⭐⭐⭐¶
这一节解决的问题是:如何让系统自动学习“什么运动像数据集”,而不是手写所有姿态追踪项。
动机:手写奖励很难覆盖运动风格 ⭐⭐⭐¶
DeepMimic 需要为每个参考动作设计追踪项。
如果目标是“自然行走”,并不一定需要逐帧追踪某段动作。
我们只希望生成的运动看起来属于人类或动物动作分布。
这时逐帧参考反而太严格。
AMP 的思想是训练一个判别器。
判别器看一小段状态转移,判断它来自真实动作数据还是策略生成。
策略得到的运动风格奖励来自判别器输出。
判别器输入 ⭐⭐⭐¶
AMP 通常不只看单帧状态。
它看状态转移:
因为运动自然性包含速度、相位和动态连续性。
单帧站姿可能看起来正常,但下一帧突然跳变就不自然。
转移输入能捕捉这种动态结构。
对于机器人,可以选择局部特征作为判别器输入。
例如 root 高度、root 速度、关节角、关节速度、末端位置和接触状态。
不一定要包含全局位置。
全局位置会让判别器记住数据集中的绝对轨迹,而不是运动风格。
对抗目标的完整推导 ⭐⭐⭐¶
设真实动作数据分布为 \(p_{data}\)。
策略生成分布为 \(p_\pi\)。
判别器 \(D_\phi(s,s')\) 学习区分两者。
为什么选择最小二乘 GAN 而不是原始 GAN? 原始 GAN(Goodfellow 2014)使用交叉熵损失 \(\log D\) 和 \(\log(1-D)\)。当判别器很强时,\(\log(1-D)\) 的梯度趋近于零——生成器几乎收不到有效梯度信号。这就是 GAN 训练中著名的"梯度消失"问题。
最小二乘 GAN(LSGAN, Mao et al. 2017)用平方误差替代对数,梯度在判别器输出偏离目标值时始终存在。对 RL 策略优化来说,梯度信号的稳定性比 GAN 训练中更重要——因为 RL 的策略更新本身就有高方差,如果风格奖励的梯度再消失,训练几乎不可能收敛。
判别器的目标值设定:真实数据转移 \((s,s') \sim p_{data}\) 的输出目标为 \(+1\),策略生成转移 \((s,s') \sim p_\pi\) 的输出目标为 \(-1\)。判别器最小化:
梯度惩罚 \(L_{gp}\) 的必要性。判别器如果梯度范数很大,意味着它在状态空间的某些区域变化极快。策略一旦从"自然区域"偏移一点点,奖励就会骤降。这会导致策略只学到极小范围内的动作,丧失泛化能力。梯度惩罚限制判别器的 Lipschitz 常数:
跨领域类比:梯度惩罚的作用类似于控制系统中的限幅器。不限幅的判别器就像增益无穷大的控制器——理论上分类精度最高,但系统会在边界处振荡。梯度惩罚把判别器的"增益"限制在合理范围内,让策略有稳定的学习空间。
策略的风格奖励。策略不直接优化 \(L_D\),而是从判别器输出中提取奖励信号:
这个变换的设计逻辑是:当策略生成的转移被判别器判断为"真实"(\(D \approx 1\))时,\(r_{style} \approx 1\);当被判断为"假"(\(D \approx -1\))时,\(r_{style} = \max(0, 1 - 1) = 0\)。\(\max(0, \cdot)\) 截断保证奖励非负。\(1/4\) 的系数让奖励在 \(D \in [-1, 1]\) 范围内保持合理的梯度幅度。
具体形式会随实现变化。本质是:越像数据,奖励越高。
从 GAIL 到 AMP:理论脉络 ⭐⭐⭐¶
AMP 并非凭空设计。它的理论根基来自 GAIL(Generative Adversarial Imitation Learning),而 GAIL 本身又与 f-散度最小化有深刻联系。理解这条推导链对正确使用 AMP、诊断训练问题都至关重要。
GAIL 的出发点。GAIL 把模仿学习转化为匹配占据度量(occupancy measure)的问题。定义策略 \(\pi\) 的占据度量为:
GAIL 的目标是让 \(\rho_\pi\) 接近专家的占据度量 \(\rho_E\)。Ho & Ermon(2016)证明,这等价于最小化 Jensen-Shannon 散度:
这个最小化通过对抗博弈实现:判别器 \(D\) 区分策略和专家的状态-动作对,策略 \(\pi\) 试图欺骗判别器。
从 GAIL 到 AMP 的关键修改。AMP 相对 GAIL 做了三个重要改变:
第一,判别器输入从 \((s,a)\) 变成 \((s,s')\)。GAIL 判别状态-动作对,但动作空间在不同平台上定义不同(关节力矩、PD 目标、末端增量)。AMP 用连续两帧状态 \((s_t, s_{t+1})\) 替代,这样判别器只看运动结果,与控制接口解耦。这个替换在理论上是合理的:给定转移动力学 \(s_{t+1} = f(s_t, a_t)\),\((s_t, s_{t+1})\) 包含了 \(a_t\) 的所有可观测效果。
第二,从 JS 散度推广到 f-散度。AMP 使用最小二乘目标而不是交叉熵目标。可以证明,不同的判别器损失函数对应不同的 f-散度:
| 判别器损失 | 对应 f-散度 | 特点 |
|---|---|---|
| 交叉熵(GAIL) | Jensen-Shannon | 梯度在判别器很强时消失 |
| 最小二乘(AMP) | Pearson \(\chi^2\) | 梯度始终存在,训练更稳定 |
| Wasserstein | 最优传输距离 | 需要严格 Lipschitz 约束 |
形式化地,AMP 的判别器目标对应最小化策略分布与数据分布之间的 Pearson \(\chi^2\) 散度:
这个散度在两个分布差异大时给出更强的信号,而 JS 散度在差异大时趋于饱和。对 RL 策略训练来说,这意味着初始阶段策略能收到更有效的梯度。
第三,梯度惩罚替代权重裁剪。WGAN 用权重裁剪约束 Lipschitz 常数,GAIL 不约束。AMP 使用梯度惩罚(gradient penalty),在理论上等价于软约束判别器的 Lipschitz 常数,实践中比裁剪更稳定。
深入理解:为什么 AMP 的风格奖励连接到 f-散度最小化?
考虑策略优化的目标 \(\max_\pi \mathbb{E}_{(s,s') \sim \rho_\pi}[r_{style}(s,s')]\)。当 \(r_{style}\) 由最优判别器给出时,策略最大化风格奖励等价于最小化 \(p_\pi\) 与 \(p_{data}\) 之间的 f-散度。 换言之,策略不知道 f-散度的存在,它只是在最大化累积奖励。但最优判别器把分布差异转化成了奖励信号,使得奖励最大化隐含了分布匹配。 这就是 AMP "自动学习运动风格"的数学本质:它在策略-判别器交替优化中隐式地最小化运动分布散度。
判别器更新与策略梯度的交互。AMP 的训练是一个两时间尺度过程:
外层循环(每 N_policy 步):
├── 用当前策略 π_θ 采集轨迹 {(s_t, s_{t+1})}
├── 从动作数据集采样 {(s_t, s_{t+1})}_data
├── 内层循环(每 N_disc 步):
│ └── 更新判别器 D_φ,最小化 L_D
├── 计算风格奖励 r_style = f(D_φ(s,s'))
├── r_total = w_task * r_task + w_style * r_style
└── 用 PPO 更新策略 π_θ,最大化 r_total
两个更新频率的比值 \(N_{disc} / N_{policy}\) 至关重要。如果判别器更新太快(比值太大),判别器很快学会完美区分,策略拿不到有效梯度——类似 GAN 中的模式崩塌。如果判别器更新太慢(比值太小),风格奖励不能有效区分自然和不自然动作,约束力太弱。实践中常用 \(N_{disc} = 1\),\(N_{policy} = 1\),即每个 PPO 迭代更新一次判别器。
跨领域类比:判别器和策略的关系像厨师和美食评审。如果评审标准太高(判别器过强),厨师发现无论怎么改都拿不到好评,就会放弃尝试——这是 GAN 的训练崩塌。如果评审太随便(判别器过弱),厨师做什么都能过关,不会学到真正的技术。好的训练需要评审和厨师能力同步提升。
总奖励 ⭐⭐⭐¶
AMP 通常与任务奖励组合:
任务奖励告诉策略要做什么。
风格奖励告诉策略怎样做更自然。
例如速度跟踪任务中:
AMP 风格奖励让它用类似数据集的步态完成速度跟踪。
类比:动作风格的质检员 ⭐⭐¶
DeepMimic 像老师拿着标准答案逐题批改。
每一帧都要和参考答案接近。
AMP 像质检员判断这段动作是否属于合格产品。
它不要求每一步都和某个固定样本一样。
只要求整体统计特征像数据集。
这给了策略更多自由。
但也引入了对抗训练的不稳定。
代码:判别器损失 ⭐⭐⭐¶
import torch
import torch.nn.functional as F
def amp_discriminator_loss(d_real, d_fake, grad_penalty):
"""AMP 判别器的简化最小二乘损失。"""
# 真实动作转移希望输出 +1
loss_real = torch.mean((d_real - 1.0) ** 2)
# 策略生成转移希望输出 -1
loss_fake = torch.mean((d_fake + 1.0) ** 2)
# 梯度惩罚稳定训练
loss = loss_real + loss_fake + 10.0 * grad_penalty
return loss
def amp_style_reward(d_fake):
"""把判别器输出转换为风格奖励。"""
reward = 1.0 - 0.25 * (d_fake - 1.0) ** 2
return torch.clamp(reward, min=0.0, max=1.0)
真实实现中还要处理 replay buffer、特征归一化和判别器更新频率。
如果判别器过强,策略几乎拿不到风格奖励。
如果判别器过弱,风格奖励没有约束作用。
AMP 的优点 ⭐⭐⭐¶
第一,不需要精确逐帧对应。
第二,可以从多个动作片段中学习运动分布。
第三,可以与任务奖励组合。
第四,能鼓励自然风格,而不是只追求误差最小。
AMP 的局限 ⭐⭐⭐¶
第一,对抗训练不稳定。
第二,判别器特征选择很关键。
第三,风格奖励可能与任务奖励冲突。
第四,数据集偏差会被学进去。
如果数据集中没有某种动作,AMP 不会凭空知道它自然。
如果数据中有脚滑,判别器可能把脚滑当成正常风格。
⚠️ 常见陷阱¶
⚠️ 编程陷阱:判别器输入没有归一化
错误做法:直接把不同尺度的关节角、速度、位置拼接。
现象:判别器只关注数值大的通道。
根本原因:特征尺度不一致。
正确做法:对 AMP 特征做 running mean/std 归一化。
💡 概念误区:AMP 可以替代任务奖励
错误想法:有运动先验后,策略自然会完成任务。
实际情况:AMP 只知道动作像不像数据,不知道目标速度、目标位置或抓取成功。
正确做法:风格奖励和任务奖励组合使用。
🧠 思维陷阱:判别器越准越好
错误想法:判别器分类准确率越高,训练越好。
实际情况:判别器太强会让策略长期拿不到有效梯度。
正确做法:控制判别器更新频率、使用梯度惩罚和数据缓冲。
AMP 训练的实用技巧 ⭐⭐⭐¶
在实际项目中使用 AMP 时,以下经验有助于避免常见问题:
判别器网络结构。推荐使用 2-3 层 MLP,隐层维度 256 或 512。不需要很深的网络——判别器只需区分局部状态转移的统计特征,不需要像图像判别器那样学习层级特征。过深的网络更容易过拟合,导致训练不稳定。
特征选择原则。判别器输入应包含运动的局部特征:root 高度、root 线速度和角速度、关节角、关节速度、末端相对 root 的位置。不应包含全局 x/y 位置——否则判别器会记住数据集中的绝对轨迹,而非运动风格。也不应包含动作(关节力矩或 PD 目标),因为不同平台的动作定义不同。
Replay buffer。策略生成的状态转移不应只用当前批次。维护一个 replay buffer 存储历史转移样本,让判别器在更广泛的样本上训练。这减少了判别器对当前策略分布的过拟合。推荐 buffer 大小为 \(10^5\) 到 \(10^6\) 个转移对。
数据集多样性与平衡。如果数据集中行走动作占 90%、跳跃占 10%,判别器会偏向行走。策略可能学到"行走是自然的,跳跃不是"。解决方法是对数据集做均衡采样,或为不同动作类别训练独立判别器。
class AMPReplayBuffer:
"""AMP 判别器训练用的经验回放缓冲。"""
def __init__(self, capacity, obs_dim):
self.capacity = capacity
self.buffer_s = np.zeros((capacity, obs_dim), dtype=np.float32)
self.buffer_s_next = np.zeros((capacity, obs_dim), dtype=np.float32)
self.ptr = 0
self.size = 0
def add(self, s, s_next):
batch = s.shape[0]
idx = np.arange(self.ptr, self.ptr + batch) % self.capacity
self.buffer_s[idx] = s
self.buffer_s_next[idx] = s_next
self.ptr = (self.ptr + batch) % self.capacity
self.size = min(self.size + batch, self.capacity)
def sample(self, batch_size):
idx = np.random.randint(0, self.size, size=batch_size)
return self.buffer_s[idx], self.buffer_s_next[idx]
小节练习 ⭐⭐⭐¶
- 设计 AMP 判别器输入特征,要求不包含全局 x/y 位置。
- 解释为什么状态转移比单帧状态更适合判断运动自然性。
- 设计一个实验比较纯速度奖励和速度奖励加 AMP 风格奖励的步态差异。
- 推导:当判别器是最优的(即 \(D^*(s,s')\) 完美区分 \(p_{data}\) 和 \(p_\pi\)),策略最大化 \(r_{style}\) 等价于最小化什么分布度量?
前面三节建立了动作模仿的三个核心方法层次:DeepMimic 的逐帧追踪提供精确但刚性的参考;AMP 的对抗先验提供灵活的风格约束;下面要讨论的技能潜空间把多种运动压缩成可复用的连续表示。这三层不是互相替代的,而是可以组合的——例如用 DeepMimic 奖励训练单个技能,用 AMP 判别器约束技能间切换的自然性,用技能潜空间实现多任务调度。
专题.5 技能潜空间、长期追踪与失败恢复 ⭐⭐⭐¶
这一节解决的问题是:如何从单段动作模仿走向多技能、长时程和可恢复控制。
动机:真实机器人不能只会一段动作 ⭐⭐⭐¶
DeepMimic 常训练单个技能。
一个策略学一个后空翻,另一个策略学跑步。
这对动画演示可以接受。
对机器人不够。
机器人需要在走、转、蹲、伸手、避障和操作之间切换。
它还需要在被推、脚滑或目标改变后恢复。
因此动作模仿从单段追踪发展到技能潜空间和大规模运动追踪。
ASE:技能潜空间 ⭐⭐⭐¶
ASE(Adversarial Skill Embeddings)的核心是引入潜变量 \(z\)。
策略写成:
不同 \(z\) 对应不同运动技能或风格。
训练阶段让 \(z\) 覆盖大量动作数据。
下游任务只需要学习如何选择 \(z\),就可以调用已有技能。
这比为每个任务从零训练策略更高效。
ASE 的编码器-解码器架构。ASE 实际上包含四个组件,每个都有明确的功能:
ASE 架构
├── 编码器 enc(z | τ) ← 把动作片段压缩成潜变量
├── 解码器 π(a | o, z) ← 条件策略,根据潜变量执行
├── 先验 p(z) ← 潜空间的参考分布(通常是单位高斯)
├── 后验 q(z | o) ← 当前观测下的潜变量推断
└── 判别器 D(s, s') ← AMP 风格的运动自然性判别
编码器 \(\text{enc}(z|\tau)\) 接收一段动作片段 \(\tau = \{s_t, s_{t+1}, \ldots, s_{t+k}\}\),输出潜变量 \(z\) 的分布参数。训练时,编码器从数据集的动作片段中采样 \(z\),然后让解码器(条件策略)\(\pi(a|o,z)\) 在物理仿真中执行这个 \(z\) 对应的动作。AMP 判别器同时评估执行结果的自然性。
先验 \(p(z)\) 通常是标准正态分布 \(\mathcal{N}(0, I)\)。训练中通过 KL 散度正则化 \(D_{KL}(q(z|o) \| p(z))\) 保证潜空间不会退化成离散簇。后验 \(q(z|o)\) 在下游任务中使用——给定当前观测,推断应该执行哪个技能。
跨领域类比:ASE 的编码器-解码器结构类似于音乐合成器的预设库。编码器像录音师,把各种演奏录成预设。解码器像合成器引擎,给一个预设编号就能实时生成对应声音。先验分布像预设库的索引系统,保证编号空间连续且覆盖均匀。下游任务就像作曲家,只需选择和混合预设,不需要从零设计每个音色。
潜空间的直觉 ⭐⭐¶
如果把技能看成离散按钮,切换会很僵硬。
走路按钮、跑步按钮、蹲下按钮之间没有连续关系。
潜空间把技能放在一个连续空间中。
两个技能之间可以插值。
例如慢走和快走之间的 \(z\) 可能产生中速行走。
左转和右转之间的 \(z\) 可能产生小角度转向。
这种连续性对复合机器人很重要。
操作任务经常需要在多个动作之间平滑过渡。
CALM:从技能库到任务条件调用 ⭐⭐⭐¶
ASE 建立了技能潜空间,但下游任务如何高效调用这些技能?CALM(Conditional Adversarial Latent Models)提供了一座桥梁。
CALM 的核心洞察是:ASE 训练完成后,潜空间中的 \(z\) 分布是"无条件的"——它覆盖所有技能,但不知道当前任务需要哪个。CALM 在 ASE 之上训练一个任务条件先验:
其中 \(g_t\) 是任务目标(如目标位置、目标物体、高层语义指令)。这个条件先验学习"给定当前观测和任务目标,应该选择哪个技能"。
训练流程分两阶段:
阶段 1:ASE 预训练
输入:大量无标注动作片段
输出:技能潜空间 + 条件策略 π(a|o,z)
阶段 2:CALM 任务适配
输入:任务奖励 r_task + 预训练的 π 和 enc
训练:条件先验 p_ψ(z|o,g)
冻结:底层策略 π(或极小学习率微调)
CALM 的优势在于第二阶段的样本效率。底层策略已经能执行各种技能,任务适配只需要学习"什么时候用哪个技能"。这比从零训练全身策略快一到两个数量级。
这种"预训练技能库 + 任务条件调用"的模式与 复合/50_操作技能接口 中讨论的技能接口思想高度一致。区别在于操作接口用显式命令空间(EE 位姿、力矩阈值),CALM 用隐式潜空间。两者可以互补:CALM 的潜变量选择器负责选择运动风格,操作接口负责精确的末端任务执行。
class CALMHighLevel:
"""CALM 风格的任务条件技能选择器(简化示意)。"""
def __init__(self, obs_dim, goal_dim, latent_dim):
# 条件先验网络:给定观测和任务目标,输出潜变量分布
self.prior_net = MLP(obs_dim + goal_dim, [256, 256], latent_dim * 2)
def select_skill(self, obs, goal):
"""根据当前观测和任务目标选择技能潜变量。"""
h = self.prior_net(torch.cat([obs, goal], dim=-1))
mu, log_std = h.chunk(2, dim=-1)
z = mu + torch.exp(log_std) * torch.randn_like(mu)
return z # 传给底层 ASE 策略 π(a|o, z)
⚠️ 编程陷阱:CALM 适配阶段解冻底层策略
错误做法:在任务适配阶段对底层 ASE 策略 \(\pi(a|o,z)\) 使用正常学习率更新。
现象:底层策略退化,已经学会的技能能力丢失(灾难性遗忘)。
根本原因:任务奖励梯度会把底层策略拉向完成当前任务的方向,破坏预训练中学到的通用技能。
正确做法:冻结底层策略,或使用极小学习率(\(< 10^{-5}\))微调。只训练条件先验 \(p_\psi(z|o,g)\)。
PHC 类长期追踪 ⭐⭐⭐¶
长时程运动追踪的关键困难是失败恢复。
策略可能在某些难相位摔倒。
如果训练只在平均数据上优化,少数困难片段会长期失败。
PHC 的渐进训练策略。PHC(Perpetual Humanoid Control)不是直接在全部动作上训练一个策略,而是采用渐进式扩展。
第一阶段:在简单动作子集上训练基础策略(行走、站立、简单手势)。
第二阶段:锁定基础策略权重的底层,加入更复杂动作(跑步、转身、蹲下),只微调上层。
第三阶段:用 hard negative mining 专攻失败片段。
这种渐进训练避免了直接面对数千种动作时的训练崩塌。类似于教学中"先学站、再学走、最后学跑"的自然进程。
Hard negative mining 与惯性补偿。Hard negative mining 的思路是专门收集失败片段,然后提高这些片段在训练中的采样概率。策略逐渐学会从困难状态恢复。
这对人形机器人尤其关键。因为双足支撑面积小,一次相位错误就可能导致摔倒。
PHC 进一步引入惯性补偿(inertial compensation)技巧。当策略从困难状态恢复时,它需要快速改变身体动量——从"正在摔倒"变成"重新站稳"。但正常训练中,恢复动作的奖励很低(因为姿态偏差大),策略倾向于放弃恢复而直接摔倒(摔倒后 episode 重启,从容易的状态重新开始)。
惯性补偿的做法是:在困难状态初始化时,给予一个短暂的"恢复宽容期"。在这个窗口内,追踪误差的权重降低,稳定恢复的奖励增加。策略不会因为瞬间姿态偏差大而被惩罚,而是被鼓励先站稳、再逐渐回到参考轨迹。
def phc_recovery_reward(sim, ref, time_since_init, recovery_window=0.5):
"""PHC 风格恢复奖励:初始化后短暂宽容期。"""
# 正常追踪奖励
tracking = deepmimic_reward(sim, ref)
# 恢复阶段的稳定奖励
upright = torch.exp(-5.0 * (sim["base_up_vec"][:, 2] - 1.0) ** 2)
height_ok = torch.exp(-10.0 * (sim["base_height"] - ref["base_height"]) ** 2)
recovery = 0.5 * upright + 0.5 * height_ok
# 在恢复窗口内逐渐从 recovery 过渡到 tracking
alpha = torch.clamp(time_since_init / recovery_window, 0.0, 1.0)
reward = alpha * tracking + (1.0 - alpha) * recovery
return reward
深入理解:PHC 的渐进训练 + hard negative mining + 惯性补偿构成了一个"课程学习"系统。课程学习(curriculum learning)的理论根基是:对于非凸优化问题,训练样本的呈现顺序会影响最终解的质量。先易后难的课程通常能找到更好的局部最优。PHC 把这个原理应用到运动追踪:先学简单动作建立基本控制能力,再攻克困难动作,最后专注失败恢复。
失败片段采样流程 ⭐⭐⭐¶
这不是简单增加训练数据。
它改变了采样分布。
训练重点从“平均动作表现”转向“最容易失败的区域”。
上下体解耦模仿 ⭐⭐⭐¶
人形和四足臂操作中,常见做法是上半身追踪参考,下半身负责平衡。
例如上体来自遥操作或 MoCap。
下体策略输入上体目标或上体当前状态,学习如何移动脚和身体保持稳定。
这种方法避免让下体逐帧模仿人体脚步。
因为机器人腿长、脚底、质量分布和执行器能力与人体不同。
上体动作可以较强模仿。
下体动作则更强调机器人自身稳定。
这是一种“模仿与适配”的分工。
代码:失败片段采样权重 ⭐⭐⭐¶
import numpy as np
class MotionSampler:
"""根据失败统计调整动作片段采样概率。"""
def __init__(self, num_clips):
self.num_clips = num_clips
self.fail_count = np.zeros(num_clips, dtype=np.float32)
self.base_weight = np.ones(num_clips, dtype=np.float32)
def update_failures(self, failed_clip_ids):
for idx in failed_clip_ids:
self.fail_count[idx] += 1.0
def probabilities(self):
weights = self.base_weight + 0.5 * self.fail_count
return weights / np.sum(weights)
def sample(self, batch_size):
prob = self.probabilities()
return np.random.choice(self.num_clips, size=batch_size, p=prob)
真实系统还会按失败相位采样,而不仅是按动作片段。
但这个例子展示了 hard negative mining 的核心:失败越多,越应该被重新训练。
⚠️ 常见陷阱¶
⚠️ 编程陷阱:只记录失败动作,不记录失败相位
错误做法:某段动作失败后,下次仍从随机相位训练。
现象:困难相位仍然样本不足。
根本原因:失败通常发生在特定相位,例如落地、转身或抓取接触。
正确做法:记录 clip id 和 phase,一起用于重采样。
💡 概念误区:潜空间一定有可解释轴
错误想法:\(z_1\) 就是速度,\(z_2\) 就是步高。
实际情况:无监督或弱监督潜空间未必轴对齐。
正确理解:潜空间是否可解释取决于训练目标和约束。
🧠 思维陷阱:追踪全身每个关节才叫模仿
错误想法:下肢也必须精确追踪人体腿部动作。
实际情况:机器人下肢应优先满足稳定和力矩可行性。
正确做法:上体可强追踪,下体可用任务和稳定奖励适配。
⚠️ 编程陷阱:失败采样只按动作片段不按相位
错误做法:某段跳跃动作失败后标记整段,下次仍可能从不失败的起跳阶段训练。
现象:困难的落地相位仍然样本极少,失败率不下降。
根本原因:失败常集中在特定相位(如落地、抓取接触),按片段统计丢失了相位信息。
正确做法:记录 (clip_id, failure_phase),在 RSI 时优先从失败相位附近初始化。
小节练习¶
- 设计一个技能潜空间任务:高层输入目标速度和目标手部高度,输出 latent \(z\)。
- 说明为什么失败恢复对双足比四足更重要。
- 为上体遥操作人形设计上下体奖励分工。
- 画出 CALM 的两阶段训练流程图,标注哪些模块被冻结。
- 设计一个 PHC 风格渐进训练课程:选择 5 种动作,按难度排序,说明每阶段的训练目标和成功条件。
前面几节假设参考动作来自高质量 MoCap 系统。但 MoCap 数据在数量和场景多样性上存在天然瓶颈。接下来两节分别讨论数据来源的扩展(从视频获取参考)和运动知识的跨平台复用(跨形态迁移)。这两个方向共同推动动作模仿从"单平台单数据源"走向更通用的范式。
专题.5b 基于视频的动作模仿 ⭐⭐⭐¶
这一节解决的问题是:如何从普通视频而非 MoCap 系统获取参考动作,并用于机器人策略训练。
动机:MoCap 很强但不够普适 ⭐⭐¶
前面所有方法默认参考动作来自 MoCap 系统——标记点、力板、精密相机阵列。
MoCap 精度高,但有三个根本限制。
第一,场景受限。MoCap 必须在预标定的采集空间进行,不能在户外、工厂或家庭环境中随意录制。
第二,穿戴成本。被试者需要穿贴有标记点的紧身衣,不适合大规模、非专业人员的数据采集。
第三,数据量天花板。互联网上的视频远比 MoCap 数据集丰富。YouTube 上有无穷无尽的人类运动视频——体操、舞蹈、搬运、日常活动。如果能从中提取可用参考,数据来源将不再是瓶颈。
跨领域类比:MoCap 采集像在专业录音棚里录歌。音质完美,但每首歌都需要昂贵的棚租和工程师。视频动作提取像从手机录音中分离人声——质量不如录音棚,但随处可得,数量远超专业录音。当下游任务(RL 训练)本身就有噪声容忍度时,"大量中等质量数据"可能比"少量高质量数据"更有价值。
流水线:从视频到可训练参考 ⭐⭐⭐¶
视频动作模仿的典型流水线包含四个阶段:
原始视频
↓ 姿态估计(HMR2 / WHAM / SLAHMR / 4DHumans)
SMPL 参数序列 {θ_t, β, T_t}
↓ 时序平滑与物理修正
干净 SMPL 序列
↓ Retargeting(专题.6 节方法)
机器人关节轨迹 {q_t^robot}
↓ RL 训练(DeepMimic / AMP)
闭环控制策略 π
阶段 1:视频到 SMPL。现代人体姿态估计器把单目视频帧映射到 SMPL 模型参数。代表性方法包括:
| 方法 | 输入 | 输出 | 特点 |
|---|---|---|---|
| HMR2 | 单帧图像 | SMPL 姿态 + 形状 | Transformer 架构,单帧精度高 |
| WHAM | 视频序列 | 全局 SMPL 轨迹 | 结合 IMU 先验,全局定位 |
| SLAHMR | 多人视频 | 多人 SMPL + 场景 | 同时优化人体和相机轨迹 |
| 4DHumans | 视频 | 时序一致 SMPL | 多人跟踪和遮挡处理 |
每帧输出包含:躯干全局旋转 \(R_{root}\)、全局平移 \(T_{root}\)、关节角参数 \(\theta \in \mathbb{R}^{72}\)(SMPL 的 24 个关节各 3 个轴角分量)和体形参数 \(\beta \in \mathbb{R}^{10}\)。
阶段 2:时序平滑与物理修正。视觉估计的原始输出通常包含高频抖动、帧间跳变和物理不合理性(例如脚穿地面、人体漂移)。平滑处理包括:
- 时序滤波:低通滤波关节角,保留接触事件
- 地面约束:强制支撑脚在地面上,修正 root 高度
- 物理一致性:用优化方法使关节角序列在物理上合理(不产生超大力矩)
import numpy as np
from scipy.signal import savgol_filter
def smooth_smpl_sequence(poses, contacts, window=11, poly_order=3):
"""平滑 SMPL 姿态序列,保留接触事件。
poses: (T, 72) SMPL 关节角
contacts: (T, 2) 左右脚接触标志
"""
smoothed = np.copy(poses)
# 对每个关节通道做 Savitzky-Golay 滤波
for j in range(poses.shape[1]):
smoothed[:, j] = savgol_filter(poses[:, j], window, poly_order)
# 在接触切换帧附近不平滑,保留离散事件
for t in range(1, len(contacts)):
if np.any(contacts[t] != contacts[t - 1]):
# 接触切换帧前后 3 帧保留原始值
lo = max(0, t - 3)
hi = min(len(poses), t + 4)
smoothed[lo:hi] = poses[lo:hi]
return smoothed
**阶段 3 和 4**与 专题.6 节的 retargeting 和 专题.3/专题.4 节的 RL 训练相同。
核心挑战:视频姿态的噪声与不确定性 ⭐⭐⭐¶
视频姿态估计面临三类根本困难:
深度模糊。单目视频丢失了深度信息。估计器看到手臂在图像中变短,无法区分"手臂向前伸"还是"手臂向下垂"。这种模糊在根部平移 \(T_{root}\) 和沿相机光轴的关节位置上最为严重。
遮挡。当身体部位被物体、其他人或自身遮挡时,估计器只能依赖先验猜测。猜测的关节角可能与真实值偏差很大。
全局定位漂移。视频估计的全局轨迹(人在世界中的位置)依赖相机运动估计。SLAM 或光流的漂移会传导到人体轨迹中。WHAM 和 SLAHMR 通过联合优化相机和人体来缓解这个问题,但不能完全消除。
⚠️ 概念误区:视频姿态是地面真值
错误想法:HMR2 或 WHAM 输出的 SMPL 参数就是人体的真实姿态,可以直接用于 retargeting。
实际情况:视频估计的关节角误差通常在 5-15 度,全局平移误差在 5-20 cm。对于精细操作任务(如抓取、工具使用),这个精度远远不够。
根本原因:单目视频的几何约束不足以唯一确定 3D 姿态。所有估计器都依赖训练数据的先验,对分布外的动作(如非常规体操动作)误差会大幅增加。
正确做法:把视频姿态当作带噪声的参考,配合 AMP 风格的分布匹配而非 DeepMimic 风格的逐帧追踪。视频姿态的噪声在分布层面会被平均掉,但逐帧追踪会放大噪声。
代表性工作 ⭐⭐⭐¶
Vid2Player(2023)。从网球比赛视频中提取球员动作,训练物理角色在仿真中打网球。流水线为:视频 → 姿态估计 → retargeting → RL 训练。关键创新是利用网球比赛的结构化约束(球场线、球轨迹)来修正姿态估计的全局定位误差。
视频条件运动策略。不把视频预处理成离散参考轨迹,而是直接把视频特征作为策略输入。策略学习"看到某个视频片段后做出相似动作"。这避免了显式姿态估计的瓶颈,但需要大量视频-动作配对数据,且泛化到未见视频的能力有待验证。
与本章其他方法的关系。视频动作模仿不是独立方法,而是数据获取管道的扩展。一旦从视频中提取出 SMPL 参数序列,后续的 retargeting(专题.6 节)、DeepMimic 追踪(专题.3 节)和 AMP 分布匹配(专题.4 节)完全适用。区别仅在于数据质量:MoCap 数据精度约 1 mm,视频姿态精度约 1-5 cm。这个数量级差异决定了 AMP 比 DeepMimic 更适合处理视频来源的参考动作。
数据质量-训练方法匹配矩阵:
| 数据质量 | 适合的训练方法 | 原因 |
|---|---|---|
| 高精度 MoCap(<1mm) | DeepMimic 逐帧追踪 | 参考足够精确,逐帧追踪有意义 |
| 中等精度 IMU/视频(1-5cm) | AMP 分布匹配 | 噪声在分布层面被平均,逐帧追踪会放大噪声 |
| 低精度粗估计(>5cm) | 仅作为 AMP 数据集增强 | 太粗糙不能单独使用,但可以扩充数据集多样性 |
| 多源混合 | AMP + 数据质量加权 | 对高质量样本给判别器更高权重 |
这个矩阵提供了一个实用的决策框架。当你拿到一批新的运动数据时,先评估其精度水平,再决定用什么训练方法。不要对低精度数据强行做逐帧追踪——那只会让策略学到抖动和漂移。
与 复合/200_UMI_on_Legs精读 的连接:UMI 系统从手持夹爪采集操作轨迹,经 SLAM 恢复 6DoF 运动。这些轨迹的精度介于 MoCap 和视频估计之间,适合用 AMP + DeepMimic 混合方式训练。
⚠️ 常见陷阱¶
⚠️ 编程陷阱:不检查视频姿态的物理合理性
错误做法:把 HMR2 输出直接送入 retargeting,不做任何后处理。
现象:机器人参考轨迹中出现脚穿地面、身体漂浮、关节角超限等异常。
根本原因:视觉估计器只学习了图像到姿态的映射,不保证物理一致性。
正确做法:加入地面约束、关节限位投影和时序平滑。用仿真器回放 retargeting 结果,检查是否穿模或力矩超限。
🧠 思维陷阱:视频数据越多越好
错误想法:从 YouTube 爬取大量视频,估计姿态后全部放入训练集。
实际情况:低质量视频(遮挡严重、运动模糊、多人干扰)产生的姿态估计噪声很大。大量噪声数据不仅不会提升训练效果,还会污染 AMP 判别器,让它把不自然动作当成正常风格。
正确做法:对视频数据做质量筛选。设置姿态估计置信度阈值,丢弃低置信度片段。用人工抽检验证关键动作类别的估计质量。
小节练习¶
- 设计一个从视频到 RL 训练的完整流水线,列出每个阶段的输入、输出和质量检查点。
- 解释为什么 AMP 比 DeepMimic 更适合处理视频来源的参考动作。
- 对比 MoCap 和视频两种数据来源,分别适合什么类型的动作模仿任务。
专题.6 Motion Retargeting:从人体到机器人 ⭐⭐⭐¶
这一节解决的问题是:如何把人体动作映射到不同骨架和关节限制的机器人。
动机:人体骨架和机器人骨架不一样 ⭐⭐⭐¶
人体肩、肘、腕、髋、膝、踝的自由度和机器人不同。
人体脚掌柔软,机器人脚底通常是刚性或近似刚性。
人体脊柱有大量柔性自由度,很多人形机器人只有 1-3 个腰部关节。
人体手指灵活,机器人夹爪可能只有 1 个自由度。
因此不能把人体关节角直接赋给机器人。
Retargeting 的目标是保留任务相关的几何关系,同时满足机器人约束。
骨架映射 ⭐⭐⭐¶
第一步是定义关键点对应关系。
| 人体关键点 | 机器人关键点 |
|---|---|
| pelvis | base 或 pelvis link |
| left hip | left hip joint/link |
| left knee | left knee link |
| left ankle | left foot |
| right hand | right wrist / gripper |
| head | head / camera |
映射不一定一对一。
人体肩关节可能映射到机器人肩 yaw、roll、pitch 三个关节。
人体手指可能映射到夹爪开合。
人体脊柱可能映射到腰 yaw/pitch 或直接忽略。
IK 优化 ⭐⭐⭐¶
给定人体参考关键点:
机器人正运动学关键点:
可写 IK 目标:
约束:
还可以加入足端接触、手部姿态和自碰撞距离。
平滑项 \(\|\mathbf{q}-\mathbf{q}_{t-1}\|^2\) 用于减少帧间跳变。
完整 Retargeting 优化公式 ⭐⭐⭐¶
前面的 IK 目标是单帧、单项的简化。实际部署中,retargeting 需要在整条轨迹上同时优化几何相似性、关节可行性、运动平滑性和接触一致性。完整的优化问题写成:
约束条件:
每一项的物理含义如下:
几何相似项 \(\sum_i w_i \| FK(q^{robot})_i - T_{map}(p^{human})_i \|^2\) 是核心目标。\(FK\) 是机器人正运动学,\(T_{map}\) 是从人体关键点到机器人坐标系的映射变换(包括骨长缩放和坐标系对齐)。\(w_i\) 是每个关键点的权重——手部和脚部通常权重最高,因为它们直接影响任务执行和接触。
关节正则项 \(\lambda_{joint} \| q - q_{nom} \|^2\) 把关节角拉向名义位置 \(q_{nom}\)(通常是自然站立姿态)。这防止 IK 解退化到关节极限附近。当几何目标有多个 IK 解时,正则项选择最接近自然姿态的解。
加速度平滑项 \(\lambda_{smooth} \| \ddot{q} \|^2\) 惩罚关节加速度。高加速度意味着高力矩和高冲击。对电驱机器人来说,加速度过大还会导致减速器齿轮冲击。平滑项确保 retargeting 结果不只是逐帧 IK 解的拼接,而是时序上连贯的轨迹。
为什么只做几何 retargeting 不够? 考虑一个人类做深蹲的动作。几何 retargeting 可以让机器人的膝盖和髋关节到达相似角度,IK 残差很小。但机器人的质量分布与人体不同——机器人电池可能在背部,人体质量集中在躯干和四肢。同样的姿态在人体上质心投影在支撑多边形内(稳定),在机器人上质心投影可能越出支撑区域(不稳定)。力矩约束进一步暴露问题:人体膝关节有大肌肉群提供力矩,机器人膝关节电机的峰值力矩可能不足以在深蹲姿态下支撑体重。
这就是为什么 retargeting 需要力矩可行性约束 \(\|\tau_t\| \le \tau_{max}\)。这个约束通过逆动力学计算:
如果任何关节力矩超过电机额定值的 80%(留安全裕度),该帧就标记为力矩不可行。处理方式可以是降低该帧的动作幅度、延长动作时间(降低速度和加速度),或直接删除该片段。
接触一致性 ⭐⭐⭐¶
人体动作中脚底接触必须转成机器人可执行接触。
如果人体脚底在地面滑动,而机器人参考要求支撑脚不动,训练信号会冲突。
Retargeting 应在接触相位内强约束足端速度:
也可以把支撑脚位置固定在触地时刻的位置:
这会牺牲一些人体几何相似度,但提高物理可执行性。
动力学过滤 ⭐⭐⭐¶
几何 IK 成功不代表动作可执行。
机器人还要满足力矩限制:
其中:
如果某段动作需要超过电机能力,必须修改参考、降低速度或删除片段。
这一步称为动力学过滤。
对人形机器人尤其重要。
人体可以通过脚踝、小腿肌肉和柔性脚掌完成的动作,电驱机器人未必能执行。
代码:IK retargeting 目标框架 ⭐⭐⭐¶
def retarget_frame(q_init, human_keypoints, robot_model, weights):
"""单帧 retargeting 的优化框架,省略具体求解器。"""
def objective(q):
loss = 0.0
# 计算机器人关键点位置
robot_points = robot_model.forward_keypoints(q)
for name, p_human in human_keypoints.items():
p_robot = robot_points[name]
w = weights.get(name, 1.0)
loss += w * ((p_robot - p_human) ** 2).sum()
# 关节平滑,避免相邻帧跳变
loss += 1e-3 * ((q - q_init) ** 2).sum()
return loss
q_solution = solve_box_constrained_problem(
objective,
q_init,
lower=robot_model.q_min,
upper=robot_model.q_max,
)
return q_solution
真实实现通常使用可微运动学库、Pinocchio、Ceres、CasADi 或仿真器自带 IK。
关键不是求解器名称,而是目标项和约束是否表达了机器人可执行性。
反事实推理:如果只做几何 retargeting ⭐⭐⭐¶
只做几何 retargeting,动作在可视化中可能很好看。
但训练时会暴露问题。
脚底滑动导致接触奖励冲突。
关节速度过大导致电机力矩不够。
手腕姿态精确但肩关节接近限位。
质心投影越出支撑区域。
这些问题会让策略为了追踪参考而牺牲稳定。
所以 retargeting 的结果必须经过仿真回放和动力学检查。
⚠️ 常见陷阱¶
⚠️ 编程陷阱:左右关节映射写反
错误做法:人体左手关键点映射到机器人右手。
现象:动作镜像,训练奖励长期异常。
根本原因:数据集坐标系和机器人命名约定不同。
正确做法:可视化骨架映射,并用单侧抬手动作做单元测试。
💡 概念误区:IK 残差小就说明 retargeting 成功
错误想法:关键点距离很小,动作就可用。
实际情况:还可能存在接触滑动、力矩超限、自碰撞和不稳定。
正确理解:retargeting 需要几何、接触和动力学三层验证。
🧠 思维陷阱:机器人必须完全模仿人体脚步
错误想法:人体脚落在哪里,机器人脚也应落在哪里。
实际情况:腿长、足底形状和支撑裕度不同,落脚点需要适配。
正确做法:保留上体和末端任务结构,下肢可重新规划或由策略适配。
小节练习¶
- 为 Unitree G1 设计人体关键点到机器人关键点的映射表。
- 在 IK 目标中加入足端接触固定项,写出完整优化目标。
- 设计一个动力学过滤流程,删除力矩超限的参考片段。
- 用 专题.6 的完整优化公式,分析一个人体"单脚站立并前倾"动作的 retargeting 难点:哪些约束最容易违反?
前面两节分别讨论了 retargeting 的数学公式和实际约束。Retargeting 解决的是"一种人体动作如何映射到一种机器人"的问题。接下来,我们把视角拉远一步:如果目标不是映射到一种机器人,而是让运动知识在多种机器人之间流动,该怎么做?
专题.6b 跨形态迁移与运动基础模型 ⭐⭐⭐⭐¶
这一节解决的问题是:如何让运动模仿跨越不同机器人形态,以及如何向通用运动基础模型发展。
动机:每换一个机器人就重新训练? ⭐⭐¶
前面的方法假设了一个固定的"人 → 特定机器人"管道。
每换一种机器人——从 Unitree H1 到 Fourier GR-1,从 Agility Digit 到 Tesla Optimus——就要重新做骨架映射、IK 优化、力矩验证和 RL 训练。
这个流程在机器人种类爆发的当下越来越不可持续。
跨形态迁移的目标是学习一种运动表示,使同一份运动知识能在不同机器人形态上复用。这与大语言模型的"预训练-微调"范式类似:先用大量数据学习通用运动表示,再对具体平台做轻量适配。
MaskedMimic:掩码运动条件 ⭐⭐⭐⭐¶
MaskedMimic(NVIDIA, SIGGRAPH Asia 2024)把掩码学习引入物理角色动画。
核心思想是:在训练时随机掩码参考动作的一部分关键点或关节。策略必须在只看到部分参考信息时完成合理运动。
其中 \(m_t \in \{0,1\}^{d_{ref}}\) 是随机掩码。训练时 \(m_t\) 的掩码比例从低到高变化。
为什么这有用?
第一,它天然支持不同级别的运动规格。全身掩码只留头和手 → 变成头手追踪的 VR 问题。只留脚 → 变成步态规划。只留躯干 → 变成姿态控制。同一个策略用不同掩码模式就能处理不同输入规格。
第二,它为跨形态迁移提供接口。源机器人有的关键点直接传入,源机器人没有的关键点掩码掉。策略已经学会了如何在缺失信息时补全运动。
第三,它与文本和语言条件兼容。文本描述可以被解析为"哪些关键点约束 + 约束值",掩码模式由文本决定。
跨领域类比:MaskedMimic 类似于 BERT 中的掩码语言模型。BERT 随机遮盖句子中的词,让模型学会从上下文补全。MaskedMimic 随机遮盖运动的一部分,让策略学会从可见部分补全完整运动。两者的共性是:通过掩码学习,模型获得了对缺失信息的鲁棒性和补全能力。
HumanPlus:从人到人形的实时影随 ⭐⭐⭐⭐¶
HumanPlus(Stanford, 2024)实现了从人类 RGB 视频到人形机器人实时全身控制的完整流水线。
完整管道:
人类操作者(穿普通衣服)
↓ RGB 相机(无标记点)
视频流
↓ 实时姿态估计
SMPL 全身姿态
↓ 在线 Retargeting
机器人关节目标
↓ 仿真训练的 RL 策略(部署为 Student 网络)
机器人电机命令
↓
实际执行
HumanPlus 的关键贡献在于证明了这条管道可以端到端运行在实时系统上。姿态估计、retargeting 和策略推理总延迟约 50 ms,足够 20 Hz 的控制频率。
技术上的几个关键点:
- 使用 Unitree H1 人形平台,29 自由度
- RL 训练在 Isaac Gym 中完成,Teacher-Student 蒸馏到仅用本体感知的部署策略
- 上体追踪人类手臂和躯干,下体策略自主维持平衡
- 支持行走中的上体操作:端盘子、挥手、搬箱子
与 复合/230_人形全身RL 的连接:HumanPlus 的底层 RL 训练使用了该章讨论的全身 RL 框架。与 复合/240_ASAP_SimToReal 的连接:HumanPlus 的 sim-to-real 流程与 ASAP 方法论高度一致,都使用了渐进域随机化和 Teacher-Student 蒸馏。
H2O 与 OmniH2O:人形全身遥操作 ⭐⭐⭐⭐¶
H2O(Human-to-Humanoid, CMU)系列工作推进了全身遥操作的前沿。
**H2O(2024)**的核心贡献是实时全身遥操作框架。操作者穿戴 VR 头盔和手持控制器,机器人实时复现操作者的全身运动(包括行走、转身、手臂操作)。
**OmniH2O(2025)**进一步去掉了对 VR 设备的依赖。它支持多种输入模态:
| 输入模态 | 设备需求 | 特点 |
|---|---|---|
| VR 头盔 + 手柄 | HMD + 2 controllers | 头手 6DoF,精度高 |
| RGB 相机 | 普通摄像头 | 无穿戴,但精度较低 |
| Apple Vision Pro | 空间计算设备 | 手部追踪精度高,免手柄 |
| IMU 套装 | 惯性传感器 | 无视线遮挡问题 |
OmniH2O 的技术关键是统一的运动表示。无论输入来自什么设备,都转换成相同的参考关键点格式。策略在训练时同时使用所有输入模态,配合 dropout 增强对缺失信号的鲁棒性——这与 MaskedMimic 的掩码思想异曲同工。
ExBody 与 ExBody2:表达性全身控制 ⭐⭐⭐¶
ExBody(UCSD, 2024)和 ExBody2(2024)专注于"表达性"全身控制——不仅让人形机器人完成任务,还要让动作具有表现力。
表达性运动的挑战在于:机械式地完成"手到达目标"不等于人类那样自然、流畅、有节奏地完成动作。人类的运动风格——走路的摆臂幅度、转身的节奏、蹲下时的重心转移——携带了大量社交和情感信息。
ExBody 使用人类 MoCap 数据训练全身控制策略,特别关注上体的表达性动作。ExBody2 进一步改进了上下体的协调性,使机器人在行走中能做出自然的手势和躯干动作。
这些工作与 专题.5 节的上下体解耦模仿形成互补。专题.5 讨论了解耦的原理和必要性,ExBody 系列则提供了如何做好"表达性上体 + 稳定下体"的具体方案。
方法对比与选型指南 ⭐⭐⭐¶
面对这么多跨形态方法,实际项目中如何选择?
| 场景 | 推荐方法 | 理由 |
|---|---|---|
| 单平台精确追踪 | DeepMimic + 专用 retargeting | 最成熟,调试简单 |
| 多风格自然运动 | AMP + 大数据集 | 不需逐帧对应 |
| 实时遥操作(有 VR) | H2O / OmniH2O | 全身实时影随 |
| 实时遥操作(无设备) | HumanPlus | 仅需 RGB 相机 |
| 部分身体条件控制 | MaskedMimic | 灵活掩码支持多种输入 |
| 表达性社交机器人 | ExBody2 | 专注上体表现力 |
| 跨平台迁移 | 预训练 + 目标平台微调 | 先通用后专用 |
实际系统常组合使用多种方法。例如,用 HumanPlus 的实时管道做遥操作数据采集,用 AMP 做运动风格约束训练,用 Teacher-Student 蒸馏部署。选型的核心原则是:输入模态决定前端,任务需求决定训练方式,部署约束决定后端。
运动基础模型:通向通用运动智能 ⭐⭐⭐⭐¶
上述工作各自解决了运动模仿的特定方面。一个自然的问题是:能否建立一个通用的"运动基础模型",类似 GPT 之于语言?
MotionGPT 和运动-语言模型把运动表示为 token 序列,用 Transformer 架构进行生成。文本指令"做一个前滚翻"可以直接生成对应的运动 token 序列。
与 VLA 的连接。回顾 复合/260_VLA_Foundation_Model:VLA(Vision-Language-Action)模型把视觉、语言和动作统一在一个生成框架中。运动基础模型可以为 VLA 提供运动先验——VLA 决定"做什么",运动基础模型提供"怎么做才自然"。
目前运动基础模型面临的核心挑战:
第一,运动数据的标准化。不同数据集使用不同骨架定义、帧率和坐标系。缺少类似 ImageNet 或 The Pile 那样的统一大规模运动数据集。
第二,物理一致性。语言模型可以生成语法正确但语义荒谬的句子。运动模型同样可能生成看起来合理但物理不可执行的动作。如何在生成过程中注入物理约束是开放问题。
第三,从虚拟角色到真实机器人。大部分运动生成工作在虚拟人体(SMPL)上评估。迁移到真实机器人需要 retargeting、sim-to-real 和硬件适配,这些问题不会因为基础模型更强而自动消失。
⚠️ 思维陷阱:基础模型可以替代专用控制
错误想法:有了足够大的运动基础模型,不再需要针对特定机器人的 RL 训练。
实际情况:基础模型生成的运动仍需要物理验证和闭环适配。每种机器人的动力学约束(力矩限制、关节限位、接触模型)都是独特的,无法被预训练模型完全覆盖。
正确理解:基础模型提供运动先验和初始化,专用 RL 训练负责物理适配和闭环鲁棒性。两者是互补关系,不是替代关系。
⚠️ 编程陷阱:跨平台 retargeting 不验证动力学
错误做法:用 MaskedMimic 或通用运动表示直接生成目标关节角,不检查力矩可行性。
现象:仿真中动作看起来正常,部署到真机后电机过热、减速器异响、关节保护触发。
根本原因:通用运动表示不包含特定平台的执行器能力信息。
正确做法:通用运动表示生成参考后,必须经过 专题.6 节的动力学过滤。这是不可跳过的步骤。
小节练习¶
- 比较 MaskedMimic、HumanPlus 和 OmniH2O 三种方法的输入接口差异,说明各自适合什么应用场景。
- 设计一个跨形态运动迁移实验:先在 Unitree H1 上训练动作模仿策略,再迁移到 Fourier GR-1。列出需要修改的模块和不需要修改的模块。
- 讨论运动基础模型与 VLA 的关系:两者的输入、输出和训练数据分别是什么?它们如何组合使用?
- 参考
复合/240_ASAP_SimToReal,设计 HumanPlus 风格系统的 sim-to-real 验证流程。
专题.7 从模仿到部署:鲁棒性与接口 ⭐⭐¶
到这里,我们已经掌握了动作模仿的核心技术链:从参考数据获取(专题.2/专题.5b)到训练方法(专题.3/专题.4/专题.5)到骨架映射(专题.6/专题.6b)。但仿真中训练好的策略不等于可以部署的控制器。仿真与真实之间的鸿沟——sim-to-real gap——在动作模仿中特别棘手,因为参考动作本身就来自与真机不同的身体(人体或虚拟角色)。本节讨论如何跨越这道鸿沟。
这一节解决的问题是:动作模仿策略怎样从仿真走向可部署控制。
动机:参考动作数据不包含真实硬件误差 ⭐⭐¶
MoCap 数据很干净。
仿真 retargeting 也可以很干净。
真实机器人却有电机延迟、关节摩擦、传感器噪声、地面摩擦变化和外力扰动。
动作模仿如果只追踪干净参考,很容易过拟合。
部署前必须加入鲁棒性训练和接口检查。
Domain Randomization ⭐⭐¶
动作模仿中的 DR 与普通腿足 RL 类似,但要额外关注参考动作相关参数。
| 随机化 | 作用 |
|---|---|
| root 初始偏移 | 防止只会固定起点 |
| 相位扰动 | 增强相位恢复 |
| 参考速度缩放 | 适应动作快慢变化 |
| 关节噪声 | 提高观测鲁棒性 |
| 动作延迟 | 模拟执行器滞后 |
| 地面摩擦 | 提高接触鲁棒性 |
| 上身负载 | 模拟拿物体 |
| 外部推力 | 训练恢复 |
相位扰动很关键。
如果策略只在参考相位完全正确时工作,一旦实际状态落后参考半拍,就会持续累积误差。
训练中可以随机扰动参考相位,让策略学习重新对齐。
Teacher-Student 蒸馏流水线 ⭐⭐⭐¶
模仿训练中可以把参考动作信息作为特权信息。
Teacher 看完整参考未来窗口。
Student 只看部署可用的本体感知和有限命令。
例如上体遥操作任务中,Teacher 可以看到未来几帧上体目标。
Student 部署时只看到当前目标和历史。
蒸馏能把未来信息压缩成可部署策略。
但必须确保 Student 的输入与真机一致。
完整蒸馏流水线。动作模仿的 Teacher-Student 蒸馏通常分三个阶段:
阶段 1:训练特权 Teacher
观测 = 本体感知 + 完整参考未来窗口 + 地形高度图 + 接触力
奖励 = 追踪奖励 + 风格奖励 + 任务奖励
输出:高性能但不可部署的策略 π_teacher
阶段 2:蒸馏 Student
观测 = 仅本体感知 + 当前命令(部署可用信息)
损失 = ||π_student(o_deploy) - π_teacher(o_priv)||² + α·||a_student - a_teacher||²
输出:可部署的策略 π_student
阶段 3:Student 微调(可选)
在带噪声的仿真中继续训练 π_student
目的:弥补蒸馏损失导致的性能下降
这个流水线与 足式/190_腿足RL训练栈 中的 Teacher-Student 结构完全一致。区别在于:腿足任务的 Teacher 特权信息主要是地形和外力;动作模仿的 Teacher 特权信息还包括参考动作的未来窗口,这对相位预测至关重要。
蒸馏中的关键决策。Student 应该模仿 Teacher 的什么?有两种选择:
第一种,行为蒸馏:\(L = \|a_{student} - a_{teacher}\|^2\)。Student 直接模仿 Teacher 的输出动作。简单直接,但 Teacher 的好动作和坏动作都会被模仿。
第二种,表征蒸馏:\(L = \|h_{student} - h_{teacher}\|^2\)。Student 模仿 Teacher 的隐层表征。Teacher 的内部表征包含了对未来参考的压缩编码。Student 学到这个编码后,可以在没有未来参考的情况下做出类似预测。
实践中常用两种的加权组合。
Sim2Sim 验证 ⭐⭐¶
在把策略部署到真机之前,加入 sim2sim 验证步骤可以捕获很多问题。
sim2sim 指在训练使用的仿真器之外的另一个仿真器中测试策略。例如:
为什么 sim2sim 有用?不同仿真器使用不同的接触模型、积分器和摩擦模型。如果策略在两个仿真器中都能工作,说明它对物理模型差异有一定鲁棒性。如果在训练环境工作但在验证环境摔倒,很可能是策略过拟合了训练仿真器的特定物理行为——这种策略部署到真机后大概率也会失败。
sim2sim 检查清单:
| 检查项 | 通过标准 | 不通过常见原因 |
|---|---|---|
| 站立稳定 | 30s 不摔倒 | 接触模型差异 |
| 行走追踪 | 误差增幅 <30% | 摩擦系数敏感 |
| 推力恢复 | 5N 推力后 2s 恢复 | 力矩饱和处理不同 |
| 关节限位 | 不超限 | 关节阻尼模型差异 |
def sim2sim_evaluation(policy, env_train, env_verify, n_episodes=50):
"""在训练环境和验证环境中分别评估策略。
env_train: 训练用仿真器(如 IsaacLab)
env_verify: 验证用仿真器(如 MuJoCo)
"""
results = {}
for name, env in [("train", env_train), ("verify", env_verify)]:
falls, track_errors, torque_maxes = [], [], []
for _ in range(n_episodes):
obs = env.reset()
total_steps, fell = 0, False
episode_track_err, episode_torque = [], []
while total_steps < 1000:
action = policy(obs)
obs, reward, done, info = env.step(action)
episode_track_err.append(info["tracking_error"])
episode_torque.append(info["max_torque_ratio"])
total_steps += 1
if done and info.get("fell", False):
fell = True
break
falls.append(fell)
track_errors.append(np.mean(episode_track_err))
torque_maxes.append(np.max(episode_torque))
results[name] = {
"fall_rate": np.mean(falls),
"mean_tracking_error": np.mean(track_errors),
"max_torque_ratio": np.mean(torque_maxes),
}
# 比较两个环境的差异
gap = {
k: results["verify"][k] - results["train"][k]
for k in results["train"]
}
return results, gap
如果 sim2sim gap 过大(例如摔倒率增加 50% 以上),应首先检查两个仿真器的物理参数差异,然后加大 Domain Randomization 范围来覆盖这些差异。
⚠️ 编程陷阱:sim2sim 测试用了训练环境的归一化参数
错误做法:把训练环境中计算的观测 running mean/std 直接用于验证环境。
现象:验证环境中策略行为异常,但参数看起来没问题。
根本原因:两个仿真器的状态量范围不完全一致(例如接触力的数量级可能不同),用训练环境的归一化会扭曲验证环境的观测。
正确做法:在验证环境中重新计算归一化统计量,或使用不依赖归一化的策略架构。
真机渐进测试协议 ⭐⭐¶
真机测试不应一步到位。渐进测试协议按风险递增排列:
第一步:静态测试。机器人上电但不行走。策略输出关节目标,检查关节跟踪精度、电机温度、通信延迟和传感器数据一致性。这一步不涉及平衡和接触,纯粹验证硬件接口。
第二步:慢速运动。把参考动作速度缩放到 50%。策略在低速下执行追踪。检查是否有明显相位偏差、关节抖动或力矩饱和。慢速测试暴露的问题在快速时会更严重。
第三步:正常速度。恢复正常参考速度。在平坦地面上测试完整动作序列。记录追踪误差、摔倒率和力矩 RMS。
第四步:扰动测试。在正常速度下施加外力扰动(例如用安全绳牵引、推肩膀)。测试策略的恢复能力。如果恢复失败,回到仿真中增加 DR 强度。
第五步:复杂环境。在不平地面、软地毯、坡道或室外环境中测试。每次只增加一种复杂度。
每一步都应有明确的通过标准和回退条件。不要因为赶进度跳过某一步——部署摔倒造成的硬件维修时间远大于渐进测试节省的时间。
与 足式/200_RL的CPP部署 的连接:该章讨论了 RL 策略的 C++ 推理部署。本节的渐进测试协议可以直接使用那里的推理框架,只需要替换输入的参考动作和观测格式。
跨领域类比:渐进测试协议类似于飞行器试飞流程。新飞机不会一上来就飞全速全包线。先在地面测试发动机(静态),再低速滑行(慢速),然后低空慢速飞行(正常),最后才进入极端工况测试(扰动和复杂环境)。每一步都有明确的包线边界和回退条件。机器人部署同理——渐进扩展能力包线,每步验证后再推进。
Residual Action 正式表述 ⭐⭐⭐¶
残差动作的完整形式是相位条件的:
其中 \(\phi_t\) 是当前参考相位,\(a_{ref}(\phi_t)\) 是相位对应的参考关节目标,\(\Delta a_\theta(o_t)\) 是策略输出的残差修正,\(\alpha(t)\) 是残差尺度系数。
尺度调度(scale scheduling)。\(\alpha(t)\) 的设置对训练稳定性至关重要:
训练初期,\(\alpha\) 应该很小(如 0.1)。此时策略主要靠参考动作,残差只做微小修正。这保证了训练初期的稳定性——即使策略网络输出随机噪声,残差乘以小系数后也不会导致摔倒。
训练中期,\(\alpha\) 逐渐增大(如线性增长到 0.5)。策略开始学习有意义的修正:补偿模型误差、适应延迟、应对扰动。
训练后期,\(\alpha\) 可以固定或继续增大。如果 \(\alpha\) 增大到 1.0,残差和参考等权,策略有很大的修正空间。
def residual_action(ref_action, policy_output, phase, alpha_schedule, step):
"""残差动作计算,带尺度调度。"""
alpha = alpha_schedule(step) # 例如 min(0.1 + step / 5e6, 1.0)
action = ref_action + alpha * policy_output
return action, alpha
但也有风险。
如果参考动作质量差,残差策略可能被限制在错误附近。
如果残差范围太大,参考动作失去约束作用。
⚠️ 编程陷阱:残差尺度从一开始就设为 1.0
错误做法:\(\alpha = 1.0\) 固定,不做尺度调度。
现象:训练初期策略频繁摔倒,收敛非常慢。
根本原因:初始策略网络输出接近随机,大尺度残差叠加到参考上产生不可控动作。
正确做法:\(\alpha\) 从 0.1 起步,按训练进度线性或指数增长。
与操作接口和 VLA 系统的连接 ⭐⭐¶
动作模仿不一定输出全身关节。
对于四足臂和人形操作,可以只模仿上体或末端轨迹。
然后通过 复合/50_操作技能接口 中的 EECommand 接入低层。
这样高层模仿人类手部操作,低层负责全身稳定。
这比让策略同时模仿人体上肢和下肢更容易迁移。
例如手持夹爪演示可以转成 task-frame 夹爪轨迹。
低层 RL WBC 负责在移动基座上跟踪。
这就是”动作模仿”和”操作技能接口”的交汇点。
与 VLA 移动操作的关系(连接 复合/140_VLA移动操作)。回顾第 84 章:VLA 把语义和视觉上下文变成动作参考。动作模仿则从另一个方向提供参考——把人体示例变成机器人的运动先验。两者的交汇在于:VLA 生成的动作片段也可以用 AMP 判别器来评估自然性。如果 VLA 输出的动作不像任何训练过的运动模式,AMP 风格奖励会给出低分,提示需要安全过滤或重新规划。
与数据采集的关系(连接 复合/150_Mobile_ALOHA与UMI)。回顾第 85 章:UMI 用手持夹爪采集人类操作轨迹。这些轨迹经过 SLAM 恢复和手眼标定后,正是本章 retargeting 的输入数据。Mobile ALOHA 的 leader-follower 遥操作数据则提供了已经在机器人关节空间中的参考动作,可以直接进入 DeepMimic 风格的追踪训练。两种数据路线在本章的训练流程中处于不同入口:UMI 数据需要先 retargeting 再训练,ALOHA 数据可以直接训练。
部署评估 ⭐⭐¶
动作模仿策略的评估应分层。
| 指标 | 意义 |
|---|---|
| pose tracking error | 姿态追踪精度 |
| EE tracking error | 手脚任务精度 |
| contact violation | 接触相位是否一致 |
| fall rate | 稳定性 |
| torque saturation | 硬件可行性 |
| recovery time | 受扰恢复能力 |
| task success | 实际任务完成 |
| style score | 动作自然性 |
不能只看 tracking error。
低误差但频繁力矩饱和的动作不能部署。
高 style score 但任务失败也没有意义。
⚠️ 常见陷阱¶
⚠️ 编程陷阱:训练中使用未来参考,部署时没有
错误做法:Actor 输入未来 1 秒参考窗口,真机只能提供当前目标。
现象:仿真追踪好,部署相位滞后严重。
根本原因:训练和部署观测不一致。
正确做法:未来窗口只给 Teacher 或确保部署也能提供同样命令。
💡 概念误区:残差策略总比纯策略安全
错误想法:有参考动作兜底,残差一定更稳定。
实际情况:参考动作若不可执行,会把策略带向危险区域。
正确理解:残差方法依赖高质量参考和合理残差限幅。
🧠 思维陷阱:模仿成功等于任务成功
错误想法:动作看起来像人,就能完成操作。
实际情况:任务还需要感知、接触、力控和安全回退。
正确做法:用任务成功率和物理安全指标共同评估。
小节练习¶
- 为动作追踪任务设计 phase randomization,并说明它如何提高恢复能力。
- 比较“全身关节模仿”和“只模仿 task-frame 手部轨迹”的迁移性。
- 设计一个 sim2sim 测试,把 IsaacLab 中训练的模仿策略放到 MuJoCo 中评估。
专题.8 综合项目:Mini Motion Imitation Pipeline ⭐⭐¶
本章综合项目是实现一个最小动作模仿流水线。
目标不是复现大型人形系统,而是掌握从参考数据到训练评估的关键环节。
项目目标 ⭐⭐¶
- 读取一段参考动作。
- 做 root 对齐和速度计算。
- 构造 reference sampler。
- 实现 DeepMimic 风格奖励。
- 加入 RSI。
- 训练一个站立上肢挥手或四足臂末端轨迹追踪策略。
- 加入相位扰动和观测噪声。
- 输出 tracking error、fall rate 和 torque RMS。
推荐目录 ⭐⭐¶
mini_motion_imitation/
├── data/
│ └── wave_motion.npz
├── motion/
│ ├── load_motion.py
│ ├── preprocess.py
│ └── reference.py
├── env/
│ ├── observations.py
│ ├── rewards.py
│ └── reset.py
├── train.py
├── play.py
└── evaluate.py
里程碑 1:参考动作可视化 ⭐⭐¶
先不要训练。
把参考动作在机器人模型上可视化。
检查左右、坐标系、尺度、脚底高度和关节限位。
通过标准:
| 检查 | 通过标准 |
|---|---|
| 左右映射 | 单侧动作方向正确 |
| root 高度 | 不穿地 |
| 关节范围 | 不明显超限 |
| 末端轨迹 | 与任务语义一致 |
里程碑 2:奖励分项正常 ⭐⭐¶
用随机策略跑环境。
记录姿态、速度、末端和质心奖励。
通过标准:
| 奖励项 | 预期 |
|---|---|
| pose | 随机策略较低 |
| velocity | 不出现 NaN |
| EE | 目标近时更高 |
| CoM | 初始对齐时合理 |
里程碑 3:RSI 训练 ⭐⭐¶
打开随机相位初始化。
统计每个相位段的成功率。
如果某些相位长期失败,将它们加入困难相位采样。
通过标准:
| 指标 | 目标 |
|---|---|
| 平均 tracking error | 持续下降 |
| fall rate | 持续下降 |
| 相位成功率 | 不只集中在开头 |
里程碑 4:鲁棒性 ⭐⭐¶
加入动作延迟、观测噪声和外部推力。
比较无随机化策略和随机化策略。
通过标准:
| 测试 | 目标 |
|---|---|
| 轻微噪声 | 误差小幅增加 |
| 小推力 | 能恢复 |
| 相位扰动 | 不持续跑偏 |
里程碑 5(Phase 2):从单段追踪到多技能 AMP ⭐⭐⭐¶
完成 Phase 1(里程碑 1-4)的单段 DeepMimic 追踪后,进入 Phase 2:用 AMP 实现多技能运动先验。
目标。准备 3 段以上不同动作(如行走、挥手、蹲下),训练 AMP 判别器,让策略在速度命令下用自然风格完成运动。
步骤:
- 在
data/中准备 3 段以上动作片段。 - 实现 AMP 判别器:输入 \((s_t, s_{t+1})\) 特征,输出标量。
- 实现风格奖励 \(r_{style}\) 和任务奖励 \(r_{task}\)(速度跟踪)。
- 调节判别器与策略的更新频率。
- 比较纯任务奖励策略和任务+AMP 策略的步态自然性。
通过标准:
| 指标 | 目标 |
|---|---|
| 速度跟踪误差 | 与 Phase 1 持平或更好 |
| 步态自然性 | 无明显脚拖地或上身僵硬 |
| 判别器准确率 | 稳定在 50-70%(不过强也不过弱) |
| 动作多样性 | 不同速度下步态风格有变化 |
评估量规 ⭐⭐¶
完整项目的评估量规如下。每项 0-5 分,总分 50 分。
| 评估维度 | 0-1 分 | 2-3 分 | 4-5 分 |
|---|---|---|---|
| 参考数据处理 | 数据能加载但未对齐 | root 对齐和速度计算正确 | 含接触标注和质量检查 |
| 奖励实现 | 只有单项奖励 | 多项 DeepMimic 奖励且有合理权重 | 含 AMP 风格奖励和可视化 |
| RSI 实现 | 无随机相位 | RSI 能运行 | 含失败相位统计和重采样 |
| 训练收敛 | 奖励无明显上升 | 奖励收敛,tracking error 下降 | 多种动作都能稳定追踪 |
| 鲁棒性测试 | 未做 DR | 基础 DR 且有对比实验 | 含扰动测试和 sim2sim |
| AMP 实现 | 未实现 | 判别器可训练但不稳定 | 稳定训练且步态有明显改善 |
| 代码质量 | 逻辑混乱 | 结构清晰,有注释 | 模块化、可配置、有单元测试 |
| 文档与分析 | 无 | 有训练曲线和基本分析 | 含消融实验和失败案例分析 |
| 可视化 | 无 | 有动作回放 | 含奖励分项、相位成功率等多维可视化 |
| 跨章连接 | 无 | 引用了其他章节概念 | 将手部轨迹接入 EECommand 或与 足式/190 训练栈对接 |
综合练习¶
- 实现
MotionReference.sample(phase)的线性插值版本。 - 用 RSI 和不用 RSI 训练同一动作,比较后半段相位的追踪误差。
- 把姿态奖励权重减半,观察末端误差和动作自然性的变化。
- 加入接触一致性奖励,检查脚底滑动是否减少。
- 将参考手部轨迹转换为
EECommand,交给第 75 章的低层接口执行。 - (进阶)用
足式/190_腿足RL训练栈的训练栈训练本节策略,对比与简化版训练的收敛速度和最终性能。
专题.9 延伸阅读¶
| 主题 | 推荐材料 | 难度 | 阅读目的 |
|---|---|---|---|
| 参考追踪 | DeepMimic (Peng et al., 2018) | ⭐⭐⭐ | 理解手工运动追踪奖励 |
| 运动先验 | AMP (Peng et al., 2021) | ⭐⭐⭐ | 理解对抗风格奖励与 f-散度 |
| 技能潜空间 | ASE (Peng et al., 2022) | ⭐⭐⭐ | 理解编码器-解码器技能架构 |
| 条件技能调用 | CALM (Tessler et al., 2023) | ⭐⭐⭐ | 理解任务条件先验与技能组合 |
| 长时程人形追踪 | PHC (Luo et al., 2023) | ⭐⭐⭐⭐ | 理解渐进训练、hard negative mining 和惯性补偿 |
| 人体数据 | AMASS / SMPL | ⭐⭐ | 理解人体动作表示 |
| 人形重定向 | human2humanoid / ASAP 类流程 | ⭐⭐⭐ | 理解 SMPL 到机器人 |
| 掩码运动条件 | MaskedMimic (Tessler et al., SIGGRAPH Asia 2024) | ⭐⭐⭐⭐ | 理解掩码学习在运动控制中的应用 |
| 人形实时影随 | HumanPlus (Fu et al., 2024) | ⭐⭐⭐⭐ | 理解视频到人形的完整管道 |
| 全身遥操作 | H2O / OmniH2O (He et al., 2024-2025) | ⭐⭐⭐⭐ | 理解多模态输入和跨设备泛化 |
| 表达性控制 | ExBody / ExBody2 (Cheng et al., 2024) | ⭐⭐⭐ | 理解表达性上体与稳定下体的协调 |
| 视频姿态估计 | HMR2 / WHAM / SLAHMR | ⭐⭐⭐ | 理解从视频提取运动参考 |
| 运动基础模型 | MotionGPT 等 | ⭐⭐⭐⭐ | 理解运动-语言统一生成 |
| 全身 RL | 复合/40_RL全身控制基础 |
⭐⭐ | 连接模仿奖励与低层训练 |
| 操作接口 | 复合/50_操作技能接口 |
⭐⭐ | 连接手部轨迹与低层执行 |
| Sim-to-Real | 复合/240_ASAP_SimToReal |
⭐⭐⭐ | 连接 retargeting 与部署验证 |
| 人形全身 RL | 复合/230_人形全身RL |
⭐⭐⭐ | 连接动作模仿与人形 RL 训练 |
阅读时建议围绕五个问题做笔记。
第一,方法使用的是逐帧追踪、运动分布还是两者结合。
第二,参考动作经过了哪些 retargeting 和过滤。
第三,部署策略能看到哪些参考信息。
第四,策略如何从失败和扰动中恢复。
第五,方法是否支持跨形态迁移,如果支持,运动表示的哪些部分是形态无关的。
🔧 故障排查手册¶
| 症状 | 可能原因 | 排查步骤 | 相关小节 |
|---|---|---|---|
| 参考动作可视化左右反 | 骨架映射或坐标系错误 | 1. 用单侧抬手动作测试 2. 检查关键点命名 3. 可视化坐标轴 | 专题.6 |
| 姿态奖励突然跳变 | 角度周期或旋转误差计算错误 | 1. 检查 \(\pi\) 附近误差 2. 改用 SO(3) log 3. 打印单关节误差 | 专题.3 |
| 训练只会动作开头 | 没有 RSI 或相位采样不均 | 1. 开启随机相位 2. 统计相位成功率 3. 增加困难相位采样 | 专题.3/专题.5 |
| 脚底明显滑动 | 参考接触不一致或缺少接触奖励 | 1. 检查足端速度 2. 标注接触相位 3. 加 stance 约束 | 专题.2/专题.6 |
| 追踪误差低但经常摔倒 | 稳定奖励或终止条件不足 | 1. 记录 fall rate 2. 加 base/CoM 奖励 3. 检查力矩饱和 | 专题.7 |
| AMP 风格奖励不变 | 判别器过强或过弱 | 1. 查看分类输出分布 2. 调整更新频率 3. 做特征归一化 | 专题.4 |
| retarget 后关节抖动 | IK 缺少平滑项或参考噪声大 | 1. 加帧间正则 2. 平滑关键点 3. 检查关节限位 | 专题.6 |
| 部署时相位滞后 | 训练使用未来参考但部署没有 | 1. 对齐观测 2. 加延迟随机化 3. 使用 Teacher-Student | 专题.7 |
| 残差动作发散 | 残差范围过大或参考不可执行 | 1. 降低 residual scale 2. 回放参考 3. 做动力学过滤 | 专题.7 |
| 动作自然但任务失败 | 风格奖励压过任务奖励 | 1. 打印 reward 分项 2. 提高任务权重 3. 分阶段训练 | 专题.4 |
| 视频姿态 retarget 后脚穿地 | 视频估计的 root 高度不准 | 1. 检查 SMPL root 高度 2. 强制地面约束 3. 用接触标注修正 | 专题.5b |
| 跨平台迁移后动作崩塌 | 骨架映射或力矩限制不匹配 | 1. 重新做骨架对应 2. 动力学过滤 3. 检查关节自由度差异 | 专题.6b |
| 残差策略训练初期频繁摔倒 | 残差尺度过大 | 1. 降低 \(\alpha\) 初始值 2. 用尺度调度 3. 检查参考动作质量 | 专题.7 |
| sim2sim 测试摔倒但训练环境正常 | 过拟合训练仿真器物理 | 1. 增加 DR 范围 2. 检查接触参数差异 3. 对比摩擦系数 | 专题.7 |
本章小结¶
| 知识点 | 核心结论 | 工程落点 |
|---|---|---|
| 动作模仿定位 | 它把运动示例转成闭环控制学习信号 | 不要开环播放参考 |
| 参考表示 | root、关节、末端、接触都要明确 | 做 root 对齐和速度计算 |
| DeepMimic | 手工分项追踪直观可调 | 姿态、速度、末端、质心奖励 |
| RSI | 随机参考相位提高全段学习 | 统计相位成功率 |
| AMP 与 f-散度 | 判别器隐式最小化运动分布散度 | LSGAN 目标、梯度惩罚、更新频率平衡 |
| ASE 架构 | 编码器-解码器-先验构成技能潜空间 | 用 latent 表示技能,KL 正则化 |
| CALM | 条件先验实现任务到技能的映射 | 预训练技能库 + 轻量任务适配 |
| PHC 渐进训练 | 先易后难 + hard negative + 惯性补偿 | 渐进扩展动作库、恢复宽容期 |
| 视频动作模仿 | 视频姿态是带噪声的估计,非地面真值 | 物理后处理、AMP 优于逐帧追踪 |
| Retargeting 完整公式 | 几何+正则+平滑+约束联合优化 | IK、接触、力矩和自碰撞验证 |
| 跨形态迁移 | 掩码学习和统一表示实现跨平台复用 | MaskedMimic、HumanPlus 管道 |
| 运动基础模型 | 基础模型提供先验,专用训练负责适配 | 与 VLA 互补,不替代闭环 RL |
| 失败恢复 | 困难片段需要重采样 | 记录 clip 与 phase |
| Teacher-Student 蒸馏 | 特权信息压缩到可部署观测 | 行为蒸馏与表征蒸馏结合 |
| Residual action | 参考动作 + 尺度调度残差 | \(\alpha\) 从小到大调度 |
| Sim2Sim | 跨仿真器测试检验物理鲁棒性 | 先 sim2sim 再真机 |
| 部署鲁棒性 | 参考动作要经受噪声、延迟和扰动 | DR、蒸馏、残差和渐进真机测试 |
本章完成了复合方向公共基础组的动作模仿主线。
第 74 章解决低层全身 RL 怎么训练。
第 75 章解决高层操作命令怎样接入低层。
本章解决动作数据和运动先验怎样进入这个系统。
三者合起来构成复合机器人从”能走”到”能带着任务自然运动”的基础链条。
本章还向前延伸了两个方向。第一,视频动作模仿和跨形态迁移把数据来源从 MoCap 扩展到普通视频和跨平台运动库。第二,运动基础模型的讨论连接了本章与 复合/260_VLA_Foundation_Model 的语义动作生成。这两个方向代表了动作模仿从”单平台单数据源”向”通用运动智能”演进的趋势。