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

提出两阶段方案(base policy + 在线 adaptation module),让四足机器人在部署时无需系统辨识即可实时适应未知负载、摩擦与地形,并在 Unitree A1 上零样本迁移到真实世界。是 legged robot sim-to-real 自适应的标志性工作,其『online adaptation module』思想被大量后续 contact/torque 估计与全身控制工作沿用。

机器人Unitree A1
上真机
物理感知
实时
输入模态proprioception

论文:Kumar, Fu, Pathak, Malik. RMA: Rapid Motor Adaptation for Legged Robots . RSS 2021. arXiv:2107.04034. 🌐 · 真机平台:Unitree A1 四足。

一句话直觉

让机器人不靠预先校准,就能边跑边适应陌生环境。

秘诀是挂一个"环境侦探",只看自身传感器历史就反推当前地形与负载。

RMA 之于机器人,就像老司机换车。

踩几脚油门刹车,就摸清这辆车的脾气,然后照着开。

是什么·为什么

要解决的问题:以前机器人的策略一旦部署就固定了。

遇到训练时没见过的情况它就会倒。

比如突然被挂上背包、踩到冰面、电机老化。📎

老办法domain randomization

这是一种训练技巧:在仿真里随机变摩擦、质量这些物理量,逼策略对一切扰动都鲁棒。

代价是策略部署后就死板,不会随环境变。📎

RMA 的转身:在策略外挂一个"环境侦探"模块。

它只读机器人自己的传感器历史。

关节角、速度这些就能反推当前环境。📎

策略拿到这个估计,立刻调整动作。

RMA 之于机器人适应,就像司机之于新车。

不是背手册,而是开两步就懂这车的脾气。

方法核心(大白话):分两步训。

Step 1,仿真里给策略一份"小抄"。

小抄是个短向量,描述当前环境——载重多重、地面多滑、电机多强。

策略靠小抄学会很好的走法。

这一步还顺带训一个小编码器,把完整物理量压成这份小抄。

Step 2,真机上小抄没了。

你没法直接测电机磨损或地面摩擦。

于是再训一个很小的"侦探"网络。

它只读机器人自己最近半秒的关节角和速度,去猜小抄里该写什么。

猜的监督信号,就是 Step 1 里那份真小抄。

部署时侦探以 10 Hz 更新猜测,策略以 100 Hz 出动作,两者异步。

侦探跑慢点够用——环境通常不会毫秒级剧变,省算力。

机器人边走,侦探边偷偷摸清环境。

📎

为什么能猜出来:同一个电机命令,在不同环境里关节响应不一样。

挂了重物,加速度变小。

踩到冰面,腿会侧滑。

这些"动力学指纹"写在关节历史里。

侦探把它们读出来,还原环境。

你会看到:Unitree A1 四足真机零样本扛住未知负载。

最高到 12 kg,约自重 100%。

踩未知地面、过未知台阶、爬未知坡度,照样走。

后续极限 parkour 工作复用这套思路做在线适应(感知另起)。📎

怎么做

核心机制·两阶段训练

RMA 把"学一个对环境敏感的策略"和"从历史推断环境"拆成两步独立训。📎

Stage 1:带特权信息的 RL

仿真里训 base policy,看三个输入:本体感受、上一步动作、还有环境标签。

关键方程:$\pi(a_t \mid s_t, a_{t-1}, \mu(e_t))$。

z_t(即 mu(e_t))是 8 维环境向量;e_t 是 17 维特权信息,含质量、摩擦、电机强度、地形高度。📎

"特权信息"指仿真里能直读、真机读不到的物理量。

PPO 联合训策略和编码器 mu

Stage 2:监督学习训 adaptation module

部署时拿不到 e_t,所以另训一个模块 phi,只看最近 50 步历史,推断 z_t 的估计 z_hat📎

$\hat{z}_t = \phi_\omega(s_{t-50:t-1}, a_{t-50:t-1})$。

phi 是一维因果时间卷积(causal 1-D CNN,只看过去不看未来),不用 LSTM——为了推理快。

监督信号是 Stage 1 输出的真值 z_t,损失是 MSE

$L = \|\hat{z}_t - z_t\|^2$。

关键工程细节:采数据必须用随机初始化的 phi 步进环境(DAgger 式)。

不能直接拿 teacher 的完美轨迹——否则部署鲁棒性大降。

