← 全部文章

MPC 入门:一个电驱标定工程师从零开始的学习笔记

2026-08-30MPC · 模型预测控制 · 学习笔记 · 速度环 · 车辆控制

阅读说明:这篇是学习笔记,不是经验总结。我刚开始学 MPC,还没跑通 demo(已列入补课路线,见文末)。写下它是因为:①目标岗位 JD 明确要求(大族数控写”PID/LQR/MPC”、易控智驾写”横纵向运动控制 + MPC 预瞄”);②我发现把还不懂的东西讲清楚,是最快的学法。如果你发现理解有偏差,欢迎指出——我把它当作学习的一部分。

1. 为什么一个标定工程师要学 MPC

先说我 4 年用 PID 的体感,再讲为什么还要学 MPC。

PID 很伟大,但它有三个”天生”的局限

  1. 不会处理约束:电流限幅、电压限幅、执行器行程……PID 只能在饱和之后”补救”(anti-windup),不能提前规划”我知道要限幅了,所以别把输出逼到极限”;
  2. 不会处理多变量耦合:车辆横纵向、多轴机器人,一个 PID 管一个环,环与环之间互相打架,要靠解耦/分层这种”外部功夫”;
  3. 面对大延时很吃力:执行器响应、通信延时一大,PID 要么调不稳、要么调太慢。

MPC(模型预测控制)换了个思路:不用”误差驱动”,用”模型预测未来 + 滚动优化”。我理解它的过程分三步,下面用大白话讲。

2. 核心思想:像开车一样控制

想象你开车要跟上前面一辆车(参考轨迹)。你不会”看到距离误差才踩油门”(那是 PID),你会:

  1. 预测:看一眼前方的路(模型预测未来几步会怎样);
  2. 规划:心里盘算”接下来这几秒怎么踩油门刹车最平顺”(解一个优化问题);
  3. 只执行一步:先按第一秒的动作来;
  4. 滚动重来:下一秒重新看路、重新规划。

这就是 MPC 的全部思想:预测 → 优化 → 只执行第一步 → 滚动。它和 PID 的本质区别:PID 只看”现在错多少”,MPC 看”未来几步怎么走最优”。

时间 k y 过去(已发生) 现在(k) 参考轨迹(目标) 预测输出(模型预测的未来 N 步) 预测时域 N 只执行第一步 u(k),下一拍整体右移重新优化(滚动)

3. 三个要素(我的理解)

  1. 预测模型:能预测未来 NN 步输出的模型。比如速度环用一阶惯性 + 纯延时: G(s)=Kτs+1eTdsG(s) = \frac{K}{\tau s + 1} e^{-T_d s} 离散化后写成状态空间 xk+1=Axk+Bukx_{k+1} = A x_k + B u_kyk=Cxky_k = C x_k
  2. 滚动时域优化:每个采样周期解一个”未来 NN 步的优化问题”,只执行第一个控制量,下一拍重新求解——这就是”滚动”;
  3. 反馈校正:每拍用实测输出修正模型预测误差。这一步让 MPC 即使模型不准也不会”一路错下去”——这是 MPC 鲁棒性的来源,也是它和”纯开环最优控制”的本质区别

4. 数学化:代价函数与约束

每个控制周期要解的优化问题:

minu0,,uN1  J=k=0N1(ek+1TQek+1+ΔukTRΔuk),ek+1=yk+1yref\min_{u_0, \dots, u_{N-1}} \; J = \sum_{k=0}^{N-1} \left( e_{k+1}^{T} Q\, e_{k+1} + \Delta u_k^{T} R\, \Delta u_k \right), \qquad e_{k+1} = y_{k+1} - y_{ref}

同时满足约束(这是 MPC 相对 PID 的核心优势):

uminukumax,ΔuminΔukΔumaxu_{min} \le u_k \le u_{max}, \qquad \Delta u_{min} \le \Delta u_k \le \Delta u_{max}

直觉理解:

线性模型 + 线性约束 + 二次代价 → 每个周期就是一个二次规划(QP),有成熟的求解器(MATLAB MPC Toolbox、osqpquadprog)。

5. 一个最小速度环例子的手算过程(帮我自己理解”滚动”)

设离散一阶对象 xk+1=xk+ukx_{k+1} = x_k + u_k(最简单化),目标 xref=10x_{ref} = 10,无约束,N=2N = 2Q=1,R=0Q = 1, R = 0(先只看跟踪)。

kk 时刻:已知 xkx_k,要选 uk,uk+1u_k, u_{k+1} 最小化:

J=(xk+110)2+(xk+210)2J = (x_{k+1} - 10)^2 + (x_{k+2} - 10)^2

代入模型:xk+1=xk+ukx_{k+1} = x_k + u_kxk+2=xk+uk+uk+1x_{k+2} = x_k + u_k + u_{k+1}

uk,uk+1u_k, u_{k+1} 求偏导:由于 R=0R = 0,只要 uk+uk+1=10xku_k + u_{k+1} = 10 - x_k 代价就是 0,最优解是一族而非唯一——均分取 uk=uk+1=10xk2u_k = u_{k+1} = \frac{10 - x_k}{2}、或全部压在第一拍取 uk=10xku_k = 10 - x_k 都同样最优;R>0R > 0 时(对控制量变化有惩罚)才有唯一解。这里取均分 uk=10xk2u_k = \frac{10 - x_k}{2} 往下算(N=2N=2 尚可解析;NN 大了就要上求解器)。关键动作:只执行 uku_kuk+1u_{k+1} 扔掉——下一拍重新算。这就是”滚动”最朴素的样子。

伪代码(真实实现会用 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 的工程对比(我的笔记式总结)

维度PIDMPC
约束处理饱和后补救(anti-windup)建模时就纳入约束
多变量需解耦 / 分层统一优化
大延时很难调稳模型里显式含延时
计算量极小每周期解 QP
模型依赖低(鲁棒)高(模型失配需谨慎)

工程折中(我目前的理解):模型失配时 MPC 可能比 PID 更差,所以实际系统常用”MPC 做前瞻 + 反馈修正做兜底”,或只在约束关键场景(限幅、安全)启用。这也意味着:我 4 年台架攒下的”被控对象建模”能力(见《参数辨识》)恰好是 MPC 的地基——模型准,MPC 才好用。

7. 我的学习路径(补课计划,随时更新)

  1. 第 1 步(现在):本文这样的概念笔记,把”预测-优化-滚动”和代价函数理解透;
  2. 第 2 步:用 MATLAB MPC Toolbox 跑通一个一阶对象的速度环 demo,看波形、调 Q/R/NQ/R/N,理解每个参数的实际效果;
  3. 第 3 步:自己写一个最简 QP 版 MPC(osqp),和 Toolbox 结果对比;
  4. 第 4 步:上车辆纵向速度控制仿真(对应作品 3 方向三选一),对标易控智驾类岗位。

8. 目前我还说不清的地方(诚实清单)

这些会随学习进度在本文更新——这就是”学习笔记”存在的意义

相关项目