carsim与simulink联合仿真——轨迹跟随,车道保持,横向控制 carsim的cpar文件导入即可使用 simulink的mdl模型文件支持自己修改 模型说明文件

在自动驾驶demo里看到车子自己拐弯是不是觉得很酷?今天咱们就动手搞一个。抽屉里翻出吃灰的CarSim安装盘,配合Matlab/Simulink,咱们半小时就能搭出个能车道保持的模型。

先打开CarSim把车辆参数整利索。把自带的ChevroletEquinox2017.cpar文件拖进Vehicle标签,这车重1.8吨,轴距2.85米,方向盘打死2.5圈——这些参数后面调控制器时会反复用到。重点检查轮胎魔术公式参数对不对,尤其是那个B.C1参数要是0.3开头的,这直接影响轮胎侧偏刚度。

Simulink这边打开TrajectoryTracking.slx,模型结构看着挺唬人,其实核心就三块:轨迹生成器在疯狂输出参考路径,MPC控制器在绞尽脑汁算方向盘转角,CarSim接口模块正把车辆状态偷偷传给控制器。咱们先看轨迹生成部分的代码:

function refPath = generateSinusoidalPath(t)
    amplitude = 3.5;  % 车道宽度的一半
    wavelength = 150; % 道路起伏波长
    refPath.y_ref = amplitude * sin(2*pi*t/50); 
    refPath.psi_ref = atan((2*pi*amplature)/wavelength * cos(2*pi*t/50));
end

这其实在生成一条正弦波形的参考路径,相当于让车子在连续S弯里蛇形走位。注意psi_ref的计算用了三角函数导数,确保航向角连续变化,避免方向盘突然抽风。

重点看看横向控制的黄金代码段——模型预测控制的核心代价函数:

function cost = mpcCostFunction(u, x, ref)
    Q = diag([10, 5, 2]);  % 横向误差、航向角误差、方向盘权重
    horizon = 10;
    cost = 0;
    current_state = x;
    for k = 1:horizon
        current_state = bicycleModel(current_state, u(k), 0.1); % 0.1秒预测步长
        error = [current_state.y - ref.y(k); 
                 current_state.psi - ref.psi(k);
                 u(k)];
        cost = cost + error' * Q * error;
    end
end

这里用自行车模型做预测,Q矩阵就像调音台——第一个参数调大车子就死死咬住车道线,但方向盘可能抖成帕金森;第三个参数加大能让转向更平顺,但跟踪精度会下降。建议初次调试时先把航向角权重(Q[2])设为0,专心调横向误差。

遇到仿真卡成PPT?八成是求解器在作妖。把Simulink的Solver从变步长改成定步长,步长设0.01秒,CarSim那边的输出频率调到100Hz,立马丝滑如德芙。要是出现方向盘疯狂左右打,检查下车辆参数里的转向传动比是不是和控制器输出对得上——曾经有兄弟把14.8的传动比错输成1.48,车子在弯道里跳起了街舞。

最后看结果时别光盯着误差曲线,CarSim的3D动画才是灵魂。按住Ctrl+Shift再点动画界面的轮胎,能显示实时滑移率。当看到轮胎边缘泛起淡淡的红色(说明开始出现侧滑),就是提醒你该优化轮胎模型或者降低控制器的攻击性了。

模型包里附带的TuningGuide.pdf第23页有个骚操作:把前轮侧偏刚度和后轮的比值调到1.3:1,能让车子在急转弯时自动呈现转向过度的趋势,配合控制器能做出漂移效果——当然,甲方验收时可千万别这么玩。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