跳转至

专题:动作模仿理论——从参考追踪到可部署全身运动

专题.0 前置自测

答不出两题以上,建议先复习 足式/190_腿足RL训练栈复合/40_RL全身控制基础复合/50_操作技能接口

  1. 为什么浮动基座机器人的运动不能只用关节角轨迹描述?
  2. 用 MoCap 动作训练机器人时,为什么必须做 retargeting?
  3. DeepMimic 中 reference state initialization 解决的是什么训练困难?
  4. AMP 为什么可以不手写每一项姿态追踪奖励?
  5. 人体动作迁移到人形机器人时,为什么“几何像”不等于“动力学可执行”?

本章目标

本章建立动作模仿的理论主线。

学完后,你应能解释参考动作追踪、对抗运动先验、技能潜空间、动作重定向和部署验证之间的关系。

你还应能写出一个最小 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 为什么动作模仿是复合机器人的桥梁 ⭐⭐

这一节解决的问题是:为什么复合机器人需要动作模仿,而不是只靠手写奖励或传统轨迹规划。

动机:自然全身运动很难手写 ⭐⭐

复合机器人有腿、臂、腰、头、夹爪和浮动基座。

如果任务只是平地前进,速度跟踪奖励足够表达目标。

如果任务是边走边挥手、蹲下拿物体、转身开门、搬运箱子或模仿人类上身动作,手写奖励会迅速变得复杂。

你需要同时描述脚步节奏、上身姿态、手臂轨迹、头部朝向、身体重心、接触相位和动作自然性。

这些内容不是互相独立的。

手臂抬起会改变角动量。

蹲下会改变腿部可用力矩。

转身时脚步和躯干必须协调。

手写一个奖励项鼓励手到目标,可能破坏平衡。

手写一个奖励项鼓励身体稳定,又可能让手臂动作僵硬。

动作模仿提供了一种替代路径:先给出“合理运动长什么样”的示例,再让策略在物理仿真中学习闭环执行。

反面案例:只奖励末端目标的僵硬动作 ⭐⭐

考虑一个人形机器人要从桌上拿起杯子。

如果奖励只写末端位置误差:

\[ r = \exp\left(-\frac{\|\mathbf{p}_{hand}-\mathbf{p}_{cup}\|^2}{\sigma^2}\right) \]

策略可能学会把躯干极端前倾,手臂伸到限位附近,脚几乎不动。

末端接近杯子,但姿态非常不自然。

这种动作可能在仿真中完成一次抓取,却很难对不同桌面高度泛化。

人类做这个动作时会自然弯膝、前移重心、调整另一只手和躯干。

这些协调结构很难只靠一个末端奖励表达。

动作模仿可以把这些协调结构作为先验引入训练。

历史线索:从角色动画到真实机器人 ⭐⭐

动作模仿最早在物理角色动画中形成系统方法。

DeepMimic 把 MoCap 参考动作转成强化学习奖励,让物理角色学会跑、跳和翻滚。

AMP 进一步用判别器学习“自然运动”的奖励,减少手写追踪项。

ASE 把大量动作压缩到技能潜空间,让下游任务可以调用可复用运动技能。

PHC 一类工作把运动追踪扩展到大规模人体动作集合,强调长时间不摔倒和失败恢复。

机器人领域随后吸收这些思想。

四足机器人用运动先验学到更自然的步态。

人形机器人用人体动作重定向训练全身控制。

四足臂和人形操作又把上半身动作、末端任务和下半身平衡结合起来。

这条历史脉络说明:动作模仿不是动画领域的技巧,而是高维全身控制中的一种结构化先验。

理论:模仿学习与强化学习的分工 ⭐⭐

设参考运动为:

\[ \tau^{ref} = \{s_0^{ref}, s_1^{ref}, \ldots, s_T^{ref}\} \]

机器人策略为:

\[ a_t \sim \pi_\theta(a_t|o_t) \]

动作模仿的目标不是简单复制参考状态。

真实目标是在物理转移下生成与参考相似且稳定的轨迹:

\[ \tau^\pi = \{s_0, s_1, \ldots, s_T\} \]

并让:

\[ d(\tau^\pi, \tau^{ref}) \]

尽可能小,同时满足动力学、接触和执行器限制。

模仿信号提供“应该像什么”。

强化学习提供“在物理世界中怎样闭环实现”。

