CarSim与Simulink联合仿真实时检测动态规划路径实现超车换道基于mpc模型预测控制实现距离效果见视频 carsim参数配置文件导入即可运行simulink模型文件 模型说明文档最近在搞CarSim和Simulink联合仿真玩超车换道这玩意儿真不是一般的有意思。直接把我折腾好的参数配置文件甩进CarSimSimulink那边模型加载就能跑实测视频里能看到车辆嗖的一下完成换道超车整个过程稳如老狗。先说说联合仿真这茬。CarSim里设置车辆动力学参数的时候重点注意轮胎模型选MF轮胎悬架刚度系数建议用默认值别乱动。Simulink这边需要搞个IO接口模块核心是这个配置代码vs_config vsSetup(); vs_config.sample_time 0.01; % 10ms步长 vs_config.vehicle Sedan; % 对应CarSim车型 vs_build(vs_config); % 生成S-Function这代码相当于给两个软件牵了条数据线。特别说下sample_time参数改大了车辆会飘0.01秒是实测最佳值。之前试过0.05秒好家伙车辆轨迹抖得跟帕金森似的。动态规划这块搞了个五次多项式轨迹生成。核心是这段路径生成代码function path generate_trajectory(start, goal) T 3; % 换道用时 coeff_x quintic_poly(start.x, goal.x, T); coeff_y quintic_poly(start.y, goal.y, T); % 省略中间解方程组的过程... path (t)[polyval(coeff_x, t); polyval(coeff_y, t)]; end这玩意儿能根据前车速度动态调整T参数。重点在五次多项式的加速度连续实测比三次多项式顺滑太多。之前用三次多项式的时候方向盘转角突变太猛CarSim直接报错甩脸色。CarSim与Simulink联合仿真实时检测动态规划路径实现超车换道基于mpc模型预测控制实现距离效果见视频 carsim参数配置文件导入即可运行simulink模型文件 模型说明文档MPC控制器才是重头戏在Simulink里搭了个自定义模块。核心是优化问题的构建代码for k 1:N cost cost 0.5*weights(1)*(X(k)-ref_x(k))^2 ... 0.3*weights(2)*(Y(k)-ref_y(k))^2; if k 1 cost cost 0.2*weights(3)*(delta(k)-delta(k-1))^2; end end权重系数weights[1.2, 0.8, 0.5]是调参调出来的玄学参数。这里给横向误差的权重加了buff毕竟换道首要保证别怼上隔壁车道的车。有个坑是必须加方向盘转角变化率的惩罚项不然方向盘能给你扭成麻花。实时检测模块里埋了个超声波雷达的模拟器代码里这个判断逻辑贼关键if (relative_speed -2) (distance 15) trigger_lane_change(); end当后车逼近速度超过2m/s且距离小于15米时触发强制换道。实测这个阈值在80km/h工况下最稳妥。之前用10米阈值翻过车——雨天制动距离不够直接给干出护栏了。跑起来之后在CarSim里能看到方向盘转角曲线像过山车一样刺激但车身横摆角始终稳在2度以内。视频里那蓝色轨迹线跟刀切的一样直跟旁边那辆慢车擦肩而过的时候最近距离控制在0.8米左右——别紧张这在国标里算合格水平。配置文件里有个隐藏参数Steer_ratio16.5千万别乱改这数值对应某德系车的转向特性。之前手贱改成14结果车辆入弯时直接spin活脱脱排水渠过弯失败现场。整套模型跑完大概吃8个G内存显卡不好的兄弟记得把CarSim的渲染精度调低点。