PAPER DEEP DIVE
生成、跟踪、改进:用 RL 微调运动生成器实现感知的多技能人形机器人运动
通用人形机器人需要的运动控制器必须同时具备多技能、感知、动态与足够的鲁棒性,才能去到人能去的地方。本文提出一个两层运动架构:(1)一个感知的流匹配运动生成器,从原始深度图规划全身轨迹;(2)一个用控制引导强化学习(CLF-RL)训练的感知跟踪策略,负责实时跟上这些动作。两张策略都训练在一个由动力学优化后的人体数据构建的、与地形一致的运动片段库上,因此既有准确的速度跟踪,又有与地形一致的参考。核心贡献是一个简单而有效的离线(off-policy)RL 微调环,用来改进运动生成器:配合生成器使用一种结构化搜索方法采数据,再做优势加权回归。这个离线环比在线的残差微调样本效率高得多,并且在没见过的几何与技能组合上提升了地形一致性——成功通过地形的比例最高提升 25 个百分点,技能选择最高提升 80 个百分点。因为直接用原始深度图感知环境,不需要里程计与高度图,室外部署很轻松;两个相机让策略能更早看到地形,无论指令速度是多少都能自主调速以通过地形。同一对策略让一台 Unitree G1 人形机器人在室外环境中行走、奔跑、站立、跳上跳下箱子并上下楼梯。项目主页:https://zolkin1.github.io/generate-track-improve/
一句话总结
这套系统把「会看地形的全身轨迹生成器」与「CLF-RL 训出的高速跟踪策略」分成两层:26.8M 参数的流匹配 Transformer 每 0.24 秒从两路原始深度图 + 速度指令生成一条 1.24 秒的全身参考轨迹,50Hz 的跟踪策略负责把它跑出来;真正的贡献是一个离线 RL 微调环——在闭环 rollout 里用「扰动条件量 + 扰动流匹配初始噪声」做结构化搜索,训 critic 打优势标签,再用优势加权回归直接改生成器自己的权重,从而在没见过的地形与技能组合上把成功率抬高最多 25 个百分点、把技能(mode)选对的比例从 0% 抬到约 80%。
图 1:感知控制策略在室内外多种地形上的实拍演示。(a)爬 15 级真实楼梯,含进入与离开楼梯段的过渡;(b)跳上箱子、走过去、再跳下来;(c)室外行走,含转弯进入小道;(d)室内奔跑;(e)下真实楼梯。
研究背景:人形机器人缺的不是单个技能,是「会看地形的多技能控制器」
论文的出发点是一句相当直白的判断:技能种类的多样性与真实世界运动本身的感知依赖性叠加在一起,使得人形机器人至今没有出现在可靠的真实场景作业中。近些年行走、奔跑、parkour、楼梯通过等运动模态各自都被研究过,能力在快速膨胀,但两个方向各自缺一块。地形感知类的运动策略通常不是为「可扩展到通用全身控制、可扩展到多速度运动」而设计的,于是机器人很难在真实世界里按指令速度去任何地方,也很难再扩展成开门、按电梯按钮这类与环境交互的技能。通用全身控制器这一侧(如 SONIC 这类 mimic 路线)能跟踪大量动作,却缺少 traversing 真实世界所需的感知与地形感知动作。本文要做的就是把两边接上:一对都带感知的策略,一层生成地形感知的参考,一层实时跟踪这个参考。
为什么选「生成器 + 跟踪器」这个范式,论文给的理由是工程性的而非性能性的。相比多专家蒸馏,或者让生成器同时输出运动学轨迹与动作的做法,分层架构带来模块化与技能可扩展性:只要跟踪控制器足够通用,加一个新技能就等于往运动库里加一批参考片段,不必重训跟踪层。它还提供了一个天然的算力切分——轻量的跟踪控制器跑高频,庞大的运动生成器可以低频查询。这一点在部署上是决定性的:本文生成器推理约 11 ms,而跟踪器不到 1 ms,两者相差一个数量级,正好对上「每 0.24 秒规划一次、每 0.02 秒控制一次」的频率差。
感知输入的选择同样是一个部署权衡。感知运动大体有两条路:用高度场(height field),或直接用传感器原始测量。高度场路线在部署时很麻烦,因为它普遍需要一个建高图的包加里程计。本文走原始深度图路线,代价是必须在仿真里模拟这个传感器、并且要求网络输出在相机视野下是可观测的;换来的是不需要里程计、不需要高度图,室外部署几乎零额外工作——论文里室内外用的是同一对策略,没有任何针对性调整。
与已有生成器—跟踪器工作的差别被作者列得很清楚。SONIC 用运动学生成器配通用跟踪策略,但生成器不带感知、只面向平地。PARC 提出感知的生成—跟踪流水线,能从有限起始集合生成新动作,但没有上硬件、只在仿真角色上验证,而且它需要运动学与动力学两步修正,加上扩散策略训练,三次迭代要花一个月,明显慢于本文方法。另一条相近工作需要里程计与高度扫描,既没有展示准确的速度跟踪也没有室外实验,而且要靠微调跟踪器来适配。本文的立场是:用原始深度相机、不用里程计、展示准确速度跟踪,并且提供一条用 RL 改进生成器的流水线——因为有些问题(例如该用哪种技能去越障)微调跟踪器根本改不动。
最后一块背景是把 RL 用于微调流匹配/扩散策略。这在 VLA 上已有先例,也用在腿式/轮式系统上较小的行为克隆操作策略上:有的用在线算法 DPPO 配一个不直接控制腿的降维动作空间,有的冻结生成器只学残差动作或引导潜在噪声。本文的设定与它们都不同:应用场景是动态运动,而且它直接调整生成器自己的权重,不是外挂残差。这也是后面对比 PPO 残差基线的动机。
预备知识:mimic 路线、CLF-RL 与流匹配
人形全身控制的主流做法是「mimic」:先有一条参考轨迹,再用 RL 学一个跟踪它的控制器。这条路线的好处是性能好、结果干净、几乎不需要调奖励,代价是必须先拿到参考轨迹。参考轨迹的来源包括人体动捕数据、降阶模型、动力学优化轨迹与动画数据。但很多 mimic 控制器只做到「动作回放」,缺少通用技能,也缺少一个供上层自治系统调用的接口;在运动控制里,这个接口通常由速度条件化、周期轨道构造或可实时查询的降阶模型提供,让机器人能跟踪一个指令速度——那正是上层导航策略会输出的东西。本文的数据管线要同时满足两件事:参考动作必须动力学可行且速度准确(否则跟踪精度上限被数据卡死),又必须与地形一致(否则脚会穿模或踩空)。
跟踪层用的是 CLF-RL 的一个变体。CLF-RL 用控制李雅普诺夫函数把跟踪误差的收敛性写进奖励结构,作者选它是因为已有工作显示它的跟踪误差更低。本文的变体有两处改动:跟踪目标是所有连杆的机体位置而不是关节角;另外引入一个缩放项 $S$ 来平衡数值性质而不牺牲 CLF 性质。附录里的命题 1 证明了这件事是合法的:设 $A_\eta,B_\eta$ 按输出块对角、$Q,R$ 对角正定,$P$ 是相应 CARE 的稳定化解,则对任意 $S=\mathrm{diag}(a_1,b_1,\dots,a_n,b_n)$($a_i,b_i>0$),
$$\bar{V}(\eta)=\eta^{\top}SPS\eta$$
仍然是一个指数稳定的 CLF。证明的关键是 CARE 按输出解耦,于是 $S_iA_iS_i^{-1}=c_iA_i$($c_i=a_i/b_i$)把缩放吸收进等价的 $\bar{Q}_i=c_iS_iQ_iS_i$ 与 $\bar{r}_i=\tfrac{b_i^3}{a_i}r_i>0$。换句话说,作者拿到了「自由调各通道权重」的自由度,而不破坏原有的稳定性保证——这解释了为什么 CLF 原本对速度项的偏置在这里可以被压下去(速度的方差比位置大,一味上权并不合适)。
生成层用流匹配(flow matching):训练时把噪声 $x_0\sim\mathcal{N}(0,I)$ 与数据 $x_1$ 线性插值成 $x_t=(1-t)x_0+tx_1$,网络学一个速度场去拟合常向量场 $v^{*}=x_1-x_0$;推理时从噪声出发做数值积分。本文部署时用 8 步 Euler 积分。选择流匹配而不是自回归 token 生成,是为了在 0.24 秒的规划周期内一次性吐出整条全身轨迹;而「初始噪声 $x_0$ 是一个可采样的连续量」这一点,后来成了 RL 微调结构化搜索的抓手。
方法详解
图 2:方法总览。人体数据经优化与生成模型变成运动片段库;用 CLF-RL 训练感知跟踪策略;再用运动库 + 跟踪策略采集机器人真实会看到的深度图,配上速度指令与运动库,构成流匹配生成器的监督训练数据(flow MSE 损失);最后用离线 RL 微调生成器——生成器与跟踪器一起闭环 rollout 采数据入缓冲区,训 critic 估计无限时域回报,用它给数据打优势标签,再用优势加权回归(AWR)调整生成器的输出分布。这对策略最终部署到硬件上做感知运动。
1. 系统总览:50Hz 跟踪,每 0.24 秒重新规划
方法分四步:数据管线、跟踪器训练、生成器训练、生成器的 RL 微调;完成后部署的是两张独立策略。跟踪器跑 50 Hz(RL 控制策略的常规频率),生成器每 0.24 秒被查询一次,也就是每 12 个控制步一次。输入切分得很干净:跟踪器吃本体感知信息 + 一路相机深度图,输出关节位置目标;生成器吃期望速度、自己上一次的输出、以及两路深度图,输出一条 1.24 秒长的全身轨迹。数据管线为两者提供地形一致的参考动作,微调只在生成器已经训好之后改进它。
这个频率差还带来一个容易被忽略的好处:生成器输出的是一条覆盖未来 1.24 秒的轨迹,而它每 0.24 秒才更新一次,所以相邻两次规划之间有约 5 倍的重叠。跟踪器在这段重叠里始终有一条完整的参考可跟,生成器的推理延迟(11 ms)与相机链路延迟因此不会直接变成控制空洞——论文专门提到,即便如此,缩短「传感器输入到新轨迹」的延迟对动态动作仍然关键。
2. 运动片段数据管线:动力学优化 + Motion Bricks 拼接
跟踪策略需要事先做好的地形感知运动片段。起点是 bones-seed 数据集里的人体动捕数据,作者用它生成优化后的人形参考动作:252 条平地稳态参考(前进与倒退直线行走、斜向行走、转弯行走、原地转身、侧步行走、直线奔跑、转弯奔跑),覆盖全向运动能力;再加46 条跳上/跳下箱子与上/下楼梯的参考。
优化用的是多重打靶(multiple shooting)+ 状态约束的形式,动力学后端是 MuJoCo。这个组合的理由很具体:因为可以对 MuJoCo 的接触动力学求导,接触时序允许发生小改动;同时多重打靶本身提供了数值稳定性。状态约束是这里的关键能力——它让作者能强制周期约束(末状态等于初状态)与平均速度约束(把参考动作精确调到目标速度)。
地形类动作在开源 bones-seed 数据里没有地形真值,作者的做法是反过来「先摆地形再解」:先按动作把地形摆好,用同一套优化在含地形的 MuJoCo 场景里求解;第一遍解完后,就从仿真里拿到了接触真值——对相关末端执行器body 的接触力做阈值化,再滤掉过短的接触/非接触片段。作者明确指出这比纯运动学检测接触更可靠,而这正是用动力学优化的额外收益。有了接触真值,就能把机器人运动学重定向到各种不同的地形尺寸上(数据集不可能覆盖真实世界里所有尺寸):计算脚的偏移量使接触时脚正好落在地形上,在相邻接触之间平滑插值这些偏移得到连续的末端轨迹变形,再用逆运动学解出关节角;重定向到新高度之后再跑一遍动力学优化,得到既可行又平滑的地形感知动作。
有了这批优化动作,下一步才是生成训练用的完整片段。片段长度 6 到 20 秒,按家族分组:跳下、跳上、纯下楼梯、纯上楼梯、下楼梯过渡、上楼梯过渡、平地。生成方式是采样速度剖面,对每个稳态速度指令挑最接近的那条稳态优化参考,然后用生成模型 Motion Bricks 做动作补间(in-betweening)。作者说这一步做的是 motion matching 也能做的事,但更快更平滑。最终产出 10,000 条运动片段、覆盖 140 种不同的地形 tile 几何,合成一个运动库——训练因此既能在同一几何上看到许多不同速度剖面,也能看到许多不同几何。
3. 跟踪策略:CLF-RL 变体 + 自扫描深度输入
跟踪器的奖励由两项 CLF-RL 跟踪奖励,加上非期望接触惩罚、力矩上限惩罚、关节限位惩罚、动作变化率惩罚与力矩惩罚组成。它是一个感知策略,输入包含一路能看到机器人自己身体的深度扫描:分辨率只有 30x26 像素,在硬件上由 600p 图像降采样得到。观测的完整构成见表 1。
| 观测项 | 维度 | 历史堆叠 |
|---|---|---|
| 关节角 | 29 | 10x |
| 关节速度 | 29 | 10x |
| 投影重力 | 3 | 10x |
| 基座角速度 | 3 | 10x |
| 上一步动作 | 29 | 10x |
| 下方深度相机 | 780 | 无 |
| 参考轨迹 | 572 | 无 |
| 速度指令 | 39 | 无 |
表 1(论文表 I):跟踪策略的观测项与维度。带历史的项按对应步数堆叠;780 = 30x26 的深度扫描。
网络结构是两段前馈 MLP:先由一个 MLP 编码参考轨迹与速度指令,其输出再与本体感知、深度输入一起进入第二个 MLP,激活函数全用 ELU。参考/指令 MLP 的隐藏维度是 [1024, 512, 512],主 MLP 是 [1024, 512, 256, 128]。策略以 50 Hz 输出关节位置目标,交给关节级 PD 控制器;动作变化率与增益取自已有工作。为了 sim-to-real,物理量(质心位置、关节摩擦、地面恢复系数、相机角度与外参偏移)都做域随机化,参考轨迹、深度读数与本体感知输入上都加噪声。训练在 IsaacLab 里用 8192 个环境、单张 H100 跑 20,000 轮迭代,约 48 小时,算法是带非对称 actor-critic 的 PPO(RSL-RL 实现)。
4. 生成器:一个前缀可缓存的流匹配 Transformer
生成器是一个自回归式的流匹配 Transformer,唯一的传感器观测就是深度图。深度图经 CNN 变成 token 送进 Transformer;Transformer 还接收速度指令与一段轨迹历史(上一条生成轨迹的一个节点子集),历史里每个节点单独成一个 token;流匹配头输出参考轨迹。规模上:每路相机的 CNN 输出 56 个 token,两路共 112 个感知 token;速度指令被拆到 13 个 token 上;模型 8 层、每层 8 头,FFN 宽度 2048,$d_{\text{model}}=512$,共 26.8M 可学习参数。
注意力结构里有一个为后续 RL 微调专门设计的决定:前缀 token(深度、速度指令、历史)之间做全自注意力,但前缀不去注意流匹配头里的输出轨迹 token;输出 token 则注意前缀。这意味着深度图、速度指令与历史的内部表示与当前流匹配速度场的输出无关,于是(1)这个 Transformer 编码器后面可以被 RL 微调直接复用(critic 冻结它、只训一个 value head),(2)推理更快——前缀编码器只需算一次,然后缓存起来在 8 个积分步里反复使用。感知 token 的位置编码来自它在相机视场角中的角度。
送进 CNN 的深度输入有五个通道:深度值,以及该像素在 3D 空间里的 $x$、$y$、$z$ 坐标与一个有效性二值位。三个坐标是相对于机器人根连杆上一个重力对齐、且与 yaw 对齐的坐标系:机器人偏航时这个坐标系跟着转,俯仰或横滚时不转。坐标由前向运动学求出根连杆到相机的变换,再把深度像素位置变换到根坐标系——这也正是流匹配输出根节点位置所用的坐标系。作者特别强调:由于生成器不吃任何本体感知,这些附加坐标输入是它能在地形上真正奏效的关键。没有它们,机器人无法分辨某些情形,例如自己正朝地形倾倒,或者地形正在靠近而机器人本身没有移动。
训练数据的采集方式很讲究:用训好的跟踪策略去跟它自己训练时的那批运动片段,把过程中的深度图、该时刻之前的参考轨迹(做历史)与之后的参考轨迹(做预测目标)都记录下来。选择用真实 RL rollout 而不是运动学回放,是为了让深度相机的访问状态尽可能真实。此外还维护一个历史深度测量缓冲区,训练时故意取缓冲区里较旧的一帧而不是最新帧,让生成器学会容忍相机延迟。数据初始规模 20 万点,随后做一次针对「参考必须与地形一致」的增强:把所有轨迹部分或全部落在地形上的数据点拿出来,沿地形采样一个随机距离与一个 yaw 偏移施加到机器人状态上,从新位置重新投射(re-cast)深度图而参考轨迹保持不变,每个相关数据点做 3 份增强。这等于在数据里强调:这些轴必须相对地形保持正确,即使机器人在动。
另外两处训练细节都服务于自回归鲁棒性:20% 的数据点把历史替换成一个可学习的 null embedding——一来逼策略不要只会「延续历史正在做的事」,必须真正学会从速度指令与深度图映射到输出轨迹,二来这个学到的参数正好用作线上第一次推理(此时还没有历史)的历史输入;同时训练时给历史轨迹加噪声,让策略对自己在线自回归时的输出更鲁棒。作者观察到的结果是:最终策略在自回归 rollout 中非常稳定,尽管它从没被训练去看自己的输出——训练全程都是 teacher forcing。生成器训 100 个 epoch、单张 H100 约 12 小时,部署时用 8 步 Euler 积分。
图 3:生成器 RL 微调架构与两张网络的 Transformer 结构。整体流程是采数据 → 训 critic → 更新生成器;右侧标出前缀编码器在 critic 训练时被冻结、在生成器更新时被更新,critic 用 value head,生成器用速度场 action head。
5. 生成器的离线 RL 微调:把跟踪器当成机器人动力学的一部分
初次训练之后,流匹配策略已经能和跟踪器一起在闭环里跑,但在分布外地形与任务组合上仍然吃力。作者的选择是微调生成器而不是跟踪器。形式化成一个 MDP:状态 $s_k\in\mathcal{S}$、动作 $a_k\in\mathcal{A}$,下标 $k$ 是重规划步——因为跟踪策略被冻结,所以「从这个 MDP 的视角看,跟踪器实际上就是机器人动力学的一部分,而不是一个可调的对象」。状态是全部条件量(深度扫描、参考历史、速度指令),动作是整条轨迹,因此 $\mathcal{A}\subset\mathbb{R}^{H\times\ell}$,其中 $H=62$ 个节点、每节点 $\ell=44$ 维,$H\times\ell=2728$。策略给出采样动作 $a_k\sim\pi_{FM}(a|s_k)$,逐步奖励 $r_k=r(s_k,a_k)$,轨迹 $\tau=\{(s_0,a_0),(s_1,a_1),\dots\}$,无限时域折扣回报为
$$J_{\pi_{FM}}(s)=\sum_{k=0}^{\infty}\gamma^{k}r_{k}$$
为什么不能直接上 PPO?作者给的理由是搜索效率:生成器每次重规划要吐出接近 3,000 个数(一条全身轨迹),在这些输出上加独立高斯噪声根本产生不出「结构上合理的轨迹」,搜索几乎是无效的。本文的替代方案是结构化搜索:不扰动动作,而是(1)扰动条件量(rollout 中扰动 conditioning,让机器人看到别的、但仍然合理的动作可能),(2)把机器人 spawn 到原策略本来到不了的各种位置,(3)在流匹配的初始采样噪声上做扰动。这样既能跳到其它 mode,又不给动作加噪声。扰动条件量时,名义(未扰动)条件量仍然被存下来,因此策略训练会把名义动作当作它在真实所处状态下的一个合法动作。
奖励设计见表 2,思路是地形一致性优先、速度跟踪与成功次之。地形穿透项惩罚与地形相交的机体点,地形接触项惩罚那些「按运动学分类器本应接触」却插得太深或离得太远的机体;速度跟踪与成功奖励都被地形一致性调制,只有地形一致性好的时候才给出显著奖励。考虑到越障时偏离指令速度往往是必要的,这种调制让两者可以用一致的方式被奖励;成功奖励还被整条 episode 上最差的地形一致性门控,因此只有在每一个规划都地形一致时才有强信号。
| 奖励项 | 表达式 | 作用 |
|---|---|---|
| 地形穿透 $r_{pen}$ | $\sum_{b=1}^{N_b}w_b\sum_{p\in P(b)}-\min\{\text{sdf}(p),0\}$ | 惩罚穿进地形的机体点 |
| 地形接触 $r_{con}$ | $\sum_{b=1}^{N_b}c_b\min_{p\in P(b)}|\text{sdf}(p)|$ | 惩罚该接触却离得太远/太深的机体 |
| 地形一致性 $r_{terr}$ | $\exp(-(w_c r_{con}+w_p r_{pen}))$ | 把两项压到 (0,1],作为主奖励 |
| 速度跟踪 $r_{vel}$ | $\sin(\frac{\pi}{2}(r_{terr})^{s_{vel}})\exp(-|v_x-v_x^{cmd}|/\sigma)$ | 被地形一致性调制的速度精度 |
| 成功 $r_{succ}$ | $\sin(\frac{\pi}{2}(\min_k r_{terr})^{s_{succ}})\cdot C1_{reached}$ | 被最差一致性门控的到达奖励 |
| 总奖励 | $r_{terr}+r_{vel}+r_{succ}$ | — |
表 2(论文表 II):生成器 RL 的奖励。$N_b$ 是机体连杆数,$P(b)$ 是某个机体上的点集,$\text{sdf}(p)$ 是地形到该点的有符号距离场取值,$s_{vel}$ 与 $s_{succ}$ 调节地形项衰减的锐利程度。这些奖励的灵感来自 PARC。
数据采集在 IsaacLab 里进行:由流匹配策略驱动、跟踪策略固定,机器人跑闭环。作者点出一个重要副作用——到这一步就可以抛弃预制的运动片段,在任何地形上微调。缓冲区是容量 $D$ 的 FIFO:初始采 2,000 个 episode 的数据点(重规划),之后每轮迭代只再采 500 个 episode 并入队,同时挤掉最旧的 500 个 episode。
方法依赖优势估计来判断哪些状态—动作对更好,因此需要拟合一个 critic 去预测无限时域折扣回报 $J_{\pi_{FM}}(s)$。训练方式是拟合值迭代(FVI),并且复用原生成器那个被冻结的前缀编码器,只训一个 value head。第 0 轮 FVI 用无 bootstrap 的蒙特卡洛估计 $V(s_i)\approx\sum_{k=i}^{\infty}r_k$,终止会截断 rollout:如果第 $k$ 步因失败而终止,其后所有奖励记 0;如果机器人没摔,仍然截断 rollout,但用一个「尾值」bootstrap,尾值就是最后一步的奖励。$n>0$ 的各轮用 $N$ 步前瞻并用上一轮的 $V$ bootstrap(回归的是缩放了 $(1-\gamma)$ 的值,因此目标量纲与奖励一致):
$$V^{n}(s)=(1-\gamma)\sum_{k=0}^{N-1}\gamma^{k}r_{k}+\gamma^{N}V^{n-1}(s_{N})$$
FVI 跑完就用 critic 打优势标签:$A(s,a)=R(s,a)-V(s)$,其中 $R(s,a)$ 是从该状态出发采样得到的真实回报——它把轨迹一直展开到终止、不做任何 bootstrap,也不使用 critic,所以优势标签里用的永远是真回报。实际中用归一化优势 $\tilde{A}=A/\sigma_A$,$\sigma_A$ 每轮 RL 迭代算一次,这样后面那个优势权重系数 $\beta$ 就可以按归一化单位来设。还有一个防泄漏的细节:训两个 critic,各自只用一半数据训练,然后用它去给另一半数据打优势标签——因为同一个 episode 里的多个数据点共享同一个成功/失败标签,单 critic 有可能把 episode 背下来。
有了优势就能给每个数据点加权:$w=\min\{\exp(\tfrac{1}{\beta}\tilde{A}(s,a)),\,L\}$,$L$ 是权重上界。然后把这些权重放进流匹配的 MSE 损失:均匀采一个 $t\in[0,1]$,采初始噪声 $x_0\sim\mathcal{N}(0,I)$,插值得 $x_t=(1-t)x_0+tx_1$,线性速度场 $v^{*}=x_1-x_0$,加权损失为
$$\mathcal{L}=\frac{1}{B}\sum_{i}^{B}\frac{w_i}{H\ell}\left\|v_{\theta}(x_t^{i},t_i,s_i)-v^{*}\right\|_{F}^{2}$$
其中 $B$ 是批大小,$\|\cdot\|_F$ 是 Frobenius 范数,除以 $H\ell$ 是为了让损失与轨迹规模无关。到这里就能看清整个方法的形状:探索发生在条件量与初始噪声上,学习发生在监督回归上,所以它同时避开了 2728 维动作空间上的无效高斯搜索和在线算法的样本浪费。
新数据可以很容易地掺进这个流程:预训练阶段的数据也能参与微调,做法是以权重 1 加入流匹配更新,但不参与 critic 学习与优势标注。这给了一个缓解「忘记原有动作」的开关——后文部署到硬件的那个多地形微调策略正是这样训的。整套 RL 微调跑 5 轮迭代,每轮在流匹配更新里跑 5 个 epoch,单张 H100 约 6 小时(会随地形、episode 长度等因素变化)。
flowchart TD MOCAP["人体动捕 bones-seed"] --> OPT["MuJoCo 多重打靶 + 状态约束<br/>周期约束 + 平均速度约束<br/>252 条平地 + 46 条地形参考"] OPT --> RETGT["接触真值 → 运动学重定向到多种地形尺寸<br/>脚偏移 + IK,再跑一遍动力学优化"] RETGT --> MB["Motion Bricks 补间<br/>10,000 条片段 / 140 种几何"] MB --> TRK["跟踪器: CLF-RL 变体 + 深度扫描<br/>IsaacLab 8192 环境 / 20,000 轮 / 约 48h<br/>50 Hz 输出关节位置目标"] MB --> GEN["生成器: 流匹配 Transformer 26.8M<br/>100 epoch / 约 12h<br/>20 万点 + 每点 3 份地形增强"] TRK --> ROLL["闭环 rollout(生成器驱动冻结的跟踪器)<br/>结构化搜索: 扰动条件量 + spawn 位置 + 初始噪声"] GEN --> ROLL ROLL --> BUF["FIFO 缓冲区<br/>先 2,000 episode,之后每轮 +500 / 挤掉 500"] BUF --> CRITIC["critic: 冻结前缀编码器 + value head,FVI<br/>两个 critic 交叉给另一半数据打优势<br/>A(s,a) = R(s,a) - V(s)"] CRITIC --> AWR["AWR 更新生成器权重<br/>w = min(exp(A_tilde / beta), L)"] AWR --> GEN AWR --> DEP["部署 Unitree G1 + Jetson Thor<br/>生成器 11 ms / 每 0.24 s<br/>跟踪器 50 Hz 且不到 1 ms"]
6. 部署:Jetson Thor + 两路深度相机的分工
两张策略都跑在机载 NVIDIA Jetson Thor 上:流匹配推理约 11 ms,跟踪器不到 1 ms。虽然生成器每 0.24 秒才被查询一次,作者仍然强调压缩「传感器输入到新轨迹」之间的延迟对动态动作很关键。两路相机是 Zed X mini 与 Zed X,它们先接到一台 NVIDIA Jetson Orin 上做深度处理与降采样,再经 ROS2 送给 Thor。训练时只模拟降采样后的像素,而不是模拟整台相机再在仿真里降采样——这大幅降低了感知仿真的成本。安装位置上,Zed X 装在躯干靠上的位置、大致朝前;Zed X mini 装在躯干下部,能看到腿与机器人正下方的地面。Thor 与 Orin 都由机器人本体供电,速度指令通过蓝牙手柄给出。
实验结果
RL 微调:分布外地形上成功率最高 +25 个百分点,mode 选择从 0% 到约 80%
为了衡量微调的作用,作者构造了 4 组配置:(1)箱子,1 到 2 个宽度与高度各异的箱子;(2)楼梯,先上后下、宽度各异,两侧有 1 到 2 面墙,有起止平台,上下楼梯之间还有一个中间平台;(3)多地形,把箱子、楼梯、部分分布内地形,以及一个真实建筑入口(两段尺寸不同的楼梯、墙体、以及两段楼梯之间的休息平台)混在一起;(4)分布内地形集,即原来训生成器与跟踪器用的那批。前三组之所以是分布外,原因包括:策略从没被训练过在单个 episode 里既跳上又跳下箱子、箱子宽度被改动、楼梯周围加了墙、以及加入了入口这类全新地形。成功的判定是在给定时间内到达目标区域且没有摔倒,目标区域分布在地形各处。
图 4:RL 微调对分布外与分布内地形的效果。(a)成功率,最高提升 25 个百分点;(b)平均接触惩罚,数值越低越好,说明微调后的策略地形一致性更高;(c)整条 episode 把每一个 mode(技能)都选对的比例——例如两段箱子地形要求两次跳上、两次跳下。微调在 mode 选择上的改善最大:某个楼梯地形从 0% 选对提升到约 80%。误差条为 95% 置信区间。
三张子图给出三条相互独立的证据:成功率全面提升(最高 25 个百分点);平均接触惩罚下降,说明轨迹与地形的吻合更好;mode 选择显著改善。这里的 mode 指用来通过地形的技能,例如用楼梯轨迹还是用跳箱轨迹。mode 的标注协议值得单独记下来:每个策略在每种地形上跑 50 次 rollout,把所有 rollout 随机打乱以避免偏见,再由人工逐个标注所选 mode,如果人都判断不出用了哪种 mode,就记为错误。作者由此强调:调整 mode 选择是微调跟踪器做不到的事,所以生成器 RL 与跟踪器微调是互补工具,而不是二选一。
最终部署到硬件上的是多地形微调那一版,它同时验证了微调能跨地形类型与跨技能工作;这一版训练里也按前文所述掺入了预训练数据,从而在学新环境的同时不让生成器忘掉其它动作。
算法对比:AWR 全面不输,PPO 残差贵 160 倍数据还低 13 个百分点
第二组实验研究算法选择。本文方法(AWR:在离线 rollout 上做带优势加权的监督回归)与四种做法对比:filtered BC(过滤式行为克隆)、arrival filtering(保留所有到达目标区域的 rollout 数据)、plain BC / 自蒸馏,以及去掉条件量扰动的 AWR。plain BC 完全去掉优势信息,用来问「哪怕没有 critic、没有筛选机制,光是拥有这块新地形上的数据是否就有用」;两种筛选变体用来考察筛选方式本身的影响;去掉条件量扰动则单独隔离这种搜索方式的贡献。箱子地形还分「严格终止」(偏离生成轨迹超过 12 cm 即终止)与「宽松终止」(30 cm 界)两档。
图 5:不同微调算法与搜索方式相对本文 AWR 的表现,跨地形、跨箱子地形的严格/宽松两档终止条件。AWR 在成功率与地形一致性两个指标上都等价或更优,误差条为 95% 置信区间。
结果是 AWR 在成功率与地形一致性上都稳定地打平或胜过其它选择,而几条对照各自说明了一件事。plain BC 失败得很彻底,说明某种优势或筛选机制是必需的——「有新地形的数据」本身不够。两种筛选变体总体都差于 AWR:arrival filtering 对终止条件的选择敏感得多,从严格终止换到宽松终止,它相对 AWR 的成功率优势损失约 10 个百分点;filtered BC 则稳定落后 AWR 5 到 10 个百分点。作者解释了 arrival filtering 为什么没有像 plain BC 那样崩:因为它的终止判据基于跟踪性能,于是隐式地改善了地形一致性指标。去掉条件量扰动会让成功率下降 4 到 6 个百分点,接触惩罚在多地形上明显更高,楼梯地形上的表现持续更差——这条直接把「结构化搜索」的贡献量化了出来。
与在线算法的对比更硬核。作者用 PPO 训一个残差策略:观测是生成器的输出加上生成器自己的观测,输出是对轨迹的残差修正,动作空间与生成器完整输出同维;奖励与离线算法完全相同。如果残差方式真的有效,理论上还可以再蒸馏回原生成器。结论是 PPO 的数据效率显著更差:训练在 2,000 轮迭代时被作者主动停掉,此时它已经用掉离线算法 160 倍以上的数据、花了 30 倍以上的墙钟时间,而成功率仍比 AWR 低约 13 个百分点。作者承认它可能还在上升趋势里,但继续爬需要多得多的数据与算力,因此结论是:在这个场景下离线算法(AWR)是更好的 RL 微调路径。
速度跟踪与地形通过:机器人自己决定何时减速
有一件事必须先说清楚:地形不可能在任意速度下通过。数据里没有「冲刺上楼梯」的轨迹,也没有高速跳上箱子的能力,所以机器人自己减速是预期且必要的。真正不希望出现的是「必须由上层指令给出正确速度才能过障碍」。因此策略要用深度相机自主调速:接近地形时减速到能通过的速度,通过之后再回到指令速度。
图 6:微调后策略在多种地形上的通过能力,以及地形对机器人速度的影响。机器人接近地形时自主减速以便稳健通过,整体速度跟踪准确、地形通过可靠。图中百分比是每种地形 150 次采样里的成功比例。
图 6 同时回答了两个问题:微调后策略是否还保得住速度跟踪精度(训练里加了条件量扰动,这本有可能损害它),以及 sim-to-sim 是否成立——评测在 MuJoCo 里做,而训练在 IsaacLab,每个速度跑 50 次 rollout、每次用不同的流匹配采样随机种子。
| 速度指令区间 $v_x$ (m/s) | 本文管线 速度 RMSE [95% CI] | 仅用 Motion Bricks [95% CI] |
|---|---|---|
| (-1.0, -0.2] | 0.484 [0.357, 0.598] | 0.462 [0.346, 0.562] |
| (-0.2, +1.0] | 0.230 [0.191, 0.271] | 0.368 [0.308, 0.434] |
| (+1.0, +2.5] | 0.442 [0.312, 0.563] | 0.896 [0.813, 0.976] |
表 3(论文表 III):平地上不同运动片段生成方法的速度 RMSE 对比。加粗为统计显著的改善;置信区间与其它均值重叠的条目在原文中以下划线标注。
表 3 是数据管线的直接证据:优化参考轨迹 + Motion Bricks 的组合,速度跟踪优于单独使用 Motion Bricks。作者给出的理由很重要——这些运动片段是最终策略速度跟踪性能的上界,因为策略就是被训练去跟踪它们的,所以在这里丢掉的跟踪能力,在现有管线下后面无法补回来。前进区间(-0.2 到 +1.0)RMSE 从 0.368 降到 0.230,高速区间(+1.0 到 +2.5)从 0.896 降到 0.442,后者几乎腰斩;倒退区间两者相当(0.484 对 0.462,置信区间重叠)。作者也试过用 motion matching 生成离线片段:在拿到同样参考动作与数据集的条件下速度跟踪确实不错,但生成一条片段的时间是 7 倍以上,整个 10,000 条片段的库要跑数小时,而且产出的轨迹 jerk 更高、动作看起来更抖,所以不是一条可取的路。
硬件部署:6 座不同的真实楼梯、2 m/s 转弯奔跑
图 7:这对策略在多种条件下的实拍。几何各不相同的多段楼梯、平地上的直线与转弯行走与奔跑,以及跳上多种平台(含带助跑的起跳)。
因为用的是原始深度读数,转到室外是轻松的,相对室内不需要任何调整。硬件结果的具体颗粒度:连续爬 15 级台阶无异常;成功通过 6 座几何各不相同的真实楼梯,上行与下行都做了;室内外都能行走与奔跑,并能从快速与慢速两种状态过渡到地形上;图 7 右下角是机器人以 2 m/s 奔跑同时在路径上转弯;箱子既能跳上也能跳下,包含带助跑的起跳。作者还专门报告了在硬件上以 0.8 m/s、1.5 m/s、2.0 m/s 三种速度接近楼梯并成功过渡到地形上。动作质量方面,作者描述硬件上的动作平滑、自然、相对安静,尤其在楼梯这类地形上——其它方法可能会把脚砸向地面。多相机策略在有墙、有树、有灌木的真实环境里也能部署,说明不需要把每一种感知条件都仿真出来。
双相机消融:拿掉上方相机,箱子地形从 100% 掉到 57.3%
| 地形类型 | 双相机 | 仅下方相机 | 差值 |
|---|---|---|---|
| 平地 | 100% | 100% | 0 |
| 箱子 | 100% | 57.3% | -42.7 个百分点 |
| 上楼梯 | 82.7% | 71.3% | -11.4 个百分点 |
| 下楼梯 | 97.3% | 88.0% | -9.3 个百分点 |
表 4(论文表 IV):上方相机对分布内地形通过能力的影响。移除上方相机最多让通过率下降 43%(箱子地形)。
很多已有工作只用一个朝下的相机,本文之所以需要两个,是因为它要求机器人在到达地形之前就调整速度——它的速度可以到 2.5 m/s,而朝下相机看到障碍时已经太晚。为了隔离变量,这组实验只用原始预训练的生成器(不带 RL 微调)分别训「有上方相机」与「无上方相机」两版。结果见表 4:移除上方相机后成功率最多下降 43%(箱子地形 100% → 57.3%),上楼梯与下楼梯分别下降 11.4 与 9.3 个百分点,平地不受影响。作者检查了箱子地形的轨迹,确认绝大多数失败是直接撞上箱子,而且成功率随速度提高而下降——这正是「提前看到、提前减速」这条能力的量化。
局限性
论文有专门的局限性小节,作者自述三条。其一,RL 微调用的是手工设计的奖励:虽然这些奖励相当通用,但可能无法延伸到所有可能的动作。其二,只用深度信息限制了策略能使用的语义:作者举的例子很具体——可能存在一些箱形物体是我们不希望机器人跳上去的,而当前方法没有任何途径把这件事编码进去。其三,数据管线仍然需要人工调参:过渡环节的超参数要手调,而为优化挑选人体参考动作这一步仍然靠启发式或靠人。作者明确说,这两条数据管线上的限制必须先解决,方法才能真正扩展到任意动作。
以下是我从工程与实验设计角度补充的判断。第一,地形一致性奖励依赖地形 SDF,而 SDF 只在仿真里存在。表 2 的 $r_{pen}$ 与 $r_{con}$ 都建立在 $\text{sdf}(p)$ 上,这意味着整套 RL 微调信号是仿真专属的;论文提出的「从真实硬件数据里学习」还只是未来工作,所以真机上的改进完全依赖 sim-to-real 迁移,而论文没有给出「微调在仿真里涨的点在硬件上是否同样涨」的直接对照(硬件只部署了多地形微调那一版,没有并排的预训练版实拍对比)。第二,mode 标注由单人完成。50 次 rollout 随机打乱后由「一个人」标注,判断不出就算错,但没有报告标注者间一致性,而 mode 选对率恰好是本文最亮眼的数字(0% → 约 80%)。第三,PPO 对比是被提前停掉的。作者自己承认 PPO 可能仍在上升,因此「离线优于在线」这个结论在 2,000 轮这个点上成立,但不能外推成 PPO 的收敛上限更低。第四,速度 RMSE 只在平地上报告。表 3 是数据管线质量的关键证据,却没有地形上的对应测量,而地形上「该不该跟踪指令速度」本来就是被奖励刻意放宽的。第五,评测样本量与统计口径偏轻。双相机消融与速度跟踪评测分别是每地形若干次 rollout 与每速度 50 次,成功率给到 0.1 个百分点精度(57.3%、82.7%)但未附置信区间;表 3 有 CI,表 4 没有。第六,生成器不吃本体感知。作者用「重力对齐根坐标系下的像素 3D 坐标」补上了姿态信息,这在 IMU 与状态估计可靠时成立,但把对重力方向估计的依赖转移到了输入通道里,论文没有讨论状态估计漂移对生成器的影响。
总结与展望
这篇论文的三块贡献可以分开评价。架构(感知生成器 + CLF-RL 跟踪器,50 Hz 与 0.24 s 的双频切分)本身不是新范式,SONIC 与 PARC 已经走过这条路,但本文是把它做成了「原始深度输入、无里程计、无高度图、室内外同一对策略、速度跟踪准确」的完整可部署形态。数据管线(人体数据 → 多重打靶动力学优化 → 接触真值 → 运动学重定向到多种地形尺寸 → 再优化 → Motion Bricks 补间 → 10,000 条片段 / 140 种几何)解决的是 mimic 路线最脏的那部分工作,而且表 3 说明它不是可选项:片段的速度精度就是最终策略速度精度的上界,Motion Bricks 单独用会把高速区间的 RMSE 从 0.442 抬到 0.896。生成器的离线 RL 微调是真正的新东西,也是作者声称的首次——用 RL 微调一个感知的生成模型来做动态、地形感知的人形运动。它的巧妙之处不在算法(AWR、FVI、优势加权都是既有组件),而在搜索空间的选法:把探索从 2728 维动作空间挪到条件量、spawn 位置与流匹配初始噪声上,同时把跟踪器冻结成「机器人动力学的一部分」,于是 MDP 的步长变成 0.24 秒的重规划步,horizon 短到离线方法足以应付。
对做人形控制的读者,最值得抄的两条经验是:其一,前缀注意力隔离——让条件 token 不去注意输出 token,使前缀编码器既能被缓存加速推理,又能被 critic 冻结复用,一个结构决定同时服务部署与训练两个目标;其二,mode 选择要改生成器,不要改跟踪器——跟踪器再准也只会忠实执行给它的参考,「该用哪种技能越障」这个决定发生在参考被生成出来的那一刻。
论文自己列出的未来工作有四条:改进生成器 RL 里的搜索,不仅能提升动作质量,还可能像 PARC 那样生成出新动作,但找到高效且结构化的搜索方式是前提;把这套方法扩展到从真实硬件数据中学习,让它能从真实部署里持续改进;数据侧,当前人体数据没有地形真值,把物体与地形纳入数据集会让问题更可扩展,同时需要更好的过渡生成方法与新的离线地形感知动作生成模型;以及把这对控制器接入导航自治栈,并织入安全与避障,才能进一步走向真实部署。