异步部署

phi @ 10 Hz 更新估计,pi @ 100 Hz 出动作,两者异步。📎

A1 算力有限,这个设计是必须的。

常见误区(先抛一个,完整版见末尾):"RMA 不就是带 history 的端到端 RNN 策略吗?"

论文试过这个 baseline:步态不自然、性能差,还只能跑 10 Hz 失去异步优势

两阶段不是可选项,是必须——Stage 1 显式锚定了 z_t 的语义。📎

深度

Reward 设计(Sec.III.A,bioenergetics-inspired,共 10 项)

前进奖励 $\min(v_x^t, 0.35)$ 封顶 0.35 m/s。

还有 9 项惩罚:侧向与 yaw、做功 $-|\tau^\top(q^t-q^{t-1})|$、地面冲击 $-\|f^t-f^{t-1}\|^2$、平滑性、动作幅值、关节速度、姿态、Z 加速度、足部滑动。📎

权重依次 $\{20, 21, 0.002, 0.02, 0.001, 0.07, 0.002, 1.5, 2.0, 0.8\}$。

这套 reward 让策略无需任何参考动作就学到自然步态——是 RMA 的隐藏功臣。

仿真器与训练(Sec.IV.A):原 paper 用 RaiSim(不是 Isaac Gym),与 ETH 自研栈一致。📎

地形是 fractal terrain(octaves=2, lacunarity=2.0, gain=0.25, z-scale=0.27)。

policy 100 Hz,论文原文写 sim timestep 0.025 s——但这与 100 Hz policy 在物理上矛盾(sim 必须比 policy 高频),疑为 0.0025 s 笔误;复现按 RaiSim 默认约 400 Hz 物理配 4× decimation 验证。

每 episode 最多 1000 步;早停:身高低于 0.28 m、roll > 0.4 rad 或 pitch > 0.2 rad。

特权信息 e_t 的精确组成(Sec.IV.A):17 维。

质量 + 质心 3 维 + 电机强度 12 维 + 摩擦 + 局部地形高度。

采样范围(Table I):摩擦 $[0.05, 4.5]$,PD 增益 $K_p \in [50, 60]$、$K_d \in [0.4, 0.8]$(部署用 $K_p=55, K_d=0.8$),payload $\in [0, 6]$ kg,COM $\pm 0.15$ m,motor strength $\in [0.9, 1.1]$。

整个 episode 内近似不变(resample probability 仅 0.004)。

z_t 维度纠正:论文 Sec.III.A 明确 $z_t \in \mathbb{R}^8$。📎

社区流传的"5 维"是误传。

Stage 2 on-policy 采样(Sec.III.B):DAgger 式——用随机初始化的 phi rollout,把含偏差的轨迹配上真值 z_t 当监督。

这让 phi 见到足够多的"偏离完美轨迹"样本,是部署鲁棒性的关键来源。

为什么这能工作(机制洞察):机器人对同样的电机命令,在不同环境里产生不同的关节响应。

挂了 5 kg 背包时加速度变小;踩到冰面时支撑腿水平滑动变大。

这些"动力学指纹"编码在 (s, a) 历史里,时间卷积把它们读出来还原环境。

phi 本质是一个轻量的隐式 system identifier——不需要专门的激励信号。📎

Stage 1 的语义锚定:策略训练时见过真值 z_t,所以 z_t 一旦推断对,策略立刻知道怎么调整。

这是 RMA 比纯 RNN policy 易训的原因——latent 的语义是显式锚定的。

实验(真机 Unitree A1):扛未知负载最高 12 kg(A1 自重 12 kg,即 100% 自重;性能从 8 kg 起开始衰减)、踩未知摩擦地面(oily path)、过 hiking trail 台阶、爬 6° 未知坡度——全部零样本迁移。📎

这些场景之前的 domain randomization / teacher-student 都搞不定。

局限

  1. 推断延迟phi 需要 50 步(约 0.5 秒)历史才能稳定推断 z_hat

毫秒级突变(踏空、急刹)来不及。📎

  1. 分布外泛化phi 的能力上限是 Stage 1 里 e_t 的分布。

遇到训练分布外的扰动(从未见过的可变形地形),z_hat 不可靠。

本质上 RMA 与 domain randomization 共享这一局限:适应范围由训练分布决定。

  1. z_hat 不可解释:8 维 latent 是黑箱,无法保证推断对。