这两者缺一不可。

只有模仿,没有物理闭环,轨迹一受扰就偏离。

只有强化学习,没有动作先验,高维动作空间探索非常低效。

本质洞察:动作模仿不是把 MoCap 轨迹当作控制命令播放,而是把参考运动变成学习信号。 策略最终学到的是抗扰动的闭环行为,而不是一段开环动画。

双重解读:动作模仿像什么 ⭐⭐

从控制角度看,动作模仿像“带参考轨迹的跟踪控制”。

参考轨迹提供期望姿态、速度、末端位置和接触相位。

策略学习的是在模型误差、接触扰动和动作限制下跟踪它。

从数据角度看,动作模仿像“运动分布建模”。

数据集定义了自然动作的统计结构。

策略不一定逐帧追踪某一段动作,而是生成落在这个分布附近的运动。

DeepMimic 更靠近第一种理解。

AMP 更靠近第二种理解。

现代系统常把两者结合。

例如用追踪奖励保证任务对齐,用运动先验保证动作自然。

跨章连接 ⭐⭐

回顾 复合/40_RL全身控制基础:全身 RL 通过观测、动作、奖励和随机化学习复合机器人控制。

在那里,末端目标来自命令采样或高层策略。

本章的动作模仿可以为这些命令和奖励提供更强先验。

回顾 复合/50_操作技能接口:高层操作策略通过 task-frame EE 轨迹接入低层。

动作模仿中的手部、上身和物体交互轨迹也应尽量转成这种接口,而不是直接绑死在某个机器人关节空间。

⚠️ 常见陷阱

⚠️ 编程陷阱:把参考轨迹当成控制命令直接播放

错误做法:按时间把 retarget 后的关节角直接发给电机。

现象:仿真回放看似正常,稍有扰动就摔倒。

根本原因:开环轨迹没有根据当前状态修正误差。

正确做法:用参考轨迹构造奖励或观测,让策略学习闭环跟踪。

💡 概念误区:动作越像人越好

错误想法:人体动作还原得越精确,机器人表现越好。

实际情况:机器人关节、质量分布和接触能力与人体不同,过度追求人形相似可能不可执行。

正确理解:模仿的是任务相关运动结构,而不是机械复制每个关节角。

🧠 思维陷阱:把动作模仿和任务控制对立起来

错误想法:要么模仿数据,要么完成任务。

实际情况:实际系统常用任务奖励加模仿奖励。

正确做法:用任务奖励定义目标,用模仿信号限制动作分布和探索空间。

小节练习

  1. 以“人形机器人端盘子行走”为例,列出哪些运动结构适合从人类示例中学习,哪些必须由机器人控制器重新适配。
  2. 解释为什么开环播放 retarget 轨迹无法替代 RL 闭环策略。
  3. 设计一个奖励函数,同时包含末端任务、参考姿态和基座稳定三类项。

专题.2 参考运动表示:MoCap 到机器人状态 ⭐⭐

这一节解决的问题是:动作数据应该怎样表示,才能进入机器人训练。

动机:同一段动作有很多种描述方式 ⭐⭐

一段人类挥手动作可以用视频像素描述。

也可以用 3D 关键点描述。

可以用 SMPL 关节旋转描述。

可以用手腕末端轨迹描述。

可以用机器人关节角描述。

这些表示之间不是等价的。

视频包含外观但不直接包含关节角。

关键点直观但缺少关节旋转。

SMPL 表示适合人体但不适合机器人直接执行。

机器人关节轨迹可执行但失去跨平台性。

选择表示的原则是:训练目标需要什么,就保留什么。

如果任务是手部操作,手腕和夹爪相对物体的轨迹很重要。

如果任务是全身舞蹈,躯干、手脚和节奏都重要。

如果任务是稳定行走,上身动作可以作为扰动条件,而下身接触相位必须可靠。

常见运动数据 ⭐⭐

表示 内容 优点 风险
BVH 骨架层级 + 关节旋转 传统 MoCap 常见 坐标系和骨长不统一
C3D 标记点轨迹 接近原始测量 需要骨架拟合
SMPL/SMPL-X 人体形状 + 姿态参数 数据集统一 与机器人骨架差异大
3D keypoints 关节点坐标 视觉估计方便 缺少姿态和接触
EE trajectory 手脚末端轨迹 接口清晰 缺少全身细节
robot q 机器人关节轨迹 可直接训练追踪 平台绑定

