基于Matlab/simulink搭建4轮分布式电驱动车辆23自由度动力学模型,包括车身6自由度、4个车轮的旋转和垂向自由度、1个转向自由度以及开环驾驶员模型。 输入量为第一轴转向角度和各轮转矩,输出量包括横摆角速度、质心侧偏角、滑移率、横纵向加速度、车速、运动轨迹、车轮垂向力等。 文件包括.m文件、slx文件、参考文献。
直接上手搞四轮分布式电驱动模型这事儿,比想象中带劲多了。今儿咱们要折腾的23自由度模型,说人话就是把车拆成会动的积木------车身能上下蹦跶、左右摇摆、前后晃悠,四个轮子各自带着电机转圈圈,外加方向盘带着前轮扭屁股。

先说悬架这茬,Simulink里用S-Function实现弹簧阻尼模型最实在。看这段代码:
matlab
function F = suspension_model(z,zdot)
k = 25000; % 弹簧刚度/N·m⁻¹
c = 1500; % 阻尼系数/N·s·m⁻¹
F = k*z + c*zdot; % 悬架力计算公式
end
这里边儿藏着玄机:刚度过大会让车轮像踩了钉子似的乱蹦,阻尼太小又像坐船似的晃不停。实际调参时得开着仿真看垂向力曲线跳舞,找到那个既不颠屁股又能吃住地的平衡点。
转向系统这块,搞了个齿轮齿条模型。关键是要处理转向角到前轮转角的非线性关系:
matlab
steer_ratio = 16:1; % 转向传动比
delta_wheel = steer_input / steer_ratio;
% 阿克曼转向几何修正
left_angle = delta_wheel * (1 - wheelbase/(2*track_width));
right_angle = delta_wheel * (1 + wheelbase/(2*track_width));
注意那个阿克曼修正系数,直接关系到转弯时内外轮转角差。实测发现当车速超过80km/h时,这修正量得动态调整,否则高速变道时横摆角速度会抽风。

电机扭矩分配是重头戏,四台永磁同步电机的协同控制直接决定车辆稳定性。这个状态流图特别实用:
matlab
function torque_distribute(vx, ay, slip)
% 基于车速和侧向加速度的动态分配
front_bias = 0.6 - 0.2*(vx/100);
rear_bias = 1 - front_bias;
torque_matrix = [front_bias*0.7, front_bias*0.3;
rear_bias*0.4, rear_bias*0.6];
% 考虑滑移率的扭矩限制
torque_limit = 1./(1 + exp(5*(slip-0.15)));
final_torque = torque_matrix .* torque_limit;
end
这个分配策略在冰雪路面实测时,能把滑移率控制在0.12-0.18之间。注意那个sigmoid函数的应用,比硬阈值顺滑得多,避免扭矩突变导致的车身抖动。
验证模型时最爽的是看轨迹跟踪效果。跑双移线工况时,把期望轨迹和实际轨迹叠在一起:
matlab
plot(ref_x,ref_y,'b--',sim_x,sim_y,'r-');
legend('参考轨迹','实际轨迹');
title('蛇形绕桩轨迹跟踪');
xlabel('纵向位移(m)');
ylabel('横向位移(m)');
grid on;
这时候如果发现轨迹像喝醉似的画龙,八成是横摆惯量参数设错了。记得检查簧载质量与非簧载质量的转动惯量匹配度,这玩意儿对操控特性影响比想象中还大。

模型跑起来后,车轮垂向力的实时监测特别重要。用这个结构体存储数据:
matlab
wheel_force.Fz = zeros(4,1);
wheel_force.Fx = zeros(4,1);
wheel_force.Fy = zeros(4,1);
% 更新函数里这么搞
for i=1:4
wheel_force(i).Fz = calculate_vertical_force(...);
[wheel_force(i).Fx, wheel_force(i).Fy] = pacejka_model(...);
end
注意垂向力突变往往意味着悬架触底或者车轮离地,这时候得赶紧检查轮胎模型里的法向力-滑移率耦合关系是不是没处理好。
最后说个坑:千万别在同一个模型里混用固定步长和变步长求解器!之前因为电机控制模块用了ode45而整车模型用ode15s,结果仿真到3.2秒必崩溃。统一改用ode23tb后稳如老狗,虽然计算速度慢点儿,但数值稳定性真不是盖的。

模型文件打包时记得把参考文献的Bakker轮胎模型参数表带上,那堆魔术公式系数可不是拍脑袋能编出来的。整个工程跑顺之后,试着给扭矩分配加个PID闭环,立马能看见滑移率曲线老实多了------不过那就是另一个故事了。