基于模型预测控制(mpc)的车辆换道,车辆轨迹跟踪,换道轨迹为五次多项式,matlab与carsim联防控制
手把手教你用五次多项式玩转MPC换道控制
最近在调车辆横向控制时发现,用五次多项式做换道轨迹配合MPC真是香!今天咱们就抛开复杂的公式推导,直接上代码实战,聊聊怎么用Matlab和CarSim搞联合控制。
为啥非得是五次多项式?
换道轨迹要满足起终点位置、速度、加速度连续,五次项刚好能塞进去六个边界条件。举个栗子,横向位移从0变到3米,纵向速度保持20m/s,起终点加速度都得是零。用下面这段代码生成轨迹:
% 五次多项式系数计算(横向位移y关于时间t) t0 = 0; tf = 5; % 换道时间5秒 A = [1 t0 t0^2 t0^3 t0^4 t0^5; 0 1 2*t0 3*t0^2 4*t0^3 5*t0^4; 0 0 2 6*t0 12*t0^2 20*t0^3; 1 tf tf^2 tf^3 tf^4 tf^5; 0 1 2*tf 3*tf^2 4*tf^3 5*tf^4; 0 0 2 6*tf 12*tf^2 20*tf^3]; b = [0; 0; 0; 3; 0; 0]; % y(t0)=0, y'(t0)=0, y''(t0)=0 → y(tf)=3m coeff = A\b; % 解线性方程组生成曲线类似S型,加速度连续不会让乘客晕车。但实际场景中得考虑纵向速度变化,这时候需要做轨迹参数化处理(比如用s-L坐标系)。
MPC控制器核心操作
模型预测控制的精髓在于滚动优化。这里用二自由度单车模型做预测:
% 状态量:[横向位移y,横摆角psi,横向速度vy,横摆角速度r] % 控制量:前轮转角delta dt = 0.1; % 控制周期0.1秒 A_k = [1 dt 0 0; 0 1 dt 0; 0 0 1 -vx*dt; 0 0 0 1]; B_k = [0; 0; C_alpha_f*dt/m; C_alpha_f*lf*dt/Iz]; % 轮胎侧偏刚度代入目标函数设计是关键——既要跟踪轨迹又要限制方向盘打得太猛:
H = blkdiag(Q, R); % Q惩罚状态误差,R惩罚控制量变化 f = -Q*Y_ref; % Y_ref是未来N步的参考轨迹 [delta_opt,~,exitflag] = quadprog(H,f,A_cons,b_cons,[],[],delta_min,delta_max);实际调试时会遇到几个坑:
- 预测时域N选太大导致求解慢,建议从N=10开始试;
- 权重矩阵Q对角线元素别拍脑袋定,先让横向位移误差权重比角度大10倍;
- 约束前轮转角变化率(方向盘转速不能超过500度/秒)。
CarSim和Matlab的基情配合
基于模型预测控制(mpc)的车辆换道,车辆轨迹跟踪,换道轨迹为五次多项式,matlab与carsim联防控制
联合仿真的核心是数据交互协议。在Simulink里拉出这几个接口:
- CarSim输出:车速vx、横向误差ey、横摆角
- Matlab输入:前轮转角指令
!
建议用S-Function做CarSim接口,避免IO延迟问题
调试时注意单位换算!CarSim默认用英制单位,记得在Dataset里改成kph和rad。遇到过最离谱的bug是方向盘转角符号反了,车子直接蛇形走位...
效果展示与调参玄学
成功运行时能看到车辆丝滑换道,方向盘的转角变化像下面这样:
!
如果出现轨迹震荡,尝试:
- 增大MPC的R矩阵权重(让控制量变化更保守)
- 检查轮胎模型是否线性区(大转角时非线性明显,得换更复杂的模型)
完整代码已传Github(搜索MPC_LaneChange),包含联合仿真配置文件和参数说明。下期预告——加入障碍物避让的MPC该怎么玩?
注:实际项目记得考虑路面附着系数变化和传感器噪声,仿真和实车差距往往在这些细节里。