参考状态 ⭐⭐

动作追踪通常把参考状态写成:

\[ s_t^{ref} = \left( \mathbf{p}_{root}^{ref}, \mathbf{R}_{root}^{ref}, \mathbf{q}^{ref}, \dot{\mathbf{p}}_{root}^{ref}, \boldsymbol{\omega}_{root}^{ref}, \dot{\mathbf{q}}^{ref}, \mathbf{p}_{ee}^{ref}, c^{ref} \right) \]

其中 \(c^{ref}\) 是接触相位。

并不是每个方法都需要所有量。

DeepMimic 类方法常用姿态、速度、末端和质心。

人形全身追踪常加入关键点、root 高度和接触信息。

四足臂操作可能更关注末端轨迹、基座稳定和上身姿态。

Root 对齐 ⭐⭐

参考动作的全局位置通常不能直接使用。

MoCap 数据中的人体可能在世界中从左到右走。

训练时机器人环境的初始位置每个 episode 都不同。

因此常做 root 对齐。

例如把参考 root 的初始位置设为机器人初始位置:

\[ \tilde{\mathbf{p}}_{root}^{ref}(t) = \mathbf{p}_{root}^{robot}(0) + \left(\mathbf{p}_{root}^{ref}(t)-\mathbf{p}_{root}^{ref}(0)\right) \]

朝向也可以对齐:

\[ \tilde{R}_{root}^{ref}(t) = R_{align} R_{root}^{ref}(t) \]

其中:

\[ R_{align}=R_{root}^{robot}(0)(R_{root}^{ref}(0))^T \]

这样策略追踪的是相对运动,而不是某个数据集中的绝对世界位置。

速度计算 ⭐⭐

参考速度通常由离散轨迹差分得到。

位置速度:

\[ \dot{\mathbf{p}}_t \approx \frac{\mathbf{p}_{t+1}-\mathbf{p}_{t-1}}{2\Delta t} \]

关节速度:

\[ \dot{\mathbf{q}}_t \approx \frac{\mathbf{q}_{t+1}-\mathbf{q}_{t-1}}{2\Delta t} \]

旋转速度不能直接对旋转矩阵相减。

应使用:

\[ \boldsymbol{\omega}_t \approx \frac{1}{\Delta t}\log(R_t^T R_{t+1}) \]

速度差分对噪声敏感。

因此 MoCap 预处理通常需要平滑。

但平滑不能破坏接触事件。

脚落地瞬间的速度变化对控制很重要。

接触相位 ⭐⭐

接触相位告诉策略哪只脚或手应该接触环境。

可以由足端高度和速度估计:

\[ c_i(t) = \mathbb{1} \left[ z_i(t)<z_{th} \;\land\; \|\dot{\mathbf{p}}_{i,xy}(t)\|<v_{th} \right] \]

也可以来自力板或仿真标注。

接触相位错误会严重影响训练。

如果参考说脚在支撑,但实际轨迹脚还在滑动,策略会收到矛盾信号。

如果参考说脚摆动,但奖励又要求脚不离地,策略也会混乱。

代码:参考轨迹采样器 ⭐⭐

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 有噪声,强低通会让训练更稳定。

实际情况:过强平滑会抹掉脚落地、抓取接触和快速转身等关键事件。

正确做法:分别处理连续姿态和离散接触,保留物理事件。

小节练习

  1. 写出一个 root 对齐公式,让参考动作从机器人当前 yaw 方向开始。
  2. 设计接触相位估计规则,并说明足端滑动会造成什么误判。
  3. 读取一段关节轨迹,分别用前向差分和中心差分计算速度,对比噪声。

专题.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 函数"。

总奖励:

\[ r_t = w_p r_p + w_v r_v + w_e r_e + w_c r_c \]

姿态奖励——测量关节旋转是否接近参考:

\[ r_p = \exp\left( -k_p \sum_j \|\log((R_j^{sim})^T R_j^{ref})\|^2 \right) \]

这里 \(\log((R_j^{sim})^T R_j^{ref})\) 是 SO(3) 上的旋转距离。\(R_{sim}^T R_{ref}\) 是从仿真到参考的相对旋转,取对数得到轴角表示,其范数就是旋转角度。这比直接比较四元数或欧拉角在数学上更严格,因为它在 SO(3) 流形上度量真实的测地距离。

