跳转至

本文档属于 Robotics Tutorial 项目,作者:Pengfei Guo,达妙科技。采用 CC BY 4.0 协议,转载请注明出处。

第 91 章 RAMBO——混合 MPC-RL 架构的理论与实践

难度: ⭐⭐⭐⭐ | 建议时间: 1.5 周 (30-40 小时) | 前置: 足式/90 WBC/TSID, 足式/190 RL 基础, 复合/30 MPC 基础, 足式/70 简化模型

本章定位
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
足式/90 WBC/TSID   ──→ [RAMBO 混合架构]  ──→ 复合/220 端到端 MPC+RL
复合/30 MPC 基础    ──→ [MPC 前馈层]      ──→ 足式/110 OCS2
足式/190 RL 基础    ──→ [RL 残差层]       ──→ 复合/200 UMI-on-Legs
足式/70 简化模型    ──→ [SRB 建模]        ──→ 足式/100 DDP
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

前置自测

📋 前置自测(答不出 ≥ 2 题 → 先回足式/90 WBC 和足式/190 RL 复习)

  1. QP (Quadratic Program) 的标准形式是什么?KKT 条件包含哪些方程?
  2. 单刚体(SRB)模型忽略了什么?这个近似在什么条件下成立?
  3. PPO (Proximal Policy Optimization) 的 clip 机制解决什么问题?
  4. 什么是 Domain Randomization?它如何帮助 Sim-to-Real 迁移?
  5. 摩擦锥约束 \(\|f_{xy}\| \leq \mu f_z\) 的物理含义是什么?线性化后变成什么形状?

本章目标

学完本章,学员应能:

  1. 解释纯 MPC 和纯 RL 各自的局限——理解混合方案的必要性
  2. 分类混合 MPC-RL 架构——区分四种主要范式的数学形式和适用场景
  3. 写出 RAMBO 的核心方程——MPC 产生前馈 + RL 产生有界残差
  4. 推导简化模型 QP 的建模过程——从 SRB 到接触力优化
  5. 设计残差策略的训练管线——观测/动作/奖励 + Domain Randomization
  6. 分析混合系统的稳定性——理解残差约束如何提供安全保证

91.1 动机:纯 MPC vs 纯 RL 的局限 ⭐⭐

91.1.1 纯 MPC 的困境

模型预测控制(MPC)是腿足运动控制的经典方法。它的核心思想是:在每个控制周期,用动力学模型预测未来 \(N\) 步的状态演化,优化控制序列使代价函数最小化,执行第一步控制量,然后重复。

MPC 在理想条件下非常强大——它可以系统性地处理约束(摩擦锥、关节限位)、预测性地规划未来(避免短视行为)、利用物理模型保证安全性。但它有三个根本性的局限:

局限 1:模型精度的天花板

MPC 的核心假设是"我有一个准确的模型"。但真实世界中的模型始终是近似的:

模型假设 现实情况 误差后果
地面是刚性平面 地面有弹性、不平、有坡度 接触力预测错误
摩擦系数已知 \(\mu=0.6\) \(\mu\) 随地面材质变化 \([0.2, 1.0]\) 打滑或过保守
电机无延迟 通信+计算延迟 10-20ms 力矩施加时刻偏差
质量分布精确 负载改变、零件磨损 重心和惯量预测偏差
关节无摩擦 减速器有显著摩擦 力矩-运动映射偏差

回顾足式/70 简化模型:SRB (Single Rigid Body) 模型假设腿部质量可忽略。当机器人腿部确实很轻(如 Go1/Go2 通过连杆设计降低腿部惯量)时,这个假设误差约 5-10%。但当机器人背上安装了 2-3kg 的机械臂时,质心分布显著改变,SRB 模型的预测误差可能达到 20-30%。

局限 2:计算时间的硬约束

MPC 需要在每个控制周期内求解一个优化问题。对于 SRB-MPC,典型的 QP 求解时间约 1-5ms(取决于时域长度和约束数量)。但更精细的模型(如全身动力学 MPC)可能需要 10-50ms,甚至无法在 100Hz 的控制周期内完成。

计算时间 vs 模型精度的 trade-off:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
模型精度 ▲
         │           ★ 全身动力学 MPC
         │           (50ms, 非实时)
         │      ★ Centroidal MPC
         │      (5-10ms, 勉强实时)
         │ ★ SRB-MPC
         │ (1-2ms, 舒适实时)
         └───────────────────→ 求解时间
           1ms   5ms   50ms

理想点: 模型精确 + 求解快 → 目前不存在
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

局限 3:非结构化交互的建模困难

当机器人需要与物体交互(推购物车、端盘子、拿软物体)时,交互力的建模变得极其困难。购物车有轮子摩擦、偏转角、载荷惯性;盘子上的物体可能滑动;软物体的刚度非线性。为每种交互对象建立精确模型是不现实的。

本质洞察:MPC 的局限本质上是"基于模型"(model-based)方法的通用局限——模型永远比现实简单。提高模型精度可以缩小 gap,但永远无法消除它。而且模型越精细,计算越慢,可能反而不如快速的粗糙模型实用。

91.1.2 纯 RL 的困境

另一端是纯 RL 方法——直接用强化学习从零训练一个端到端的策略。近年来,PPO + 大规模并行仿真 (Isaac Gym/Lab) 的组合在四足行走任务上取得了惊人的成功。但纯 RL 也有三个根本性的局限:

局限 1:安全约束难以保证

RL 策略是一个黑盒神经网络。它不显式地知道摩擦锥约束、关节限位、力矩饱和等物理边界。虽然可以通过奖励函数惩罚违反约束的行为,但奖励惩罚只是**软约束**——策略可能在 0.1% 的情况下违反约束,这在仿真中几乎不影响平均奖励,但在真机上一次违反就可能损坏硬件。

\[\text{MPC: } f_z > 0,\ \|f_{xy}\| \leq \mu f_z \quad \text{(硬约束, 永远满足)}$$ $$\text{RL: } r_{friction} = -w \cdot \max(0, \|f_{xy}\| - \mu f_z) \quad \text{(软约束, 可能违反)}\]

局限 2:精确力控困难

当任务需要精确控制末端力(如端一个盘子时保持水平、或与刚性环境接触时控制法向力),RL 策略很难学到精确的力调节。原因是力的反馈在仿真中受接触模型精度限制——仿真器(即使是 MuJoCo)的接触力计算与真实世界有显著差异。

纯 RL 的力控问题:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
目标: 末端施加 5N 的法向力

RL 策略在仿真中学到:
  → 输出关节力矩 τ_sim → 仿真器计算接触力 → 5N ✓

真机部署:
  → 相同的 τ_sim → 真实接触刚度不同 → 3N 或 8N ✗
  → 缺少力传感器反馈 → 无法校正
  → 过大力可能损坏物体,过小力可能丢失接触
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

局限 3:样本效率和训练成本

虽然 Isaac Lab 可以并行模拟数千个环境,但对于 loco-manipulation 任务(需要同时学走路和操作),状态空间和技能空间的组合爆炸使训练时间达到数天甚至数周。更糟糕的是,奖励工程(reward engineering)本身就是一个反复试错的过程——不好的奖励设计可能导致策略学到非预期的"捷径"行为。

反事实推理:如果 RL 能在几分钟内训练完并保证安全,我们就不需要 MPC 了。如果 MPC 的模型能完美反映现实,我们就不需要 RL 了。混合方案的存在恰恰说明这两个"如果"在当前技术水平下都不成立。

91.1.3 混合的核心直觉

MPC 和 RL 的优势恰好互补:

         MPC                    RL
  ┌──────────────┐      ┌──────────────┐
  │ ✅ 物理约束   │      │ ✅ 鲁棒性     │
  │ ✅ 可解释     │      │ ✅ 适应未知   │
  │ ✅ 力控精确   │      │ ✅ 计算快速   │
  │ ❌ 模型误差   │      │ ❌ 安全约束   │
  │ ❌ 计算慢     │      │ ❌ 力控粗糙   │
  │ ❌ 需要建模   │      │ ❌ 训练耗时   │
  └──────┬───────┘      └──────┬───────┘
         │                     │
         └──────┬──────────────┘
         ┌──────▼──────┐
         │  混合 MPC+RL │
         │ MPC: 物理前馈 │
         │ RL: 残差补偿  │
         │ 安全 + 鲁棒   │
         └─────────────┘

跨领域类比:混合 MPC+RL 类似于自动驾驶中的"规则引擎 + 学习模型"。规则引擎保证不闯红灯、不逆行(硬约束);学习模型处理复杂的驾驶决策(如并线时机)。单独的规则太僵化,单独的学习太危险——混合是工程实践的必然选择。

练习 91.1a (⭐): 列举三个你认为纯 MPC 会失败的操作任务和三个纯 RL 会失败的操作任务。说明失败的具体原因。

练习 91.1b (⭐⭐): 在足式/70 中我们推导了 SRB 模型的运动方程。如果四足机器人背上放了一个 2kg 的物体,SRB 模型需要做哪些修改?修改后的预测误差如何量化?


91.2 混合架构分类学 ⭐⭐⭐

91.2.1 四种主要范式

混合 MPC-RL 架构不止一种。根据 MPC 和 RL 的**耦合方式**,可以分为四种主要范式:

范式 数学形式 代表工作 核心思想
MPC→RL (蒸馏) \(\pi_{RL} \approx \pi_{MPC}\) DAgger, MPC distillation RL 学习模仿 MPC 的行为
RL→MPC (引导) MPC cost from \(\pi_{RL}\) Value-guided MPC RL 的价值函数引导 MPC 的代价设计
并行 (残差) \(u = u_{MPC} + \Delta u_{RL}\) RAMBO, residual RL MPC 前馈 + RL 残差
层级 (分工) RL→ref, MPC→track Hybrid controller RL 输出参考,MPC 跟踪

91.2.2 范式 1:MPC→RL(蒸馏)

思想:先用 MPC 生成大量最优控制数据,然后用监督学习或模仿学习训练 RL 策略来模仿 MPC。

\[\mathcal{L}_{distill} = \mathbb{E}_{s \sim \mathcal{D}} \left[\| \pi_\theta(s) - u_{MPC}^*(s) \|^2 \right]\]

优势:RL 策略推理速度快(~0.1ms),部署时不需要在线求解 MPC。

劣势:学生策略不会超过老师。如果 MPC 本身因为模型误差而给出次优解,RL 也会复制这些错误。而且 MPC 在分布外(out-of-distribution)状态下的行为可能不合理,RL 也会学到这些不合理行为。

91.2.3 范式 2:RL→MPC(引导)

思想:用 RL 学习一个价值函数 \(V(s)\),然后把这个价值函数嵌入 MPC 的代价中,作为终端代价或启发式引导。

\[\min_u \sum_{k=0}^{N-1} l_k(x_k, u_k) + V_\theta(x_N)\]

优势:MPC 保留了约束处理能力,RL 的价值函数提供了长期规划的视野。

劣势:RL 的价值函数需要频繁更新(因为 MPC 的行为会改变状态分布),两者的训练需要仔细的协调。

91.2.4 范式 3:并行残差——RAMBO 的选择

思想:MPC 和 RL 并行运行,MPC 输出物理可解释的前馈力矩,RL 输出有界的残差补偿。

\[\boxed{u_t = u_t^{MPC} + \Delta u_t^{RL}, \quad \|\Delta u_t^{RL}\| \leq \epsilon_{max}}\]