后续 DreamWaQ [Nahrendra et al. 2023] 用 implicit estimation 替代显式 module,更难调但稳定性有时更好。

  1. 仅四足验证:原 paper 只在四足上验证。

双足需应对单脚支撑相的不稳定平衡,对 adaptation 延迟容忍度更低,由 A-RMA 解决;机械臂场景由 RMA2 验证思想可迁移。[未确认]

研究者视角

图谱定位:RMA 是"在线适应"范式的起点,T01 的转折 3(分水岭)。📎

它把 sim-to-real 的范式从"让策略在部署前就准备好"(domain randomization / system identification / teacher-student)转向"让策略在部署中持续调整"。

后续支线清晰:

  • A-RMA(IROS 2022,arXiv:2205.15299):搬到双足,单脚支撑相对 adaptation 延迟容忍度更低。
  • RMA2(CVPR 2024):搬到机械臂,验证思想可迁移。
  • DreamWaQ(2023):用 implicit estimation 替代显式 module,避开两阶段训练。
  • Extreme Parkour(ICLR 2024):复用 RMA 的历史编码器思路做 adaptation module(ROA),感知侧另起 convnet 蒸馏、并非直接复用 RMA 的 encoder。🌐

注:RMA 的"两阶段必须"是就其自身设计而言——Stage 1 显式锚定 z_t 语义,φ 才有清晰的监督目标。后续同组工作 DWC / ROA 证明单阶段(编码器与策略一起用 RL 联训)也可行;两阶段是当时的工程选择,不是 adaptation 的唯一解。[未确认]

latent + history encoding 的 idea 最终被 rsl_rl 整合进 legged locomotion 的标准训练栈。

副产品:RMA 没有改 RL 算法(还是 PPO),只是引入 latent + temporal conv 的组合。

这意味着它可以即插即用地加到任何 legged RL 框架里,是它范式扩散快的原因。

Open problems

  1. 推断延迟的根治:0.5 秒窗口对毫秒级突变不够。

能否用 world model 或高频预测把延迟压到毫秒级,仍开放。[未确认]

  1. 跨分布外泛化:训练分布外的扰动(未见过的软地形、连阴雨导致的电机湿冷),phi 推不准。

需要_meta-learning_ 或持续学习机制。

  1. 可解释的 latent:8 维 z_t 黑箱,工程师无法在推断错误时干预。

能否引入结构化 latent(如显式分离摩擦与质量估计)是开放方向。[未确认]

常见误区

"RMA 就是带 history 的端到端 RNN 策略" —— 错。

论文 Sec.III.C 明确试过此 baseline:步态不自然、性能差、失去异步优势。

两阶段训练不是工程妥协,是必需——Stage 1 显式锚定 z_t 的语义,phi 才有清晰的学习目标。📎

"RMA 用 Isaac Gym 训" —— 常见误传。

原 paper 用 RaiSim(ETH 自研栈),社区复现(legged_gym/rsl_rl)才基于 Isaac Gym 改造。

仿真器选 RaiSim 是工程妥协,方法本身与仿真器无关。

"z_t 是 5 维" —— 错。

论文 Sec.III.A 明确 $z_t \in \mathbb{R}^8$。

太低信息不够、太高 phi 学不出来,8 维是经验最优。

"Stage 2 可以直接用 teacher 的完美轨迹采数据" —— 错。

论文 Sec.III.B 明确必须用 DAgger 式 on-policy rollout(随机初始化的 phi 步进)。

完美轨迹里没有"偏离状态下怎么恢复"的信号,部署鲁棒性会大幅下降。

"RMA 解决了 distribution shift 问题" —— 部分错。

它只解决了训练分布内的时变 gap;训练分布外的扰动它无能为力。

RMA 与 domain randomization 共享同一根本局限——适应范围由训练分布决定。

检查点

Q1

RMA 分两步训。Step 1 的策略能拿到一份描述环境的"小抄",真机上拿不到。Step 2 训的"侦探"网络是干什么用的?它的监督信号(老师)是谁?

💡 参考答案

  • 侦探的作用:部署时小抄(环境向量 z_t)拿不到,侦探只读机器人自己的关节历史,猜出小抄里该写什么,把猜出来的估计喂给策略。
  • 监督信号(老师):Step 1 里那份真小抄 z_t——侦探猜的值与真 z_t 做监督学习(MSE)。
  • 关键区分:Step 1 在仿真里、策略有真小抄;Step 2 训侦探去复现这份小抄;真机部署只有侦探、没有真小抄。
