3. Simulink基础与车辆动力学模型:环境搭建与模型构建

好,咱们进入第三讲。这一章,说白了就是打地基。Simulink环境怎么搭,车辆纵向和横向动力学模型怎么建,这些搞不定,后面联合仿真就是空中楼阁。我个人习惯,每次开新项目,第一件事就是把Simulink的模板和路径理清楚,省得后面找文件找到崩溃。

3.1 Simulink环境搭建——别小看这一步

很多人觉得Simulink打开就能用,其实不然。我刚开始带项目时,有个同事直接拿默认设置跑仿真,结果模型跑了一整天没出结果——后来发现是求解器步长设得太小了。嗯,这里要注意。

3.1.1 基础配置清单

打开Simulink,先做这几件事:

  • 设置工作路径:把项目文件夹加到MATLAB路径里。我习惯用addpath(genpath('你的项目文件夹')),一次性搞定所有子目录。
  • 选择求解器:车辆动力学仿真,我推荐用ode45(变步长)或ode15s(刚性系统)。别问为什么,问就是踩过坑——用固定步长跑高速工况,结果发散得一塌糊涂。
  • 配置仿真时间:一般设成10秒或20秒,够看一个完整的加速-制动-转向循环。

核心配置示例:

% 在MATLAB命令窗口执行
addpath(genpath('C:\Carla_Simulink_Project'));
set_param('myModel', 'Solver', 'ode45');
set_param('myModel', 'StopTime', '20');

3.1.2 模块库的选取

Simulink的模块库很庞大,但做车辆动力学,你主要关注这几个:

  • Simscape:物理建模,适合搭悬架、轮胎这种机械系统。
  • Vehicle Dynamics Blockset:专门做车辆动力学的,里面有现成的车身、轮胎、转向模型。我个人建议新手先用这个,省时省力。
  • Stateflow:做逻辑控制,比如换挡策略、ACC模式切换。

我记得有一次,一个学员非要用纯数学模块搭整车模型,结果调试了三天还没跑通。后来换成Vehicle Dynamics Blockset,半天就搞定了。你想想看,工具选对了,事半功倍。

3.2 车辆纵向动力学模型——加速与制动

纵向动力学,说白了就是研究车怎么加速、怎么减速。核心公式其实就一个:牛顿第二定律

3.2.1 纵向动力学方程

车辆在直线上行驶,受力情况如下:

  • 驱动力:来自发动机/电机,通过轮胎传递到地面。
  • 阻力:包括空气阻力、滚动阻力、坡度阻力。
  • 制动力:刹车时产生。

方程写出来就是:

m * dv/dt = F_drive - F_aero - F_roll - F_grade - F_brake

其中:

  • m:整车质量
  • v:车速
  • F_drive:驱动力
  • F_aero:空气阻力(与速度平方成正比)
  • F_roll:滚动阻力(与正压力成正比)
  • F_grade:坡度阻力(与坡度角正弦值成正比)
  • F_brake:制动力

我的经验:空气阻力系数C_d一般取0.3-0.4,滚动阻力系数f取0.01-0.02。别问我为什么,问就是查过几十款车的参数,基本都在这个范围。

3.2.2 Simulink实现

在Simulink里搭纵向模型,我习惯用积分器反馈的方式:

  1. Integrator模块对加速度积分得到速度。
  2. Integrator再积分一次得到位移。
  3. 把速度反馈回去计算空气阻力。
  4. 把驱动力和阻力求和,再除以质量,得到加速度。

代码块示例(MATLAB Function模块内):

function a = calc_longitudinal(F_drive, F_brake, v, grade)
    % 参数
    m = 1500;       % 质量 kg
    C_d = 0.32;     % 空气阻力系数
    A_f = 2.2;      % 迎风面积 m^2
    rho = 1.225;    % 空气密度 kg/m^3
    f = 0.015;      % 滚动阻力系数
    g = 9.81;       % 重力加速度
    
    % 阻力计算
    F_aero = 0.5 * rho * C_d * A_f * v^2;
    F_roll = f * m * g * cos(grade);
    F_grade = m * g * sin(grade);
    
    % 加速度
    a = (F_drive - F_aero - F_roll - F_grade - F_brake) / m;
end

避坑指南:我曾经在计算空气阻力时忘了加0.5系数,结果仿真出来的最高车速比实际高了30%。后来查了半天才发现——嗯,细节决定成败。

3.3 车辆横向动力学模型——转向与稳定性