优势: - MPC 保证了物理约束(摩擦锥、接触模式),RL 只需要在安全范围内补偿 - 即使 RL 完全失效(\(\Delta u = 0\)),系统仍然有 MPC 兜底 - 两者可以独立开发和调试

劣势: - 需要精心设计残差的约束范围 \(\epsilon_{max}\):太小则 RL 无法发挥作用,太大则可能破坏 MPC 的安全保证 - 在线求解 MPC 增加了计算负担

本质洞察:并行残差范式的关键是**责任分工的显式化**。MPC 负责"不应该做什么"(约束),RL 负责"在安全范围内做什么最好"(优化)。这种分工让调试变得清晰:如果机器人打滑了,先查 MPC 的摩擦锥约束是否合理;如果机器人行为不自然但安全,先查 RL 的奖励设计。

91.2.5 范式 4:层级分工

思想:RL 在上层输出参考轨迹(如步态参数、EE 目标),MPC/WBC 在下层跟踪这些参考。

这种范式与 UMI-on-Legs 的架构类似——上层策略(Diffusion Policy / RL)输出 EE 目标,下层控制器跟踪。区别在于 RAMBO 不是层级分工,而是并行残差。

91.2.6 范式对比总结

维度 蒸馏 引导 残差 (RAMBO) 层级
MPC 在线运行?
RL 直接出力矩? 是(残差) 否(出参考)
安全保证
计算开销
调试难度
模型误差容忍

91.2.7 残差策略的理论基础:Residual Policy Learning

残差策略学习的理论基础来自 Silver et al. (2018) 的工作。其核心定理是:

定理(非正式):如果基础策略 \(\pi_{base}\) 在目标任务上的性能为 \(J(\pi_{base})\),且最优策略为 \(\pi^*\),那么残差策略 \(\pi_{res}\) 需要学习的"修正量"为:

\[\Delta a^*(s) = \pi^*(s) - \pi_{base}(s)\]

如果 \(\pi_{base}\) 已经接近最优(\(\|\Delta a^*\|\) 小),则残差策略的学习问题**比从零学习 \(\pi^*\) 更简单**——因为搜索空间更小,梯度信号更清晰。

直觉理解:假设你要学习打网球。方案 A 是从零开始学(端到端 RL);方案 B 是先教你基本站位和挥拍姿势(MPC 前馈),然后让你自己微调(RL 残差)。方案 B 明显更高效——你只需要学习细微的调整,而不是从握拍方式开始学。

这个理论为 RAMBO 提供了坚实的基础:SRB-MPC 是一个很好的"基础站位"(物理上合理的前馈力矩),RL 只需要学习"微调"(补偿模型误差)。

反事实推理:如果 \(\pi_{base}\) 很差(比如一个完全随机的基础策略),残差策略 \(\Delta a^*\) 的量级和 \(\pi^*\) 本身差不多——残差学习退化为从零学习,没有任何优势。这说明**基础策略的质量决定了残差方法的效率**。RAMBO 选择在线 MPC 而非固定 PD 作为基础策略,正是为了最大化这个优势。

练习 91.2a (⭐⭐): 对于以下场景,分析哪种范式最合适:(1) 工厂产线上的四足搬运(环境已知、安全要求高);(2) 户外四足探索(环境未知、计算资源有限);(3) 四足+臂的门开关操作(需要力控+行走)。

练习 91.2b (⭐⭐⭐): 从残差策略的理论出发,分析以下三种基础策略的残差学习效率:(a) 随机策略 \(\pi_{base}(s) \sim \mathcal{N}(0, I)\);(b) PD 站立控制器;(c) SRB-MPC。哪种的残差最小?哪种最容易学习?


91.3 RAMBO 核心方程:MPC 产生参考→RL 产生残差 ⭐⭐⭐

91.3.1 系统总方程

RAMBO (Cheng et al., 2025) 的核心架构包含三个模块的级联:

RAMBO 架构:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[1] 运动学参考生成器
    输入: 速度命令 v_cmd, 步态参数
    输出: 关节参考轨迹 q_ref, EE 参考 p_ee_ref

[2] 模型前馈 (QP)
    输入: q_ref, 当前状态 x, 接触信息
    输出: 前馈关节力矩 τ_ff

[3] RL 残差策略
    输入: 观测 o_t (含 q_ref, τ_ff, 本体感知)
    输出: 残差力矩 Δτ_rl

最终命令: τ = τ_ff + Δτ_rl + K_p(q_ref - q) + K_d(dq_ref - dq)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

完整的关节力矩命令为:

\[\boxed{\boldsymbol{\tau}_t = \underbrace{\boldsymbol{\tau}_{ff}^{QP}}_{\text{模型前馈}} + \underbrace{\Delta \boldsymbol{\tau}^{RL}}_{\text{RL 残差}} + \underbrace{\mathbf{K}_p(\mathbf{q}_{ref} - \mathbf{q}) + \mathbf{K}_d(\dot{\mathbf{q}}_{ref} - \dot{\mathbf{q}})}_{\text{PD 跟踪}}}\]

每一项的物理意义:

力矩分量 来源 物理含义 响应速度
\(\boldsymbol{\tau}_{ff}^{QP}\) QP 求解 克服重力、产生接触力 慢 (QP 求解 ~1ms)
\(\Delta \boldsymbol{\tau}^{RL}\) 神经网络推理 补偿模型误差 快 (~0.1ms)
\(\mathbf{K}_p(\mathbf{q}_{ref} - \mathbf{q})\) PD 控制 位置跟踪 最快 (无计算)
\(\mathbf{K}_d(\dot{\mathbf{q}}_{ref} - \dot{\mathbf{q}})\) PD 控制 速度阻尼 最快

91.3.2 残差约束:有界映射

RAMBO 中 RL 输出的原始残差 \(\Delta \boldsymbol{\tau}^{raw}\) 需要通过有界映射变成安全的残差:

\[\Delta \boldsymbol{\tau}^{safe} = \boldsymbol{\epsilon}_{max} \odot \tanh(\Delta \boldsymbol{\tau}^{raw})\]

其中 \(\boldsymbol{\epsilon}_{max} \in \mathbb{R}^{n_j}\) 是每个关节的最大允许残差,\(\odot\) 表示逐元素乘积,\(\tanh\) 保证输出在 \((-1, 1)\) 之间。

为什么用 \(\tanh\) 而不是 \(\text{clip}\)

映射方式 公式 梯度特性 训练表现
clip \(\text{clip}(\Delta\tau, -\epsilon, \epsilon)\) 边界处梯度为零(死区) 策略容易卡在边界
tanh \(\epsilon \cdot \tanh(\Delta\tau)\) 处处有非零梯度 平滑收敛
sigmoid \(2\epsilon \cdot \sigma(\Delta\tau) - \epsilon\) 梯度在中心最大 可行但不对称

\(\tanh\) 的关键优势是**梯度处处非零**。当 RL 训练时需要探索边界附近的残差值,clip 的零梯度会阻止梯度信号传回,策略无法学习如何在边界附近精细调节。\(\tanh\) 虽然在远离零点时梯度指数衰减,但始终非零,保证了学习信号的连续性。

91.3.3 \(\epsilon_{max}\) 的选择

残差约束的大小 \(\epsilon_{max}\) 是一个关键的设计参数。太大太小都有问题:

ε_max 过小:                   ε_max 过大:
━━━━━━━━━━━━━━                ━━━━━━━━━━━━━━
RL 几乎无法修正模型误差          RL 可能输出危险大残差
→ 系统表现接近纯 MPC            → 系统可能打滑、过热
→ 浪费了 RL 的潜力              → 安全保证弱化

合理范围: 模型误差的 1.5-2 倍
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

经验法则:先在仿真中运行纯 MPC,记录跟踪误差产生的等效力矩偏差 \(\boldsymbol{\tau}_{error}\)。设 \(\epsilon_{max} \approx 1.5 \cdot \text{std}(\boldsymbol{\tau}_{error})\)

⚠️ Pitfall: \(\epsilon_{max}\) 不应该所有关节都相同。髋关节(hip)承受体重,需要大的前馈力矩,其模型误差的绝对值也大;膝关节(knee)在支撑相也承受大力矩但运动范围小。应根据每个关节的物理特性分别设置。

练习 91.3a (⭐⭐): 推导当 \(\Delta\tau^{raw} \to \infty\) 时,\(\tanh\) 映射的最终残差值。如果某关节的标称力矩是 10Nm,\(\epsilon_{max} = 3\)Nm,RL 最大能补偿标称力矩的百分之几?

练习 91.3b (⭐⭐⭐): 设计一个实验来自动调节 \(\epsilon_{max}\)。基本思路:在仿真中训练纯 MPC,统计每个关节的力矩跟踪误差分布,用误差分布的某个分位数作为 \(\epsilon_{max}\)


91.4 MPC 层详解:简化模型选择与 QP 建模 ⭐⭐⭐

91.4.1 单刚体模型回顾

回顾足式/70 简化模型:SRB (Single Rigid Body) 模型把整个机器人视为一个质心处的刚体,忽略腿部质量和惯性。其运动方程为:

\[m \ddot{\mathbf{p}}_{com} = \sum_{i=1}^{n_c} \mathbf{f}_i + m\mathbf{g}\]
\[\mathbf{I} \dot{\boldsymbol{\omega}} + \boldsymbol{\omega} \times \mathbf{I}\boldsymbol{\omega} = \sum_{i=1}^{n_c} (\mathbf{r}_i - \mathbf{p}_{com}) \times \mathbf{f}_i\]

其中 \(m\) 是总质量,\(\mathbf{p}_{com}\) 是质心位置,\(\mathbf{f}_i\) 是第 \(i\) 个接触点的力,\(\mathbf{r}_i\) 是接触点位置,\(\mathbf{I}\) 是惯性张量,\(\boldsymbol{\omega}\) 是角速度。

在足式/70 中我们详细推导了这个模型——它把 \(6+12=18\) 自由度的四足机器人简化为 \(6\) 自由度的浮动刚体。这里我们把它用作 RAMBO 的 MPC 模型。

跨章回顾:回顾足式/70:SRB 模型之所以有效,是因为四足机器人的腿部被刻意设计为低惯量——电机放在髋部,通过连杆传动到膝关节和踝关节。这不是巧合,而是为了让 SRB 近似更准确而做的机械设计。如果腿部惯量不可忽略(如重型工业足式机器人),SRB 模型就不够了,需要 Centroidal 或全身动力学模型。

91.4.2 接触力 QP 的建模

RAMBO 的 MPC 层将 SRB 动力学转化为一个 QP,决策变量是**接触力** \(\boldsymbol{\lambda} = [\mathbf{f}_1^T, \mathbf{f}_2^T, \dots, \mathbf{f}_{n_c}^T]^T \in \mathbb{R}^{3n_c}\)

代价函数

\[\min_{\boldsymbol{\lambda}} \frac{1}{2} \| \mathbf{A}\boldsymbol{\lambda} - \mathbf{b}_{des} \|_{\mathbf{Q}}^2 + \frac{1}{2} \| \boldsymbol{\lambda} - \boldsymbol{\lambda}_{ref} \|_{\mathbf{R}}^2\]

第一项让接触力产生期望的质心加速度(跟踪参考),第二项正则化接触力分配(鼓励均匀分布)。

\(\mathbf{A}\) 矩阵的构建

