CarSim与Simulink联合仿真,实时检测,动态规划路径,实现超车换道,基于mpc,模型预测控制实现,距离效果见视频 carsim参数配置文件,导入即可运行simulink模型文件 模型说明文档

最近在搞CarSim和Simulink联合仿真玩超车换道,这玩意儿真不是一般的有意思。直接把我折腾好的参数配置文件甩进CarSim,Simulink那边模型加载就能跑,实测视频里能看到车辆嗖的一下完成换道超车,整个过程稳如老狗。

先说说联合仿真这茬。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直接报错甩脸色。

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_ratio=16.5千万别乱改,这数值对应某德系车的转向特性。之前手贱改成14,结果车辆入弯时直接spin,活脱脱排水渠过弯失败现场。整套模型跑完大概吃8个G内存,显卡不好的兄弟记得把CarSim的渲染精度调低点。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