MPC 入门:一个电驱标定工程师从零开始的学习笔记
阅读说明:这篇是学习笔记,不是经验总结。我刚开始学 MPC,还没跑通 demo(已列入补课路线,见文末)。写下它是因为:①目标岗位 JD 明确要求(大族数控写”PID/LQR/MPC”、易控智驾写”横纵向运动控制 + MPC 预瞄”);②我发现把还不懂的东西讲清楚,是最快的学法。如果你发现理解有偏差,欢迎指出——我把它当作学习的一部分。
1. 为什么一个标定工程师要学 MPC
先说我 4 年用 PID 的体感,再讲为什么还要学 MPC。
PID 很伟大,但它有三个”天生”的局限:
- 不会处理约束:电流限幅、电压限幅、执行器行程……PID 只能在饱和之后”补救”(anti-windup),不能提前规划”我知道要限幅了,所以别把输出逼到极限”;
- 不会处理多变量耦合:车辆横纵向、多轴机器人,一个 PID 管一个环,环与环之间互相打架,要靠解耦/分层这种”外部功夫”;
- 面对大延时很吃力:执行器响应、通信延时一大,PID 要么调不稳、要么调太慢。
MPC(模型预测控制)换了个思路:不用”误差驱动”,用”模型预测未来 + 滚动优化”。我理解它的过程分三步,下面用大白话讲。
2. 核心思想:像开车一样控制
想象你开车要跟上前面一辆车(参考轨迹)。你不会”看到距离误差才踩油门”(那是 PID),你会:
- 预测:看一眼前方的路(模型预测未来几步会怎样);
- 规划:心里盘算”接下来这几秒怎么踩油门刹车最平顺”(解一个优化问题);
- 只执行一步:先按第一秒的动作来;
- 滚动重来:下一秒重新看路、重新规划。
这就是 MPC 的全部思想:预测 → 优化 → 只执行第一步 → 滚动。它和 PID 的本质区别:PID 只看”现在错多少”,MPC 看”未来几步怎么走最优”。
3. 三个要素(我的理解)
- 预测模型:能预测未来 步输出的模型。比如速度环用一阶惯性 + 纯延时: 离散化后写成状态空间 、;
- 滚动时域优化:每个采样周期解一个”未来 步的优化问题”,只执行第一个控制量,下一拍重新求解——这就是”滚动”;
- 反馈校正:每拍用实测输出修正模型预测误差。这一步让 MPC 即使模型不准也不会”一路错下去”——这是 MPC 鲁棒性的来源,也是它和”纯开环最优控制”的本质区别。
4. 数学化:代价函数与约束
每个控制周期要解的优化问题:
同时满足约束(这是 MPC 相对 PID 的核心优势):
直觉理解:
- 大 → 更在乎”跟得准”(响应快,可能振荡);
- 大 → 更在乎”动作平滑”(省执行器,更稳);
- 预测时域 大 → 更”有远见”,但计算量上升、对模型误差更敏感。
线性模型 + 线性约束 + 二次代价 → 每个周期就是一个二次规划(QP),有成熟的求解器(MATLAB MPC Toolbox、osqp、quadprog)。
5. 一个最小速度环例子的手算过程(帮我自己理解”滚动”)
设离散一阶对象 (最简单化),目标 ,无约束,,(先只看跟踪)。
时刻:已知 ,要选 最小化:
代入模型:,。
对 求偏导:由于 ,只要 代价就是 0,最优解是一族而非唯一——均分取 、或全部压在第一拍取 都同样最优; 时(对控制量变化有惩罚)才有唯一解。这里取均分 往下算( 尚可解析; 大了就要上求解器)。关键动作:只执行 , 扔掉——下一拍重新算。这就是”滚动”最朴素的样子。
伪代码(真实实现会用 QP 求解器替换 solve_qp):
for k in range(steps):
u_seq = solve_qp(predict_model(x_k), Q, R, constraints) # 解未来 N 步
u_k = u_seq[0] # 只执行第一步
x_k = plant_step(x_k, u_k) # 实测更新(反馈校正)
6. 与 PID 的工程对比(我的笔记式总结)
| 维度 | PID | MPC |
|---|---|---|
| 约束处理 | 饱和后补救(anti-windup) | 建模时就纳入约束 |
| 多变量 | 需解耦 / 分层 | 统一优化 |
| 大延时 | 很难调稳 | 模型里显式含延时 |
| 计算量 | 极小 | 每周期解 QP |
| 模型依赖 | 低(鲁棒) | 高(模型失配需谨慎) |
工程折中(我目前的理解):模型失配时 MPC 可能比 PID 更差,所以实际系统常用”MPC 做前瞻 + 反馈修正做兜底”,或只在约束关键场景(限幅、安全)启用。这也意味着:我 4 年台架攒下的”被控对象建模”能力(见《参数辨识》)恰好是 MPC 的地基——模型准,MPC 才好用。
7. 我的学习路径(补课计划,随时更新)
- 第 1 步(现在):本文这样的概念笔记,把”预测-优化-滚动”和代价函数理解透;
- 第 2 步:用 MATLAB MPC Toolbox 跑通一个一阶对象的速度环 demo,看波形、调 ,理解每个参数的实际效果;
- 第 3 步:自己写一个最简 QP 版 MPC(
osqp),和 Toolbox 结果对比; - 第 4 步:上车辆纵向速度控制仿真(对应作品 3 方向三选一),对标易控智驾类岗位。
8. 目前我还说不清的地方(诚实清单)
- 无约束时 MPC 和 LQR 的精确关系(据说等价,我要推一遍);
- 模型失配到什么程度 MPC 会劣于 PID——想用一个失配仿真实测;
- 大 时数值稳定性问题。
这些会随学习进度在本文更新——这就是”学习笔记”存在的意义。