从 SRB 运动方程,期望的质心加速度 \(\ddot{\mathbf{p}}_{des}\) 和角加速度 \(\dot{\boldsymbol{\omega}}_{des}\) 与接触力的关系为:

\[\underbrace{\begin{bmatrix} \frac{1}{m}\mathbf{I}_3 & \frac{1}{m}\mathbf{I}_3 & \cdots & \frac{1}{m}\mathbf{I}_3 \\ \mathbf{I}^{-1}[\mathbf{r}_1 - \mathbf{p}]_\times & \mathbf{I}^{-1}[\mathbf{r}_2 - \mathbf{p}]_\times & \cdots & \mathbf{I}^{-1}[\mathbf{r}_{n_c} - \mathbf{p}]_\times \end{bmatrix}}_{\mathbf{A} \in \mathbb{R}^{6 \times 3n_c}} \boldsymbol{\lambda} = \underbrace{\begin{bmatrix} \ddot{\mathbf{p}}_{des} - \mathbf{g} \\ \dot{\boldsymbol{\omega}}_{des} - \mathbf{I}^{-1}(\boldsymbol{\omega} \times \mathbf{I}\boldsymbol{\omega}) \end{bmatrix}}_{\mathbf{b}_{des} \in \mathbb{R}^6}\]

其中 \([\cdot]_\times\) 表示反对称矩阵(叉积矩阵)。

约束

\[\text{摩擦锥:} \quad |f_{x,i}| \leq \mu f_{z,i}, \quad |f_{y,i}| \leq \mu f_{z,i} \quad \text{(线性化)}$$ $$\text{法向力:} \quad 0 \leq f_{z,i} \leq f_{z,max}$$ $$\text{接触模式:} \quad f_{z,i} = 0 \text{ if leg } i \text{ in swing}\]

线性化的摩擦锥约束把圆锥 \(\|f_{xy}\| \leq \mu f_z\) 近似为四棱锥,形成线性不等式约束 \(\mathbf{C}\boldsymbol{\lambda} \leq \mathbf{d}\)

⚠️ Pitfall: 初学者常忘记"接触模式"约束。当腿处于摆动相(swing phase)时,对应的接触力必须为零——因为脚不在地上,不可能产生接触力。如果忘记添加这个约束,QP 可能给摆动腿分配非零接触力,MPC 产生的前馈力矩会在摆动腿上产生错误的扭矩。

91.4.3 从接触力到关节力矩

QP 求解得到最优接触力 \(\boldsymbol{\lambda}^*\) 后,需要映射回关节空间的前馈力矩:

\[\boldsymbol{\tau}_{ff} = \mathbf{J}_c^T \boldsymbol{\lambda}^*\]

其中 \(\mathbf{J}_c\) 是接触 Jacobian——把关节速度映射到接触点速度。其转置 \(\mathbf{J}_c^T\) 把接触力映射回关节力矩(虚功原理)。

在 RAMBO 中,Jacobian 的计算使用简化的关节运动学。对于典型的 3-DoF 腿(hip-abduction, hip-flexion, knee),\(\mathbf{J}_c\)\(3 \times 3\) 矩阵,解析形式已知。

91.4.4 QP 求解器选择

RAMBO 在不同场景使用不同的 QP 求解器:

求解器 环境 优势 劣势
qpth 训练 (GPU) 可微分,支持批量 QP 单个慢
OSQP 部署 (CPU) 快速 (~0.3ms), 稳定 不可微分

训练时用 qpth 的关键原因是**可微分**:梯度可以穿过 QP 求解过程反向传播到 RL 策略。这让 RL 可以学习如何与 MPC"协调"——比如学习什么时候 MPC 的前馈足够好(不需要大残差),什么时候模型误差大(需要大残差)。

部署时切换到 OSQP 是因为速度:OSQP 是高度优化的 C++ 求解器,单个 QP 的求解时间约 0.3ms,而 qpth 的单个 QP 需要 1-5ms。

反事实推理:如果不用可微分 QP 训练会怎样?可以把 QP 当作黑盒——输入状态,输出前馈力矩,RL 只学习残差。这也是可行的(很多早期工作这样做),但 RL 需要更多样本来学会什么时候应该补偿、补偿多少。可微分 QP 让梯度信息从 MPC 的最优性条件流回 RL,相当于告诉 RL:"这个状态下 MPC 的主要误差来自摩擦估计,你应该主要补偿水平力分量"。

91.4.5 QP 的对偶解释与物理意义

QP 的 KKT 条件不仅给出最优接触力,还给出有价值的**对偶变量**(拉格朗日乘子)。理解对偶变量的物理意义有助于调试和分析。

QP 的 Lagrangian:

\[\mathcal{L}(\boldsymbol{\lambda}, \boldsymbol{\nu}, \boldsymbol{\mu}) = \frac{1}{2}\|\mathbf{A}\boldsymbol{\lambda} - \mathbf{b}\|_Q^2 + \frac{1}{2}\|\boldsymbol{\lambda}\|_R^2 + \boldsymbol{\mu}^T(\mathbf{C}\boldsymbol{\lambda} - \mathbf{d})\]

KKT 条件:

\[\nabla_\lambda \mathcal{L} = \mathbf{A}^T\mathbf{Q}(\mathbf{A}\boldsymbol{\lambda}^* - \mathbf{b}) + \mathbf{R}\boldsymbol{\lambda}^* + \mathbf{C}^T\boldsymbol{\mu}^* = 0 \quad \text{(stationarity)}$$ $$\mu_i^* \geq 0, \quad C_i\boldsymbol{\lambda}^* \leq d_i, \quad \mu_i^*(C_i\boldsymbol{\lambda}^* - d_i) = 0 \quad \text{(complementarity)}\]

对偶变量 \(\mu_i^*\) 的物理意义:它衡量第 \(i\) 个约束对最优代价的"紧迫程度"。

\(\mu_i^*\) 的值 含义 工程解读
\(\mu_i^* = 0\) 约束非活跃(有裕度) 该约束不影响最优解
\(\mu_i^* > 0\) 小值 约束轻微活跃 约束略微限制了最优性
\(\mu_i^*\) 大值 约束强活跃 约束严重限制了性能

💡 Insight: 如果某条腿的摩擦锥约束的对偶变量持续很大,说明该腿接近打滑——MPC 想施加更大的水平力但被摩擦锥约束阻止了。这是一个**预警信号**:真机上的摩擦系数可能比假设的低,RL 的残差应该学会减小该方向的力。

91.4.6 摩擦锥的线性化细节

真实的摩擦锥约束是一个二阶锥 (SOC):

\[\sqrt{f_x^2 + f_y^2} \leq \mu f_z\]

直接处理 SOC 约束需要 SOCP 求解器(如 ECOS, SCS),计算更慢。RAMBO 使用多面体近似(线性化),用 \(n_{fc}\) 条线性不等式近似圆锥:

\[\cos(\frac{2\pi k}{n_{fc}}) f_x + \sin(\frac{2\pi k}{n_{fc}}) f_y \leq \mu f_z, \quad k = 0, 1, \dots, n_{fc}-1\]

\(n_{fc} = 4\) 时是四棱锥(最常用),\(n_{fc} = 8\) 时是八棱锥(更精确但约束更多)。

摩擦锥线性化:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
真实圆锥 (SOC):        四棱锥近似 (n=4):

     fy                      fy
     ▲                       ▲
    / \                     /|\
   / ○ \                   / | \
  /  ↑  \                /  |  \
 / μf_z  \              / μf_z  \
─────●─────→ fx        ──────●──────→ fx
     fz                      fz

面积比: 正方形/圆 = 2/π ≈ 0.637
→ 四棱锥的可用力区域约为圆锥的 64%
→ 偏保守, 但保证安全
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

反事实推理:如果不做线性化,直接使用 SOCP,QP 变成了 SOCP。SOCP 的求解时间约 2-5ms(使用 ECOS),是线性 QP (OSQP, 0.3ms) 的 10 倍。在 100Hz 的控制周期中,SOCP 仍然可行但裕度大幅减少。RAMBO 选择线性化是速度和精度的折中——四棱锥虽然损失了 36% 的可用力区域,但保证了求解速度在 0.3ms 以内。

练习 91.4a (⭐⭐): 对于一个四足站立(4 条腿接地),写出 \(\mathbf{A}\) 矩阵的维度,列出所有约束的数量,计算 QP 的总决策变量和约束数。

练习 91.4b (⭐⭐⭐): 实现一个简化的 SRB-QP:假设四足机器人在平地上站立,质量 12kg,期望质心高度恒定。用 OSQP 求解最优接触力分配,验证四条腿各分担约 \(mg/4 = 29.4\)N 的法向力。


91.5 RL 层详解:残差策略的观测/动作/奖励设计 ⭐⭐⭐

91.5.1 观测空间

RAMBO 的 RL 策略接收的观测包含三类信息:

RL 策略观测 o_t ∈ R^{d_obs}:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[本体感知]
  关节角度偏差     q - q_ref ∈ R^{12}
  关节角速度       dq ∈ R^{12}
  基座角速度       ω_body ∈ R^3
  重力方向投影     projected_gravity ∈ R^3

[运动学参考]
  关节参考位置     q_ref ∈ R^{12}
  步态相位         phase ∈ R^4 (每腿一个)
  接触状态         contact ∈ {0,1}^4

[MPC 前馈]
  前馈力矩         τ_ff ∈ R^{12}
  (可选) 接触力    λ ∈ R^{12}

[命令]
  速度命令         v_cmd ∈ R^3

[历史]
  上一步动作       a_{t-1} ∈ R^{12}

总维度: 约 70-90 维
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

关键设计决策:观测中包含了 MPC 的前馈力矩 \(\tau_{ff}\)。这让 RL 策略能"看到" MPC 认为应该施加的力矩,从而学会在 MPC 不够准确的地方补偿。如果不提供 \(\tau_{ff}\),RL 需要自己重新"发现" MPC 已经做对的部分——浪费学习容量。

跨领域类比:这类似于编程中的"增量编码"思想。不要让 RL 从零学习完整的控制策略,而是只学习"与 MPC 的差异"。就像 Git 存储文件的 diff 而不是完整文件——diff 通常比完整文件小得多,更容易处理。

91.5.2 动作空间

RL 策略的动作是**残差力矩** \(\Delta\boldsymbol{\tau}^{raw} \in \mathbb{R}^{n_j}\),经过 \(\tanh\) 映射后得到安全残差:

\[\Delta\boldsymbol{\tau}^{safe} = \boldsymbol{\epsilon}_{max} \odot \tanh(\Delta\boldsymbol{\tau}^{raw})\]

在 RAMBO 中,对于四足机器人(12 关节)加上 EE 控制,动作维度约为 12-18 维。

91.5.3 奖励函数设计

RAMBO 的奖励函数需要同时驱动行走稳定性和操作精度:

\[r_t = \underbrace{r_{track}}_{\text{跟踪}} + \underbrace{r_{stable}}_{\text{稳定}} + \underbrace{r_{smooth}}_{\text{平滑}} + \underbrace{r_{residual}}_{\text{残差正则}}\]

各分项设计:

