05-控制系统-模型预测控制MPC

作者:姚博文 · 2026-09-15

模型预测控制 MPC

定位: 智能小车运动控制的进阶方法——MPC 四要素(预测时域/代价函数/约束/滚动优化)原理, 线性 MPC 的 QP 推导与 OSQP 完整实现, NMPC 概念与快速演示, 横纵向控制应用, acados/OSQP/qpOASES/CasADi/DoFastMPCTrajectory 选型对比与 ROS2 集成。 | 适用: 智能小车/移动机器人开发
**给非专业读者的一段话**: MPC(Model Predictive Control, 模型预测控制)可以理解为"开车前先打腹稿"。小车每 0.1 秒做一次: 用车辆模型在脑子里**预演**未来 2 秒——"如果现在我打这么多方向, 再加速, 轨迹会怎样?"——把上百种"打方向+给油门"的组合各算一个分数(**代价函数**, 偏得远扣分、动作太猛扣分、**约束**如最大转角/最大加速度/不撞墙是硬性红线), 挑出分数最好的一组, 但**只执行第一小步**, 下一秒用最新实测状态重新预演(这叫**滚动优化**, receding horizon)。因为"往前看"了, MPC 能提前应对弯道(有预瞄)、能同时管转向和速度(多变量)、能明确说"转角不许超过 30°"(显式约束), 这些恰恰是 PID 做不到的。代价是每步要解一个优化问题, 好在现代求解器(OSQP 这类)毫秒级就能解完, 小车 10~30 Hz 跑起来绰绰有余。

· * *

1\. 概述

1.1 解决什么问题

自主导航链路里, 规划器(A\* + DWA/TEB)给出的是"参考路径 + 期望速度", 控制器要把它们变成电机能执行的 `(v, ω)`。最常用的是外环 PID 航向环: 看到"车头偏了 3°"才打方向。它的三个固有短板:

| 短板 | 表现 | MPC 怎么解决 |

| --- | --- | --- |

| 只看当前误差, 无预瞄 | 入弯时"来不及", 弯心外侧偏移大 | 预测时域内提前看到 2s 后的弯道曲率, 提前入弯 |

| 约束靠人工饱和(saturation) | 转角限幅后输出突变, 积分项累积 | 约束是优化问题的一等公民, 求解器自动找"贴着约束走"的最优解 |

| 单变量、无耦合 | 转向环/速度环各调各的, 高速转弯滑移时互相打架 | 转向+速度放同一个优化里联合求解, 代价函数统一权衡 |

对比本目录前一篇 LQR: LQR 也是"模型 + 最优", 但**假设无约束**(解出来的控制量可能超过电机能力, 还得再加饱和)且**增益固定**(在某个工作点线性化后就不变了)。MPC 每步在线重解, 天然处理**硬约束**, 且可以随状态变化(非线性模型)——这是它比 LQR 强的地方; 代价是计算量大(小车场景下是毫秒级, 可接受)。

1.2 在自主导航链路中的位置

全链路图见 `00-路线图/学习路线图.md`。MPC 处于 control 环节, **替换/增强外环**, 内环速度 PID 不动:

💡 **MPC 是外环, 不是替代 PID**。内环 100 Hz 速度环必须先行调好(路线图 M1), 否则 MPC 的"模型"里速度都不可信, 上层再优也没用。

1.3 MPC 的四个核心要素

| 要素 | 英文 | 作用 | 典型取值(小车) |

| --- | --- | --- | --- |

| 预测时域 | Prediction Horizon | 预演未来多长 | $N = 10\sim50$ 步, 采样 $T_s = 0.05\sim0.1$ s, 总长 1~3 s |

| 代价函数 | Cost Function | 给每种预演打分 | 二次型: 状态误差权重 $Q$ + 控制量权重 $R$ + 终端项 |

| 约束 | Constraints | 硬性红线 | 转角/角速度限幅、加速度/加加速度限幅、状态包络、障碍(虚拟墙) |

| 滚