如果你用过MPC控制一个稍微像样的对象,一定遇到过这种场面:仿真里一切完美,约束守得住,超调也不大,但把同一套预测模型搬到有模型误差和外部扰动的对象上,状态就像脱缰野马一样直接顶到约束边界上,甚至越界。问题不完全出在MPC算法本身,而在于预测模型太“自信”——它假设自己算出来的名义轨迹就是真实轨迹。Tube-MPC(管式模型预测控制)就是针对这个痛点的一种鲁棒控制方案,它把名义预测轨迹和真实轨迹之间的偏离装进一根由鲁棒控制不变集(RCI)决定的“管道”里,真实状态只能在这根管道内波动,因此即使在Lipschitz非线性系统里也能同时保证约束满足和闭环稳定。
这篇文章我会从原理讲到Matlab代码落地,适合对MPC有基础、想进一步理解鲁棒MPC、或者正在做非线性系统控制仿真复现的工程师和研究生。我会避开那种“公式堆完就跑”的写法,尽量把每一步的动机、计算逻辑、参数选择和踩坑经验都交代清楚。
1. 当MPC的“预测之眼”被模型误差蒙蔽:管式结构为什么是更聪明的鲁棒方案
1.1 标称MPC的边界穿越:一个再常见不过的失败场景
说句实话,初次接触MPC的人很容易被它的名字骗了——MPC确实在每一个采样时刻滚动求解一个有限时域最优控制问题,但它求解的是“名义模型”下的最优,不是“真实对象”下的最优。一旦模型和对象之间存在偏差,比如质量参数估不准、摩擦系数变了、外部风扰进来,预测的状态轨迹就只是“看起来很美”。
我举个具体的例子。假设你在做一阶倒立摆的平衡控制,标称模型里摆杆质量m是0.5 kg,实际对象是0.55 kg。MPC在预测窗口里认为,施加某个控制序列后,角度约束可以保持在±0.2 rad以内。但真实对象因为质量偏大,在同样的控制量下响应偏慢,结果第6步预测时感到还稳得住,实际第8步就突破了约束边界的±0.2 rad。这时候MPC还没来得及反应,约束已经被违反。这类情况在含硬约束的实际系统里往往是不可接受的——比如机械臂末端不能撞到障碍物,气压管路压力不能超限。
所以,单纯在预测模型里做“最优”,但完全不对模型失配和外部扰动负责,是标称MPC天生的短板。而解决这个短板的方法很多,最务实的路线之一,就是Tube-MPC。
1.2 min-max MPC为什么大家用得少
早期鲁棒MPC的主流思路是min-max MPC:在每一个采样时刻,把未来所有可能的扰动序列都纳入优化,目标是让最坏情况下的代价最小。这个方法理论很干净——一旦解出来,闭环对所有的扰动场景都有性能保证。但它有一个致命问题:计算量随预测时域和扰动集合维度呈指数增长。
假设扰动集W用多面体表示,每个顶点代表一种扰动实现,预测时域N=10,那么扰动序列的组合数就是顶点数的10次方,这还没考虑状态约束和控制约束。对于Lipschitz非线性系统,min-max问题里还嵌套了非线性动力学,求解难度直接飞升。很多做控制的同行都会说:min-max MPC写论文很漂亮,做工程很痛苦。
那有没有办法把“扰动鲁棒性”和“在线优化复杂度”解耦?Tube-MPC给出了一个很聪明的回答:在线只需解一个常规的名义MPC问题,所有扰动的“吸收”交给离线设计好的误差管和反馈律。
1.3 Tube-MPC的核心思路:名义优化加误差管
Tube-MPC的基本思想可以概括成三句话:
- 名义系统走名义轨迹:MPC在线求解一个不考虑扰动的名义模型,得出一条名义状态轨迹x̄(k)和名义控制序列ū(k)。
- 真实系统跟着名义系统走:真实控制量不直接用ū(k),而是加一项反馈修正u(k) = ū(k) + K·(x(k) − x̄(k)),其中K是离线设计好的反馈增益。
- 误差被“管道”罩住:定义误差e(k) = x(k) − x̄(k),鲁棒控制不变集S保证只要e(k)在S内,不管扰动怎么来,e(k+1)还在S内。
这样一来,在线优化只需要面对名义模型,真实的约束验证只需要在名义约束上“缩”出一个安全裕度:名义状态x̄必须落在状态约束X与S的Pontryagin差集X ⊖ S内,名义控制ū必须落在U ⊖ K·S内。只要这些收缩后的约束满足,那么实际状态x一定满足原始约束X,实际控制u一定落在U。
这个方法在线就是一个普通QP或者NLP,离线多花点时间算集合、算反馈增益,工程可接受度比min-max高得多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Tube-MPC的三根承重柱:名义系统、误差动态和鲁棒控制不变集
2.1 名义系统:“平行世界”里的理想模型
名义系统在许多论文里写作x̄(k+1) = f(x̄(k)) + B·ū(k),它的作用是提供给MPC求解器一个“参考剧本”。需要强调一个容易混淆的点:名义系统不一定要和真实系统完全一样。在Tube-MPC的常见处理中,我们把真实系统的不确定性、模型失配、外部扰动统一折叠进误差系统里,因此名义系统完全可以取一个更简单的线性模型。
在Lipschitz非线性系统场景里,我建议的做法是:取系统的某一参考线性化模型作为名义模型,把所有非线性残差和外部扰动都当作“等效扰动”。这样做的好处非常直接——名义MPC变成一个标准QP,在线求解速度极快,鲁棒性由管和反馈律兜底。代价是保守性:等效扰动变大后,管S会变胖,名义可行域会收缩。这是一个典型的“模型精度与在线计算复杂度”的权衡。
2.2 误差动态与反馈增益K:把偏差往回拽
实际系统的状态更新可以写成:
x(k+1) = f(x(k)) + B·u(k) + d(k)
其中d(k)∈W是有界扰动,可以是外部扰动、建模误差、参数摄动的综合效果。定义误差e(k) = x(k) − x̄(k),并把控制律写成u(k) = ū(k) + K·e(k),代入后得到误差动态:
e(k+1) = [f(x̄(k)+e(k)) − f(x̄(k))] + B·K·e(k) + d(k)