奖励分项 公式 含义
速度跟踪 \(r_{vel} = \exp(-\|v_{cmd} - v_{body}\|^2 / \sigma_v^2)\) 跟踪行走速度命令
EE 位置跟踪 \(r_{ee} = \exp(-\|p_{ee} - p_{ee}^{des}\|^2 / \sigma_p^2)\) 末端到达目标
基座高度 $r_{h} = - h - h_{nom}
姿态稳定 \(r_{ori} = -\|\theta_{roll,pitch}\|^2\) 身体保持水平
动作平滑 \(r_{sm} = -\|a_t - a_{t-1}\|^2\) 减少力矩跳变
残差大小 \(r_{res} = -\|\Delta\tau^{safe}\|^2\) 鼓励小残差(倾向信任 MPC)
接触力 \(r_{cf} = -\sum_i \max(0, \|f_{xy,i}\| - \mu f_{z,i})\) 惩罚打滑

残差正则项 \(r_{res}\) 是 RAMBO 特有的设计。它鼓励 RL 只在必要时才输出大的残差——如果 MPC 的前馈已经足够好,RL 应该输出接近零的残差。这有两个好处: 1. 减少 RL 对 MPC 的"干扰"——MPC 做对的部分不被 RL 破坏 2. 在 RL 训练早期(策略还不好时),小残差比大残差更安全

⚠️ Pitfall: 残差正则的权重需要仔细调节。如果 \(w_{res}\) 太大,RL 什么都不做(残差总是零),系统退化为纯 MPC。如果 \(w_{res}\) 太小,RL 可能学到大的残差来"覆盖" MPC 的输出,系统退化为纯 RL。典型的经验是:\(w_{res}\) 使得在训练收敛后,残差的 L2 范数约为前馈力矩 L2 范数的 10-30%。

91.5.4 PPO 训练的超参数细节

RAMBO 使用 PPO (Proximal Policy Optimization) 训练残差策略。以下是关键超参数及其影响:

超参数 推荐值 影响 调参方向
clip 参数 \(\epsilon\) 0.2 限制策略更新步长 太大→不稳定, 太小→收敛慢
学习率 3e-4 梯度步长 余弦退火, 从 3e-4 到 1e-5
Batch size 48 × 2048 环境 梯度噪声 越大越稳定但显存需求大
GAE \(\lambda\) 0.95 偏差-方差平衡 小→偏向低方差, 大→偏向低偏差
折扣因子 \(\gamma\) 0.99 长短期权衡 操作任务可用 0.995 (更长期)
价值函数系数 0.5 价值网络学习速度 太大可能导致策略不稳定
熵正则化系数 0.01→0.001 探索 vs 利用 训练初期大, 后期退火
Mini-batch 数 4 每次数据重用次数 太多→过拟合当前数据

**熵退火(entropy annealing)**对残差策略特别重要。训练初期,RL 需要大量探索来发现 MPC 误差的模式;训练后期,RL 应该输出精确的补偿而非随机探索。通过逐步降低熵系数,可以实现从"广泛探索"到"精确补偿"的平滑过渡。

⚠️ Pitfall: 初学者常设置过大的折扣因子 \(\gamma = 0.999\)。对于 100Hz 的控制频率,这意味着有效的规划视野约 \(\frac{1}{1-\gamma} = 1000\) 步 = 10 秒。在行走任务中,10 秒的规划视野意味着 RL 会考虑 20 步之后的行走效果——这可能导致策略过于保守(为了远期稳定而牺牲近期性能)。对于操作任务,\(\gamma = 0.99\)(有效视野 1 秒)通常足够。

91.5.5 训练框架:Isaac Lab 中的混合训练

RAMBO 在 Isaac Lab 中训练,利用 GPU 并行模拟数千个环境。训练管线的关键步骤:

训练管线:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Step 1: 环境初始化
  → 在 Isaac Lab 中创建 2048-4096 个并行环境
  → 每个环境包含一个四足机器人 + (可选) 操作对象

Step 2: 运动学参考生成
  → 使用 Raibert 落脚点公式 + 插值生成步态参考
  → 速度命令从均匀分布采样

Step 3: QP 前馈计算 (qpth, GPU 批量)
  → 对所有环境并行求解 QP
  → 输出前馈力矩 τ_ff

Step 4: RL 策略推理
  → 网络推理: o_t → Δτ_raw
  → tanh 映射: Δτ_raw → Δτ_safe

Step 5: 应用力矩
  → τ = τ_ff + Δτ_safe + PD
  → 仿真一步