Q2

RMA 的"侦探"只读机器人自己最近半秒的关节角和速度,不读任何环境标签。它凭什么能猜出当前环境(比如载重多重、地面多滑)?

💡 参考答案

  • 核心直觉'动力学指纹':同一个电机命令,在不同环境里关节响应不一样——挂重物加速度变小,踩冰面腿会侧滑。
  • 这些响应差异写在关节角/速度的历史里;侦探从最近半秒历史里把这些指纹读出来,反推环境。
  • 关键:侦探不做主动探测,是从机器人正常行走的被动响应里读环境;不需要专门的激励信号。
Q3

用"老司机换车"或你自己举的类比,用自己的话解释:RMA 是怎么让机器人"边跑边适应"新环境的?

💡 参考答案

  • 老司机换车:开两步、踩几脚油门刹车,就摸清这辆车的脾气(重不重、油门灵不灵),然后照着开。
  • 映射:'摸清脾气' = 侦探从机器人自身运动历史推断环境(不是预先告知、不是查手册)。
  • 重要补充(修 r1 redteam M3):老司机心里估的'脾气'对应一个显式锚定的环境向量 z_t——不是黑箱感觉,是策略训练时就见过、有明确语义的量。'踩几脚'只是为了通俗,RMA 本身是被动读响应、不做主动探测。
Q4

部署时策略以 100 Hz 出动作,"侦探"以 10 Hz 更新猜测,两者异步。为什么不让"侦探"也跑 100 Hz?

💡 参考答案

  • 环境变化相对慢:载重、地形、电机特性这些不会毫秒级剧变,10 Hz 更新估计足够跟上。
  • 侦探要读最近半秒的历史卷积推理,强制跑 100 Hz 会拖垮策略;A1 算力有限。
  • 异步是工程必需:高频出动作 + 低频更新估计,既保 walking 平稳又省算力。
Q5

机器人突然踩空(毫秒级事件),"侦探"需要约半秒的历史才能稳定推断。为什么这种场景下来不及?

💡 参考答案

  • 侦探需要约半秒(50 步)的历史才能稳定估出环境——这是它的工作窗口。
  • 踩空是毫秒级突变:环境在侦探的一个估计周期里就变了,半秒窗口来不及捕捉。
  • 本质:RMA 适应的是'相对慢变'的环境分布;毫秒级突变超出它的设计上限(属分布外/高频扰动)。

FAQ

Q1:RMA 能直接用在真机上吗?

能。论文在 Unitree A1 真机做了零样本迁移实验(最高 12 kg 负载、未知摩擦、过 hiking trail 台阶、6° 坡度)。📎不需要真机 fine-tune。

Q2:Stage 1 的 e_t 有 17 维,为什么 z_t 只有 8 维?

z_te_t 的压缩表示。论文 Sec.III.A 用 8 维;太高 phi 学不出来,太低信息不够。📎8 维是经验最优。

Q3:为什么 base policy @ 100 Hz、adaptation module @ 10 Hz 异步?

z_t 在真机上变化相对缓慢(负载、地形不会毫秒级剧变),10 Hz 更新足够。

而 50 步历史卷积推理较慢,强制 100 Hz 会拖垮 policy。

异步设计对算力有限的低成本机载(A1)至关重要。📎

Q4:RMA 和 ETH teacher-student 范式什么关系?

两者都解决"真机拿不到特权信息"的问题,机制不同。

ETH 范式(Lee et al. 2020):精确测真机参数,蒸馏特权学生。

RMA:不测,靠运行时推断。

RMA 直接承接 Lee 2020,但把"适应"从训练时属性变成运行时能力。📎

Q5:为什么我的 RMA 复现训不出自然步态?

先查 reward:必须用 bioenergetics-inspired 10 项(Sec.III.A)。

特别是 ground impact $-\|f^t-f^{t-1}\|^2$ 和 work $-|\tau^\top(q^t-q^{t-1})|$ 两项,移除后步态退化成"趴地爬行"。📎

其次查 curriculum:penalty 系数从极小起步按 schedule 增大,mass/friction/motor strength 难度线性递增。