搞自动驾驶和智能车辆控制的开发者,对“换道轨迹规划+轨迹跟踪”这对组合应该都不陌生。本来想把这块吃透不容易,单看教材理论头头是道,真到Simulink里跑通一条完整的“五次多项式换道轨迹规划+MPC轨迹跟踪控制”链路,从多项式系数求解到MPC预测时域调整,每一步都有不少看不见的坑。最近在一套带有说明文档的Simulink模型上完整过了一遍,跑通之后把设计逻辑、数学推导和调参经验都记录下来,适合正在做车辆横向控制的开发者、选智能车方向做毕设的同学,以及想从单个算法走向完整控制链路的入门选手参考。
1. 项目整体设计与思路拆解
1.1 为什么是“先规划轨迹,再做跟踪控制”
换道这个动作,很多人一开始觉得简单,就是从一个车道变到另一个车道而已。但放到控制问题的框架里看,它天然拆成两层:一层是“在哪段时间、以什么样的路径从前一个车道到目标车道”,另一层是“车辆到底怎么打方向盘、才能沿着这条路准确走过去”。
如果跳过轨迹规划直接设计控制器,只能给一个目标车道中心线作为终点,控制器很难处理“从当前位置平滑过渡到目标位置”的问题。换道过程中车辆姿态、横向偏移、转向角度都需要一个具体的过程曲线来引导。这套模型里的做法很标准:先由五次多项式在Frenet/笛卡尔坐标系下生成一条从换道起点到终点的参考路径,再由MPC控制器去跟踪这条路径。两层各管各的事,逻辑清晰,调试时也能分别定位问题。
1.2 五次多项式和MPC各自的选型理由
换道轨迹规划有很多种形式,三次多项式、五次多项式、贝塞尔曲线、B样条都存在。这套方案选五次多项式,核心原因是它可以同时约束起点的位置、速度/航向、加速度,以及终点的位置、速度/航向、加速度,共六个边界条件。三次多项式只能约束位置和速度,换道起止点位置的加速度会突变,反映到控制层面,前轮转角在两端会像台阶一样跳变,乘坐舒适性和控制稳定性都受影响。五次多项式让加速度曲线也连续变化,路径曲率平滑过渡,这是它在这个场景里胜出的关键。
轨迹跟踪控制器的选择上,纯跟踪、LQR、MPC都能做,但换道这种带有明确约束的过程,MPC的优势非常明显。纯跟踪的前瞻距离很难自适应,换道这类大横向偏移工况下容易切弯或振荡。LQR作为无限时域最优控制,公式大会员并且难以显式处理约束,而换道过程中前轮转角完全可能顶到限位。MPC把约束写进优化问题,在预测的多个未来步中寻找既能跟踪参考轨迹、又满足转向极限的控制序列,更贴近真实规控需求。
个人观点:这套“五次多项式规划+MPC跟踪”的组合,属于工程中俗称的“标准套餐”。不会过于炫技,但每个环节的选型都有清晰的物理和数学依据,非常适合作为学习模板或者二次开发基座。
1.3 整条信号链路的走向
整套Simulink模型本质上是一条闭环信号链:轨迹生成模块以仿真时间t为输入,实时计算当前时刻的参考横向/纵向位置、参考航向角、参考曲率;MPC控制器接收参考轨迹和当前车辆状态反馈,求解出前轮转角控制量;控制量经过限幅后送给车辆动力学模型;车辆模型输出新的位置、航向、横摆角速度等状态;状态反馈给MPC以及误差计算模块,误差送入示波器记录。部分版本还会在MPC前端加一个坐标变换模块,把参考轨迹转换到误差坐标系下再进控制器。整条链路的架构不复杂,但“参考轨迹从哪来、反馈状态用哪个坐标系”这两个问题,如果没想清楚,模型容易在莫名的地方发散。
2. 五次多项式换道轨迹规划的数学原理与参数设计
2.1 多项式表达式与六个边界约束
这套模型采用换道横向位移相对于纵向距离的函数来描述参考轨迹,形式是:
y(x) = a0 + a1·x + a2·x² + a3·x³ + a4·x⁴ + a5·x⁵
其中x是沿车道方向的纵向距离,y是横向偏移。换道过程中车辆从当前车道中心(y=0)平滑过渡到目标车道中心(y=D,D一般为车道宽度,通常取3.5米左右)。
边界条件为:
- 起点处:y(0)=0,y'(0)=0,y''(0)=0
- 终点处:y(Xe)=D,y'(Xe)=0,y''(Xe)=0
这六个方程正好解出a0~a5六个未知系数。Xe是完成整个换道过程所需的纵向距离,由车速和换道时间决定,例如车速15m/s、换道时间4秒时,Xe约为60米。
2.2 系数求解的计算矩阵与归一化处理
把六个边界方程写成矩阵形式,求解过程其实很固定:
[a0, a1, a2, a3, a4, a5]ᵀ = A⁻¹ · b
其中:
A = [ 1, 0, 0, 0, 0, 0; 0, 1, 0, 0, 0, 0; 0, 0, 2, 0, 0, 0; 1, Xe, Xe², Xe³, Xe⁴, Xe⁵; 0, 1, 2·Xe, 3·Xe², 4·Xe³, 5·Xe⁴; 0, 0, 2, 6·Xe, 12·Xe², 20·Xe³ ]
b = [0, 0, 0, D, 0, 0]ᵀ
实际计算时有个非常容易踩坑的数值问题:Xe如果达到几十或上百米,Xe的五次方会到10^10量级,矩阵A的元素数量级差异很大,直接求逆在单精度下可能不可靠。我在模型里建议把纵向坐标归一化,令s = x / Xe,变成无量纲坐标,再求解,或者干脆用MATLAB的符号计算配合vpa保留高精度。很多初学者在这个环节看似求出了系数,画出来的轨迹却抖动,往往是精度不足导致的。
2.3 换道时长和目标横向位移的设计逻辑
换道时间T是这套规划里最重要的主观参数。换道时间太短,横向加速度峰值过大,轮胎容易突破附着极限,车体侧倾感明显;太长则换道过程冗长,对周围交通流干扰变大。工程上城市工况一般取4~6秒,高速工况取5~8秒。配套的说明文档里推荐了一组默认参数:车速15m/s,换道时间4秒,横向偏移3.5米。这几个参数直接决定了Xe = v·T = 60米,也决定了多项式的曲率分布。改变车速时必须同步检查横向加速度是否超过约0.3g的经验阈值,否则乘车人会明显不适。
这里有一个规划与控制的耦合问题值得注意:轨迹规划隐含了“车辆严格按规划速度行驶”的假设,如果实际车速与规划时用的车速不一致,参考轨迹和时间轴就会错位。在这套Simulink模型里,由于纵向速度控制比较稳定,这个问题不明显,但在实车或高保真车辆模型上必须考虑横向/纵向的耦合。
3. MPC轨迹跟踪控制器的建模与求解
3.1 车辆预测模型的选取与离散化
MPC要工作,首先得有一个能“预测未来”的模型。这套Simulink模型里用的是经典的车辆运动学自行车模型,状态量取为[X, Y, φ, v],其中X、Y是车辆在世界坐标系下的位置,φ是航向角,v是纵向速度。控制量取前轮转角δ。
运动学方程为:
X_dot = v·cos(φ) Y_dot = v·sin(φ) φ_dot = v·tan(δ) / L
其中L为轴距,典型乘用车取2.8米左右。运动学模型在小到中速度、低侧向加速度场景下精度够用,状态量少,预测计算负担轻,非常适合换道这种中低速工况的MPC设计。
对MPC实现来说,必须把这个连续模型离散化。常见做法是在Simulink里用c2d函数或者直接做一阶欧拉近似,采样周期Ts取0.1秒。一阶欧拉在0.1秒采样下有轻微误差,但对换道跟踪问题足够。更精细的做法是用零阶保持的精确离散化,MATLAB里语句就是sysD = c2d(sysC, Ts, 'zoh')。
3.2 目标函数和约束的具体设计
MPC在每个控制周期要解一个有限时域优化问题,目标函数的一般形式是:
J = Σ(k=1..N) (x_k - x_ref,k)ᵀ·Q·(x_k - x_ref,k) + Σ(k=0..Nc-1) Δu_kᵀ·R·Δu_k
实际模型里状态通常不是直接用X、Y、φ,而是转换成误差量:横向位置误差e_y(车辆当前位置到参考轨迹的横向偏差)、航向误差e_φ、横摆角速度误差等,这样物理意义清晰,权重也好设。预测时域N取10步左右,控制时域Nc取3~5步。Nc比N小的原因很直接:未来比较远的控制量对当前决策影响小,减少控制自由度能显著降低QP求解规模。
权重矩阵的设计,我在模型里默认的经验值是这样的:
- 横向位置误差权重:Q11 = 20~50。这是跟踪精度的主要来源,换道过程中最关心的就是横向偏差。
- 航向误差权重:Q22 = 5~10。航向误差过大会导致MPC“只顾位置不管姿态”,车辆以较大的斜角切入目标车道。
- 控制增量权重:R = 0.5~2。这个值不能太小,否则前轮转角会高频抖动;也不能太大,否则跟踪响应变慢。
约束方面,前轮转角δ一般限制在±0.5 rad(约±28.6°),控制增量Δδ限制在±0.3 rad/s。前轮转角约束对应机械转向极限,控制增量约束则等效于转向速率限制,后者对抑制振荡非常关键。
3.3 QP求解的数值细节与时域参数调整
标准MPC在每个控制周期内需要求解一个二次规划问题。Simulink的MPC Controller块内部会把它转换成标准QP形式,调用内点法或主动集法求解。如果预测时域N取20步以上,QP变量数量会成倍增加,普通处理器上单步求解时间可能从几毫秒涨到几十毫秒,这在纯仿真里不敏感,但一旦要部署到实时平台就会出问题。
实测下来的经验是,预测时域N=10、控制时域Nc=3是换道场景下性价比比较高的配置。把N从10增加到15,跟踪误差改善有限,但求解时间几乎翻倍。真正对精度影响更大的是Q中的横向误差权重和控制增量权重R的比值,而不是单纯加长预测时域。
4. Simulink模型搭建与关键模块配置
4.1 模型整体架构
这套Simulink模型采用了模块化的分层结构。顶层模型里可以看到几个明显的模块组:轨迹生成模块、MPC控制器模块、车辆模型模块、状态显示与数据记录模块。轨迹生成模块内部是一个MATLAB Function块,输入为仿真时间t和车速v,输出为参考位置X_ref、Y_ref、参考航向φ_ref和参考曲率k_ref。MPC控制器模块采用Model Predictive Control Toolbox提供的MPC Controller块,控制器对象在MATLAB工作区预先配置。
车辆模型模块我拆成了两种可选形式:一种简单的运动学模型,直接用积分器搭建;另一种是带轮胎线性侧偏的动力学模型,状态量增加横摆角速度。两套模型在仿真中可以通过手动开关切换。这种设计对学习很有价值——先用运动学模型调通MPC参数,再切到动力学模型观察差异,是很好的渐进式调试路径。
4.2 轨迹生成模块的内部实现
轨迹生成模块是整个模型里最容易写错的地方。MATLAB Function块内部,核心逻辑就是根据当前时间和车速计算换道参考点的五个多项式系数。代码要点在于:
function [x_ref, y_ref, phi_ref, kappa_ref] = trajectory_gen(t, v, T, D, t_switch)
在换道开始之前(t < t_switch),参考轨迹保持当前车道直线;换道开始后,按照五次多项式计算y坐标。这里最容易掉坑的是“换道完成后的衔接”:如果换道结束后直接把参考横向位移拉回D,曲率会有一个微小但可见的跳变,模型里需要用一段过渡逻辑让MPC在换道结束后继续跟踪目标车道中心线,而不是跟踪一个永远在横向移动的参考点。
相位管理是另一个容易被忽视的细节。换道起始时刻t_switch不能在轨迹生成模块内部硬编码,而是要做成模型外部的参数,便于反复测试不同起始时机下的跟踪效果。说明文档里就把这个t_switch作为一组可调参数列在模型初始化脚本中。
4.3 MPC控制器与车辆模型的连接要点
MPC Controller块在Simulink里需要指定被控对象模型——也就是车辆模型的线性化状态空间模型。这个模型必须在MATLAB工作区中预先定义好,用前面提到的运动学模型求雅可比矩阵,再线性化、离散化。
这里有一个关键的接口不匹配问题:MPC内部的预测模型必须与仿真中的车辆模型状态定义一致。MPC控制器认为自己控制的是一辆车,这辆车的状态量顺序、单位、物理含义必须和Simulink里搭的那辆车完全对得上。最常见的翻车现场就是状态顺序搞反了,控制器计算出来的控制量明显不对,但偏偏不报错,因为数值上依然在求解可行解,只是预测的是“另一辆车”的未来。
车辆模型模块的输出一般有:当前坐标X/Y、航向角φ、纵向速度v。把它们与参考轨迹求差得到误差量,再送进MPC。MPC Controller块还需要一个总线对象或者向量输入接口,这部分在配置控制器对象时要注意匹配。
仿真求解器设置上,建议固定步长,步长取0.01秒或更小。这样MPC控制周期0.1秒内包含多个仿真步,能比较准确地模拟连续系统动态。用变步长求解器跑MPC模型偶尔也能跑通,但时间步跳跃大时,MPC的离散预测模型和仿真模型之间会有不必要的误差。
5. 常见问题与调参实录
5.1 轨迹规划阶段的典型坑
换道轨迹规划最典型的问题,是生成的轨迹曲率在起点或终点出现尖峰。发生这种情况,先查Xe是否太大或太小。Xe太小(比如车速低但换道时间短),轨迹横向加速度集中在极短距离内,曲率峰值明显偏高;Xe太大,五次多项式系数间的数值差异变大,求解精度下降。解决办法是合理重算换道时间,并在MATLAB脚本里先画出曲率曲线再送进控制器。
另一个常见坑是横向位移D与车道宽度不匹配。如果D取得比实际车道窄,换道完成后车辆仍然压线;取得太宽,车辆会越过目标车道中心线。做毕设或课题时,建议把车道宽D定义成模型全局参数,并和参考轨迹生成模块共享同一个变量来源,避免在两处分别写死数值。
5.2 MPC调参的实战经验
调MPC时,我个人的顺序是从约束调起。先把前轮转角约束设得比较宽(比如±0.6 rad),把R值设大(比如5),确保系统稳定收敛,然后逐步减小R到模型能接受的最高频响应范围。这个过程像拧螺丝,一次只动一个参数。横向误差权重Q11不够大时,车辆在换道中点会有明显外飘;此时加大Q11可以压住误差,但也会让转向响应变急,需要同步加大控制增量约束的松弛处理。
采样时间Ts的选择也很讲究。Ts=0.1秒是比较常见的平衡点。Ts太大,预测模型离散误差增大,尤其在车速变化较快时;Ts太小,预测时域覆盖同样的物理时长需要更多步,求解压力陡增。我试过把Ts改成0.05秒,N保持10步,预测覆盖时长缩到0.5秒,系统开始出现可以观察到的高频振荡。
5.3 仿真发散时的排查清单
仿真发散一般有迹可循,按照下面这个清单排查能节省大量时间:
- 检查车辆模型输出的单位量纲。有些版本里速度用的是km/h,MPC内部预测用的m/s,一个单位没对齐,控制器会输出错误转角。
- 检查MPC的初始状态是否与车辆模型当前状态一致。如果MPC初始化时状态全零,而车辆初始位置在某个非零坐标上,第一个控制周期就会产生大误差。
- 检查控制量限幅是否生效。转角限幅如果放在MPC外部独立模块中,MPC内部不知道限幅存在,求解结果可能在限幅附近反复进出,导致振荡。
- 检查参考轨迹是否存在跳变。轨迹生成模块如果用了阶跃信号或者时序逻辑不连续,MPC会为了跟踪错误的参考量而做出剧烈动作。
- 检查Q和R的比例。如果Q/R比值超过100倍,通常会出现抖动;低于0.1倍,跟踪响应会过于迟钝。
在这套模型上,我调试中最常遇到的是第一和第四条。单位问题只要认真统一变量就能解决,轨迹跳变则需要在MATLAB Function里加防抖逻辑。还有一个很容易忽视的细节:Simulink运行前必须运行初始化脚本,脚本中如果没把MPC对象里的状态空间模型更新为当前车辆参数,控制器就会拿一套旧的预测模型工作,仿真结果自然不对。
提醒:MPC调参有一个“自我安慰陷阱”——只盯着仿真里的误差曲线,看到误差收敛就觉得万事大吉。一定要同时看控制量输出曲线,如果前轮转角频繁大幅摆动,说明控制器在牺牲控制代价换精偏信号,这样的模型在实车上不能直接用。
6. 一些适用于二次开发和扩展的补充思路
这套模型的价值不只是“能跑通”,更在于它是一个可扩展的算法验证平台。基于它做二次开发的方向比较多,比如把五次多项式换成Spine曲线或贝塞尔曲线做对比实验,把MPC里的运动学模型替换为更高精度的动力学模型,或者在MPC目标函数中加入横摆角速度项来模拟更真实的车辆响应特性。换道轨迹规划与跟踪的基本框架是通用的,轮式机器人、移动小车、AGV这些方向其实也都适用,只要调整车辆轴距、最大转角约束和车速参数即可。
如果后续要往实车方向走,最优先要做的事是测一下MPC在每个控制周期内的最大求解时间。离线仿真里求解10步QP只要几毫秒,但上实时设备后CPU负载、总线通信都可能拖慢求解,安全性会受影响。做完这些扩展再回头看,这套模型的意义就更清晰了——它把轨迹规划和跟踪控制这两块相对独立的领域捏合成了一个完整的闭环,让初学者可以对整套智能车控制逻辑建立直观、系统的认知。