Model Predictive Control (MPC)
✅ 本章定位:理解 MPC 如何通过滚动时域优化实现闭环最优控制,掌握其核心思想、算法流程和在角色动画中的应用。
⭐ 核心概念:MPC 是一个控制框架
MPC 本身不是一个具体的优化算法,而是一个控制框架。
它定义了**"每帧优化、只执行第一步、然后重新优化"的闭环控制思想,但不指定具体用什么方法求解**优化问题。
MPC 框架 + 不同求解器
MPC 框架(滚动时域优化)
│
├─ 结合 iLQR 求解器 → iLQR-MPC(适用于平滑问题)
│
├─ 结合 DDP 求解器 → DDP-MPC(适用于高精度需求)
│
├─ 结合 CMA-ES → Sampling-MPC(适用于不可微问题)
│
├─ 结合 SAMCON → 粒子滤波 MPC(适用于角色控制)
│
└─ 结合凸优化 → Convex-MPC(适用于凸问题)
| 组件 | 作用 | 类比 |
|---|---|---|
| MPC 框架 | 定义"何时优化、如何执行" | 汽车的"自动驾驶系统" |
| 求解器 | 实际计算最优控制 | 汽车的"发动机"(可以是汽油、柴油、电动) |
重要理解:
- MPC 的核心是滚动时域思想,不是某个特定算法
- 同一个 MPC 框架,换不同求解器,适用于不同问题
- 选择求解器时要考虑:可微性、计算成本、精度需求
一、从开环到闭环:为什么需要 MPC
开环控制的局限性
前面介绍的轨迹优化方法(如 iLQR、DDP、CMA-ES)主要是开环控制:
离线优化一次 → 得到最优轨迹 (x*, u*) → 执行
| 优点 | 缺点 |
|---|---|
| 可预先计算、推理快 | 无法应对扰动 |
| 适用于动作生成 | 误差会累积 |
| 计算成本一次性投入 | 实际轨迹可能偏离规划 |
问题:角色动画中经常遇到扰动:
- 外力推挤
- 地面不平
- 模型参数误差
- 数值仿真误差累积
闭环控制的思想
反馈控制:每帧根据当前状态重新计算控制
测量当前状态 s → 查表 u = -K·s → 执行 → 下一帧
PD 控制就是典型的闭环控制,但它是局部的:
- 只考虑当前状态与目标状态的偏差
- 不考虑未来、不预测后果
- 无法处理复杂约束
MPC 的核心洞察
MPC = 开环优化 + 闭环执行
每帧都做一次开环轨迹优化,但只执行第一步,然后重新优化
t=0: 测量 s₀ → 优化得到 (u₀*, u₁*, ..., uₙ*) → 执行 u₀*
t=1: 测量 s₁ → 优化得到 (u₀*, u₁*, ..., uₙ*) → 执行 u₀*
t=2: 测量 s₂ → 优化得到 (u₀*, u₁*, ..., uₙ*) → 执行 u₀*
...
关键:
- 每帧都基于最新测量状态重新规划
- 只执行规划序列的第一步
- 下一帧重复优化,形成反馈
二、MPC 的数学描述
标准 MPC 问题
在每一时刻 t,求解如下优化问题:
$$ \begin{aligned} \min_{\mathbf{u}_{0:N-1}} \quad & \phi(\mathbf{x}N) + \sum{k=0}^{N-1} \ell(\mathbf{x}_k, \mathbf{u}k) \ \text{s.t.} \quad & \mathbf{x}{k+1} = f(\mathbf{x}_k, \mathbf{u}_k) \quad \text{(动力学)} \ & \mathbf{x}0 = \mathbf{x}{\text{current}} \quad \text{(当前状态)} \ & \mathbf{x}_k \in \mathcal{X}, \mathbf{u}_k \in \mathcal{U} \quad \text{(约束)} \end{aligned} $$
其中:
- \(N\):预测时域(Prediction Horizon),通常 10-50 步
- \(\phi(\mathbf{x}_N)\):终端代价
- \(\ell(\mathbf{x}_k, \mathbf{u}_k)\):阶段代价
- \(\mathcal{X}, \mathcal{U}\):状态和控制约束集
MPC 算法流程
算法:MPC 闭环控制
输入:
- 当前状态 x_current
- 参考轨迹 x_ref
- 预测时域 N
输出:
- 控制输入 u*
每帧执行:
1. 测量当前状态 x_current
2. 求解优化问题:
min J = φ(x_N) + Σₖ₌₀ᴺ⁻¹ ℓ(x_k, u_k)
s.t. x_{k+1} = f(x_k, u_k)
x_0 = x_current
x_k ∈ X, u_k ∈ U
3. 得到最优控制序列 (u₀*, u₁*, ..., uₙ*₋₁)
4. 执行第一步控制 u* = u₀*
5. 等待下一帧,回到步骤 1
与开环优化的对比
| 维度 | 开环优化 (iLQR, DDP) | MPC |
|---|---|---|
| 优化频率 | 一次(离线) | 每帧(在线) |
| 输入状态 | 固定初始状态 x₀ | 实时测量 x_current |
| 执行方式 | 执行完整轨迹 | 只执行第一步 |
| 应对扰动 | ❌ 无法应对 | ✅ 自动校正 |
| 计算成本 | 一次性高 | 持续高 |
| 适用场景 | 动作生成/离线规划 | 实时控制/跟踪 |
三、MPC 的关键设计要素
1. 预测时域 (Prediction Horizon)
预测时域 \(N\) 的选择是 MPC 设计的核心:
| 时域长度 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 短 (N=5-10) | 计算快 | 短视、可能不稳定 | 快速反应任务 |
| 中 (N=10-30) | 平衡 | 中等计算量 | locomotion、跟踪 |
| 长 (N=30-100) | 远视、稳定 | 计算慢 | 复杂规划任务 |
经验法则:
- 时域应覆盖任务的关键动态
- 例如:走路步态周期约 1 秒,若 dt=0.01s,则 N≈100
2. 代价函数设计
MPC 的代价函数通常包含:
$$ J = J_{\text{track}} + J_{\text{control}} + J_{\text{smooth}} + J_{\text{terminal}} $$
| 项 | 数学形式 | 作用 |
|---|---|---|
| 跟踪误差 | \(\sum (\mathbf{x}_k - \mathbf{x}_k^{\text{ref}})^T Q (\mathbf{x}_k - \mathbf{x}_k^{\text{ref}})\) | 跟踪参考轨迹 |
| 控制 effort | \(\sum \mathbf{u}_k^T R \mathbf{u}_k\) | 避免过大控制 |
| 平滑项 | \(\sum (\mathbf{u}k - \mathbf{u}{k-1})^T S (\mathbf{u}k - \mathbf{u}{k-1})\) | 控制变化平滑 |
| 终端代价 | \(\mathbf{x}_N^T P \mathbf{x}_N\) | 保证稳定性 |
3. 约束处理
MPC 的核心优势之一是能显式处理约束:
| 约束类型 | 数学形式 | 示例 |
|---|---|---|
| 状态约束 | \(\mathbf{x} \in \mathcal{X}\) | 关节角度限制、速度限制 |
| 控制约束 | \(\mathbf{u} \in \mathcal{U}\) | 关节力矩上限 |
| 接触约束 | \(g(\mathbf{x}) \geq 0\) | 足部不穿透地面、摩擦锥 |
| 任务约束 | \(h(\mathbf{x}) = 0\) | 手部保持抓握、视线跟踪 |
4. 终端设计
为保证 MPC 稳定性,通常需要设计终端约束或终端代价:
| 方法 | 说明 | 优缺点 |
|---|---|---|
| 终端代价 | \(\phi(\mathbf{x}_N) = \mathbf{x}_N^T P \mathbf{x}_N\) | 软约束,计算简单 |
| 终端约束 | \(\mathbf{x}N = \mathbf{x}{\text{goal}}\) | 硬约束,可能无解 |
| 终端集合 | \(\mathbf{x}_N \in \mathcal{X}_f\) | 灵活但设计复杂 |
| 无终端 | 不设终端 | 简单但可能不稳定 |
四、MPC 的求解方法
核心理解:MPC 是一个框架,它需要调用具体的求解器来解优化问题。
求解器对比
| 求解器类型 | 代表方法 | 特点 | 适用场景 |
|---|---|---|---|
| 基于梯度 | iLQR, DDP, SQP | 收敛快,需要可微模型 | 平滑问题、精确跟踪 |
| 无梯度 | CMA-ES | 不需要梯度,收敛慢 | 非凸问题、接触频繁 |
| 采样方法 | SAMCON, MPPI | 平衡效率和适用性 | 角色控制、复杂约束 |
| 凸优化 | Convex-MPC | 全局最优、高效 | 可公式化为凸问题 |
1. iLQR-MPC(最常用)
在角色动画中最常用的是 iLQR 作为 MPC 的内部求解器:
每帧:
1. 测量当前状态 x_current
2. 以 x_current 为初值,运行 iLQR 优化
3. 得到最优控制序列 (u₀*, u₁*, ..., uₙ*₋₁)
4. 执行 u₀*
优点:
- 收敛快(适合实时)
- 适用于平滑非线性问题
- 可处理高维系统(如全身角色)
缺点:
- 需要可微模型
- 接触处理困难(需要光滑近似)
2. Sampling-based MPC
对于不可微问题(如接触),可使用采样方法:
SAMCON (Sampling-based Model Predictive Control):
- 在控制空间采样多条轨迹
- 评估每条轨迹的代价
- 选择最优轨迹的第一步执行
- 用 CMA-ES 迭代优化采样分布
MPPI (Model Predictive Path Integral):
- 基于重要性采样的随机 MPC
- 适用于连续控制和随机系统
3. 其他求解器
| 求解器 | 说明 | 适用场景 |
|---|---|---|
| DDP-MPC | 使用 DDP 作为求解器,二阶收敛 | 高精度需求、可计算二阶导数 |
| Convex-MPC | 将问题公式化为凸优化 | 足式机器人、简化模型 |
| NMPC (Nonlinear MPC) | 直接求解非线性优化问题 | 一般非线性系统 |
求解器选择建议
问题特征 → 推荐求解器
─────────────────────────
平滑、可微模型 → iLQR-MPC ⭐
需要二阶精度 → DDP-MPC
接触频繁、不可微 → Sampling-MPC (SAMCON/CMA-ES)
简化模型、凸问题 → Convex-MPC
3. 显式 MPC vs 隐式 MPC
| 类型 | 方法 | 特点 |
|---|---|---|
| 隐式 MPC | 在线求解优化问题 | 灵活、计算量大 |
| 显式 MPC | 离线计算策略表,在线查表 | 快、但存储大、维度低 |
角色动画中主要使用隐式 MPC。
五、MPC 在角色动画中的应用
1. 轨迹跟踪 (Reference Tracking)
问题:给定参考轨迹(动捕数据),让仿真角色跟踪
MPC 方案:
- 状态:关节位置 + 速度
- 控制:关节力矩
- 代价:跟踪误差 + 控制 effort
- 约束:关节限制、力矩限制
优势:
- 自动应对扰动(被推后恢复平衡)
- 可处理模型误差
- 实时性能
2. 平衡控制 (Balance Control)
问题:让角色在不平坦地面上保持平衡
MPC 方案:
- 状态:质心位置 + 速度 + 关节状态
- 控制:关节力矩 + 接触力
- 代价:质心高度 + 基座姿态 + 控制 effort
- 约束:接触力(摩擦锥)、ZMP 约束
3. 步态生成 (Locomotion)
问题:让角色按期望速度行走/跑步
MPC 方案:
- 状态:全身关节状态 + 基座状态
- 控制:关节力矩 + 下一步落脚点
- 代价:速度跟踪 + 能量 + 步态稳定性
- 约束:接触时序、落脚点可行区域
代表性工作:
- Winkler et al. 2020 - 全身 MPC 用于双足行走
- Kim et al. 2019 - MPC 用于复杂地形 locomotion
4. 全身控制 (Whole-Body Control)
问题:同时控制手、脚、基座完成多任务
MPC 方案:
- 状态:全身 50+DoF
- 控制:全身关节力矩
- 代价:多任务加权(手跟踪 + 脚跟踪 + 平衡)
- 约束:全身动力学 + 接触约束
挑战:
- 高维(计算量大)
- 接触切换(混合系统)
- 实时性要求高
六、MPC 与其他方法的对比
MPC vs PID/PD 控制
| 维度 | PD 控制 | MPC |
|---|---|---|
| 优化范围 | 局部(当前误差) | 全局(预测时域内) |
| 约束处理 | 无法显式处理 | 显式处理 |
| 多任务协调 | 难(需要调权重) | 易(统一优化) |
| 计算成本 | 极低 | 高 |
| 适用场景 | 简单跟踪 | 复杂任务 |
MPC vs 轨迹优化
| 维度 | 轨迹优化 (iLQR, DDP) | MPC |
|---|---|---|
| 优化频率 | 一次(离线) | 每帧(在线) |
| 初值敏感性 | 高(可能局部最优) | 低(热启动) |
| 实时性 | 否 | 是 |
| 应对扰动 | 否 | 是 |
| 关系 | MPC 可以用轨迹优化作为求解器 |
MPC vs 强化学习
| 维度 | MPC | 强化学习 |
|---|---|---|
| 训练需求 | 无需训练 | 需要大量训练 |
| 泛化能力 | 有限 | 强 |
| 推理速度 | 慢(ms 级) | 快(μs 级) |
| 可解释性 | 高 | 低 |
| 约束处理 | 显式 | 隐式(需特殊设计) |
| 适用场景 | 已知模型、高精度 | 未知模型、泛化需求 |
方法选择建议
场景 → 推荐方法
─────────────────────────
已知模型 + 实时控制 → MPC
已知模型 + 离线动作 → iLQR/DDP/CMA-ES
未知模型 + 泛化需求 → 强化学习
简单跟踪 → PD 控制
七、MPC 的优缺点
优点
| 优点 | 说明 |
|---|---|
| 闭环最优 | 每帧重新优化,自动应对扰动 |
| 约束处理 | 显式处理状态/控制/接触约束 |
| 多任务协调 | 统一框架下优化多目标 |
| 模型利用 | 充分利用已知模型信息 |
| 灵活性 | 代价函数和约束可在线修改 |
缺点
| 缺点 | 说明 |
|---|---|
| 计算成本高 | 每帧需解优化问题 |
| 模型依赖 | 模型不准会导致性能下降 |
| 调参复杂 | 时域、权重、约束需要调节 |
| 接触处理 | 离散接触需要特殊处理 |
| 稳定性分析 | 理论保证需要终端设计 |
八、工程实践
1. 计算优化
热启动 (Warm Start):
- 用上一帧的解作为当前帧优化的初值
- 显著减少迭代次数
并行化:
- 采样方法可并行评估多条轨迹
- GPU 加速动力学计算
简化模型:
- 使用简化的动力学模型(如线性倒立摆)
- 在简化的控制空间优化
2. 稳定性设计
终端代价:
- 用 LQR 的 Value Function 作为终端代价
- 保证闭环稳定性
足够长的时域:
- 时域应覆盖系统的主要动态
- 经验:至少覆盖一个步态周期
约束松弛:
- 硬约束可能导致无解
- 用软约束(加惩罚)代替
3. 接触处理
光滑近似:
- 用 sigmod 近似接触力的开启/关闭
- 使问题可微
混合 MPC:
- 显式枚举接触模式
- 每种模式下分别优化
分层 MPC:
- 高层规划接触时序
- 低层优化连续轨迹
九、MPC 在 GAMES105 中的定位
与其他方法的关系
轨迹优化方法图谱
按优化时机:
├── 离线优化
│ ├── CMA-ES (无梯度)
│ ├── iLQR (一阶梯度)
│ └── DDP (二阶梯度)
│
└── 在线优化
├── MPC (滚动时域)
│ ├── iLQR-MPC
│ ├── Sampling-MPC (如 SAMCON)
│ └── Convex-MPC
│
└── 即时反馈
└── PD 控制
在课程体系中的位置
| 先修内容 | 后续内容 |
|---|---|
| 轨迹优化的数学描述 | SAMCON - 采样-based MPC |
| LQR - 线性最优控制 | SIMBICON - 简化模型预测 |
| iLQR - 非线性轨迹优化 | Character Control |
十、关键要点总结
核心思想
- 滚动时域优化:每帧基于当前状态重新优化未来 N 步
- 只执行第一步:形成闭环反馈
- 显式约束处理:统一框架处理状态/控制/接触约束
MPC 设计要素
| 要素 | 设计考虑 |
|---|---|
| 预测时域 | 平衡计算成本和远视性 |
| 代价函数 | 跟踪 + 控制 + 平滑 + 终端 |
| 约束 | 状态限制 + 控制限制 + 接触 |
| 求解器 | iLQR/SQP/CMA-ES/采样方法 |
优缺点
| 优点 | 缺点 |
|---|---|
| 闭环最优、应对扰动 | 计算成本高 |
| 显式约束处理 | 模型依赖 |
| 多任务协调 | 调参复杂 |
适用场景
- ✅ 实时控制 + 已知模型
- ✅ 需要应对扰动的场景
- ✅ 复杂约束处理
- ❌ 无模型场景(用 RL)
- ❌ 超高频率控制(用 PD)
十一、深入学习
前置知识
- 轨迹优化的数学形式化描述
- LQR - 线性二次调节器
- iLQR - 迭代 LQR
相关方法
参考资料
教程:
论文:
- Rawlings & Mayne 2009 - Model Predictive Control: Theory and Design (教材)
- Winkler et al. 2020 - Convex Model Predictive Control for Bipedal Walking
- Kim et al. 2019 - Reinforcement Learning for Robust Parameterized Locomotion Control
代码:
本文出自 CaterpillarStudyGroup,转载请注明出处。 https://caterpillarstudygroup.github.io/GAMES105_mdbook/