ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

自动驾驶控制核心:MPC模型预测控制原理与实车落地实践

自动驾驶控制核心:MPC模型预测控制原理与实车落地实践 1. MPC凭什么在自动驾驶控制里站稳脚跟1.1 从一个真实场景说起我在做自动驾驶控制这块也有不少年头了最早接触运动控制的时候项目组用的还是PID那套东西。当时负责的是一个低速园区车的轨迹跟踪任务车辆沿着预设路径走PID调好了直线还行但一到弯道或者前方突然出现障碍物需要换道的时候问题就全冒出来了。超调、振荡、跟不上参考轨迹调了半天参数最后还是得靠限速来兜底。后来导师把MPC方案引进来效果完全不一样。MPC的全称是Model Predictive Control中文一般叫模型预测控制业内更习惯直接喊MPC。它跟PID最大的区别在于PID是“看当前误差做当前修正”而MPC是“通过模型预测未来一段时间的状态在满足约束的前提下算出一串最优控制量然后只执行第一步到下一时刻再重新来一遍”。说白了PID像一个只看眼前三步的司机MPC则像一个能预判未来十秒路况的司机。这个差异在自动驾驶这种需要提前规划、躲避障碍、保证舒适性的场景里几乎是决定性的。1.2 自动驾驶控制算法的整体分工在展开MPC之前先把自动驾驶算法链条捋一遍。整个系统大致分四层感知层负责看路定位层负责知道自己在哪规划层负责决定怎么走控制层负责让车真正按照规划的轨迹去走。MPC就属于控制层里的核心算法有时候也会向上延伸参与局部轨迹规划。控制层一般有两个主要任务路径跟踪让车辆沿着规划层给出的参考路径行驶横向上保持车道中心纵向上控制车速。运动控制在跟踪路径的基础上兼顾车辆的动力学特性比如侧滑、轮胎附着力极限确保车辆在极限工况下也能稳定。在规划层给出的轨迹通常是一条带时间戳的参考路径控制层的任务就是让实际车辆状态尽可能地贴近这条参考轨迹。如果只追求“贴近”那PID理论上也能干但在高速、大曲率、强约束场景下PID很难同时兼顾跟踪精度、稳定性和舒适性。这时候MPC的优势就体现出来了它能把车辆的动力学模型、执行器限制、安全边界全部放进一个优化问题里求解天然适合自动驾驶这种多约束、多目标的控制场景。1.3 MPC的三层结构理解MPC最好的方式是记住它的三个核心模块预测模型、滚动优化、反馈校正。预测模型解决的是“未来怎么走”的问题。它用一组数学方程描述车辆的运动状态给一个控制输入就能推算出未来一段时间车辆会处于什么状态。这个模型可以是运动学模型只考虑位置、航向、速度也可以是动力学模型还考虑轮胎力、侧偏角、横摆角速度。模型精度直接决定了控制效果的上限。滚动优化解决的是“怎么走最好”的问题。在每个控制周期MPC会基于当前状态求解一个带约束的最优控制问题得到一个未来N个时刻的控制序列。这个优化目标通常包含跟踪误差最小、控制量变化尽量平缓等指标同时必须满足车辆和执行器的各种约束。反馈校正解决的是“模型不准怎么办”的问题。因为模型不可能完全真实预测结果一定有偏差所以MPC不会把算出的整条控制序列全部执行而是只执行第一个时刻的控制量等下一个采样周期到来时用最新的实测状态重新计算一遍。这个“滚动”机制让MPC天然具备抗干扰和模型失配的能力。想理解这三个模块之间的关系可以想象你在开车导航导航根据当前速度和路线预测你接下来几分钟的行驶轨迹如果发现速度太快、可能会错过转弯就提醒你减速但你未必完全照做下一秒钟车辆实际状态变了导航又会重新计算。MPC就是把这个过程用数学优化模型固化了。2. 把MPC的核心原理拆开揉碎2.1 预测模型怎么选运动学模型还是动力学模型先说一个我踩过的坑。刚开始做MPC的时候我图省事直接用了运动学自行车模型在低速园区场景里表现还不错但把车速提到60公里每小时以上过弯的时候就明显感觉到跟踪误差变大车辆横摆响应也有滞后。后来换成动力学模型问题才缓解。运动学模型假设车轮纯滚动不考虑轮胎侧偏和离心力带来的滑动适用于低速、低加速度场景。它的状态量一般是车辆的横纵坐标、航向角、速度和前轮转角。优点是模型简单、计算量小、线性化容易缺点是高速时精度严重下降。动力学模型则把轮胎力、车辆质量、轴距、质心位置、横摆惯量都考虑进去了能更真实地反映车辆在高速、大侧向加速度下的运动状态。常见的是单轨动力学模型自行车模型状态量包括横纵坐标、航向角、速度、横摆角速度、侧偏角等。相应的计算量也比运动学模型大得多。在实际工程中我的经验是低速泊车、园区接驳场景用运动学模型就够了。城市道路、高速巡航强烈建议上动力学模型。如果要做极限工况下的稳定性控制还得考虑轮胎的非线性特性。MPC对模型的要求是“够用且在线可解”模型越复杂预测越准但优化问题的求解难度也会指数级上升。所以选择模型本质是在精度和实时性之间做权衡。2.2 滚动优化的数学表达其实没你想的那么难很多朋友一看到MPC的优化目标函数就头大其实它的形式非常有规律。一个典型的离散时间MPC优化问题长这样先对车辆模型进行离散化得到状态方程x(k1) f(x(k), u(k))。在每个时刻kMPC要解决的是一个从当前状态出发对未来N个采样时刻的优化问题目标函数J通常包含三项跟踪误差惩罚让预测状态尽量接近参考轨迹公式里一般是(x(ki) - x_ref(ki))的加权二次型。控制量惩罚让控制量不要过大避免激烈操作。控制增量惩罚让控制量的变化率保持平稳这是影响舒适性的关键项。与此同时还必须满足一组约束条件最常见的包括控制量幅值约束比如前轮转角不能超过物理极限。控制增量约束比如转向速度不能太快。状态约束比如横向位置不能越过车道边界车速不能超限。这些约束让MPC区别于其他算法的地方在于它能“提前看到”约束边界在还来得及的时候就开始调整控制量。一个特别典型的场景是前方有一个急弯如果不提前减速等到了弯道跟前再刹车就来不及了。MPC在预测未来轨迹的时候就能发现“如果不提前减速就会冲出车道”于是它会通过优化控制序列提前轻轻踩下刹车——这正好是驾驶员在真实驾驶中的操作逻辑。2.3 滚动优化里的“只执行第一步”到底有什么意义我刚接触MPC的时候有过一个疑惑既然已经算出了未来N步的最优控制序列为什么不一口气全执行完而非要每步重新算这不浪费算力吗这个问题的答案藏在模型的“失配”里。任何数学模型都不可能完全等于真实物理系统再加上外部干扰、测量噪声预测轨迹和真实轨迹之间一定存在偏差。如果不做修正小偏差会随着时间累积成大偏差最终控制失效。MPC的做法是只执行当前时刻算出的第一个控制量等到下一个采样周期用最新的传感器测得的状态重新初始化预测模型再从头算一遍优化问题。这样一来每一轮计算看到的都是最新的系统状态。可以把这套机制理解成“计划赶不上变化”的应对方案。你在周初做了一周的详细工作计划但每天早晨你肯定要根据前一天的实际完成情况调整今天的安排没有人会傻乎乎地完全照搬一周前做好的计划去执行。2.4 线性MPC与非线性MPC的选择MPC有两种主流形态一种是线性MPC一种是非线性MPC。它们的本质区别在于预测模型是线性方程还是非线性方程。线性MPC的做法是把非线性车辆模型在当前工作点附近做线性化得到线性的状态方程然后目标函数是二次型优化问题就变成了一个标准的二次规划QP问题。QP问题在数学上非常成熟求解速度快、稳定性好是目前工程中使用最广泛的形式。非线性MPC则直接使用非线性预测模型目标函数也可能是非凸的需要求解非线性规划NLP问题。这样做的好处是预测更准确尤其是在大曲率、大侧偏角场景下代价是求解时间大幅增加。我见过不少团队在实车部署时踩过非线性MPC的坑——仿真效果很好但上了实车一个控制周期只有20毫秒求解器还没收敛控制周期已经结束了。所以我的建议是除非你对求解器的实时性有充分把握否则优先考虑线性MPC或线性时变MPC。先在简化模型上跑通整个流程再去逐步提升模型复杂度是比较稳妥的路线。3. MPC在自动驾驶场景里的落地细节3.1 轨迹跟踪控制MPC的看家本领轨迹跟踪是MPC在自动驾驶中最成熟的应用场景。在这个任务里规划层已经给出一条参考轨迹比如一系列带时间戳的路径点(x_ref, y_ref, v_ref)控制层的任务就是让车辆的实际轨迹尽可能逼近参考轨迹。具体做法是这样的在每个控制周期先把参考轨迹转化到车辆坐标系下然后基于车辆当前状态以参考轨迹为跟踪目标构造优化问题求解下一时刻的方向盘转角或前轮转角和加速度或油门刹车量。在实际测试中我发现MPC的跟踪效果有一个很直观的体现同样一条S形弯道PID控制下车身姿态明显僵硬需要频繁修正方向而MPC控制下的车辆轨迹平滑很多过弯一气呵成。原因就在于PID只盯着当前的横向误差而MPC能够结合车辆当前速度判断出“如果按照现在的转向趋势走接下来两秒钟会严重偏离参考线”从而提前调整转向。轨迹跟踪的精度评价一般看两个指标横向跟踪误差车辆质心到参考轨迹的垂直距离通常要求在城市道路场景下小于20厘米。航向角误差车辆实际航向与参考轨迹切线方向的夹角直接影响乘员感受。MPC在这两个指标上的表现都明显优于PID尤其是在车速变化剧烈的场景下优势更加明显。3.2 横向控制与纵向控制的耦合很多新手做MPC的时候会把横向控制和纵向控制分开来做横向只管转向纵向只管速度。在低速场景下这种解耦问题不大但到高速场景横纵向的耦合效应会变得很明显主要体现在两个方面车速影响转向效率同样的前轮转角车速越高横摆响应越快过弯就越容易失稳。转向影响纵向速度过弯时车辆会产生侧向加速度如果纵向速度不相应调整就会超出轮胎附着极限。MPC一个很自然的好处是它天然可以做一个横纵向联合控制器。把速度和前轮转角同时作为控制量在目标函数里同时考虑横向误差、纵向误差和控制量代价。这样一来求解出来的控制序列本身就包含了“过弯前减速、弯中调整转向、出弯后加速”这样的耦合策略。我在做高速公路匝道的测试时横纵向联合MPC的效果比分开控制要好得多车辆在匝道上的最大横向误差能从35厘米降到10厘米以内而且车速变化更平顺没有那种忽快忽慢的顿挫感。3.3 局部路径规划与避障除了轨迹跟踪MPC还可以承担一部分局部路径规划的工作。这里说的规划不是全局导航那种宏观寻路而是在车辆前方一定范围内根据障碍物信息和车辆动力学约束实时生成一条可行驶的轨迹。传统做法是先把全局路径投影到局部再用采样或搜索的方法生成候选轨迹最后选一条最优的作为控制目标。MPC的做法更直接把障碍物避让写成约束条件在优化过程中直接生成一条避开障碍物的轨迹同时满足动力学约束。当然这种做法对求解器的要求更高因为障碍物约束通常是非凸的可能会把优化问题变成一个混合整数规划或非线性规划问题。工程上常见的折中方案是先用一个快速的采样算法生成局部参考轨迹再用MPC去跟踪这条轨迹或者把障碍物约束做凸化处理近似成线性约束。我在一个园区物流车的项目里试过MPC直接生成避障轨迹的方式。当时车辆前方1.5米处突然出现了一个静态障碍物MPC在预测时域内发现如果不转向就会碰撞于是自动生成了一条平滑的绕行动作。整个过程中车速只从10公里每小时降到8公里每小时乘员几乎没有明显的顿挫感。这个体验是PID完全无法实现的因为PID只有“撞上了再修正”的能力没有“提前预判并规划”的能力。3.4 纵向控制里的MPC应用横向控制是MPC的强项但纵向控制同样可以使用MPC。纵向MPC的任务是控制车速让车辆按参考速度行驶同时与前车保持安全距离。纵向MPC相比传统的PI控制的优势在于它可以把舒适性和安全性统一到一个优化框架里。比如在自适应巡航场景中目标函数里可以同时惩罚速度误差、加速度大小和加速度变化率即冲击度约束条件可以是最大制动减速度、最大加速度和与前车的最小安全距离。这样做的好处是MPC能在前方有慢车时提前规划减速动作而不是像PI控制那样等距离逼近了才急刹。我用纵向MPC做跟车场景实测的时候车辆在接近前车的过程中会提前、平缓地松开油门然后轻踩刹车整个过程非常接近人类驾驶员的驾驶风格。4. MPC参数设计和调参的实践经验4.1 预测时域与控制时域怎么定预测时域用N表示和控制时域用Nu表示是MPC最核心的两个参数直接决定了“看多远”和“做几个决策”。预测时域N的含义是在当前时刻我们要预测未来多少个采样周期内的系统状态。假如采样周期是50毫秒N等于20那就相当于预判未来1秒的车辆轨迹。N太短MPC就失去了“预判”的意义变成近视眼看到急弯时已经来不及反应N太长计算量增大而且远期预测因为模型误差和干扰累积参考价值反而不大。控制时域Nu的含义是在预测时域内允许控制量变化多少个周期。Nu一般比N小因为我们对近期的控制更关心远期控制量即使算出来大概率也不会被用到。常见做法是把Nu设为N的1/3到1/2。在实车调试中我一般是这样起步的先根据车辆的响应速度确定采样周期通常在20到100毫秒之间然后让预测时域覆盖1到2秒的行驶距离再根据计算耗时反推N的上限。举个例子车速10米每秒采样周期50毫秒如果我想预判2秒后的状态N就应该取40。但这个规模在嵌入式平台上可能算不动那就得适当缩小N或者用线性化模型降低计算量。4.2 权重矩阵的设计思路权重矩阵是最直观也最折磨人的调参对象。目标函数里一般有Q和R两组权重Q对应状态偏差R对应控制量消耗。Q越大说明越重视跟踪精度R越大说明越不希望控制动作太剧烈。但实际调参时不能只盯着Q和R的大小还要注意以下几点Q中不同状态的权重需要量纲对齐。比如横向误差的单位是米航向误差的单位是弧度这两个数量级差很多权重也要相应调整否则数值大的状态会主导优化方向。控制增量的权重对舒适性影响最大。如果你发现车辆在稳态工况下方向盘的抖振比较明显优先增大控制增量权重而不是直接降Q。权重不是越大越好。Q太大会让控制器过于“激进”稍微偏离参考轨迹就猛打方向反而容易引起振荡。我的习惯是先固定控制权重R然后从小到大调Q看跟踪误差的收敛情况等跟踪误差满足要求后再回头微调R来控制动作的平滑性。这样分开调比一上来就同时调所有参数要容易很多。4.3 约束条件的工程化配置约束条件是把MPC变成“有安全意识的控制器”的关键但约束配置也是踩坑重灾区。最常见的错误是把约束设置得太紧导致优化问题无解。比如前轮转角的最大物理转角是35度但车辆在实际行驶中很少用到这么大的转角。如果直接用35度作为约束边界优化器在极端情况下可能给出一个很大的转角指令虽然没超限但实际驾驶体验很差。更稳妥的做法是给约束留出一定的安全余量比如只用25度作为软约束边界。软约束是MPC工程里的一个常用技巧。硬约束要求优化解必须满足而软约束则允许在目标函数里加上一个惩罚项让优化器尽量满足但不强制满足。典型做法是引入松弛变量epsilon当约束被违反时epsilon不为零目标函数增加一个大惩罚项。这样即使出现暂时无法满足约束的情况优化问题也不会直接无解而是会生成一个“尽量靠近约束边界”的可行控制序列。我在实际调车中还发现约束的合理性比约束的大小更重要。如果约束条件跟物理极限相差太远MPC的决策会显得“缩手缩脚”明明可以更激进地通过弯道却因为约束太保守而减速太多。所以约束的设定一定要参考车辆的物理特性和乘员舒适性阈值不要凭空想象。4.4 采样周期的选择一个容易被忽略的坑很多人把采样周期当成一个固定参数拍脑袋定个50毫秒就完事其实采样周期对MPC的影响非常大。采样周期太短比如1毫秒好处是控制频率高、响应快但代价是每个周期都要完成一次完整的优化求解。1毫秒内要解一个QP问题对嵌入式平台的算力要求相当苛刻搞不好就会超时。采样周期太长比如200毫秒计算压力确实小了但控制器对系统状态的感知颗粒度变粗在快速变化的工况下会出现明显的控制滞后。我一般的经验是采样周期设置在20到100毫秒之间具体取决于车辆的动力学特性和执行器带宽。转向执行器的响应延迟如果比较大采样周期也要相应放大否则会出现控制指令跟实际执行严重脱节的情况。还有一个容易被忽略的点采样周期和预测时域、控制时域是关联的改一个参数其他两个也要同步调整否则控制效果会突然“变味”。5. 实车调试中的常见问题与排查经验5.1 求解器超时怎么办MPC部署到实车之后遇到最多的就是求解超时问题。明明仿真里跑得好好的一上实车就出现控制周期不稳定有时候100毫秒的任务要跑200毫秒才算完。我的排查思路是分层定位。先看是不是预测模型太复杂非线性MPC在这种问题里出现的概率最大解决办法是换线性模型或对模型做离线线性化。再看是不是预测时域太长可以试着把N从20降到12如果计算耗时显著下降那就是问题所在。最后看求解器配置很多求解器都有最大迭代次数上限如果默认值是500可以适当调到200多数情况下求解质量影响很小但耗时能减少一大半。如果上面几招都试了还是超时还有一个终极方案把MPC放到单独的算力平台上运行控制指令通过CAN总线或者其他通信方式发给底层执行器保障控制周期稳定。5.2 跟踪误差发散的原因定位跟踪误差发散是一个让人很头疼的问题。车辆开得好好的突然横向误差开始变大最后甚至冲出车道。经验法则是从外到内逐层排查。先检查参考轨迹是否合理有些规划模块生成轨迹带有突变点MPC的预测模型根本追不上。然后检查车辆状态输入是否有异常比如定位模块输出跳变导致MPC每轮计算用的初始状态都不连续控制量自然也是跳变的。最后再检查模型参数是否准确轮胎侧偏刚度、轴距、质心位置这些参数如果跟实车不符高速时误差会迅速放大。有一次我们排查了一个星期的发散问题最后发现是车辆做了硬件改装之后轴距从原来的2.8米变成了2.85米但MPC模型里还用的旧参数。模型失配在MPC里的影响是全方位的修改硬件后一定要重新标定模型参数。5.3 实车与仿真差异巨大问题出在哪仿真和实车效果不一致几乎是每个MPC项目都会遇到的问题。我在刚做第一个MPC项目时仿真里跟踪误差只有5厘米结果实车一跑直接飙到50厘米当时整个人都是懵的。问题通常出在模型和现实的差距上。仿真里用的模型是理想化的没有考虑执行机构的延迟、死区和非线性也没有考虑轮胎的磨损、路面附着系数的变化。实车上的执行器响应有延迟、有滞回传感器有噪声和丢帧这些在初版MPC模型里都没有体现。解决思路是分步逼近。先把执行器延迟和传感器噪声建模进去跑一轮仿真对比看误差是否增大然后在模型中逐步加入轮胎非线性、摩擦变化等因素最后做硬件在环测试用真实的执行器和传感器去验证控制器的鲁棒性。这里我特别想强调一点MPC的效果上限由模型精度决定。如果你觉得MPC的控制效果不如预期先怀疑模型再怀疑参数最后才去怀疑算法本身。5.4 一条容易忽略的标定经验最后分享一个冷门但很重要的经验MPC的优化结果对状态变量的单位非常敏感。我在一个项目中用过角度的弧度制和度的混用结果控制量振荡得一塌糊涂。处理办法是建立一个统一的单位约定所有进入优化器的状态变量、控制变量、约束边界都用同一套单位制。最常见的选择是整个优化框架内部全部使用国际单位制输出给执行器的控制指令再转换为实际所需的单位。这样虽然多一道转换但能避免大量因为单位混用导致的“神秘Bug”。还有一个相关的小技巧对状态变量做归一化处理让不同量纲的状态值保持在相近的数量级。这样优化器在数值上更稳定求解速度也会更快因为预处理矩阵的条件数会好很多。6. MPC之外还有什么值得关注6.1 MPC与LQR的对比与互补经常有人问LQR和MPC到底怎么选。两者的关系其实可以类比成“静态最优”和“动态约束最优”的关系。LQR线性二次型调节器是全状态反馈控制器它的优势是计算量极小适合算力受限的平台而且在线性系统中能保证稳定性。但LQR处理约束的能力很弱本质上它假设系统运行在无约束的理想状态。MPC则是在每个控制周期求解一个带约束的最优控制问题天然能处理各种物理约束。代价就是计算量大、调试周期长。在实际工程中两者可以互补在正常工况下用LQR提供基础控制在检测到约束逼近时切换到MPC做安全修正。但这种切换机制的平滑性需要仔细设计否则会引起控制量的跳变。6.2 ADRC等现代控制算法的补充角色除了MPC自抗扰控制ADRC这几年在汽车控制领域也越来越受关注。ADRC的核心思想是把所有未建模动态和外部扰动统一当成“总扰动”用扩张状态观测器去估计并补偿。ADRC的优势是对模型精度要求不高、抗扰能力强在某些场景下甚至比MPC还省事。但ADRC不太擅长处理多约束优化它更像是一个强鲁棒的反馈控制器而不是一个预判型控制器。所以在自动驾驶控制上我的观点是MPC做“大脑”负责规划和预判ADRC或PID可以做“小脑”负责底层的反馈修正。两者不是纯粹的竞争关系而是可以协同工作。6.3 未来方向数据驱动与学习的融合MPC在自动驾驶中的未来一定离不开与数据驱动方法的融合。传统的MPC强依赖精确的模型但真实物理系统的建模代价很高尤其是轮胎这种高度非线性的部件。业界正在探索用神经网络来拟合难以建模的部分让神经网络和MPC的预测模型结合形成所谓的“学习型MPC”。这个方向还处在快速发展期工程落地的不多但思路值得关注。我自己的体会是MPC的框架非常开放它不像PID那样是一个固定的控制律而是一个“优化框架加约束语言”能够不断吸收新的改进手段进去。如果你现在正在学习自动驾驶控制把MPC的原理吃透再掌握一两个常用的求解器比如OSQP、CVXGEN之类同时了解车辆动力学建模的方法基本就具备了独立做轨迹跟踪控制项目的能力。剩下的大量功夫都是在实车上反复调试、反复踩坑、积累经验的过程这一点无论用什么先进算法都一样躲不掉。
返回列表