速度奖励——测量关节速度是否接近参考:

\[ r_v = \exp\left( -k_v \sum_j \|\omega_j^{sim}-\omega_j^{ref}\|^2 \right) \]

末端奖励——测量手脚关键点位置是否接近参考:

\[ r_e = \exp\left( -k_e \sum_{e} \|\mathbf{p}_e^{sim}-\mathbf{p}_e^{ref}\|^2 \right) \]

质心奖励——测量整体质心是否接近参考:

\[ r_c = \exp\left( -k_c \|\mathbf{p}_{com}^{sim}-\mathbf{p}_{com}^{ref}\|^2 \right) \]

为什么需要分项而不是一个总误差? 不同运动目标之间可能存在冲突。例如精确跟踪手部位置(\(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 的经典权重后直接用于所有任务。

实际情况:不同平台、动作和关节定义会改变误差尺度。

正确做法:先统计每个误差项的典型范围,再调权重。

小节练习

  1. 为“人形双臂挥手但下半身保持站立”设计 DeepMimic 奖励权重。
  2. 实现 RSI:每个 episode 从随机参考相位初始化,并记录不同相位成功率。
  3. 设计一个检测参考脚底滑动的指标,并说明滑动参考会如何误导策略。

专题.4 AMP:对抗运动先验 ⭐⭐⭐

这一节解决的问题是:如何让系统自动学习“什么运动像数据集”,而不是手写所有姿态追踪项。

动机:手写奖励很难覆盖运动风格 ⭐⭐⭐

DeepMimic 需要为每个参考动作设计追踪项。

如果目标是“自然行走”,并不一定需要逐帧追踪某段动作。

我们只希望生成的运动看起来属于人类或动物动作分布。

这时逐帧参考反而太严格。

AMP 的思想是训练一个判别器。

判别器看一小段状态转移,判断它来自真实动作数据还是策略生成。

策略得到的运动风格奖励来自判别器输出。

判别器输入 ⭐⭐⭐

AMP 通常不只看单帧状态。

它看状态转移:

\[ (s_t, s_{t+1}) \]

因为运动自然性包含速度、相位和动态连续性。

单帧站姿可能看起来正常,但下一帧突然跳变就不自然。

转移输入能捕捉这种动态结构。

对于机器人,可以选择局部特征作为判别器输入。

例如 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_D = \mathbb{E}_{(s,s')\sim p_{data}} \left[(D_\phi(s,s')-1)^2\right] + \mathbb{E}_{(s,s')\sim p_\pi} \left[(D_\phi(s,s')+1)^2\right] + \lambda L_{gp} \]

梯度惩罚 \(L_{gp}\) 的必要性。判别器如果梯度范数很大,意味着它在状态空间的某些区域变化极快。策略一旦从"自然区域"偏移一点点,奖励就会骤降。这会导致策略只学到极小范围内的动作,丧失泛化能力。梯度惩罚限制判别器的 Lipschitz 常数:

