公司动态
整车控制中MPC算法原理、MATLAB实现与调试实战指南
简介本资源面向车辆控制算法工程师、智能驾驶方向研究生及MATLAB/Simulink仿真开发者聚焦MPC在整车动力学控制中的工程落地问题涵盖模型预测控制原理、多子系统协同优化设计及CarSim-MATLAB联合仿真验证全流程。压缩包共4个文件2个MATLAB脚本、1个Simulink模型、1个说明文档总大小仅17KB轻量但结构完整.m文件实现MPC控制器核心逻辑与参数配置.mdl模型封装车辆动力学与控制器闭环结构.txt提供关键变量定义、运行步骤与约束条件说明便于快速复现与二次开发。已有2662人学习下载资源内容紧扣第六章典型教学案例覆盖车辆纵向/横向耦合控制建模、预测时域设定、硬约束如轮胎侧偏角、执行器饱和处理及性能指标权衡等实战要点可直接用于课程设计、毕业课题或自动驾驶控制算法原型验证。 做整车控制这些年我最常被问到的一个问题是PID明明已经够用了为什么还要折腾MPC每次遇到这种问题我都会反问一句如果你的目标是让车速在约束范围内快速响应、同时把能耗压到最低还得应付前车突然减速这类突发工况PID还能轻松搞定吗大概率不能。MPC模型预测控制Model Predictive Control在整车控制里的价值恰恰就体现在这种“多目标、带约束、能预判未来”的场景中。这篇博文就围绕整车控制中的MPC算法从原理讲到MATLAB实现再聊一聊我实际调试时踩过的坑和一些排查方法希望能给正在入门或者已经在项目中用MPC的朋友一些参考。先说说适合谁来读。如果你刚接触MPC想搞明白它到底是怎么工作的这篇能帮你把原理部分啃下来如果你已经在整车纵向控制、能量管理或者路径跟踪这类方向干活这篇里的MATLAB实现细节和参数整定经验可以让你少走不少弯路。我默认你对车辆动力学有一点基础也用过MATLAB/Simulink但不要求你有多深的控制理论功底只要会基本的矩阵运算MPC的推导和代码都能跟得上。1. 整车控制里的MPC到底解决什么问题1.1 为什么整车控制场景天然适合MPC先不聊公式咱们从需求倒推。整车控制范畴很广纵向车速控制、ACC自适应巡航、能量管理策略、底盘集成控制、路径跟踪这些场景有一个共同特点它们都带有约束而且是硬约束。车速不能超过物理极限电机输出扭矩有上下限电池SOC不能过充过放制动力不能超过路面附着系数如果你用传统PID这些约束基本靠“限幅”处理也就是先算出一个控制量再把它硬截断在约束范围内。这种粗暴的截断方式带来的问题是你可能在最需要加速的时候恰恰踩了刹车或者为了满足约束而牺牲了本来可以更好的舒适性和经济性。MPC的处理方式不一样。它在每一步优化时就把约束写进优化问题里算出来的控制量天然满足约束而不是算完再截断。而且MPC有一个“预测”能力它可以根据当前状态和模型往前看未来一段时间预测时域的系统行为然后在这段时间内做整体优化。这就好比开车时你不仅看眼前这一点而是看到前方三百米的路况再决定怎么踩油门刹车效果自然比“眼前有什么反应什么”要好。拿ACC自适应巡航举例。前车突然减速传统PID只能检测到距离误差变大了才做出反应多少有点滞后MPC因为在前一步优化时已经把“预测到的前车轨迹”代入模型可以在前车真正减速之前就开始协调发动机和制动系统整个过程更平滑、更接近人类驾驶员的预判行为。这就是整车控制选MPC的核心原因多目标、多约束、可预测三个需求正好是MPC的主场。1.2 MPC和PID、LQR的差异在哪很多人会有疑惑既然LQR也是最优控制为什么不用LQRLQR确实能处理多目标优化而且求解快但它的约束处理能力比较弱需要在设计时把约束“软化”成惩罚项这在实际工程里很难做到精确。PID就更不用说它本质上是偏差驱动的没有预测能力也没有约束概念。我做一个直观的对比。控制方法约束处理预测能力多目标优化计算量工程落地难度PID靠限幅严格说不算约束无弱需要加权合并极低低LQR弱需软约束化无强但难处理硬约束低中MPC强直接写进优化问题有强可灵活调节权重高中高从表里能看出来MPC的强项正是整车控制最看重的点。但它的代价也很明显计算量大需要在线求解一个带约束的优化问题。所以在早期MPC主要用在对算力要求不苛刻的慢过程上比如化工过程控制。近些年随着车载控制器算力提升以及一些高效QP求解器的出现MPC在整车上的实时应用才真正变得可行。这也是为什么现在很多OEM和Tier1都在往MPC方向转型。2. MPC算法原理从预测模型到滚动优化2.1 预测模型先把车辆行为写成状态空间方程MPC一切的地基是预测模型。你不把被控对象的行为描述出来后面的“预测”就是空中楼阁。对整车纵向控制来说最常用的是简化纵向动力学模型我直接给一个经典形式x(k1) A x(k) B u(k)这里的x是状态量通常包含车速v和加速度au是控制输入一般是期望加速度或者电机扭矩请求。如果你只做单纯的纵向速度控制一阶惯性模型也能用如果做ACC状态量里再加上相对距离Δd和相对速度Δv模型维度会高一些。我给你一个我在MATLAB里用得比较顺手的纵向控制状态空间模型例子% 车辆纵向动力学简化模型 % 状态: x [v; a] 车速(m/s), 加速度(m/s^2) % 输入: u acc_des 期望加速度(m/s^2) % 假设: 一阶惯性环节近似动力总成响应, 时间常数为 tao tao 0.5; % 动力总成响应时间常数根据实际整车标定 Ts 0.05; % 控制周期50ms A_cont [0 1; 0 -1/tao]; B_cont [0; 1/tao]; C_cont [1 0]; % 离散化 sys_cont ss(A_cont, B_cont, C_cont, 0); sys_disc c2d(sys_cont, Ts, zoh); A sys_disc.A; B sys_disc.B; C sys_disc.C;这个模型里有个关键参数tao时间常数它代表了从你发出期望加速度指令到车辆实际加速度变化之间的延迟和惯性。这个数值不是拍脑袋定的而是通过实车标定的比如你做阶跃响应测试记录期望加速度和实际加速度拟合出一阶惯性模型的tao。不同车型、不同动力总成形式纯电、混动、燃油差异很大纯电车响应快tao可能在0.2到0.3左右燃油车带涡轮增压的可能到0.8以上。2.2 滚动优化核心思想就一句话反复做MPC区别于“一次性算完就不管”的控制方法在于它每步都在做优化而且只执行第一步的结果。我把它拆成三步在当前时刻k读取系统当前状态x(k)。基于预测模型向前滚动预测未来Np步的状态然后求解一个优化问题得到未来Nc步最优控制序列。只把控制序列的第一步u(k)作用到系统上。到k1时刻重新采样状态重复以上过程。这就是“滚动优化”或“滚动时域控制”的本质。为什么要这么麻烦因为模型有误差、外部有扰动你一次性算出来的未来控制序列在实际情况中根本不准确。每步重新优化相当于用最新的反馈信息去修正预测误差这也是MPC鲁棒性的来源之一。我举个例子。假设你在高速上跑ACC预测模型认为前方车辆会匀速行驶所以MPC算出未来十步的控制序列但你只执行当前这一步的加速度。过了50毫秒你发现前车踩刹车了此时MPC重新采样到新的相对距离和相对速度再重新优化输出新的控制量。这种“走一步看一步、看一步算一步”的策略保证控制始终基于最新信息。2.3 代价函数MPC怎么表达“我想要什么”MPC优化问题里核心是代价函数。整车控制里最常用的代价函数可以写成J Σ(i1..Np) ||y(ki) - y_ref(ki)||²_Q Σ(i0..Nc-1) ||u(ki)||²_R看着有点吓人说白了就是“跟踪误差越小越好控制量越平稳越好”。第一项是预测输出和目标参考轨迹的误差平方和相当于司机眼里“车速和设定值的偏差”第二项是控制量大小的惩罚相当于司机踩油门的平顺性考量。Q和R就是这两者之间的权重平衡。Q大代表你更在意跟踪精度系统响应偏激进R大代表你更在意控制动作平缓系统响应偏保守。除了代价函数约束条件也是MPC的精髓。整车控制里最常见的约束有控制量约束u_min ≤ u(ki) ≤ u_max对应电机/发动机最大和最小输出能力。控制增量约束Δu_min ≤ Δu(ki) ≤ Δu_max对应加速度变化率限制直接关系到平顺性。状态约束a_min ≤ a(ki) ≤ a_max保证乘客舒适性和车辆稳定性。最终MPC每一步要解的是一个带约束的二次规划QP问题。它的标准形式是min 1/2 x H x f x s.t. Ax ≤ bMATLAB里只要把模型和代价函数写出来工具箱会自动帮你拼装这个QP然后调用求解器解出来。但如果你想真正理解MPC最好自己手推一遍QP的构造过程后面讲MATLAB实现的时候我会展示怎么一步步拼装。3. MATLAB/Simulink实现MPC的完整流程3.1 搭模型用Simulink搭一个被控车辆MATLAB/Simulink是整车控制开发最常用的平台没有之一。我一般把MPC实现分成三个模块被控对象模型、控制器、以及可视化分析模块。被控对象模型有两种选择一是用Simscape搭物理模型二是用数学方程搭简化模型。对于MPC算法的验证阶段我建议先用简化模型因为调试方便、算得快逻辑和结果对上了再往Simscape或者Simulink自带的车辆动力学库里换。我分享一个最简单的纵向车速控制Simulink搭建思路被控对象第二章里的离散状态空间模型用State-Space模块封装。MPC控制器可以用MPC Toolbox的MPC Controller模块也可以后面我讲的手写代码方式。输出显示用Scope查看车速跟踪曲线、控制量曲线用Display实时看数值。这里有个容易踩的坑MPC Controller模块默认输入是“被控对象输出y”和“参考输入ref”很多新手会把状态x直接接进去结果老是报维度不匹配。你需要先用Measurements端口给控制器反馈可测量的输出一般是车速v然后MPC内部会通过状态观测器Kalman滤波估计完整状态。如果你直接把状态都测到了比如Simulink模型里状态很容易拿到可以在MPC Controller模块里配置“所有状态可测”这样反而更稳定。3.2 用MPC Toolbox快速实现MPC Toolbox是最省事的方式适合走整体流程验证。它的使用路径很清晰先在MATLAB工作区创建MPC对象然后配置预测模型、采样时间、预测时域、控制时域、权重和约束最后丢到Simulink里仿真。我写一段典型的MPC对象创建代码% 假设已经有离散模型 sys_disc % 创建MPC控制器 mpc_obj mpc(sys_disc, Ts); % 设置预测时域和控制时域 mpc_obj.PredictionHorizon 20; mpc_obj.ControlHorizon 3; % 权重设置: 输出(车速)权重高, 控制量权重适中 mpc_obj.Weights.OutputVariables 1; mpc_obj.Weights.ManipulatedVariables 0.1; mpc_obj.Weights.ManipulatedVariablesRate 0.5; % 约束设置: 期望加速度范围 mpc_obj.ManipulatedVariables.Min -3; % m/s^2 最大制动减速度 mpc_obj.ManipulatedVariables.Max 2; % m/s^2 最大加速度 mpc_obj.ManipulatedVariables.RateMin -1; % 加速度变化率 mpc_obj.ManipulatedVariables.RateMax 1;这里的关键参数含义我先点一下PredictionHorizon预测时域Np是20代表预测未来20步也就是1秒20 × 50ms。这个长度要覆盖系统主要动态过程。如果太短MPC“看不到”更远的影响约束可能压不住如果太长计算量增大而且远处的预测权重小实际意义不大。ControlHorizon控制时域Nc是3代表未来只允许3步控制量自由变化后面的控制量保持不变。Nc小可以减少优化变量数量显著降低计算量是实车部署时常用的压缩手段。Weights里三个权重分别对应输出跟踪、控制量大小和控制量变化率。我把控制量变化率权重设成0.5是为了让加速度请求变化平缓避免顿挫感。设置完对象后你可以在MATLAB里用sim函数离线仿真也可以在Simulink里拖MPC Controller模块。我建议先跑离线仿真打开mpcobj的仿真结果图看看跟踪效果和约束满足情况再进Simulink闭环验证。3.3 手写MPC代码绕过工具箱真正吃透原理工具箱虽好但有一个问题你很难真正理解内部发生了什么。我强烈建议每个想深入MPC的人至少手写一遍无约束或简单约束的MPC这样才能在遇到问题时不至于整个就是黑盒。这里我给一个基于Yalmip封装的MPC求解代码框架方便理解问题定义和求解过程% 手写MPC: 基于Yalmip求解QP % 状态方程: x(k1) A*x(k) B*u(k) % 代价: 跟踪车速v_ref, 惩罚控制量变化 Np 20; Nc 3; % 定义优化变量 u sdpvar(1, Nc); % 控制序列 x sdpvar(2, Np1); % 状态序列 % 约束和代价初始化 constraints []; cost 0; % 初始状态约束 constraints [constraints, x(:,1) x0]; % 预测循环 for i 1:Np if i Nc u_i u(i); else u_i u(Nc); % 控制时域之后保持不变 end % 状态更新方程 constraints [constraints, x(:,i1) A*x(:,i) B*u_i]; % 约束: 控制量限幅 constraints [constraints, -3 u_i 2]; % 代价: 输出跟踪误差 控制量惩罚 cost cost (x(1,i) - v_ref(i)) * Q_out * (x(1,i) - v_ref(i)); cost cost u_i * R_in * u_i; end % 配置求解器 options sdpsettings(solver, quadprog, verbose, 0); % 求解 optimize(constraints, cost, options); % 取第一个控制量 u_first value(u(1));这段代码的风格是把MPC问题“直接写出来”让求解器去解。Yalmip的优点是代码接近数学描述适合学习和验证。实际工程部署时一般不会用Yalmip而是用QP求解器比如OSQP、qpOASES、MATLAB自带的quadprog配合C代码生成但理解思路是完全一致的。我自己带团队时要求每个工程师先用这段代码跑通一个简单纵向控制再允许用工具箱就是怕大家只会填参数、不会看本质。实际过程中一旦你手写一遍后面的参数整定、问题分析效率会明显高一个台阶。3.4 完整闭环验证从仿真代码到Simulink光有控制器代码还不够你得把它放进闭环里验证。我一般是这样操作的第一步先用纯MATLAB脚本做闭环仿真不拖Simulink。这一步能快速验证算法逻辑排除模型问题。我把被控对象也写进去用for循环模拟每个采样周期的控制过程% 闭环仿真 simTime 10; % 秒 steps simTime / Ts; x [0; 0]; % 初始车速为0 logV zeros(steps, 1); logU zeros(steps, 1); time 0:Ts:simTime-Ts; % 参考车速: 从0加速到20m/s v_ref_profile min(20, time * 2); for k 1:steps x0 x; v_ref v_ref_profile(min(k, length(v_ref_profile))); % 调用MPC求解得到控制量 % (这里以手写MPC函数为例) u_k run_mpc_controller(A, B, x0, v_ref, Np, Nc); % 施加到被控对象 x A * x B * u_k; % 记录数据 logV(k) x(1); logU(k) u_k; end第二步验证通过之后再进Simulink把MPC Controller替换成手写MPC模块用MATLAB Function 或者 S-Function 封装接上更精细的车辆模型看看在模型复杂度升高后MPC还能不能保持性能。这一步能暴露很多纯脚本阶段发现不了的问题比如模型失配、数值稳定性、求解器收敛等。我踩过的一个很典型的坑是纯脚本仿真里被控对象也是简单的线性模型MPC控制效果完美但一进Simulink换成Simscape高保真模型参数完全没调结果车速震荡甚至发散。原因就是MPC内部的预测模型和实际被控对象失配太严重。后面我会专门讲这个问题怎么处理。4. 参数整定与实操经验4.1 预测时域和控制时域的选择逻辑参数整定是MPC落地的关键一环。很多新手一上来就问Np取多少合适Nc取多少合适我没法给一个放之四海而皆准的数值但可以给一套判断逻辑。预测时域Np的选择要覆盖系统的主要瞬态过程。你可以先对被控对象做一个开环阶跃响应观察它从初始状态到稳定大约需要多长时间然后把这段时间除以采样周期Ts就得到一个粗略的Np基准值。比如车辆从0加速到20m/s可能需要2到3秒采样周期50ms那Np至少应该做到40到60步。但Np也不是越大越好Np过大时远处的预测误差累积QP规模变大而且远期目标对当前决策的贡献逐渐变小容易造成数值病态。我的经验是Np覆盖主要动态过程的1到1.5倍就够了。控制时域Nc的选择逻辑不同。Nc本质上决定了优化问题的自由度Nc越大控制序列的可变性越强性能理论上越好但计算量成比例增加。整车控制实时性要求高我通常把Nc控制在3到5之间。如果你用Np20、Nc3优化变量就是3个求解速度非常快如果你把Nc提到20优化变量就变成20个实时性可能就顶不住了。这里有个工程技巧Nc不需要等于Np因为MPC的控制特点是“未来的控制动作会逐步修正”你只需要给近期足够的自由度远期由约束保持稳定即可。4.2 权重Q和R怎么调才不会“翻车”权重整定是MPC最玄学也最有规律的部分。我的方法分三步走。第一步先把权重拉到“只关注跟踪”的状态也就是Q取较大值、R取较小值看系统在满足约束的前提下能跑到多快。这个过程通常会看到控制量快速抖动、接近约束边界甚至出现小幅超调。这不要紧目的是找到系统的性能上限。第二步逐步增大R和控制量变化率权重看跟踪性能下降的趋势找到“性能和平顺性”的折中点。我一般会观察两个指标一个是车速跟踪的上升时间和稳态误差另一个是控制量变化的最大速率。如果控制量变化太激进乘客会感觉到顿挫即使在仿真里不体现实车也会被标定工程师毙掉。第三步把权重固定下来后做一次极端工况扫描比如急加速到目标车速、高速情况下制动减速、连续坡道巡航看权重参数在所有工况下是否都能保持合理。如果某个工况下出现较大振荡优先增大控制量变化率权重而不是增大Q。因为振荡的根源是控制动作太激进通过R来抑制往往比通过Q来强压更有效。这里有一组我常用的初始参考值你可以作为起点输出权重Q车速误差权重取1左右。控制量权重R取0.1到0.5之间具体看平顺性需求。控制量变化率权重取0.2到0.8之间这是平顺性的主力调节旋钮。这组初始值大概率不会让你一上来就失控但最终还是要根据实际工况微调没有捷径。4.3 约束设置的一些经验教训约束是MPC的核心优势也是最容易出问题的地方。我总结三个常见教训。第一约束上下限不要贴死物理极限。比如电机的最大加速度是3m/s²你如果真把约束设成3MPC在优化时会频繁碰到边界一旦模型误差或者噪声让实际车辆越过约束你根本没留缓冲空间。我习惯留5%到10%的裕量比如设成2.7到2.8。第二约束之间要协调。比如你对控制量限幅的同时又对控制量变化率限幅这两个约束可能互相冲突导致QP无解。遇到这种情况MPC会报infeasible problem仿真直接中断。解决方法是给约束加“软约束”的松弛变量slack variable允许约束在极端情况下被轻微违反同时在代价函数里加上对松弛量的惩罚。用工具箱时可以通过设置OutputVariables的Soft Constraint来实现手写代码时则需要在QP里显式加入松弛变量。第三不要忽视状态约束对可解性的影响。例如你加入加速度上限约束但参考车速本身变化太快导致系统为了跟踪参考而必须请求超出约束的加速度此时QP也会无解。你需要检查参考轨迹的物理可实现性或者把参考轨迹生成模块也纳入MPC的预测框架里让MPC知道未来参考的变化趋势提前调整输出。5. 常见问题与排查技巧实录5.1 QP求解失败、系统发散怎么查在实际仿真和实车调试中最让人头疼的就是“上一秒还好好的下一秒控制器突然罢工”。我按经验列一个排查顺序按这个顺序查能省不少时间。第一确认模型离散化是否正确。很多新手用c2d离散化之后直接把连续模型的A、B矩阵拿来当离散模型用这会导致预测完全错误。务必检查sys_disc的极点是否在单位圆内A矩阵是否符合离散模型的特征。第二确认QP求解器是否收敛。用工具箱时打开仿真诊断观察是否有“The QP solver failed to find a solution”之类的提示。如果频繁出现多半是约束太紧或者权重病态。可以先放松约束或者改求解器比如从默认的KWIK算法换成QP算法。第三确认采样时间是否与实际控制器周期一致。MPC内部的模型离散化基于Ts如果你的Simulink仿真步长和MPC的Ts不匹配会导致控制量输出与实际系统状态不同步严重时出现震荡。我推荐在Simulink里用固定步长求解器并且步长等于MPC的Ts或者更小比如Ts/2这样能减少这种问题。5.2 关于模型失配问题的一些经验MPC的性能上限取决于预测模型的准确度这是一个绕不开的事实。纯车仿真里模型匹配度高效果好看实车跑起来轮胎打滑、路面坡度、风阻、电池SOC变化导致的动力响应差异都会让预测模型失真。我常用三种手段应对模型失配。第一种在预测模型里增加扰动项。就是在状态方程里加一个常数项或者可估计的扰动比如x(k1) A x(k) B u(k) d(k)这个d(k)可以在线估计比如用扩展Kalman滤波把坡度阻力、风阻等未建模扰动统一估计出来代入MPC预测。这是最实用也见效最快的方法Model Adaptive MPC或者说带扰动补偿的MPC就是干这个的。第二种把模型参数做成调度表。比如tao动力总成时间常数随车速和挡位变化你可以做一个二维查表供MPC模型查取当前工况的参数。这种方法不需要复杂的在线辨识工程实现简单稳定性好。第三种采用鲁棒MPC或者Tube-based MPC。这类方法把模型不确定性显式考虑进优化里代价是计算量增加不少。现阶段在整车控制器上量产应用还不多但对复杂工况的前期研究很有价值。如果你想往深了做这是个很好的方向。5.3 计算实时性不够怎么优化MPC上实车最大的拦路虎就是实时性。我见过有些控制器的CPU主频不算低但一跑MPC一个控制周期内算不完整个控制节奏就乱了。优化思路可以从三个层面入手。算法层面第一条路是减小Nc这是立竿见影的。Nc从10降到3优化变量减少到原来的三分之一单步求解时间几乎线性下降。第二条路是简化预测模型比如把二阶模型简化成一阶预测精度损失不大但QP规模明显缩小。第三条路是采用显式MPCExplicit MPC它把在线QP求解转化为查表计算时间基本可以忽略不计代价是需要离线生成一个庞大的分区查找表适合小状态维度的场景。工程层面你可以把MPC控制器放到独立的核或者独立MCU上跑与整车其他功能隔离避免其他任务抢占CPU。另外用MATLAB Coder把MPC算法生成C代码后编译优化比如使用-O2甚至-O3对实时性提升很明显。数值层面注意避免大数小数的病态矩阵。比如你状态量是车速几十的量级控制量是加速度个位数量级代价函数里的权重矩阵如果量级差距太大QP求解器收敛会很慢。解决方法是先对状态和控制量做归一化让它们都在0到1或-1到1的范围内再进入MPC计算。这个技巧我在多个项目里验证过对求解时间和稳定性都有明显改善。6. 后续扩展方向MPC在整车控制上远不止纵向车速控制这一个应用。我现在看到比较热的几个方向包括电池热管理和能量管理协同的MPC、四轮独立驱动车辆转矩分配的MPC、智能驾驶场景下轨迹规划和跟踪一体化的MPC还有面向整车执行器冗余容错控制的MPC。每个方向本质上都是把MPC预测和约束的优势叠加到更复杂的系统模型和控制目标上。如果你想把MPC往应用层面进一步做实我个人建议往能量管理层走一走。因为能量管理天然是一个强约束、多目标、存在未来信息比如导航工况预测的问题和MPC的特性非常契合。而且能量管理对算力的要求不如底盘子系统那么苛刻是MPC量产落地比较务实的切入点。另外我个人在实际操作中的一个体会是MPC这门技术原理说实话三天能讲完但真正要让它在一台车上稳定跑起来靠的是接下来三个月甚至更长时间的调参、试错和模型打磨。你可以把MPC看作一个好用的工具箱它给你提供了强大的框架但最终效果还得看你对被控对象的理解程度。工程师的功夫往往不在公式推导上而在面对一堆仿真曲线时能快速判断出“是模型不对、权重不当还是约束设置失衡”的那种感觉。这种东西没法速成啃过几个实际项目自然就有了。最后再分享一个小技巧不管你在什么项目里用MPC前期一定先把数据记录和可视化做全。把状态轨迹、控制输入、约束边界、参考轨迹全部存下来出问题时一条条曲线翻比看任何日志都管用。MPC调试的绝大多数问题都是通过“看曲线不对劲”这个直觉诱因才一步步定位到根因的。这个习惯建议从你第一个MATLAB仿真就开始养成。本文还有配套的精品资源点击获取