基于Matlab/simulink搭建8轮分布式电驱动车辆23自由度动力学模型,包括6个车身自由度、8个车轮的旋转和垂向自由度、1个转向自由度以及开环驾驶员模型。 输入量为前两轴转向角度和各轮转矩,输出量包括横摆角速度、质心侧偏角、滑移率、横纵向加速度、车速、运动轨迹、车轮垂向力等。 轮胎模型采用魔术轮胎模型,用m文件编写。 最终文件包括m文件、slx文件、参考文献。 如需在此基础上改进,如加入双移线驾驶员模型,转矩控制策略等

直接打开Simulink新建空白模型的那一刻,手指头就开始发痒了。23自由度听着吓人,其实拆开来看就是六个车身运动自由(XYZ平动+横摆俯仰侧倾)、八个轮子各自转圈加蹦迪(旋转+垂向)、外加方向盘转角这个显眼包。咱先别急着搭整体框架,从魔术轮胎模型这个硬骨头啃起。

在MATLAB编辑器里新建magic_tire.m,先定义好输入输出参数:

function [Fx, Fy] = magic_tire(slip_ratio, slip_angle, Fz)
    % 魔术公式参数配置
    B = 10.5; C = 1.6; D = 1.55; E = 0.97; 
    % 纵向力计算
    Fx = D*sin(C*atan(B*slip_ratio - E*(B*slip_ratio - atan(B*slip_ratio))));
    % 侧向力计算
    Fy = -D*sin(C*atan(B*slip_angle - E*(B*slip_angle - atan(B*slip_angle))));
end

这个函数会被打包成Simulink里的MATLAB Function模块,注意Fz参数暂时没参与计算,实际应用时需要补完载荷敏感系数。轮胎模型接入悬架子系统时,别忘了用S-Function把垂向动力学耦合进来——弹簧阻尼参数建议用结构体封装,方便后期调参。

车体动力学部分直接祭出Vehicle Body模块魔改。在子系统里拖入六个积分器连成运动链,惯性张量矩阵得用m文件预计算:

inertia_matrix = diag([mass, mass, mass, Ixx, Iyy, Izz]); 
% 遇到非对角项记得补上耦合项

转向系统最有趣的地方在于阿克曼几何的实现。前两轴转角分配函数里藏着玄机:

function [delta1, delta2] = ackerman_angle(steer_input)
    wheelbase = 4.2; % 轴距
    track_width = 2.0; % 轮距
    R = wheelbase / tan(steer_input);
    delta1 = atan(wheelbase/(R - track_width/2));
    delta2 = atan(wheelbase/(R + track_width/2));
end

实际仿真时会发现低速转向正常,高速时这分配策略会让车辆变推头王,这时候就该引入可变转向比了。

搭建完模型后跑个阶跃转向测试,在Scope里看到横摆角速度曲线像过山车似的上下震荡。这时候别慌,检查悬架子系统里的阻尼系数是不是设成了0.3而不是3.0——这种手滑错误我去年犯过三次。

想升级双移线工况?把开环驾驶员换成PID跟踪器,预瞄模块得自己写:

function target_steer = preview_controller(lateral_error, heading_error)
    Kp = 1.5; Ki = 0.2; Kd = 0.8;
    persistent integral_term;
    if isempty(integral_term)
        integral_term = 0;
    end
    integral_term = integral_term + lateral_error*0.01; % 假设步长0.01s
    target_steer = Kp*lateral_error + Ki*integral_term + Kd*heading_error;
end

这个粗糙版本跑双移线会画龙,得加入预瞄距离补偿。至于转矩分配策略,试试把八个电机的扭矩按滑移率反馈动态分配,保准能让仿真结果从鬼画符变成德芙般丝滑。

文件打包时记得把参考的Pacejka那本《Tire and Vehicle Dynamics》塞进文献列表,虽然可能根本没人看,但放在那里就是学术范儿的保证。整套模型跑起来后,看着动画里八轮战车在虚拟场地上漂移,CPU风扇的咆哮声都变得悦耳起来——这才是理工男的浪漫啊。

Logo

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

更多推荐