横向动力学,研究的是车怎么转弯。这里最经典的模型就是自行车模型(Bicycle Model)。别被名字吓到,其实就是把四个轮子简化成两个。

3.3.1 自行车模型原理

为什么用自行车模型?因为简单、够用。在低速和中速工况下,它的精度完全能满足联合仿真的需求。

核心假设:

  • 忽略左右轮的差异(合并成前轴和后轴)。
  • 轮胎侧偏特性是线性的(侧偏角不大时成立)。
  • 车辆质心高度忽略(不考虑侧倾)。

状态方程如下:

状态变量: [v_y, yaw_rate]
输入: [delta, v_x]

v_y_dot = (F_yf + F_yr) / m - v_x * yaw_rate
yaw_rate_dot = (a * F_yf - b * F_yr) / I_z

其中:

  • v_y:侧向速度
  • yaw_rate:横摆角速度
  • delta:前轮转角
  • v_x:纵向速度(来自纵向模型)
  • a, b:质心到前后轴的距离
  • I_z:绕z轴的转动惯量
  • F_yf, F_yr:前后轮胎侧向力

3.3.2 轮胎侧偏力计算

轮胎侧偏力与侧偏角的关系,线性区可以写成:

F_yf = -C_f * alpha_f
F_yr = -C_r * alpha_r

侧偏角计算:

alpha_f = delta - (v_y + a * yaw_rate) / v_x
alpha_r = - (v_y - b * yaw_rate) / v_x

这里C_fC_r是前后轮的侧偏刚度,单位N/rad。我常用的值:前轮C_f = 80000,后轮C_r = 60000。当然,具体数值要看轮胎型号。

Simulink实现要点:

  • Fcn模块或MATLAB Function模块实现代数运算。
  • Integrator模块对v_y_dotyaw_rate_dot积分。
  • 注意:当v_x接近0时,侧偏角公式会除以0。我一般加一个很小的常数(比如0.01)来避免数值问题。

3.3.3 横向模型与纵向模型的耦合

这里有个关键点:纵向和横向模型不是独立的。纵向速度v_x会影响横向动力学(因为侧偏角公式里有v_x),而横向运动也会影响纵向速度(比如转弯时会有侧向滑移)。

我的做法是:

  • 纵向模型输出v_x给横向模型。
  • 横向模型输出v_yyaw_rate,用于计算车辆的实际轨迹。
  • 在联合仿真中,Carla会接收这些状态量,更新车辆位置和姿态。

小技巧:在Simulink里,我习惯把纵向和横向模型封装成两个独立的子系统(Subsystem)。这样调试时,可以单独给纵向模型一个阶跃输入,看看速度响应是否合理;再给横向模型一个正弦输入,看看横摆角速度是否振荡。分而治之,问题定位快得多。

3.4 模型验证——跑个简单工况

模型搭好了,得验证一下。我一般跑两个标准工况:

  1. 直线加速-制动工况:给一个阶跃油门,看车速从0加速到100km/h的时间;再给一个阶跃制动,看制动距离。如果加速时间在8-12秒,制动距离在40-50米(初速100km/h),基本合理。
  2. 稳态转向工况:给一个固定方向盘转角,看车辆是否进入稳态圆周运动。如果横摆角速度收敛到一个常数,说明模型没问题。

我记得有一次,学员搭的模型在稳态转向时横摆角速度一直在振荡。后来发现是轮胎侧偏刚度设得太大了——说白了就是轮胎太“硬”,导致系统阻尼不足。把刚度调小一点,问题就解决了。

重要提醒:模型验证时,一定要对比实车数据或Carla自带的车辆动力学输出。如果偏差超过10%,就要回头检查参数和模型结构。我曾经因为一个符号错误(侧偏力方向搞反了),导致仿真出来的车辆在转弯时往外甩——嗯,那画面太美不敢看。

3.5 本章小结

这一章的内容,说白了就是两件事:Simulink环境怎么配,纵向和横向动力学模型怎么搭。我个人觉得,纵向模型相对简单,核心就是牛顿第二定律加几个阻力项;横向模型稍微复杂一点,但自行车模型已经够用。

下一章,我们会把这两个模型整合到一起,再加上Carla的接口,开始真正的联合仿真。到时候你会发现,今天搭的模型就是整个系统的心脏——心脏跳得好,联合仿真才能跑得顺。

好,今天就到这里。有问题随时找我,咱们下章见。