\[L_{gp} = \mathbb{E}_{(s,s') \sim p_{data}} \left[\|\nabla_{(s,s')} D_\phi(s,s')\|^2\right]\]

跨领域类比:梯度惩罚的作用类似于控制系统中的限幅器。不限幅的判别器就像增益无穷大的控制器——理论上分类精度最高,但系统会在边界处振荡。梯度惩罚把判别器的"增益"限制在合理范围内,让策略有稳定的学习空间。

策略的风格奖励。策略不直接优化 \(L_D\),而是从判别器输出中提取奖励信号:

\[ r_{style} = \max\left(0, 1 - \frac{1}{4}(D_\phi(s,s')-1)^2\right) \]

这个变换的设计逻辑是:当策略生成的转移被判别器判断为"真实"(\(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\) 的占据度量为:

\[ \rho_\pi(s,a) = \pi(a|s) \sum_{t=0}^{\infty} \gamma^t P(s_t=s|\pi) \]

GAIL 的目标是让 \(\rho_\pi\) 接近专家的占据度量 \(\rho_E\)。Ho & Ermon(2016)证明,这等价于最小化 Jensen-Shannon 散度:

\[ \min_\pi D_{JS}(\rho_\pi \| \rho_E) \]

这个最小化通过对抗博弈实现:判别器 \(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\) 散度:

\[ \chi^2(p_\pi \| p_{data}) = \int \frac{(p_\pi(s,s') - p_{data}(s,s'))^2}{p_{data}(s,s')} d(s,s') \]

这个散度在两个分布差异大时给出更强的信号,而 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 通常与任务奖励组合:

\[ r = w_{task}r_{task}+w_{style}r_{style} \]

任务奖励告诉策略要做什么。

风格奖励告诉策略怎样做更自然。

例如速度跟踪任务中:

\[ r_{task} = \exp\left(-\frac{\|\mathbf{v}-\mathbf{v}^{cmd}\|^2}{\sigma^2}\right) \]

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]

小节练习 ⭐⭐⭐

  1. 设计 AMP 判别器输入特征,要求不包含全局 x/y 位置。
  2. 解释为什么状态转移比单帧状态更适合判断运动自然性。
  3. 设计一个实验比较纯速度奖励和速度奖励加 AMP 风格奖励的步态差异。
  4. 推导:当判别器是最优的(即 \(D^*(s,s')\) 完美区分 \(p_{data}\)\(p_\pi\)),策略最大化 \(r_{style}\) 等价于最小化什么分布度量?

前面三节建立了动作模仿的三个核心方法层次:DeepMimic 的逐帧追踪提供精确但刚性的参考;AMP 的对抗先验提供灵活的风格约束;下面要讨论的技能潜空间把多种运动压缩成可复用的连续表示。这三层不是互相替代的,而是可以组合的——例如用 DeepMimic 奖励训练单个技能,用 AMP 判别器约束技能间切换的自然性,用技能潜空间实现多任务调度。


专题.5 技能潜空间、长期追踪与失败恢复 ⭐⭐⭐

这一节解决的问题是:如何从单段动作模仿走向多技能、长时程和可恢复控制。

动机:真实机器人不能只会一段动作 ⭐⭐⭐

DeepMimic 常训练单个技能。

一个策略学一个后空翻,另一个策略学跑步。

这对动画演示可以接受。

对机器人不够。

机器人需要在走、转、蹲、伸手、避障和操作之间切换。

它还需要在被推、脚滑或目标改变后恢复。

因此动作模仿从单段追踪发展到技能潜空间和大规模运动追踪。

ASE:技能潜空间 ⭐⭐⭐

ASE(Adversarial Skill Embeddings)的核心是引入潜变量 \(z\)

策略写成:

\[ a_t = \pi_\theta(o_t, 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 之上训练一个任务条件先验:

\[ z_t \sim p_\psi(z | o_t, g_t) \]

其中 \(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 时优先从失败相位附近初始化。

小节练习

  1. 设计一个技能潜空间任务:高层输入目标速度和目标手部高度,输出 latent \(z\)
  2. 说明为什么失败恢复对双足比四足更重要。
  3. 为上体遥操作人形设计上下体奖励分工。
  4. 画出 CALM 的两阶段训练流程图,标注哪些模块被冻结。
  5. 设计一个 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 判别器,让它把不自然动作当成正常风格。

正确做法:对视频数据做质量筛选。设置姿态估计置信度阈值,丢弃低置信度片段。用人工抽检验证关键动作类别的估计质量。

小节练习

  1. 设计一个从视频到 RL 训练的完整流水线,列出每个阶段的输入、输出和质量检查点。
  2. 解释为什么 AMP 比 DeepMimic 更适合处理视频来源的参考动作。
  3. 对比 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 优化 ⭐⭐⭐

给定人体参考关键点:

\[ \mathbf{p}_k^{human}(t) \]

机器人正运动学关键点:

\[ \mathbf{p}_k^{robot}(\mathbf{q}_t) \]

可写 IK 目标:

\[ \mathbf{q}_t^\star = \arg\min_{\mathbf{q}} \sum_k w_k \|\mathbf{p}_k^{robot}(\mathbf{q})-\mathbf{p}_k^{human}(t)\|^2 + \lambda \|\mathbf{q}-\mathbf{q}_{t-1}\|^2 \]

约束:

\[ \mathbf{q}_{min}\le \mathbf{q}\le \mathbf{q}_{max} \]

还可以加入足端接触、手部姿态和自碰撞距离。

平滑项 \(\|\mathbf{q}-\mathbf{q}_{t-1}\|^2\) 用于减少帧间跳变。

完整 Retargeting 优化公式 ⭐⭐⭐

前面的 IK 目标是单帧、单项的简化。实际部署中,retargeting 需要在整条轨迹上同时优化几何相似性、关节可行性、运动平滑性和接触一致性。完整的优化问题写成:

\[ \min_{\{q_t^{robot}\}_{t=1}^T} \sum_i w_i \| FK(q_t^{robot})_i - T_{map}(p_t^{human})_i \|^2 + \lambda_{joint} \| q_t - q_{nom} \|^2 + \lambda_{smooth} \| \ddot{q}_t \|^2 \]

约束条件:

\[ \begin{aligned} q_{min} &\le q_t \le q_{max} & \text{(关节限位)} \\ c_t^{robot} &= c_t^{human} & \text{(接触相位一致性)} \\ \|\tau_t\| &\le \tau_{max} & \text{(力矩可行性)} \\ d_{self}(q_t) &\ge d_{min} & \text{(自碰撞距离)} \end{aligned} \]

每一项的物理含义如下:

几何相似项 \(\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}\)。这个约束通过逆动力学计算:

\[ \tau_t = M(q_t)\ddot{q}_t + h(q_t, \dot{q}_t) - J_c(q_t)^T \lambda_t \]

如果任何关节力矩超过电机额定值的 80%(留安全裕度),该帧就标记为力矩不可行。处理方式可以是降低该帧的动作幅度、延长动作时间(降低速度和加速度),或直接删除该片段。

接触一致性 ⭐⭐⭐

人体动作中脚底接触必须转成机器人可执行接触。

如果人体脚底在地面滑动,而机器人参考要求支撑脚不动,训练信号会冲突。

Retargeting 应在接触相位内强约束足端速度:

\[ \dot{\mathbf{p}}_{foot}^{robot} \approx 0 \]

也可以把支撑脚位置固定在触地时刻的位置:

\[ \mathbf{p}_{foot}^{robot}(t) = \mathbf{p}_{foot}^{robot}(t_{touch}) \quad t \in \text{stance} \]

这会牺牲一些人体几何相似度,但提高物理可执行性。

动力学过滤 ⭐⭐⭐

几何 IK 成功不代表动作可执行。

机器人还要满足力矩限制:

\[ \tau_{min}\le \tau \le \tau_{max} \]

其中:

\[ \tau = S\left( M(q)\ddot q + h(q,\dot q) - J_c^T\lambda \right) \]

如果某段动作需要超过电机能力,必须修改参考、降低速度或删除片段。

这一步称为动力学过滤。

对人形机器人尤其重要。

人体可以通过脚踝、小腿肌肉和柔性脚掌完成的动作,电驱机器人未必能执行。

代码: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 需要几何、接触和动力学三层验证。

🧠 思维陷阱:机器人必须完全模仿人体脚步

错误想法:人体脚落在哪里,机器人脚也应落在哪里。

实际情况:腿长、足底形状和支撑裕度不同,落脚点需要适配。

正确做法:保留上体和末端任务结构,下肢可重新规划或由策略适配。

小节练习

  1. 为 Unitree G1 设计人体关键点到机器人关键点的映射表。
  2. 在 IK 目标中加入足端接触固定项,写出完整优化目标。
  3. 设计一个动力学过滤流程,删除力矩超限的参考片段。
  4. 用 专题.6 的完整优化公式,分析一个人体"单脚站立并前倾"动作的 retargeting 难点:哪些约束最容易违反?

前面两节分别讨论了 retargeting 的数学公式和实际约束。Retargeting 解决的是"一种人体动作如何映射到一种机器人"的问题。接下来,我们把视角拉远一步:如果目标不是映射到一种机器人,而是让运动知识在多种机器人之间流动,该怎么做?


专题.6b 跨形态迁移与运动基础模型 ⭐⭐⭐⭐

这一节解决的问题是:如何让运动模仿跨越不同机器人形态,以及如何向通用运动基础模型发展。

动机:每换一个机器人就重新训练? ⭐⭐

前面的方法假设了一个固定的"人 → 特定机器人"管道。

每换一种机器人——从 Unitree H1 到 Fourier GR-1,从 Agility Digit 到 Tesla Optimus——就要重新做骨架映射、IK 优化、力矩验证和 RL 训练。

这个流程在机器人种类爆发的当下越来越不可持续。

跨形态迁移的目标是学习一种运动表示,使同一份运动知识能在不同机器人形态上复用。这与大语言模型的"预训练-微调"范式类似:先用大量数据学习通用运动表示,再对具体平台做轻量适配。

MaskedMimic:掩码运动条件 ⭐⭐⭐⭐

MaskedMimic(NVIDIA, SIGGRAPH Asia 2024)把掩码学习引入物理角色动画。

核心思想是:在训练时随机掩码参考动作的一部分关键点或关节。策略必须在只看到部分参考信息时完成合理运动。

\[ a_t = \pi_\theta(o_t, m_t \odot s_t^{ref}) \]

其中 \(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 节的动力学过滤。这是不可跳过的步骤。

小节练习

  1. 比较 MaskedMimic、HumanPlus 和 OmniH2O 三种方法的输入接口差异,说明各自适合什么应用场景。
  2. 设计一个跨形态运动迁移实验:先在 Unitree H1 上训练动作模仿策略,再迁移到 Fourier GR-1。列出需要修改的模块和不需要修改的模块。
  3. 讨论运动基础模型与 VLA 的关系:两者的输入、输出和训练数据分别是什么?它们如何组合使用?
  4. 参考 复合/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 指在训练使用的仿真器之外的另一个仿真器中测试策略。例如:

训练环境:Isaac Gym / IsaacLab(GPU 并行,快但物理简化)
    ↓ 导出策略
验证环境:MuJoCo(CPU,物理更精确,接触模型不同)
    ↓ 评估通过
真机部署

为什么 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 正式表述 ⭐⭐⭐

残差动作的完整形式是相位条件的:

\[ a_t = a_{ref}(\phi_t) + \alpha(t) \cdot \Delta a_\theta(o_t) \]

其中 \(\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 或确保部署也能提供同样命令。

💡 概念误区:残差策略总比纯策略安全

错误想法:有参考动作兜底,残差一定更稳定。

实际情况:参考动作若不可执行,会把策略带向危险区域。

正确理解:残差方法依赖高质量参考和合理残差限幅。

🧠 思维陷阱:模仿成功等于任务成功

错误想法:动作看起来像人,就能完成操作。

实际情况:任务还需要感知、接触、力控和安全回退。

正确做法:用任务成功率和物理安全指标共同评估。

小节练习

  1. 为动作追踪任务设计 phase randomization,并说明它如何提高恢复能力。
  2. 比较“全身关节模仿”和“只模仿 task-frame 手部轨迹”的迁移性。
  3. 设计一个 sim2sim 测试,把 IsaacLab 中训练的模仿策略放到 MuJoCo 中评估。

专题.8 综合项目:Mini Motion Imitation Pipeline ⭐⭐

本章综合项目是实现一个最小动作模仿流水线。

目标不是复现大型人形系统,而是掌握从参考数据到训练评估的关键环节。

项目目标 ⭐⭐

  1. 读取一段参考动作。
  2. 做 root 对齐和速度计算。
  3. 构造 reference sampler。
  4. 实现 DeepMimic 风格奖励。
  5. 加入 RSI。
  6. 训练一个站立上肢挥手或四足臂末端轨迹追踪策略。
  7. 加入相位扰动和观测噪声。
  8. 输出 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 判别器,让策略在速度命令下用自然风格完成运动。

步骤

  1. data/ 中准备 3 段以上动作片段。
  2. 实现 AMP 判别器:输入 \((s_t, s_{t+1})\) 特征,输出标量。
  3. 实现风格奖励 \(r_{style}\) 和任务奖励 \(r_{task}\)(速度跟踪)。
  4. 调节判别器与策略的更新频率。
  5. 比较纯任务奖励策略和任务+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 训练栈对接

综合练习

  1. 实现 MotionReference.sample(phase) 的线性插值版本。
  2. 用 RSI 和不用 RSI 训练同一动作,比较后半段相位的追踪误差。
  3. 把姿态奖励权重减半,观察末端误差和动作自然性的变化。
  4. 加入接触一致性奖励,检查脚底滑动是否减少。
  5. 将参考手部轨迹转换为 EECommand,交给第 75 章的低层接口执行。
  6. (进阶)用 足式/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 的语义动作生成。这两个方向代表了动作模仿从”单平台单数据源”向”通用运动智能”演进的趋势。