carsim与simulink联合仿真的线控转向系统

线控转向系统(Steer-by-Wire)这玩意儿听起来高大上,实际上就是把方向盘和转向机构之间的机械连接砍了,全靠电信号传递指令。搞这技术最大的好处是什么?当然是给自动驾驶铺路啊!但真要在实验室里拿真车测试,分分钟怕不是要赔掉老板的棺材本。这时候Carsim+Simulink这对黄金搭档就派上用场了。

先说怎么让这俩货牵手成功。打开Carsim的动力学模型库,找到那个藏在菜单深处的Export按钮——对,就是长得像导弹发射键的那个。设置采样时间别超过10ms,毕竟方向盘信号要是延迟了,仿真结果能歪到姥姥家去。导出的动态链接库(DLL)记得扔到Simulink工程目录下,别学我上次手滑丢进回收站,对着报错信息懵逼半小时。

代码部分最核心的是这个S函数接口:

function sys = carsimSfunc(t,x,u,flag)
    switch flag
        case 0 % 初始化
            [sys,~,~,~,~] = ws('initialize', 0, u);
        case 3 % 输出
            sys = ws('update', t, u);
        case {1,2,4,9} % 其他情况直接返回空
            sys = [];
    end
end

这玩意儿其实是个传声筒,Carsim的车辆动力学模型通过ws函数和Simulink打暗号。初始化时给个零位标定,update才是真干活的主,把方向盘转角、车速这些参数丢给Carsim算轮胎滑移率。注意那个u输入矩阵,第3列放的是方向盘转角,单位是弧度,别手贱填个720度进去,Carsim会以为你在玩陀螺。

carsim与simulink联合仿真的线控转向系统

转向控制算法建议单独建个子模块,比如这个PID控制器:

function delta = steeringPID(v,theta_err)
    persistent integral last_err;
    if isempty(integral)
        integral = 0;
        last_err = 0;
    end
    
    Kp = 1.2 - v*0.02;  % 车速越高P系数越小
    Ki = 0.05;
    Kd = 0.3;
    
    integral = integral + theta_err*0.01; % 0.01是采样周期
    derivative = (theta_err - last_err)/0.01;
    
    delta = Kp*theta_err + Ki*integral + Kd*derivative;
    last_err = theta_err;
end

看到没?比例项跟着车速动态调整,这招是从老司机那偷师的——低速时要猛打方向,高速时得温柔点。积分项别设太大,否则方向盘会像喝醉似的来回晃。微分项能压住过冲,但仿真时如果出现高頻抖动,八成是Kd设飘了。

联合调试时最坑爹的是数据同步。有次我在Simulink里设了20ms步长,Carsim那边却是10ms,结果转向角信号活生生走出个锯齿波。后来在模型配置里加了这句才搞定:

set_param('SteerByWire', 'FixedStep', num2str(Ts))

Ts必须和Carsim导出时的采样时间严丝合缝,差个0.1ms都不行。仿真跑起来后重点盯着横摆角速度和侧向加速度,要是曲线比DJ打碟还刺激,赶紧回去调控制参数吧。

说到底,这套仿真方案最适合拿来验证控制算法。毕竟真车的EPS系统有机械死区,仿真模型里可没有这限制。不过下次你老板让你三天搞个转向控制器原型时,至少不用跪着求硬件部门借车了不是?

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