尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Apollo MPC横纵向耦合控制全解析:从原理到实车调试

Apollo MPC横纵向耦合控制全解析:从原理到实车调试 最近在啃Apollo的控制模块花了不少时间把MPC横纵向耦合控制这部分学了一遍。老实说刚接触这个概念时我是有点困惑的——因为之前做车辆控制脑子里根深蒂固的思路都是“横向归横向、纵向归纵向”把转向和加减速拆成两个独立问题来解。Apollo这套MPC控制器则把前轮转角和加速度同时放在一个优化问题里求解属于典型的横纵向耦合控制。这篇学习笔记我试图把整条逻辑链串起来为什么需要耦合、MPC凭什么能做耦合、Apollo里的工程实现长什么样、参数怎么调、实车调试会踩哪些坑。不管你是正在读Apollo源码的学生还是做工程落地的控制工程师希望这篇能帮你少走我走过的弯路。1. 横纵向耦合控制到底在解决什么问题1.1 分离控制为什么会成为主流在进入Apollo的MPC细节之前我觉得有必要先聊清楚一个更根本的问题既然横纵向耦合在物理上真实存在为什么业内主流的方案仍然是分离控制答案绕不开工程直觉。横向控制面对的是转向系统输出量是前轮转角或者方向盘转角关心的是路径跟踪误差、航向偏差这些几何量纵向控制面对的是动力总成和制动系统输出量是加速度请求关心的是速度跟踪、跟车距离这些标量。两者的执行器不同、响应带宽不同、传感器反馈不同拆开做的好处太明显了每个控制器可以单独调试、单独标定、单独做故障处理出了问题时也能很快定位到是横向还是纵向链路出了问题。从团队协作和工程排障的角度讲分离控制是极其理性的选择。所以在大多数常规工况下分离控制没有任何问题。低速园区巡航、平直高速、普通城市道路车辆轮胎远没有接近附着极限横向动态和纵向动态之间的相互作用很弱完全可以当成两个独立系统来设计。1.2 耦合的物理来源不止“车速影响横向”但是“能解耦”不代表“真的解耦了”。横纵向耦合在物理上有好几层来源理解这些来源是看懂Apollo MPC设计动机的前提。第一层是最直观的运动学耦合。车辆横向加速度和纵向速度的平方成正比a_y v_x² * κκ是路径曲率。这个公式意味着同样的转弯半径车速从30km/h提到60km/h需要的横向加速度翻四倍。纵向速度的变化会直接影响横向动力学特性这是最基础、也最不可避免的一层耦合。第二层是轮胎力层面的耦合比第一层更隐蔽、也更致命。轮胎能够提供的摩擦力是有限的纵向力和侧向力共用同一个“摩擦圆”。急加速或者重刹时纵向力占用了大量附着余量轮胎能够提供的侧向力就会下降车辆的横向稳定裕度随之降低。这个现象在低附着路面上尤其明显——冰雪路面上大脚油门哪怕方向盘没怎么动车辆也会感觉“发飘”本质就是侧偏刚度随着纵向滑移率变化而剧烈退化。第三层是动态载荷转移带来的耦合。纵向加速时车辆后仰、制动时点头每个车轮的垂直载荷会重新分配。而轮胎的侧偏刚度又和垂直载荷强相关所以纵向工况的变化直接改变了整车的横摆响应特性。这三层耦合叠加在一起在某些极端工况下会让分离控制变得非常脆弱。例如高速入弯时纵向控制器还在按照规划速度正常减速但减速度本身已经削弱了前轮的侧向力储备如果此时横向控制器又给出了较大的转角请求两者就会打架反映到车辆上就是横摆振荡、车身姿态不稳定。1.3 哪些工况下耦合效应必须正视我总结了几类如果不考虑耦合就会出问题的典型工况供大家判断自己的项目是否需要上MPC这类耦合控制器。高速大曲率匝道/连续S弯曲率大、车速高横向加速度接近轮胎附着极限。此时如果纵向控制器独立工作对速度的调节没有考虑当前横向加速度的余量很容易在弯中触发车身失稳。紧急避障同时需要大转角和大制动轮胎力耦合最严重的工况。分离控制下横向控制器和纵向控制器各自索要轮胎力轮胎的总附着力一旦被超过后果就是侧滑甚至甩尾。低附着路面雨雪、结冰路面附着系数本身就低轮胎侧偏特性对纵向力极其敏感此时即使普通的转弯加轻微制动都可能导致横向响应异常。自动泊车/窄路调头虽然速度低但曲率极大纵向的微小速度波动会显著改变最小转弯半径和航向角变化率纯运动学层面的耦合也需要去处理。所以你会发现耦合控制的必要性不是由“算法先进”决定的而是由车辆是否接近物理边界决定的。常规工况分离控制完全够用但一旦逼近极限就需要一个能把横纵向放在同一框架下统筹优化的控制器。这也正是Apollo引入MPC控制器的核心动机。2. MPC为什么天然适合做横纵向耦合2.1 从“预测”的角度理解MPC我在学习MPC之前一直觉得它无非是“一个高级点的最优控制器”后来真正上手才意识到它的核心不是调节器设计而是“预测与滚动优化”的思维方式。MPC在每个控制周期做这样几件事基于当前状态和车辆模型向前预测未来N个步长的状态变化在预测的这N步内寻找一组控制序列使得某个代价函数最小只执行这组控制序列的第一步然后进入下一个周期重新采一次状态重新预测、重新优化。这个过程通常被称为“滚动时域优化”再加上“反馈校正”和“预测模型”就是MPC的完整闭环。为什么这种“向前看几步”的方式天生适合横纵向耦合因为横纵向之间的相互作用往往不是瞬时的而是具有明显的时序延迟和动态累积效应。举个例子入弯前就开始减速比在弯道里一边打方向一边急刹要安全得多。分离控制很难做到这种前瞻性协调因为它没有统一的预测框架而MPC的预测模型天然能看到“如果现在不减速进入弯道后横向误差会多大”这种因果关系。2.2 多输入多输出天然适合统一定义控制任务横纵向耦合控制本质上是一个多输入多输出的问题——控制量有两个前轮转角或方向盘转角和纵向加速度或油门/刹车指令被控量也很多横向位置偏差、航向角偏差、纵向速度偏差、横摆角速度等等。MPC处理多输入多输出的方式非常优雅把所有状态和控制量写进一个状态空间模型再通过目标函数里的权重矩阵来统一权衡。横向误差和纵向误差在同一个代价函数里比较谁重要、谁优先变成了一组可调的权重数字而不是两个控制器之间的逻辑协调。这一点在调参时体验尤其明显。分离控制下如果高速过弯时车辆出现横向不稳你需要同时改横向控制器的增益和纵向控制器的减速度门限两个参数之间的相互作用很难量化。而MPC里你只需要调整目标函数中横向误差项和纵向误差项之间的相对权重这一点我后面会在参数整定部分详细展开。2.3 约束是MPC的最强项如果说预测给了MPC“远见”那么约束处理能力就是MPC的“安全带”。真实车辆控制中的约束无处不在前轮转角有物理饱和限位加速度要考虑舒适性边界转向角速度受转向电机能力限制车辆行驶速度也不能超过安全范围。传统PID或者LQR面对这些约束通常只能做外围处理输出限幅、抗积分饱和、前馈补偿这些措施本质上都是“先算出结果再修剪”并不能保证修剪后的控制量仍然是最优的。MPC则不同它可以在求解优化问题之前把所有这些约束显式地写进问题里。求解器返回的控制序列天然满足所有约束。更进一步轮胎摩擦圆的约束虽然是非线性的但也可以用线性不等式组近似逼近比如把摩擦圆近似为多边形然后直接放进QP二次规划问题里求解。这个能力在横纵向耦合控制中价值极大。因为它意味着“横向控制请求的转角和纵向控制请求的加速度”可以从求解层面就被约束在轮胎可提供的摩擦力范围之内而不是像分离控制那样靠两个控制器各自去猜测对方的动作。2.4 与传统控制器的对比对比维度PIDLQRMPC对模型的需求基本不需要靠误差反馈需要线性状态空间模型需要预测模型允许时变多变量协调能力弱各回路独立设计中可通过状态权重协调强统一优化框架约束处理难只能外围限幅难通常只能软处理强显式纳入求解预瞄/前瞻能力无纯事后反馈无需要额外加前馈天然具有预测能力计算开销极低低较高依赖求解器调参复杂度直观中等需要理解权重物理意义典型适用场景常规跟车/直线高速巡航/弱非线性极限工况/强耦合/强约束从表格可以直观看出MPC不是一个“替代PID的更好选择”而是一个“面对不同问题的不同工具”。如果你的工况耦合效应弱、约束不紧张用MPC反而复杂且浪费算力。3. Apollo MPC控制器的工程架构与模型搭建3.1 Apollo控制模块的位置与数据流Apollo整个自动驾驶软件栈中控制模块Control夹在规划模块Planning和底盘执行模块Canbus之间。Planning模块输出期望轨迹是一连串带有时间戳的轨迹点每个点包含位置、速度、加速度、曲率等信息。Control模块拿到这些轨迹点后结合定位模块输出的车辆实时位姿在当前控制周期内计算出方向盘转角、油门开度/刹车压力等控制指令通过Canbus下发给底盘执行。我在读Apollo Control代码时发现controller目录下其实同时存在多种控制器主要包括LAT_CONTROLLER横向LQR控制器、LON_CONTROLLER纵向控制器以及MPC_CONTROLLER横纵向耦合MPC控制器。在旧版本中默认的组合是用LQR做横向控制、lon_controller做纵向控制而MPC控制器则是作为一个整体控制器把横纵向联合起来求解。我建议初学者不要一上来就钻到mpc_controller.cc的细节里而是先去读一下Control模块的数据流上游轨迹是什么样的消息结构、下游控制指令如何封装、控制周期是多少毫秒。把这些链路理清了再去看MPC求解出来的数值到底被送到了哪里会通透很多。3.2 车辆模型状态量与控制量的定义Apollo的MPC控制器使用的车辆模型本质上是基于参考轨迹的误差状态空间模型。为什么不用最简单的运动学自行车模型x、y、航向角因为控制的目标不是“追踪一个绝对坐标”而是“跟踪一条参考轨迹上的对应点”。如果直接用惯导输出的绝对位置作为状态目标值会随参考点移动而不停变化控制问题就变成时变的跟踪问题处理起来很麻烦。改用误差模型之后控制目标就变成了“让误差状态趋向零”。Apollo MPC的状态向量大致包含这样几类不同版本会有差异我按理解列出主要分量横向位置偏差车辆当前点到参考轨迹最近点的横向距离横向偏差变化率反映横向位置误差的动态趋势航向角偏差车辆航向与参考轨迹切线方向之间的角度差航向角偏差变化率、横摆角速度相关项纵向速度偏差或纵向误差相关项前轮转角及其变化率纵向加速度。控制量则是前轮转角增量或者直接是前轮转角和纵向加速度请求。把控制量里同时包含转角和加速度这一步就完成了横纵向在“执行层面”的耦合。我理解Apollo之所以把控制量设为转角增量和加速度而不是直接设为转角和速度是因为增量式控制天然带有积分作用可以消除稳态误差同时增量式控制也更容易在目标函数里加入对控制变化率的惩罚抑制执行器抖动。3.3 线性化与离散化工程实现的精髓MPC理论上可以基于非线性模型求解但非线性优化求解速度慢、可能陷入局部最优无法满足控制周期内的实时性要求。Apollo的工程方案是在每个控制周期对参考轨迹当前工作点做一次线性化得到线性时变LTV模型再离散化。我画个简化的流程脑子就有数了根据当前车辆状态找到参考轨迹上的最近匹配点以匹配点位置计算参考曲率、参考速度、参考横摆角速度在匹配点处对车辆动力学方程做泰勒展开忽略二阶以上高阶项得到线性化的误差状态方程并离散化成 x(k1) A_k * x(k) B_k * u(k) d_k 的形式将d_k线性化残差或参考前馈项作为已知常数代入优化问题构造QP问题调用求解器求解取出控制序列的第一个控制量施加到车辆上。这一步最关键的地方在于“每个控制周期都要重新做一次线性化和离散化”因为车辆在当前工作点的状态一直在变化尤其是纵向速度会显著影响横向动力学系数。如果图省事用一套固定模型高速和低速下的预测精度都会变差。3.4 误差状态方程的物理直觉虽然没有必要把每个矩阵系数都抄在这里但我想给出误差状态方程的基本结构帮助大家建立物理直觉。如果只考虑横向和航向两个误差量有一种常见的简化形式是这样的d_dot v_x * e_psi v_y e_psi_dot r - v_x * kappa_ref v_y_dot -v_x*r (C_fC_r)/(m*v_x) * v_y (a*C_f - b*C_r)/(m*v_x) * r - C_f/m * delta_f r_dot (a*C_f - b*C_r)/(I_z*v_x) * v_y (a^2*C_f b^2*C_r)/(I_z*v_x) * r - a*C_f/I_z * delta_f其中d是横向位置偏差e_psi是航向角偏差v_y是侧向速度r是横摆角速度delta_f是前轮转角kappa_ref是参考轨迹曲率C_f和C_r是前后轴等效侧偏刚度。这个模型的物理含义很直接横向位置偏差的变化率等于纵向速度乘以航向偏差加上侧向速度航向偏差的变化率等于横摆角速度减去参考轨迹的角速度曲率乘以纵向速度。这两个方程本身就体现了横纵向耦合——因为纵向速度v_x直接出现在横向误差的动力学方程里。当你把纵向速度误差和加速度控制量也扩展进这个状态空间就得到了Apollo MPC做横纵向耦合控制的基本模型框架。理解了这几个方程的物理来源再去看代码里的矩阵系数基本就不会觉得是“天书”了。4. 代价函数、约束与参数整定学习中最容易卡壳的部分4.1 代价函数各项的物理意义MPC在Apollo里最终落到一个二次规划问题目标函数也就是QP里的代价函数。它的通用形式可以写为J sum_{k1}^{Np} ( x_k^T * Q * x_k ) sum_{k0}^{Nc-1} ( u_k^T * R * u_k delta_u_k^T * R_delta * delta_u_k )其中x是误差状态向量u是控制量delta_u是控制增量。Q、R、R_delta分别是状态权重矩阵、控制权重矩阵和控制增量权重矩阵。这个代价函数里每一项都有明确的物理意义调参的时候心里必须清楚Q矩阵的主对角元素对应每个状态的误差权重。比如横向位置偏差对应的权重越大MPC就越“较真”横向误差车辆会紧贴中心线走但代价是转向动作可能更频繁、更急促纵向速度偏差对应的权重越大车辆对速度的跟踪越严格在弯道中可能不愿意合理减速。R矩阵的主对角元素惩罚控制量本身。前轮转角权重大会让MPC尽量少打方向盘加速度权重大会让MPC尽量少大脚油门和重刹控制动作整体趋向平缓但跟踪误差会相应增大。R_delta矩阵惩罚控制增量即控制量的变化速率。这个权重对乘坐舒适性影响很大加大后方向盘变化更平缓加速度变化率更柔和能有效抑制抖振。理解代价函数的意义后横纵向耦合在MPC中就变成了“同一个天平上的两类砝码”。横向误差权重和纵向误差权重谁大决定了车辆在极限工况下优先保横向精度还是优先保纵向平顺。这个取舍没有标准答案完全取决于你的应用场景和用户期望。4.2 Np、Nc和控制步长的权衡预测时域Np可能是MPC里最需要动手实验的参数我在学习初期对它理解很浅以为“看得越远越好”后来发现完全不是这么回事。Np太小MPC“目光短浅”。在直道上一切都好但一旦进入弯道MPC看不到弯道的存在等横向误差已经显现出来才开始反应控制效果大幅退化。Np太大MPC“过度远视”。一方面预测越远模型误差积累越严重预测结果的可靠性迅速下降另一方面远处的参考轨迹信息会过早影响当前控制动作出现“提前反应”现象。Nc控制时域则代表MPC对“未来控制序列”的决策自由度。Nc越大优化变量越多求解时间增加Nc越小MPC倾向于认为未来一段时间控制量保持不变决策自由度受限。一般取Nc远小于Np因为控制效果对Nc的敏感度远低于Np。预测步长也很关键。如果控制周期是10msMPC的预测步长可以取100ms左右即每步预测间隔0.1秒。步长太小预测时域覆盖的物理时间太短等于变相缩短了Np步长太大预测精度下降。一般以预测总时长覆盖2~5秒为宜。4.3 约束设置的经验Apollo MPC中的约束通常包括控制量限幅和控制增量限幅。我整理一下自己常用的约束设置思路前轮转角饱和度根据车型转向机构极限设置通常不超过±0.5rad约±30度。实车调试时一定要查底盘手册不能拍脑袋。前轮转角变化率限制每个控制周期内转角的变化量防止方向盘瞬变对乘坐舒适性影响很大。加速度上下界综合考虑动力性能和舒适性。舒适性较好的一般在[-3, 2] m/s²范围内。紧急工况可以放宽但要在约束里预设策略。速度约束例如禁止倒车、上限车速等可以直接作为状态约束写进去。有一点必须提醒约束不是设得越多越紧就越好。约束太紧容易导致QP求解器找不到可行解表现为控制量长时间卡在边界甚至求解失败。正规的做法是引入松弛变量允许约束在极端情况下被“软性突破”并通过罚函数把松弛量拉回零。Apollo的MPC实现中也有类似的机制理解这一点对调试非常关键。4.4 参数整定的顺序参数太多最怕乱调我的个人经验是严格按顺序来每一步只动一组变量第一步固定模型和约束调Np和Nc。先在仿真里找一个中等难度场景把预测时域从短到长扫一遍观察控制效果的变化确定一个稳定且计算耗时可控的Np范围Nc取Np的1/3到1/2。第二步调横向Q权重。在直线缓弯场景下增大横向位置偏差权重观察跟踪精度和执行器动作强度找到一个折中值。第三步调纵向Q权重。加入变速、加减速场景调整纵向速度偏差权重使速度跟踪精度和舒适性达到平衡。第四步检查约束激活频率。跑一些极限场景如果控制量长时间贴在约束边界上说明约束太紧或者对应误差项的权重过大导致控制量饱和。此时优先放宽约束或者增加松弛变量权重而不是继续加大误差权重。第五步反过来验证横纵向耦合权重比。在高速大曲率弯道或者低附着路面场景观察横向误差和纵向速度跟踪的取舍是否合理再微调横纵向权重比。这个顺序的核心逻辑是先让MPC“看得足够远”再让MPC“知道什么最重要”最后才是“允许它做到什么程度”。跳过前两步直接调权重很容易陷入参数组合爆炸的困境。5. 仿真实验与实车调试中的典型问题5.1 从仿真到实车前先做的验证在Apollo的仿真环境里跑通一个MPC Demo并不难但仿真和实车之间有一道巨大的鸿沟仿真里的车辆模型是理想的实车则存在建模误差、延迟、噪声、执行器非线性。我的习惯是在仿真阶段就强制自己记录MPC每个周期的“模型预测输出”和“实际状态”对比两者的差距。具体做法不复杂在代码里把MPC求解时预测的未来状态序列导出同时记录车辆真实状态下一次到达对应时间点的值。两者偏差很大说明模型和真实车辆失配严重此时再怎么调权重都很难在实车上取得好效果。先收集几个典型工况下的失配数据比直接上车试错高效得多。5.2 大曲率入弯时横向误差发散的排查链路我在仿真中遇到过这样一个问题车辆进入连续S弯横向误差先缓慢增大然后突然发散车辆直接冲出参考轨迹。当时我的第一反应是“MPC参数没调好”于是拼命调Q矩阵结果收效甚微。后来梳理排查链路才发现问题根本不在权重。我总结了一套排查顺序供大家参考检查规划轨迹质量。如果Planning模块输出的轨迹本身曲率不连续或者有跳变MPC的参考输入就有问题。我把轨迹的曲率曲线拉出来看发现弯道入口处曲率有一个明显的阶跃这等于要求车辆横摆角速度瞬间突变任何控制器都会吃不消。这个问题应该在上游做平滑处理而不是在控制层硬扛。检查预测时域是否覆盖弯道入口。仿真时车速较高如果预测总时长不够车辆真正进入弯道后MPC才第一次“看到”弯道反应必然滞后。我把Np加大横向误差的峰值显著下降了。检查曲率前馈是否正确进入模型。很多MPC实现中参考曲率是通过线性化残差项进入状态方程的如果这个前馈项没接对弯道稳态误差会一直存在而且单纯增加Q权重也无法消除。Apollo的工程代码里对这块处理比较完善但自己移植时很容易漏掉。检查前轮转角约束是否被激活。如果约束设置过小MPC即使想要更大的转角也拿不到横向误差就会持续增大。这种情况表现为“控制量长时间贴在约束边界上”解决方法是重新评估约束的物理合理性而不是“宽容”地放开约束。最后才调Q权重。因为权重是连续影响整个代价函数而不是针对某个突发工况的开关式调整。前面几项如果存在明显问题调整权重的效果会被掩盖。5.3 急减速-转向耦合下的振荡另一个让我印象深刻的坑是模拟弯道中突然出现障碍物需要同时大角度转向和紧急制动时控制量输出出现了振荡。横向误差在中心线附近来回摆动方向盘动作忽左忽右完全不收敛。问题出在哪里车速在紧急制动过程中快速下降而横向动力学模型中的速度相关参数也随之剧烈变化。如果模型是固定的MPC在每一周期的线性化点都和真实工作点偏离很远预测结果失真优化出来的控制序列也会频繁跳变。处理手段我从三个方向入手在约束里给加速度下限设置一个安全余量不要一次压到物理极限给横向控制留一点轮胎力余量增大控制增量权重R_delta抑制相邻周期控制量跳变在目标函数中引入“横纵向优先级随工况变化”的逻辑——高速紧急避险时优先保证横向稳定性低速工况则优先保证纵向跟踪精度。解决这类问题不能只靠控制层更需要和Planning层协同。比如规划层如果提前输出一个平滑的减速序列控制层的压力会小很多。5.4 高频抖动的排查与抑制还有一类问题很容易让人抓狂直道上行驶明明参考轨迹是一条直线方向盘却在高频抖动。我一开始怀疑MPC权重不够把R和R_delta加大抖动依然存在后来把状态量和控制量的时间序列拉出来对比才发现抖动的源头根本不在控制算法而在于上游定位信号的高频噪声。MPC对状态估计的质量非常敏感。给到控制器的横向位置偏差如果本身带高频噪声MPC会将其视为真实的跟踪误差并在优化时试图通过转向去消除从而产生高频控制动作。这就像你开车时盯着一个抖动的导航线路方向盘自然会被带得左右摇摆。正确处理顺序是先确认上游定位和规划信号质量确认状态估计干净之后再调整R_delta。很多控制问题表面上是参数问题实际上前端的信号质量才是病根。MPC不是万能的它不能修复传感器噪声带来的错误输入。6. 从学习到落地一条我自己走通的学习路线6.1 先跑通再读代码还是先读代码再跑很多朋友问我是先看理论推导还是先跑代码我的答案是“两条腿走路”但顺序上必须先跑通一个Demo。只读代码不跑你对MPC的印象会停留在“一堆矩阵运算”上很难建立“参数和现象”的联系只看理论不读代码你又会困惑Apollo到底怎么把那些公式落到工程实现里的。具体路径可以是搭建Apollo环境在Simulation里跑通一个使用MPC控制器的例子在DreamView里回放控制效果观察不同工况下的横向误差、速度跟踪曲线打开mpc_controller.cc对照代码里的矩阵维度和变量名读通数据流在关键位置加日志把每个周期的状态量、控制量、预测序列打印出来对照现象去理解。这套流程下来你对MPC的理解会比单纯看论文扎实得多。6.2 亲手改一个参数并观察现象参数对MPC行为的影响只有通过动手实验才能变成直觉。我建议无论你是学生还是工程师都花时间做下面三组实验实验一改预测时域Np。把Np从10改成20、30在同一个弯道场景跑观察横向误差峰值、控制量提前开始变化的距离、以及求解耗时。你会直观发现“看得太远”和“看得太近”各自的问题。实验二改横向权重。把横向位置偏差对应的Q权重加大观察方向盘是否变得更“碎”跟踪误差是否真的减小。你会发现误差减小和动作加剧之间通常存在此消彼长最终要找一个平衡点。实验三改控制增量权重R_delta。把R_delta从小到大扫描观察控制量曲线从“高频抖动”到“平缓但滞后”的变化过程。这个实验能帮助你理解为什么MPC要引入控制增量惩罚而不只是惩罚控制量本身。做完这三组实验你对MPC参数的感觉会有一个质的飞跃。因为你看过每一个参数变化带来的真实现象而不只是停留在“参数越大越稳定”这种粗糙的印象。6.3 推荐延伸方向学完Apollo MPC的基础实现后如果想往深处走我推荐几个方向自适应MPCMPC的预测模型依赖车辆参数如侧偏刚度而实际中这些参数随车速、载荷、路面附着变化很大。可以尝试增加参数在线辨识模块让模型在工作点附近动态更新能够显著提高控制效果的鲁棒性。非线性MPCNMPCLTV MPC在强非线性工况下模型精度有限如果硬件算力允许可以往NMPC方向探索直接在非线性模型上做优化求解。摩擦圆约束的显式建模把轮胎摩擦圆近似成线性约束直接放进QP的约束集里。这个方向对极限工况下的稳定性控制非常有价值也是横纵向耦合控制在学术和工业界都比较前沿的方向。数据驱动/学习型MPC用历史数据对模型失配部分进行在线学习弥补物理模型的不足这是目前很多团队在尝试的方向。每个方向展开都是一篇大文章但从Apollo MPC这个入口切入你已经有足够的基础去理解它们到底在解决什么问题。最后说一个我自己折腾预测时域时遇到的有趣现象。某次我把Np调得很大然后在一条直道接弯道的场景里跑仿真结果车辆在直道末端就开始明显收油、微微打方向仿佛“提前预知”了弯道。一开始我觉得这是智能感拉满的效果后来才意识到这其实是MPC把远处的弯道信息放大到了当前控制决策中是一种过度反应。这个经历让我真正理解了一件事MPC的“远见”必须建立在模型足够准确的基础上否则看太远反而容易做错判断。搞控制的这些年我越来越觉得真正难的不是算法本身而是学会用数据和现象去解释控制器的每个动作。希望这篇笔记能让你少走一些弯路也欢迎多交流实际调试中遇到的有趣问题。
返回列表