1. MPC轨迹跟踪为何要先选“运动学模型”——动力学模型对比和选型逻辑
很多人一提到无人驾驶轨迹跟踪,第一反应就是“上动力学模型”,觉得运动学模型太简单、不真实。我在做轨迹跟踪实践之前也是这么想的,但真正把模型预测控制(MPC)跑起来之后,才明白选模型这件事不是越精确越好,而是“匹配场景、匹配计算资源、匹配控制周期”三方博弈的结果。
1.1 低速场景下运动学模型为什么够用
先说结论:在车速较低(比如时速30公里以内的园区接驳、自动泊车、封闭场地物流车),路面附着良好、轮胎不进入明显非线性区域时,运动学模型完全够用。它的核心假设是“车辆在任意时刻的速度方向与车身朝向保持一致”,也就是忽略轮胎侧偏和离心力带来的横向滑移。
这里的本质是什么?运动学模型描述的是“车想怎么走”,动力学模型描述的是“车实际能怎么走”。在低速、小侧向加速度场景下,两者偏差很小。你用一个复杂的二自由度自行车动力学模型,算了一堆轮胎侧偏刚度、横摆转动惯量,结果控制周期算不完,或者因为轮胎参数不准引入额外误差,不如用一个清爽的运动学模型跑得又快又稳。
我做过的模拟项目X里,控制周期选的是50毫秒。同样一段曲率连续的轨迹,用运动学模型做预测,单步求解QP问题耗时大约3~5毫秒,而用动力学模型基本要跑到15毫秒以上,留给传感器融合、执行器指令解析的余量就非常紧张。
1.2 小曲率还是大曲率,选型依据要提前定
不是说运动学模型万能。如果你的场景里有连续急弯、倒车入库频繁切换、或者路面附着系数变化剧烈,运动学模型的缺陷会放大——它无法预测车辆在极限工况下的横摆失稳,也无法刻画轮胎力饱和。
所以我在实践中会先画一张表,把项目需求列清楚再做选型:目标车速区间、最大道路曲率、路面类型、允许的横向跟踪误差、计算平台算力余量。这张表直接决定你用运动学、线性时变动力学还是非线性动力学模型。
提示:对于一阶导连续的曲率变化道路,只要车速低于5m/s且最大曲率不超过0.2,运动学模型搭配MPC的横向误差通常能控制在5厘米以内。这是我在某园区低速巴士项目里的实测数据,不是仿真理想值。
1.3 运动学模型的经典表达形式
业界最常见的运动学模型是单车模型,也叫自行车模型。它把车辆前轮和后轮等效成两个轮子,再加上车身航向角、前轮偏角。方程看起来不复杂,但每个变量都有明确的物理含义:
- 车身坐标系下的横纵向位置x、y;
- 航向角ψ,也就是车身朝向与全局坐标系X轴的夹角;
- 前轮转角δ,控制输入;
- 车速v,一般假设可以直接控制,或者作为另一个控制输入;
- 前后轴距离L,也就是轴距。
连续时间运动学模型的标准形式大概是:
x_dot = v * cos(ψ) y_dot = v * sin(ψ) ψ_dot = v * tan(δ) / L这里的核心是ψ_dot的表达式,它描述了转向运动和横摆角速度之间的关系。tan(δ)意味着前轮转角越大,单位时间内航向角变化越快。低速场景下,这个式子与真实车辆的一致性很高。
我习惯在建模后先做一个“模型合理性检验”——给一个0.1弧度的阶跃转角输入,对比模型仿真结果和真实车辆低速阶跃响应。误差在合理范围(通常是航向角误差小于0.02弧度)才继续往下做,这样后面调MPC权重时不会陷入“模型到底对不对”的迷雾里。
2. 运动学单车模型的离散化与线性化:从连续方程到可求解的预测矩阵
模型预测控制要在每个控制周期内滚动求解优化问题,所以连续的运动学方程必须先离散化。离散化的问题在很多教程里被一笔带过,但实际工程里它直接决定预测精度和数值稳定性。
2.1 离散化方法选择:为什么我优先用龙格库塔而不用一阶欧拉
最朴素的做法是前向欧拉法,也就是用当前状态和当前导数去近似下一时刻状态。公式简单,但是精度只有一阶。当控制周期是50毫秒、预测时域是20步、总预测跨度达到1秒时,一阶欧拉的累积误差会明显影响控制品质。
我对比过的方案:同样是车辆以5m/s沿曲率半径为30米的弯道行驶,一阶欧拉离散在预测末端的位置误差约0.08米,四阶龙格库塔只有0.01米左右。别小看这7~8厘米的差距,它到了约束边界附近就会变成“预测明明没超限、实际早超了”或者反过来。
所以在实际项目里,我默认用四阶龙格库塔做离散化。它的实现不复杂,本质就是取四个中间斜率做加权平均,代码量很少,但预测精度提升一整个量级。
2.2 线性化:围绕参考轨迹还是围绕当前操作点
MPC的求解效率和收敛性很大程度上取决于预测模型是否线性。运动学模型带有cos、sin、tan这些非线性项,如果不做线性化,就得走非线性MPC路线,实时性往往会崩。
工程上常用两种思路。
一种是“线性时变”方法:在每个控制周期,以当前状态为基准,对参考轨迹上的每个预测点进行一阶泰勒展开,把非线性方程变成带时变系数的线性方程。这种方法实现相对简单,也是我优先推荐的做法。预测误差在低速场景下基本可以忽略,但要注意曲率大的地方误差会积累,需要靠“反馈校正”环节来弥补。
另一种是“精确线性化”方法:利用运动学模型的微分平坦特性,将状态量做坐标变换,把非线性系统映射成线性系统。思路很漂亮,但对模型结构的依赖很强,而且一旦车辆模型加入加速度约束或执行器延迟,纯解析的精确线性化就不太好维护。我在一个模拟项目里尝试过,后面因为要频繁修改约束条件,放弃了,退回线性时变路线。
2.3 预测方程展开细节:状态向量、控制向量和误差矩阵
线性化之后,我习惯把预测方程写成增广误差模型的形式。状态误差向量取车身位置误差、航向误差和前轮转角误差,控制量误差取前轮转角变化率。这样做的关键逻辑是:用“误差”驱动控制指令,而不是直接跟踪绝对状态,控制器天然具备积分作用,能减小稳态偏差。
控制量为什么用“转角增量”而不用“转角本身”?因为真实车辆的转向执行器通常接收转角指令,做轨迹跟踪时如果只控制转角绝对值,系统遇到持续性扰动(比如侧风、路面倾斜)时会产生静态误差。把转角变化率作为控制量之后,相当于在控制器里加入了一个积分器,静态误差自然被消除。
离散后的预测矩阵展开形式是一个经典的状态空间表达式:
X(k+1) = A(k) * X(k) + B(k) * ΔU(k) + C(k)其中A矩阵来自线性化后的状态转移项,B矩阵是控制输入矩阵,C矩阵则包含参考轨迹运动带来的补偿项。每到一个控制周期,A、B、C都要结合当前状态和参考轨迹重新计算一次,这正是“线性时变MPC”名字的由来。
2.4 预测时域目标点序列:在参考轨迹上怎么取
预测时域内要有一串参考目标点。我的做法不是直接均匀按距离间隔取,而是按控制周期决定的位置前馈。假设控制周期是50毫秒、预测时域20步、预计车速4m/s,则每步前进0.2米。但实际轨迹的曲率可能连续变化,所以我会先在参考轨迹上做“等弧长重采样”,使相邻点之间的间隔相等,然后从当前位置最近点开始,向后续点索引依次填入预测序列。
这一步很重要。如果不做等弧长重采样,车辆在弯道处的参考点会挤在一起,直道处又过于稀疏,MPC在不同曲率区的表现差异很大,调节参数时很难找到通用权重。
3. MPC优化问题的核心搭建:目标函数、约束集与QP求解流程
有了预测方程,下一步就是把“跟踪得好不好”“控制得平不顺”“有没有超限”这三件事翻译成数学语言,合并成一个二次规划问题。
3.1 目标函数的三项权重:误差、控制量、控制量变化率
我习惯把目标函数写成三项加权和:
第一项是预测时域内所有预测点与参考点的误差平方和,它衡量“跟得准不准”。这里我通常只对横向位置误差和航向误差加权,前进方向的位置误差依赖纵向速度控制,不在横向MPC里处理。
第二项是控制量本身的大小,也就是前轮转角的平方和。它用来限制稳态转角不要过大,也能间接节省转向能量。这一项权重不能设太高,否则控制器“懒得转”,弯道跟踪会变成慢性拉不回。
第三项是控制量变化率的平方和,也就是前后两个控制周期前轮转角增量的平方。这是平滑性的核心,权重越高,转向越柔和,但响应也越迟钝。
这三项权重之间的比例,基本上决定了MPC的性格。我的初始经验值是横向误差权重为100,航向误差权重为50,转角权重为1,转角变化率权重为30。这是仿真里比较中庸的起点,实车还会再调。
3.2 约束设计:转角边界、转角变化率边界、位置容差
约束是MPC区别于LQR等经典控制器的关键。它可以明确告诉求解器“你不能这样走”,而不是靠大权重间接阻止。
我对前轮转角设置了物理边界,一般是正负0.6弧度左右,对应方向盘大约正负340度,这是转向执行器的硬极限。对于转角变化率,我会根据执行器的响应速度设定,比如每个周期转角变化不超过0.02弧度,防止冲击过大。
位置约束我一般不在横向MPC里加得太死。如果加“位置必须落在轨迹两侧0.05米以内”,那么在参考轨迹本身不平滑或者定位噪声偏大时,QP问题可能直接无解。更合理的做法是给位置约束加一个软约束处理,把它作为惩罚项放进目标函数,允许特殊情况轻微越界,而不是让求解器崩溃。这个细节是我踩坑后才意识到的。
3.3 QP求解流程与实时性验证
当预测模型是线性的、目标函数是二次的、约束是线性的,整个优化问题就是标准的二次规划(QP)。我在项目里用的是某开源QP求解器,支持不等式约束和稠密矩阵求解,对小规模问题非常高效。
每个控制周期的流程是这样的:
- 获取当前车辆状态、定位信息和参考轨迹;
- 根据当前状态计算A、B、C预测矩阵;
- 构造目标函数矩阵和约束矩阵;
- 调用QP求解器,得到未来N个周期的前轮转角增量序列;
- 取第一组增量,叠加到当前前轮转角上,发给转向执行器;
- 丢弃剩余预测序列,下一个周期重新执行。
第6步是MPC的精髓——“滚动优化”。虽然算了未来很长一段,但只执行第一步,剩下的全部作废。这样每当有新的状态反馈进来,控制器都能及时修正模型失配,这也是MPC比一次求解最优控制更鲁棒的原因。
我在某跨平台系统的仿真里统计过求解耗时:状态维度4、控制维度1、预测时域20步,单步QP求解平均3.8毫秒,最坏情况7.2毫秒。只要控制周期不小于50毫秒,实时性就完全够用。
4. 参数调节中的真实反馈关系:权重、预测时域和控制时域怎么配
很多人在MPC调参时很头疼,问“为什么加大权重反而车辆晃得厉害,为什么预测时域变长响应却变慢”。这些现象背后都有明确的因果关系,理解了参数之间的相互影响,就不至于瞎调。
4.1 权重调节的起点:先用仿真跑出一条“基准曲线”
我不建议一上来就对着实车调权重。使用仿真环境先跑一遍,把车辆模型、控制器、参考轨迹全部跑通,记录横向误差、航向误差、前轮转角曲线,作为基准。这一步骤的价值在于:仿真的噪声小、模型一致,你能清楚看到控制器在不同参数下的“真实性格”,不会把定位噪声和控制问题混在一起。
我常用的权重调节顺序是:先把转角变化率权重固定,调节误差权重使横向误差进入期望区间;再固定误差权重,调节转角变化率权重使转向平滑度达标;最后微调转角权重,防止稳态转角过大。注意每轮只调一个参数,调完后再看全局曲线。
4.2 预测时域的选取逻辑:长度要覆盖“刹得住”的距离
预测时域本质上是控制器“向前看”的距离。低速场景下,我建议预测时域对应的预测距离至少覆盖车辆在2~3秒内的行驶距离。车速4m/s时,预测时域20步、每步50毫秒,总预测距离是4米,这在曲率半径低于20米的弯道上就已经够看到弯道全貌。
如果预测时域太短,控制器会被叫“近视眼”,在弯道入口处看到的目标点离当前位置很近,导致转向动作过早或过晚。如果太长,一方面计算量增大,另一方面远处参考点的误差权重会“带偏”近处的控制决策,因为远处的线性化误差更大,模型和实际偏差也会更大。
4.3 控制时域通常远小于预测时域的原因
控制时域指“在这几步内控制量可以变化”,之后的控制量保持不变。我通常把控制时域设成5步左右,预测时域20步。这样做的计算优势明显:决策变量数量从20个降到5个,QP求解速度大幅提升,同时因为后面的控制量被锁定,控制器更有“定力”,不会在远未来反复调整导致动作剧烈。
代价也有——如果控制时域太短,控制器对远处动态变化的适应能力下降。在连续S弯场景里,我做过对比:控制时域为3时,弯道切换处横向误差峰值约6厘米;控制时域为6时,峰值降到3厘米以下。所以控制时域不宜设得过短,5步是我比较平衡的经验值。
4.4 常见振荡现象:为什么“权重越大反而越晃”
这是一个容易劝退新人的现象。当横向误差权重特别大时,系统会像一个过度紧张的新手司机,看到一点点误差就猛打方向盘,结果产生超调,再反向修正,形成振荡。
本质上这是“控制器带宽过高”的后果。加大误差权重相当于提高了控制器的增益,但执行器、车辆惯性和通信延迟构成的实际系统带宽是有限的。当控制器带宽明显超出系统带宽,必然会出现振荡。解决办法不是减小误差权重“求稳”,而是增大转角变化率的权重,直接限制控制器“想多快就多快”的冲动。
我们看一个典型数据:横向误差权重100、转角变化率权重30时,S弯跟踪最大横向误差4.8厘米,前轮转角曲线光滑;横向误差权重加到300、转角变化率保持30时,最大横向误差反而降到3.1厘米,但转角曲线开始出现明显毛刺;继续加横向误差权重到600,横向误差不再下降,转角曲线剧烈振荡,甚至出现饱和。这个现象说明:有一个权重“甜点区”,过了它再多加也没用。
5. 仿真转身实车时的坑:曲率噪声、执行延迟与鲁棒性验证
仿真跑通了,不等于实车没问题。我从仿真转到实车测试时,至少遇到了三类典型的“水土不服”,这里逐个说清楚。
5.1 曲率噪声带来的问题:预测点跳变如何导致转向抖动
仿真里的参考轨迹是理想曲线,曲率连续、一阶连续、甚至二阶连续。但实车上的参考轨迹通常来自路径规划模块,可能是多个线段圆弧拼接的结果,也可能经过了平滑处理但仍有残余的小幅曲率波动。
问题出现在MPC预测时,如果参考轨迹的曲率在相邻预测点之间跳变过大,控制器会感知到一个“陡弯又突然变直”的假象,导致前轮转角序列不连续,转向执行器被迫来回抖动。
我的处理策略分两层。第一层是路径预处理:在参考轨迹送入MPC之前,做一个滑动窗口平均滤波,对目标点位置序列做平滑,同时重新计算曲率,过滤掉曲率变化率过大的点对。第二层是控制层:增大转角变化率约束的权重,让控制器天然对高频参考变化“不感兴趣”。这两层合在一起,转向抖动基本能被压下去。
5.2 执行延迟:转角指令到执行器的通信和响应间隙
实车和仿真最大的不同之一是执行器有延迟。转向电机接收到转角指令后,不是瞬间到达目标角度,而是有个上升过程,通常几十到几百毫秒不等。在控制周期很短时,这个延迟可能占掉两三个控制周期。
我的做法是在MPC前加一个“延迟补偿”。具体说:根据反馈的当前实际转角,以及过去几个周期的转角指令变化趋势,外推出当前时刻执行器大概在什么位置,用这个推断值作为MPC的初始状态。这样控制器不会认为“指令发了转角就到了”,预测更接近物理现实。
另一种做法是调整期望响应速度:把转角变化率权重调高,让指令变化缓和,执行器更容易跟上。这两种补偿方式我同时用,效果明显。实测下来,前轮转角指令的超调量减少了接近40%。
5.3 定位噪声:状态反馈的抖动怎么消化
实车的定位系统(比如组合惯导加RTK)在开阔环境下精度很高,但经过高楼、隧道或者园区树荫路段,噪声和跳变会被明显放大。MPC对状态反馈很敏感,定位跳变会直接变成控制量跳变。
面对定位噪声,我一般顺序排查:先做定位数据的时间戳校准和时间同步,排除时间偏差导致的人为噪声;再做状态估计滤波,将位置、航向角通过一个带速度辅助的滤波模型融合,让进入MPC的状态量更干净;最后才是调控制器参数。注意,控制器参数不能替代定位质量,如果定位差,权重调得再大也救不回来。
5.4 鲁棒性验证清单:从单一路径到多工况
实车测试前,我会先把鲁棒性验证清单列出来,至少包括:直线高速段、不同曲率半径的弯道、连续S弯、停车起步状态、定位丢星模拟、执行器延迟突然增大模拟。每项测试都记录横向误差的均值和峰值、转角曲线光滑度、有无约束越界。只有所有工况都通过,我才认为这个MPC控制器“能上车”。
6. 我在一次低速园区轨迹跟踪调试中遇到的振荡问题
最后分享一个具体案例,这里不涉及任何真实项目名称,逻辑是通用的,希望能帮读者复现排查思路。
某次低速园区车辆调试,参考轨迹是一段环形路径,含两个半径约15米的弯道。车速设定在3m/s,控制周期50毫秒,预测时域20步,控制时域5步。初始权重我按照基准值设定,第一轮测试发现一个很典型的问题:车辆进入弯道后横向误差存在约8厘米的稳态偏差,同时伴随小幅周期性振荡,周期大约5~6个控制周期。
6.1 排查链路:先区分是跟踪偏差还是振荡超调
我没有直接调权重,而是把MPC内部量全部录制下来分析。首先是看预测误差序列,发现稳态偏差出现时,预测时域末端的误差和真实误差差异不大,说明模型没有明显失配,问题出在目标函数或约束上。再细看转角序列,发现在稳态偏差阶段,转角绝对值持续较大,而且每两三个周期发生一次微小跳变,这很像“差一点才够转”的临界状态。
6.2 定位问题:稳态偏差源于参考点和当前点的匹配逻辑
我进一步检查参考轨迹匹配逻辑,发现“最近点索引”的搜索范围只在前方10米内,而且当车辆在弯道内侧时,最近点容易落在外侧参考点上,导致MPC看到的是一个持续偏大的横向误差,于是车辆被迫增大转角,形成稳态偏差。
修正方法是:在匹配最近点时引入横向位置的搜索带,同时把最近点的选择权重偏向“前方两到三个控制周期”的预测点,而不是单纯选几何最近点。这一步修正后,稳态偏差立即从约8厘米降到2厘米以下。
6.3 残余振荡与执行延迟补偿的最终调整
稳态偏差解决后,振荡仍然存在,只是幅度变小了。继续查,发现是执行器延迟补偿做得不够精准。我原先用的是一阶惯性模型来近似执行器响应,但实际转向电机的响应曲线更接近二阶系统,在低速、大转角变化段有明显超调。
改进方式是把延迟补偿模块换成二阶模型,同时将转角变化率权重从30提高到45。这样做后,周期性的小振荡完全消失。最终的横向误差统计均值在1.2厘米,最大不超过4厘米,前轮转角曲线非常平滑,没有再出现约束边界附近的临界跳变。
6.4 这次调试给我的三点经验
第一,MPC参数不合理时,不要急着“调”,先抓数据,看内部预测序列、匹配点索引和转角序列,定位真正的问题环节。第二,参考轨迹匹配逻辑对MPC的影响常被低估,一个“几何最近点”的匹配策略可能在弯道制造出虚假误差。第三,执行器延迟补偿的精度决定控制上限,模型越贴近物理执行器,MPC的潜力越能发挥出来。
7. 最后再分享一个关于调试工具链的建议
调试MPC轨迹跟踪,纯靠在线看波形很难高效定位问题。我建议把MPC内部状态和中间量完整记录下来,包括当前状态、匹配到的参考点索引、预测时域内的误差序列、每步计算出的转角增量、QP求解耗时、是否有约束激活。
我有一个习惯:在做模拟和实车对比时,先固定同一个场景和同一组参数,把仿真里的MPC中间量输出到日志文件,再在实车上以完全相同的方式录制日志,直接逐字段对比。这样一旦出现“仿真稳定、实车振荡”的差异,能立刻看出是模型里的哪个环节引入了偏差。
如果你最近也在做基于运动学模型MPC的轨迹跟踪,建议先从低速小曲率场景入手,把预测方程和QP求解流程完全跑通,再逐步增加弯道难度。运动学模型的数学形式虽然简单,但越简单的地方越容易藏细节,位置匹配、离散化精度、执行器延迟这三个点是我见过最容易返工的地方。把这些基础磨扎实了,后面换动力学模型或者加更多约束都会顺手很多。