Step 6: PPO 更新
  → 收集经验: (o, a, r, o')
  → 估计优势函数 A(s, a)
  → clip 更新策略和价值网络

Step 7: Domain Randomization
  → 每 episode 随机化: 质量、摩擦、延迟、PD 增益
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

练习 91.5a (⭐⭐): 在上述奖励函数中,如果删除残差正则项 \(r_{res}\),预测训练会发生什么变化。提示:考虑 RL 策略在训练早期(还很差时)和后期(已经收敛时)的行为差异。

练习 91.5b (⭐⭐⭐): 设计一个课程学习(curriculum learning)方案来训练 RAMBO:从简单任务(平地站立)逐步增加到复杂任务(不平地面+负载行走+EE 跟踪)。定义每个阶段的切换条件。


91.6 稳定性分析:混合系统的安全保证 ⭐⭐⭐⭐

91.6.1 为什么需要稳定性分析?

RL 策略是一个黑盒——我们无法从它的权重中读出它"理解"了什么物理约束。即使在训练中表现良好,部署到真实世界中新的状态分布下,RL 可能产生不合理的输出。稳定性分析的目标是:即使 RL 输出最坏情况的残差,整个系统仍然不会崩溃。

91.6.2 有界残差的安全论证

RAMBO 的安全保证来自残差的有界性。设系统的闭环动力学为:

\[\dot{\mathbf{x}} = f(\mathbf{x}) + g(\mathbf{x})(\boldsymbol{\tau}_{ff} + \Delta\boldsymbol{\tau})\]

如果 MPC 的前馈 \(\boldsymbol{\tau}_{ff}\) 使得系统在 Lyapunov 意义下稳定(即存在 \(V(\mathbf{x})\) 使得 \(\dot{V} < 0\)\(\Delta\boldsymbol{\tau} = 0\)),那么在残差有界的条件下:

\[\dot{V}(\mathbf{x}) = \dot{V}\big|_{\Delta\tau=0} + \frac{\partial V}{\partial \mathbf{x}} g(\mathbf{x}) \Delta\boldsymbol{\tau}\]
\[\leq \dot{V}\big|_{\Delta\tau=0} + \left\|\frac{\partial V}{\partial \mathbf{x}} g(\mathbf{x})\right\| \cdot \|\boldsymbol{\epsilon}_{max}\|\]

如果 \(\|\boldsymbol{\epsilon}_{max}\|\) 足够小,使得第二项不超过第一项的绝对值,则 \(\dot{V} < 0\) 仍然成立。

直觉:MPC 把系统推向稳定平衡点(\(\dot{V} < 0\) 项),RL 的残差像是一个有界的扰动。只要扰动不超过 MPC 的"稳定裕度",系统就保持稳定。\(\epsilon_{max}\) 的选择本质上是在"给 RL 更大的补偿能力"和"保持更大的稳定裕度"之间取平衡。

本质洞察:有界残差的安全论证是一个**最坏情况分析**——它不依赖于 RL 策略的具体行为,只依赖于残差的上界。即使 RL 策略完全疯了(输出的 \(\Delta\tau^{raw} \to \infty\)),\(\tanh\) 映射保证了实际残差被限制在 \(\epsilon_{max}\) 之内。这种"不信任 RL 但限制它的权限"的设计哲学是 RAMBO 安全性的根基。

91.6.3 Active Set 切换与梯度不连续性

可微分 QP 训练中有一个微妙的问题:当 QP 的 active set(活跃约束集合)发生切换时,QP 解对参数的梯度是不连续的。

考虑一个简单例子:

\[\min_x x^2, \quad \text{s.t.} \quad x \geq a\]

\(a < 0\) 时,解 \(x^* = 0\)\(\frac{dx^*}{da} = 0\);当 \(a > 0\) 时,解 \(x^* = a\)\(\frac{dx^*}{da} = 1\)。在 \(a = 0\) 处,梯度从 0 跳变到 1——不连续。

在 RAMBO 的 QP 中,当机器人从四足站立变为三足站立(一条腿抬起)时,接触约束的 active set 发生变化——摆动腿的"法向力 = 0"约束从非活跃变为活跃。这个切换导致 \(\frac{\partial \tau_{ff}}{\partial \text{state}}\) 的跳变,进而导致 RL 训练时的梯度震荡。

工程缓解方法

方法 原理 效果
正则化 QP \(\mathbf{H}\) 对角线加小量 \(\epsilon \mathbf{I}\) 减少约束切换频率
松弛变量 把硬约束 \(f_z = 0\) 变为 \(f_z \leq \delta\) 避免精确零的不连续性
停止梯度 \(\tau_{ff}\) 做 stop-gradient RL 不通过 QP 反传
梯度裁剪 限制反传梯度的范数 防止大梯度破坏训练

⚠️ Pitfall: 使用停止梯度(stop-gradient)是最简单的缓解方法——RL 把 \(\tau_{ff}\) 当作固定输入,不通过 QP 反传。但这意味着 RL 无法学习"如何与 MPC 协调",只能学习"在 MPC 给定的前馈之上做什么修正"。是否使用停止梯度取决于系统的主要误差源:如果模型误差主要是系统性的(如质量偏差),stop-gradient 够用;如果模型误差是状态依赖的(如不同地形的摩擦),可微分 QP 更好。

91.6.4 ISS (Input-to-State Stability) 视角

更严格的稳定性分析可以使用 ISS (Input-to-State Stability) 框架。ISS 的核心思想是:如果系统在无扰动时稳定,那么有界扰动下系统的状态也是有界的。

ISS 定义:系统 \(\dot{\mathbf{x}} = f(\mathbf{x}, \mathbf{d})\)(其中 \(\mathbf{d}\) 是有界扰动)是 ISS 的,如果存在 \(\beta\)-函数和 \(\gamma\)-函数使得:

\[\|\mathbf{x}(t)\| \leq \beta(\|\mathbf{x}(0)\|, t) + \gamma(\sup_{0 \leq s \leq t} \|\mathbf{d}(s)\|)\]

第一项随时间衰减(系统趋于稳定),第二项与扰动大小成正比(扰动越大,偏差越大)。

在 RAMBO 中,\(\mathbf{d} = \Delta\boldsymbol{\tau}^{safe}\) 是 RL 的残差力矩,其范数上界为 \(\|\boldsymbol{\epsilon}_{max}\|\)。如果 MPC 使系统 ISS,那么 RAMBO 的状态偏差上界为:

\[\|\mathbf{x}_{eq} - \mathbf{x}(t)\| \leq \gamma(\|\boldsymbol{\epsilon}_{max}\|)\]

工程意义\(\gamma\) 函数告诉我们"允许 RL 最大残差 \(\epsilon_{max}\) 后,系统状态最多偏离平衡点多远"。如果 \(\gamma\) 是线性的(\(\gamma(r) = kr\)),那么 \(\epsilon_{max}\) 翻倍意味着状态偏差翻倍——设计者可以直接从安全约束反推 \(\epsilon_{max}\) 的上界。

💡 Insight: ISS 分析给出的是**最坏情况保证**——无论 RL 策略在 \(\epsilon_{max}\) 范围内做什么,系统状态都不会超过某个界限。这是一种"安全信封(safety envelope)"的概念——RL 可以在信封内自由探索,但永远不会突破信封。

91.6.5 混合系统的稳定性与性能的 Trade-off

稳定性和性能(操作精度、行走速度)之间存在根本性的 trade-off:

Trade-off 图:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
性能 ▲
     │           ★ ε_max = 大
     │         ★ RAMBO (ε_max 适中)
     │       ★
     │     ★
     │   ★ ε_max = 小
     │ ★ 纯 MPC (ε_max = 0)
     └──────────────────────→ 安全裕度 (稳定性)

增大 ε_max: RL 能力更强 → 性能提升
           但安全裕度减小 → 稳定性风险

最优 ε_max: 在性能和安全之间取平衡
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

练习 91.6a (⭐⭐⭐): 对于一个简化的 1D 弹簧-质量-阻尼系统 \(m\ddot{x} + b\dot{x} + kx = u_{ff} + \Delta u\),其中 \(u_{ff}\) 来自 LQR 设计,\(\Delta u\)\(|\Delta u| \leq \epsilon\) 限制。推导使系统仍然 Lyapunov 稳定的 \(\epsilon\) 的最大允许值。

练习 91.6b (⭐⭐⭐⭐): 对同一系统,推导 ISS 增益函数 \(\gamma(\epsilon)\)。验证当 \(\epsilon \to 0\)\(\gamma \to 0\)(退化为无扰动稳定性)。


91.7 案例对比:RAMBO vs DreamWaQ vs 其他方法 ⭐⭐⭐

91.7.1 对比框架

为了理解 RAMBO 的定位,需要将它与其他主流方法进行系统对比。

方法 类型 MPC 在线? 操作能力 地形鲁棒 安全保证
RAMBO 混合(残差) 是(QP) 强(EE跟踪) 强(有界残差)
DreamWaQ 纯 RL 强(隐式地形估计)
OCS2 MPC 纯 MPC 是(SQP) 中(需建模) 强(约束)
Walk-These-Ways RL+参数化
Deep-WBC RL(层级)

91.7.2 RAMBO vs DreamWaQ

DreamWaQ (Nahrendra et al., ICRA 2023) 是纯 RL 的四足行走方法,通过隐式地形想象实现鲁棒行走。

架构对比:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
RAMBO:                    DreamWaQ:
  速度命令                   速度命令
     │                        │
  运动学参考                  RL 策略 (单个)
     │                        │
  QP → τ_ff                  关节 PD 目标
  RL → Δτ                       │
     │                        PD 控制
  τ = τ_ff + Δτ + PD            │
     │                        关节力矩
  关节力矩
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

RAMBO 优势: 物理约束显式处理, 可解释的前馈
DreamWaQ 优势: 更简单, 训练更快, 地形泛化强

核心差异的根源:DreamWaQ 只做行走,不做操作——它的全部奖励都花在行走稳定性上。RAMBO 需要同时做行走和操作(loco-manipulation),MPC 前馈分担了行走的负担,让 RL 可以把更多学习容量分配给操作任务。

反事实推理:如果让 DreamWaQ 同时学走路和操作(在奖励中加入 EE 跟踪项),它能达到 RAMBO 的操作精度吗?根据 RAMBO 论文的消融实验,去掉 MPC 前馈后的纯 RL 基线在 EE 跟踪精度上显著下降。原因是:没有前馈力矩提供的"重力补偿"和"接触力基础",RL 需要从零学习这些物理量,而这些物理量恰好是 MPC 用解析模型就能很好计算的。

91.7.3 RAMBO vs OCS2

OCS2 (Farbod Farshidian et al.) 是纯 MPC 的工业级框架,使用 SQP 或 DDP 求解。

维度 RAMBO OCS2
模型精度 SRB (简单) + RL 补偿 Centroidal 或全身 (精确)
求解速度 QP ~0.3ms SQP ~5-10ms
Sim2Real Gap RL 弥补 需要系统辨识
操作任务 RL 处理未建模交互 需要为每种交互建模
调参难度 奖励工程 代价函数调参

91.7.4 何时选择哪种方法?

选择决策树:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
任务需要操作(loco-manipulation)?
  ├── 否 → 只需行走?
  │   ├── 地形复杂? → DreamWaQ / 纯 RL
  │   └── 需要安全保证? → OCS2 / 纯 MPC
  └── 是 → 操作需要精确力控?
      ├── 是 → RAMBO (MPC 提供力基线)
      └── 否 → 操作需要视觉?
          ├── 是 → UMI-on-Legs (Diffusion Policy)
          └── 否 → Deep-WBC (层级 RL)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

91.7.5 定量性能对比

基于 RAMBO 论文的实验结果和相关工作的数据,定量比较各方法:

指标 RAMBO 纯 MPC 基线 纯 RL 基线 改善
EE 位置误差 (cm) ~2.5 ~5.8 ~4.2 57% vs MPC, 40% vs RL
平地行走速度 (m/s) 0.5 0.4 0.5 与 RL 持平, 优于 MPC
推购物车成功率 >90% ~60% ~75% 显著优于两个基线
双足行走稳定性 与 RL 相当
QP 求解时间 0.3ms 0.3ms N/A 不增加开销
总控制延迟 ~2.6ms ~1.5ms ~0.5ms 仍远低于 10ms 周期

关键观察:RAMBO 在几乎所有维度上都优于单独使用 MPC 或 RL。唯一的"代价"是总控制延迟略高于纯 RL(因为需要额外的 QP 求解),但这个增加的延迟(~2ms)远在安全裕度之内。

91.7.6 RAMBO 与其他残差方法的微妙差异

并非所有"MPC + 残差 RL"方法都相同。RAMBO 与其他残差方法的关键差异在于**QP 在训练循环中的角色**:

方法 A (简单残差): 训练时 MPC 是黑盒
  MPC → τ_ff (stop gradient) → RL 学 Δτ
  → RL 不知道 MPC 为什么给出这个 τ_ff
  → 需要更多样本来学会补偿

方法 B (RAMBO): 训练时 QP 是可微的
  state → qpth(QP) → τ_ff (gradient flows) → RL 学 Δτ
  → 梯度从 RL 穿过 QP 回到状态
  → RL 可以间接学习 MPC 的误差结构

方法 C (端到端): 训练时 MPC 参数也被优化
  state → RL → QP 参数 → qpth(QP) → τ_ff → 仿真
  → RL 同时学习残差和 QP 参数
  → 最灵活但最难训练

RAMBO 选择了方法 B——可微 QP 允许梯度流过,但 QP 的参数(模型质量、摩擦系数等)是固定的。这是一个实用的折中。

练习 91.7a (⭐⭐): 分析 RAMBO 论文中的"推购物车"任务。如果用纯 MPC 做这个任务,需要建立哪些交互模型?列出至少 5 个需要辨识的参数。

练习 91.7b (⭐⭐⭐): 设计一个实验比较"方法 A (stop-gradient)"和"方法 B (可微 QP)"在同一任务上的训练效率差异。预测哪种方法收敛更快,并解释原因。


91.8 工程集成:ROS2 部署与实时性 ⭐⭐

91.8.1 部署架构

RAMBO 在真机上的部署需要满足严格的实时性要求:

部署架构 (Unitree Go2):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌───────────────────────────────────────────────┐
│  Jetson Orin NX (机载计算)                      │
│                                                │
│  ┌──────────────┐  ┌──────────────┐            │
│  │ ROS2 节点:    │  │ ROS2 节点:    │            │
│  │ 状态估计      │  │ 运动学参考    │            │
│  │ (100Hz)      │  │ (100Hz)      │            │
│  └──────┬───────┘  └──────┬───────┘            │
│         │                 │                    │
│  ┌──────▼─────────────────▼──────┐             │
│  │ QP 求解器 (OSQP)               │             │
│  │ 输入: 状态 + 参考 + 接触        │             │
│  │ 输出: τ_ff                     │             │
│  │ 周期: 100Hz, 耗时 ~0.3ms       │             │
│  └──────────────┬────────────────┘             │
│                 │                              │
│  ┌──────────────▼────────────────┐             │
│  │ RL 策略推理 (PyTorch/ONNX)     │             │
│  │ 输入: 观测 (含 τ_ff)           │             │
│  │ 输出: Δτ_rl                   │             │
│  │ 周期: 100Hz, 耗时 ~0.1ms      │             │
│  └──────────────┬────────────────┘             │
│                 │                              │
│  ┌──────────────▼────────────────┐             │
│  │ 力矩合成 + PD                  │             │
│  │ τ = τ_ff + Δτ_rl + PD         │             │
│  │ → 发送到电机                   │             │
│  └───────────────────────────────┘             │
└───────────────────────────────────────────────┘

91.8.2 实时性要求

100Hz 的控制频率意味着每个周期只有 10ms。整个管线的时间预算:

步骤 预算 实测 裕度
状态估计 1ms 0.5ms 充足
运动学参考 0.5ms 0.2ms 充足
QP 求解 3ms 0.3ms 充足
RL 推理 2ms 0.1ms 充足
力矩合成+通信 3ms 1.5ms 充足
总计 10ms ~2.6ms 充足

RAMBO 的一个工程优势是:每个模块的计算时间都远小于周期要求,留出了大量裕度用于异常处理。

91.8.3 模型部署:从 PyTorch 到 ONNX

训练时使用 PyTorch,部署时通常转换为 ONNX 或 TensorRT 以获得更稳定的推理延迟:

# 模型导出示例
import torch

# 训练好的策略网络
policy = PolicyNetwork(obs_dim=78, act_dim=12)
policy.load_state_dict(torch.load("policy_best.pt"))
policy.eval()

# 导出为 ONNX
dummy_input = torch.randn(1, 78)
torch.onnx.export(
    policy, dummy_input, "policy.onnx",
    input_names=['observation'],
    output_names=['action'],
    dynamic_axes={'observation': {0: 'batch'}, 'action': {0: 'batch'}}
)

# 部署时使用 ONNX Runtime
import onnxruntime as ort
session = ort.InferenceSession("policy.onnx")

⚠️ Pitfall: PyTorch 模型转 ONNX 时,如果网络中有 torch.tanh 操作,需要确认 ONNX 的 tanh 实现与 PyTorch 的数值精度一致。在 float16 精度下,tanh 在输入 >4 时可能有 \(10^{-3}\) 量级的差异,这会导致残差力矩有约 0.003 × \(\epsilon_{max}\) 的偏差。对于 \(\epsilon_{max} = 5\)Nm,这是 0.015Nm——通常可以忽略,但在安全关键场景中应验证。

91.8.4 ONNX Runtime vs TensorRT 的部署选择

部署 RL 策略时有两个主流推理框架:

维度 ONNX Runtime TensorRT
延迟 (小网络 50K params) ~0.1ms ~0.05ms
延迟确定性 好 (抖动 <0.05ms) 最好 (抖动 <0.02ms)
首次推理 快 (<100ms) 慢 (编译需 30s+)
精度 FP32 / FP16 FP32 / FP16 / INT8
兼容性 广泛 仅 NVIDIA GPU
部署复杂度 高 (需要 TRT 工具链)

对于 RAMBO 这样参数量很小的策略网络(~50K),两者的延迟差异不大(0.1ms vs 0.05ms),ONNX Runtime 的简单部署更有吸引力。但如果策略网络更大(如包含视觉编码器的 VBC 策略,~10M 参数),TensorRT 的加速效果更显著。

91.8.5 实时线程的优先级设置

在 Linux 上部署实时控制系统时,线程优先级设置至关重要:

线程优先级设置:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
优先级 (高→低):
  99: 关节力矩发送 (硬实时, SCHED_FIFO)
  90: QP 求解 + RL 推理 (软实时, SCHED_FIFO)
  80: 状态估计 (软实时, SCHED_FIFO)
  50: 日志记录 (非实时, SCHED_RR)
  0:  可视化/调试 (后台, SCHED_OTHER)

关键配置:
  - 隔离 CPU 核心 (isolcpus=2,3) 给控制线程
  - 禁用控制核心的频率调节 (cpufreq governor = performance)
  - 使用 CLOCK_MONOTONIC 做时间戳
  - 使用 mlockall() 防止内存页换出
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

⚠️ Pitfall: 不设置实时优先级的后果:Linux 默认的 CFS 调度器可能在控制周期中间调度其他进程(如 ROS2 的话题发布、日志写入),导致控制延迟从正常的 2ms 突然跳到 20-50ms。这个"延迟毛刺"在稳态行走中可能不致命(PD 控制在一个周期内还能撑住),但在接触切换瞬间(如摆动腿着地)可能导致冲击力失控。

91.8.6 安全监控与紧急停止

部署混合控制器时必须有多层安全机制:

安全层 触发条件 响应动作 延迟要求
软件看门狗 控制循环超时 >15ms 保持上一周期力矩 <1ms
力矩限幅 \(\|\tau_i\| > \tau_{max}\) 裁剪到 \(\tau_{max}\) <0.1ms
姿态保护 基座倾斜 >30° 松弛所有关节 <5ms
温度保护 电机温度 >80°C 逐步降低力矩上限 <100ms
E-stop 按钮 操作员按下 立即断电 硬件级

练习 91.8a (⭐⭐): 画出 RAMBO 在 ROS2 中的节点图(node graph),包括话题(topic)名称、消息类型和频率。至少包含 6 个节点。

练习 91.8b (⭐⭐⭐): 实现一个软件看门狗:如果控制循环的某次执行超过 15ms,自动切换到"安全模式"(保持上一周期力矩 + 打印警告)。用 CLOCK_MONOTONIC 计时。


91.9 前沿:可微 MPC + RL 端到端训练 ⭐⭐⭐⭐

91.9.1 当前 RAMBO 的局限

RAMBO 使用的是"MPC 和 RL 分别设计、共同部署"的方案。MPC 的代价函数和约束是人工设计的,RL 的奖励函数也是人工设计的。两者之间的协调靠人工调参。

一个自然的问题是:能否让 MPC 和 RL 端到端联合训练?

91.9.2 可微 MPC 的概念

如果 MPC 的求解过程是可微分的(即可以对 MPC 的参数求梯度),那么就可以把 MPC 作为 RL 管线中的一个"可微层",让整个系统端到端训练。

端到端训练:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
观测 o_t → [RL 策略] → MPC 参数 (代价权重, 约束松弛)
                          [可微 MPC 层]
                          τ_ff (可微分!)
                          τ = τ_ff + Δτ_rl
                          [仿真器 (可微?)]
                          奖励 r_t
                          ← 反向传播 ←
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

91.9.3 KKT 隐函数定理的推导

可微 QP 的核心数学工具是**隐函数定理**应用在 KKT 条件上。

对于标准 QP:\(\min_z \frac{1}{2}z^THz + g^Tz\),s.t. \(Az = b\), \(Gz \leq h\)

其 KKT 条件为:

\[F(z^*, \nu^*, \mu^*, \theta) = \begin{bmatrix} Hz^* + g + A^T\nu^* + G^T\mu^* \\ Az^* - b \\ \text{diag}(\mu^*)(Gz^* - h) \end{bmatrix} = 0\]

其中 \(\theta\) 是 QP 的参数(如 \(H, g, A, b\) 等),\((z^*, \nu^*, \mu^*)\) 是最优原始-对偶解。

由隐函数定理,如果 \(F\)\((z, \nu, \mu)\) 的 Jacobian \(\frac{\partial F}{\partial (z, \nu, \mu)}\) 在最优解处非奇异,则:

\[\frac{dz^*}{d\theta} = -\left(\frac{\partial F}{\partial (z, \nu, \mu)}\right)^{-1} \frac{\partial F}{\partial \theta}\]

展开 Jacobian:

\[\frac{\partial F}{\partial (z, \nu, \mu)} = \begin{bmatrix} H & A^T & G^T \\ A & 0 & 0 \\ \text{diag}(\mu^*)G & 0 & \text{diag}(Gz^* - h) \end{bmatrix}\]

为什么 active set 切换导致不连续? 当某个不等式约束从非活跃变为活跃时,对应的 \(\mu_i^*\) 从 0 变为正值,\(g_i(z^*) = h_i\) 从严格不等式变为等式。Jacobian 矩阵中的对应行发生不连续变化——这意味着 \(\frac{dz^*}{d\theta}\) 也不连续。

双重解读:KKT 微分可以从两个角度理解。优化角度:它告诉我们当问题参数微变时,最优解如何微变。控制角度:它告诉我们当状态微变时,MPC 输出的力矩如何微变——这就是"灵敏度矩阵",与 MPC 的反馈增益直接相关。

91.9.4 可微物理引擎的角色

端到端训练不仅需要可微 QP,还需要**可微仿真器**——让梯度穿过物理仿真的动力学、接触和约束。

近年来涌现的可微物理引擎:

引擎 框架 可微性 接触模型 适用场景
MuJoCo MJX JAX 完全可微 弹性+互补 通用刚体
Brax JAX 完全可微 Spring-based 快速原型
DiffTaichi Taichi 完全可微 Penalty 软体+流体
Warp CUDA 完全可微 位置级 大规模并行
IsaacGym (不可微) PyTorch 前向 only MuJoCo/PhysX 训练 RL

可微仿真与 RL 的结合方式

方式 A: 完全可微 (First-Order Gradient)
  观测 → 策略 → 动作 → 可微仿真 → 下一状态 → 奖励
  ← ← ← ← ← ← 全程反传 ← ← ← ← ← ←
  优势: 最高效的梯度利用
  劣势: 接触不连续导致梯度不准

方式 B: 混合 (SHAC)
  短时域内: 可微仿真反传梯度 (如 5 步)
  长时域: 用 RL 的价值函数近似
  优势: 避免长序列梯度爆炸
  劣势: 需要设计截断长度

方式 C: 零阶 (传统 RL)
  仿真只做前向, 梯度由 RL (PPO/SAC) 估计
  优势: 不受仿真可微性限制
  劣势: 样本效率低

RAMBO 目前使用方式 C (Isaac Lab + PPO)。未来迁移到方式 B (短时域可微) 可能进一步提升训练效率。

91.9.5 技术挑战

端到端训练面临多个技术挑战:

挑战 具体问题 当前解决方案
QP 可微性 Active set 切换导致不连续 qpth, OptNet, 松弛变量
仿真器可微性 接触不连续 可微物理引擎 (MuJoCo MJX, Brax)
梯度爆炸/消失 长时序反传 截断反传, 短时域
训练不稳定 MPC 和 RL 的耦合振荡 交替训练, 分段冻结

91.9.4 前沿工作

工作 方法 关键创新
Differentiable MPC (Amos et al., NeurIPS 2018) 把 MPC 作为可微层 首次提出概念
DiffSim (Qiao et al., NeurIPS 2021) 可微接触仿真 通过接触反传梯度
SHAC (Xu et al., ICLR 2022) 短时域反传 RL 解决梯度爆炸

💡 Insight: 可微 MPC+RL 的端到端训练目前仍处于早期阶段。RAMBO 的"分别设计,共同部署"方案虽然需要更多人工调参,但在工程实践中更稳定、更可调试。端到端训练是未来方向,但目前还不是大多数实际系统的首选。

练习 91.9 (⭐⭐⭐⭐): 阅读 qpth 库的源码,理解它如何通过 KKT 条件的隐函数定理(implicit function theorem)实现 QP 的反向传播。写出关键公式并解释为什么 active set 切换会导致梯度不连续。


91.10 RAMBO 的 Loco-Manipulation 任务详解 ⭐⭐⭐

91.10.1 任务设计与评估方法论

RAMBO 在多种 loco-manipulation 任务上进行了评估。这些任务的设计覆盖了不同类型的交互力:

任务 交互力类型 关键挑战 为什么纯 MPC 不够
推购物车 持续水平力 + 滚动摩擦 购物车有自由度,方向耦合 购物车动力学难以建模
端盘子 保持法向力 + 维持水平 盘上物体可能滑动 物体与盘的接触是非刚性的
抱软物体 变形体接触力 力-变形关系非线性 软体力学建模极其复杂
双足行走+操作 高度不稳定的平衡 支撑多边形极小 模型灵敏度极高

91.10.2 推购物车任务的深度分析

推购物车是 RAMBO 最具代表性的任务。让我们深入分析这个任务中 MPC 和 RL 各自的贡献。

MPC 的贡献——产生物理合理的基础力

推购物车时,机器人的前腿减少了一部分接地力(被购物车分担了部分机器人的重力),后腿需要产生额外的前向推力。SRB-MPC 可以计算出:

  1. 维持重心高度需要的总法向力
  2. 产生前向加速度需要的总水平力
  3. 每条接地腿的力分配
\[\text{MPC 求解:} \quad \min_{\mathbf{f}_1, \dots, \mathbf{f}_{n_c}} \|\mathbf{A}\boldsymbol{\lambda} - \mathbf{b}_{des}\|^2 + \|\boldsymbol{\lambda}\|_R^2\]

但 MPC 不知道购物车的滚动阻力、车轮偏转角、把手高度——这些都是 RL 需要补偿的。

RL 的贡献——补偿未建模的交互

RL 的残差力矩补偿以下误差:

误差源 物理原因 RL 的补偿方式
购物车滚动阻力 车轮摩擦、地面阻力 增加前向推力
把手高度偏差 MPC 假设力作用在质心 调整垂直力分量
横向偏转 车轮没有完美对齐 增加侧向校正力
重心偏移 推购物车改变了系统重心 调整腿部力分配

消融实验的启示

RAMBO 论文中的消融实验揭示了一个重要现象:

消融结果 (推购物车 EE 跟踪误差):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
完整 RAMBO (MPC + RL):        ~2.5cm 误差
去掉 RL (只有 MPC):           ~5.8cm 误差    ← 误差增大 130%
去掉 MPC (只有 RL):           ~4.2cm 误差    ← 误差增大 68%
去掉 MPC + 去掉 RL (只有 PD): ~12cm 误差     ← 完全不可用
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

本质洞察:消融结果显示 MPC 和 RL 的贡献不是简单相加——去掉任一方的误差增大都超过其单独贡献。这说明两者之间有**协同效应**:MPC 提供了一个"好的工作点"让 RL 可以高效地进行微调,而不是从零开始学习。如果没有 MPC 的基础,RL 需要用大量学习容量来学习基本的重力补偿和接触力分配——这些恰好是 MPC 用解析公式就能做到的。

91.10.3 双足行走模式

RAMBO 的一个独特功能是:同一个框架可以在四足和双足模式之间切换。当机器人需要用前肢操作物体时,后两条腿变成双足行走。

双足模式对控制的挑战更大:

维度 四足 双足
支撑多边形面积 ~400 cm² ~50 cm²
稳定裕度 极小
步态周期 ~0.4s ~0.6s
地面反力 每腿 ~25% 体重 每腿 ~50% 体重
MPC 模型误差影响 可容忍 致命

在双足模式下,MPC 的模型误差更加致命——因为稳定裕度极小。这正是 RL 残差的价值体现:它通过学习到的微调来弥补 SRB 模型在双足平衡中的不足。

91.10.4 RAMBO 的训练课程

RAMBO 使用课程学习(curriculum learning)来逐步增加任务难度:

训练课程:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
阶段 1: 平地四足站立 + EE 静态目标    (500 轮)
  → 学习基本平衡和重力补偿

阶段 2: 平地四足行走 + EE 静态目标    (1000 轮)
  → 学习行走中保持 EE 稳定

阶段 3: 平地四足行走 + EE 移动目标    (1500 轮)
  → 学习同时行走和操作

阶段 4: 加入 Domain Randomization    (2000 轮)
  → 增强鲁棒性

阶段 5: (可选) 加入特定任务交互       (1000 轮)
  → 针对推购物车/端盘子等特定任务微调

切换条件: 当前阶段的平均奖励达到阈值的 90%
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

91.10.5 运动学参考生成器的设计

RAMBO 的第一个模块是运动学参考生成器。它接收速度命令和步态参数,输出关节参考轨迹。

Raibert 落脚点公式(回顾足式/70):

\[\mathbf{p}_{foot} = \mathbf{p}_{hip} + \frac{T_{swing}}{2} \mathbf{v}_{body} + k_p (\mathbf{v}_{body} - \mathbf{v}_{des})\]

其中 \(T_{swing}\) 是摆动相时长,\(\mathbf{v}_{body}\) 是当前身体速度,\(\mathbf{v}_{des}\) 是期望速度,\(k_p\) 是比例增益。

从落脚点位置出发,通过逆运动学计算参考关节角:

\[\mathbf{q}_{ref} = \text{IK}(\mathbf{p}_{foot})\]

对于 3-DoF 腿(hip abduction, hip flexion, knee),解析 IK 有闭合解。

**步态生成器**产生接触时序:

Trot 步态:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
LF ███████░░░░░░░███████░░░░░░░████
RF ░░░░░░░███████░░░░░░░███████░░░░
LH ░░░░░░░███████░░░░░░░███████░░░░
RH ███████░░░░░░░███████░░░░░░░████
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    █ = 支撑相    ░ = 摆动相

对角腿同步: (LF, RH) 和 (RF, LH) 交替

⚠️ Pitfall: 运动学参考生成器和 MPC QP 必须使用一致的接触时序。如果步态生成器认为某条腿在摆动相,但 QP 的约束中没有将该腿的接触力设为零,QP 会给悬空的腿分配力——对应的前馈力矩会把腿往地面压,干扰摆动动作。

91.10.6 Domain Randomization 的详细设置

RAMBO 的 Domain Randomization 设置:

参数 范围 采样方式 目的
机身质量 [-0.5, +0.5] kg 均匀 负载变化
质心偏移 [-3, +3] cm 均匀 负载位置变化
地面摩擦 [0.4, 1.2] log-均匀 不同地面材质
地面刚度 [50, 200] N/mm log-均匀 软硬地面
电机力矩延迟 [0, 20] ms 均匀 通信延迟
PD 增益 K_p [-15%, +15%] 均匀 执行器参数不确定性
PD 增益 K_d [-15%, +15%] 均匀 执行器参数不确定性
关节摩擦 [0, 0.5] Nm 均匀 减速器摩擦
外部推力 [0, 5] N, 随机方向 间歇性 外部扰动
地形坡度 [0, 12°] 均匀 非水平地面
传感器噪声 (IMU) ±0.05 rad/s 高斯 传感器精度
传感器噪声 (编码器) ±0.01 rad 高斯 传感器精度

关键经验:地面摩擦用 log-均匀采样而非均匀采样,因为低摩擦(如 0.3-0.5)对控制的影响远大于高摩擦(如 1.0-1.5)。Log-均匀采样给低摩擦区域分配了更多训练样本。

91.10.7 混合控制的调试方法论

当混合 MPC+RL 系统出问题时,调试比纯 MPC 或纯 RL 更复杂。以下是结构化的调试流程:

混合系统调试决策树:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
问题: 机器人跌倒

Step 1: 冻结 RL (Δτ = 0), 只用 MPC + PD
  → 如果仍然跌倒 → 问题在 MPC 层
    → 检查: SRB 模型参数、摩擦估计、步态时序
  → 如果不跌倒 → 问题在 RL 层
    → 继续 Step 2

Step 2: 打印 Δτ 的时间序列
  → 如果 Δτ 持续饱和 → ε_max 太小或模型误差太大
  → 如果 Δτ 有高频振荡 → PD 增益与 RL 冲突
  → 如果 Δτ 突然跳变 → 观测空间有异常输入

Step 3: 检查 QP 可行性
  → 打印 QP 的 solver status
  → 如果频繁 INFEASIBLE → 约束设计有问题
  → 如果频繁 MAX_ITER → 初始猜测太差或问题规模太大

Step 4: 回放日志
  → 固定输入回放,检查输出是否一致
  → 检查时间戳对齐
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

跨领域类比:混合系统的调试类似于调试一个包含规则引擎和机器学习模型的推荐系统。当推荐结果不对时,先检查规则引擎(硬逻辑)是否输出了正确的基础推荐,然后检查 ML 模型(学习层)是否在基础推荐上做了合理的调整。分层调试是唯一可行的策略——试图同时调试两层只会让问题更混乱。

91.10.8 残差策略网络的架构细节

RAMBO 的 RL 策略网络通常使用简单的 MLP:

# RAMBO 策略网络架构示例
class ResidualPolicy(nn.Module):
    def __init__(self, obs_dim=78, act_dim=12, hidden=[256, 128, 64]):
        super().__init__()
        layers = []
        in_dim = obs_dim
        for h in hidden:
            layers.append(nn.Linear(in_dim, h))
            layers.append(nn.ELU())  # ELU 比 ReLU 更适合连续控制
            in_dim = h
        layers.append(nn.Linear(in_dim, act_dim))
        self.net = nn.Sequential(*layers)

        # 残差约束参数 (每关节独立)
        self.epsilon_max = nn.Parameter(
            torch.tensor([3.0] * act_dim),  # Nm
            requires_grad=False  # 不参与梯度更新
        )

    def forward(self, obs):
        raw = self.net(obs)
        # tanh 有界映射
        safe = self.epsilon_max * torch.tanh(raw)
        return safe

网络大小的选择:残差策略的网络不需要很大——因为它只学习 MPC 的"误差",而不是从零学习完整的控制策略。典型的参数量约 50K-200K,远小于纯 RL 策略(通常 1M-10M)。这也意味着推理时间更短(~0.05ms vs ~0.2ms)。

激活函数的选择:ELU (Exponential Linear Unit) 比 ReLU 更适合连续控制任务,因为 ELU 在负值区域有非零输出,避免了"死神经元"问题。在力矩控制中,需要策略能输出负值(表示某个方向的力矩),ReLU 的零截断会导致策略无法在某些状态下输出负力矩。

91.10.9 PPO 与 SAC 在残差策略中的选择

为什么 RAMBO 选择 PPO 而不是 SAC (Soft Actor-Critic)?

维度 PPO SAC
策略类型 On-policy Off-policy
样本效率 低 (但大规模并行弥补)
训练稳定性 高 (clip 保护) 中 (需要调目标熵)
超参数敏感度 中-高
并行化 天然适合 Isaac Lab 需要额外缓存设计
探索方式 策略熵 最大熵框架
力矩平滑性 好 (clip 限制更新) 差 (最大熵鼓励探索)

PPO 在大规模并行仿真(Isaac Lab)中的优势是决定性的。Isaac Lab 可以同时运行 2048-4096 个环境,每个环境贡献少量样本,但总样本量巨大——这恰好弥补了 PPO 作为 on-policy 方法的低样本效率。SAC 的 off-policy 优势(样本重用)在有足够并行度时不再重要。

更重要的是,PPO 的 clip 机制限制了策略更新的步长——这对残差策略特别有价值。在训练早期,如果 SAC 做了一次大的策略更新导致残差跳变,MPC 前馈可能被残差"覆盖",系统行为急剧变化。PPO 的 clip 保证了每次更新的变化量有限,系统行为平滑演进。

91.10.10 QP 前馈的物理直觉——为什么不让 RL 学重力补偿

一个合理的问题是:RL 够强大,为什么不让它直接学习全部力矩(包括重力补偿),而要用 QP 做前馈?

答案涉及学习效率和泛化性。考虑重力补偿:一个 12kg 的四足机器人,仅站立就需要约 \(mg = 118\)N 的总法向力。这个力矩大约 \(118/(4 \times 0.25) \approx 118\)Nm(假设力臂 0.25m)。每条腿的关节需要产生约 30Nm 的力矩来克服重力。

如果 RL 从零学习这个量,它需要发现 30Nm 这个"magic number"是物理定律的必然——不同质量、不同姿态、不同重力下这个数字都不同。RL 可以通过大量试错学到这一点,但 MPC 用一行公式就能精确计算:

\[\boldsymbol{\tau}_{gravity} = \mathbf{J}_c^T \cdot (m\mathbf{g})_{split} \quad \text{(解析, 精确, 零训练)}\]

本质洞察:MPC 前馈的价值在于**把结构化知识注入控制管线**。重力补偿、接触力分配、摩擦锥约束——这些都是有精确数学描述的物理现象。让 RL 从数据中重新"发现"这些物理规律是极大的浪费。正确的分工是:已知的物理用 MPC,未知的误差用 RL

练习 91.10a (⭐⭐): 在 RAMBO 的消融实验中,"去掉 MPC 只有 RL"的变体需要多长训练时间才能达到"MPC + RL"变体 50% 训练时间的性能?从学习效率的角度解释差异。

练习 91.10b (⭐⭐⭐): 设计一个新的 loco-manipulation 任务:机器人需要用前肢举起一个未知质量的箱子并行走。分析 MPC 和 RL 各自应该负责什么。箱子质量的不确定性应该由哪一层处理?


91.11 混合架构的历史脉络与演进 ⭐⭐

91.11.1 从经典控制到混合智能

混合 MPC+RL 不是一个突然出现的想法,而是控制领域几十年演进的产物:

历史时间线:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1960s ─ 经典 PID / LQR
        │ 问题: 线性假设, 无约束处理
1980s ─ MPC (Model Predictive Control)
        │ 贡献: 约束处理, 预测控制
        │ 问题: 模型精度依赖, 计算慢
2013  ─ Deep RL (DQN, Mnih et al.)
        │ 贡献: 直接从像素学策略
        │ 问题: 样本效率低, 安全性差
2017  ─ Sim-to-Real (OpenAI, Tobin et al.)
        │ 贡献: 仿真训练真机部署
        │ 问题: Sim2Real gap 仍然存在
2018  ─ Residual Policy Learning (Silver et al.)
        │ 贡献: "基线控制器 + 学习残差" 范式
        │ 问题: 基线控制器是固定的 PD
2019  ─ RL for Legged Locomotion (Lee et al., Hwangbo et al.)
        │ 贡献: RL 四足行走达到实用水平
2020+ ─ Hybrid MPC+RL
        │ 贡献: MPC 提供物理基线, RL 提供鲁棒性
        │ 代表: RAMBO (2025)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

91.11.2 混合控制在不同领域的应用

混合 model-based + learning 的思想不仅限于腿足机器人,它在多个领域都有成功应用:

领域 模型层 学习层 代表工作
四足行走 SRB-MPC 残差 RL RAMBO (2025)
无人机 动力学控制器 自适应 NN Neural-Fly (2022)
机械臂 逆动力学 残差力矩 Residual RL (2018)
自动驾驶 路径规划 决策 RL Hybrid planner (2023)
工业过程控制 PID 在线调参 RL Industrial RL (2024)

这些应用的共同模式是:结构化知识用模型表达,非结构化不确定性用学习处理

在无人机领域,Neural-Fly (O'Connell et al., Science Robotics 2022) 是一个优雅的例子。其模型层使用标准的四旋翼动力学方程产生前馈推力,学习层是一个小型神经网络(只有几千个参数),在线适应风场扰动。关键设计是学习层的输出被限制在物理合理的范围内——与 RAMBO 的 \(\tanh\) 有界映射异曲同工。

💡 Insight: 跨领域的成功说明,"模型前馈 + 学习残差 + 有界约束"不是一个特定于腿足机器人的技巧,而是一个**通用的控制架构范式**。每当你有一个"差不多对但不完美"的物理模型时,用它做前馈并让 RL 学习残差,几乎总是比从零学习更好。

91.11.3 RAMBO 的开源代码结构

RAMBO 的代码开源在 GitHub (catachiii/rambo)。代码的核心结构如下:

rambo/
├── envs/                      # Isaac Lab 环境
│   ├── go2_loco_manip.py      # 四足 loco-manipulation 环境
│   ├── rewards.py             # 奖励函数定义
│   └── observations.py        # 观测空间定义
├── controllers/               # 控制器
│   ├── srb_qp.py              # SRB-QP 前馈 (qpth / OSQP)
│   ├── kinematic_ref.py       # 运动学参考生成
│   └── gait_scheduler.py      # 步态调度
├── policies/                  # RL 策略
│   ├── residual_mlp.py        # 残差策略网络
│   └── ppo_trainer.py         # PPO 训练器
├── deployment/                # 部署
│   ├── onnx_inference.py      # ONNX 推理
│   ├── osqp_realtime.py       # 实时 OSQP
│   └── ros2_node.py           # ROS2 控制节点
└── configs/                   # 配置文件
    ├── go2_quadruped.yaml     # 四足配置
    ├── go2_biped.yaml         # 双足配置
    └── training.yaml          # 训练超参数

代码阅读建议

  1. controllers/srb_qp.py 开始,理解 QP 的构建和求解
  2. 然后读 policies/residual_mlp.py,理解残差策略的网络架构和 \(\tanh\) 映射
  3. 接着读 envs/rewards.py,理解残差正则化等特殊奖励项
  4. 最后读 deployment/ros2_node.py,理解实时控制循环的实现

⚠️ Pitfall: 训练代码中 qpth 的 batch QP 求解和部署代码中 OSQP 的单个 QP 求解可能有细微的数值差异(主要来自求解器公差设置不同)。部署前应该在离线环境中比较两个求解器在相同输入下的输出差异,确认差异在可接受范围内(通常 <0.1Nm)。

91.11.4 残差策略学习的起源

Silver et al. (2018) 首次提出了 "Residual Policy Learning" 的概念。其核心思想是:

\[\pi_{total}(s) = \pi_{base}(s) + \pi_{residual}(s)\]

原始提案中的 \(\pi_{base}\) 是一个固定的 PD 控制器。RAMBO 的创新在于把 \(\pi_{base}\) 从简单的 PD 升级为**在线求解的 MPC**——这让基线控制器的质量大幅提升,RL 需要学习的残差更小,训练更高效。

演进 基线控制器 残差 安全保证
Silver 2018 PD (固定) 无界 RL
Johannink 2019 运动规划器 无界 RL
RAMBO 2025 在线 MPC 有界 RL

跨章综合练习 91.11 (⭐⭐⭐): 综合本章 (RAMBO)、复合/200 (UMI-on-Legs) 和足式/90 (WBC) 的知识,设计一个完整的四足操作系统架构:上层使用 Diffusion Policy 生成 EE 目标轨迹,中层使用 RAMBO 的 MPC+RL 混合控制器跟踪目标,底层使用 PD 执行关节命令。画出完整的信号流图,标注每个模块的输入/输出维度、频率和坐标系。


本章小结

知识点 核心要点 难度
纯 MPC/RL 局限 模型误差 vs 安全约束的根本矛盾 ⭐⭐
混合架构分类 蒸馏/引导/残差/层级 四种范式 ⭐⭐⭐
RAMBO 核心方程 \(\tau = \tau_{ff} + \epsilon \tanh(\Delta\tau) + PD\) ⭐⭐⭐
SRB-QP 建模 接触力优化 + 摩擦锥约束 ⭐⭐⭐
残差策略设计 观测含 MPC 输出 + 残差正则化奖励 ⭐⭐⭐
稳定性保证 有界残差的 Lyapunov 论证 ⭐⭐⭐⭐
方法对比 RAMBO vs DreamWaQ vs OCS2 ⭐⭐⭐
部署实时性 OSQP + ONNX, 100Hz 管线 ⭐⭐
可微 MPC 前沿 端到端训练的机会与挑战 ⭐⭐⭐⭐
跨领域应用 无人机/机械臂/自动驾驶的混合控制 ⭐⭐
调试方法论 分层冻结 + 日志回放 + 消融实验 ⭐⭐⭐

累积项目:本章新增模块

在累积的混合控制项目中,本章新增以下模块:

  • 模块 1: SRB-QP 接触力优化器(91.4 练习)
  • 模块 2: 残差策略的观测/奖励/训练管线(91.5 练习)
  • 模块 3: Lyapunov 稳定性分析工具(91.6 练习)
  • 模块 4: ROS2 部署节点图(91.8 练习)

跨章综合题

综合练习 1 (⭐⭐⭐): 结合本章 (RAMBO)、复合/200 (UMI-on-Legs) 和足式/90 (WBC) 的知识,设计一个完整的四足操作系统:上层使用 Diffusion Policy 生成 EE 目标轨迹,中层使用 RAMBO 的 MPC+RL 混合控制器跟踪目标,底层使用 PD 执行关节命令。画出完整的信号流图,标注每个模块的输入/输出维度、频率和坐标系。分析这种三层混合方案相比 UMI-on-Legs 原始的纯 RL WBC 有什么优势和劣势。

综合练习 2 (⭐⭐⭐⭐): 在足式/70 的 SRB 模型基础上,推导当四足机器人背上安装了质量 \(m_a\) 的机械臂时,SRB 模型的修正方程。考虑臂的质心位置随臂的构型变化——SRB 的"单刚体"假设在什么条件下仍然成立?当臂的质量超过体重的多少百分比时应该切换到 Centroidal 模型?

延伸阅读

资源 难度 内容
Cheng et al., "RAMBO" (arXiv 2504.06662, 2025) ⭐⭐⭐⭐ 本章主题论文
Silver et al., "Residual Policy Learning" (2018) ⭐⭐⭐ 残差策略的原始提案
Amos & Kolter, "OptNet" (ICML 2017) ⭐⭐⭐⭐ 可微 QP 层的基础
Nahrendra et al., "DreamWaQ" (ICRA 2023) ⭐⭐⭐ 纯 RL 四足对比方法
Farshidian et al., "OCS2" ⭐⭐⭐ 纯 MPC 对比框架
Stellato et al., "OSQP" (Math. Programming, 2020) ⭐⭐⭐ QP 求解器
Xu et al., "SHAC" (ICLR 2022) ⭐⭐⭐⭐ 短时域可微 RL
O'Connell et al., "Neural-Fly" (Science Robotics, 2022) ⭐⭐⭐ 无人机领域的混合控制
Johannink et al., "Residual RL" (ICRA 2019) ⭐⭐⭐ 机械臂残差策略
Di Carlo et al., "MIT Cheetah MPC" (IROS 2018) ⭐⭐⭐ SRB-MPC 的经典实现
qpth documentation (github.com/locuslab/qpth) ⭐⭐⭐ 可微 QP 求解器
Lee et al., "Learning Quadrupedal Locomotion" (Science Robotics, 2020) ⭐⭐⭐ RL 四足行走里程碑
Hwangbo et al., "Anymal RL" (Science Robotics, 2019) ⭐⭐⭐ 首次 RL 真机四足行走

故障排查手册

症状 可能原因 排查步骤 相关章节
残差力矩持续饱和 (\(\|\Delta\tau\| \approx \epsilon_{max}\)) MPC 模型误差太大 1. 打印 \(\tau_{ff}\) vs 实际力矩 2. 增大 \(\epsilon_{max}\) 3. 检查 SRB 模型参数 91.3, 91.4
摆动腿产生异常力矩 接触模式约束缺失 1. 检查步态相位信号 2. 验证 QP 中摆动腿约束 3. 打印接触力 91.4
RL 训练奖励不收敛 残差正则权重过大 1. 打印各奖励分项 2. 降低 \(w_{res}\) 3. 检查 \(\epsilon_{max}\) 范围 91.5
部署时 QP 求解失败 约束不可行 1. 检查摩擦系数估计 2. 松弛约束 3. 添加松弛变量 91.4
行走时末端抖动 PD 增益与 RL 残差冲突 1. 降低 PD 增益 2. 增加动作平滑奖励 3. 检查动作历史观测 91.5
双足模式频繁摔倒 稳定裕度不足 1. 检查 SRB 模型质心估计 2. 增大 \(\epsilon_{max}\) 给 RL 更多补偿空间 3. 降低行走速度 91.6, 91.10
训练初期奖励不增反降 初始残差破坏 MPC 前馈 1. 增大残差正则权重 2. 减小初始 \(\epsilon_{max}\),训练后期再增大 3. 检查 PPO 的 clip 参数 91.5

混合 MPC-RL 的最新趋势(2025-2026)

RAMBO 代表的残差策略路线在 2025-2026 年间持续演化,同时出现了若干平行的混合控制思路。

可微 MPC 的端到端训练。传统的混合架构中 MPC 和 RL 是独立训练的——MPC 的参数(代价权重、约束边界)由人工调整,RL 只负责学习残差。2025 年的多项工作开始探索将 MPC 求解器嵌入 RL 训练的计算图中,使 MPC 的代价权重也可以通过梯度回传自动优化。这种端到端方式的优势在于 MPC 和 RL 可以联合适应任务需求,但技术难点在于 QP 求解器的梯度计算——接触切换导致的 KKT 系统不连续需要特殊的平滑化处理。

世界模型辅助的混合控制。另一个新兴方向是用学习到的世界模型(World Model)替代 RAMBO 中的 SRB 解析模型作为 MPC 的动力学预测器。世界模型可以捕捉解析模型忽略的非刚性效应(如软地面形变、关节柔性),从而减少 RL 残差需要补偿的模型误差。代价是世界模型的预测本身有不确定性,需要在 MPC 中引入鲁棒优化或概率约束来处理。

研究方向提示:混合 MPC-RL 方向目前最具挑战性的开放问题是**稳定性保证**。RAMBO 通过有界残差给出了初步的 Lyapunov 论证(91.6 节),但这个保证依赖于 MPC 模型误差有界的假设。当系统遇到训练分布外的地形或负载时,这个假设可能失效。如何为混合控制系统提供在分布外场景下仍然有效的安全保证,是值得博士阶段深入研究的方向。

学完本章后,建议回顾复合/70(轮足 MPC)中的纯 MPC 方案,对比理解残差 RL 带来的具体增益和额外复杂度。


—— 本章终 ——