ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于Simulink的汽车行驶阻力计算子系统建模与仿真验证

基于Simulink的汽车行驶阻力计算子系统建模与仿真验证 在整车动力性能仿真中行驶阻力子系统承担的任务是把车辆受到的滚动阻力、空气阻力、坡度阻力和加速阻力统一计算为总阻力为后续的驱动力平衡、加速度计算和动力性指标评价提供基础。使用 Simulink 建模时这个子系统虽然只是整车模型中的一个模块却往往决定了仿真结果是否可信阻力算小了最高车速会偏高阻力算大了加速时间会偏长。本讲围绕“基于 Simulink 的汽车动力性能建模与仿真”中的第 5 个专题完整演示如何从汽车理论公式出发搭建一个可复用、可验证、可接入整车闭环的行驶阻力计算子系统。文章适合已经熟悉 Simulink 基础模块操作、了解 MATLAB 基本语法的读者。整个建模过程不依赖 Simscape 等附加工具只用 Simulink 基础模块库和常规端口因此在不同版本之间基本通用。读完这篇内容后你可以独立搭出带参数封装的行驶阻力子系统能通过 MATLAB 脚本校核输出也能把它接入动力系统模型完成纵向动力学仿真。1. 为什么要在整车仿真中单独建行驶阻力子系统1.1 行驶阻力在动力性能仿真中的位置在整车纵向动力学模型中汽车沿行驶方向的运动由牛顿第二定律决定驱动力减去行驶阻力后剩余部分用来改变车辆运动状态。行驶阻力并不是一个固定数值它随车速、坡度、加速度和车辆参数实时变化。把阻力计算封装成独立子系统意味着整车模型只关心阻力子系统的接口不需要在顶层模型里反复展开阻力公式这样做可以显著降低模型复杂度。从仿真链路看阻力子系统通常位于被控对象模型的中心位置。驾驶员模型给出加速踏板和制动踏板信号动力系统模型把踏板信号转换成车轮驱动力阻力子系统根据当前车速、坡度和加速度算出需要克服的总阻力纵向动力学模块再做驱动力与阻力的差积分得到车速。任何一个环节出错都会让整个仿真结果偏离真实车辆表现。因此阻力子系统是整车动力性能模型中最基本、也最需要严格验证的结构。1.2 建模目标与可复用性这一讲想要实现的子系统需要满足几个目标输入车速、坡度角、加速度和可选风速输出总行驶阻力。内部可分别观测滚动阻力、空气阻力、坡度阻力和加速阻力。所有车辆参数可由外部配置不需要修改模型内部连线。输出结果能通过已知工况的解析解校核。后续可以接入整车加速、爬坡、最高车速等场景仿真。满足这些条件后子系统的可复用性才会明显提升。换一辆车时只需要改参数不需要重新建模做代码生成时子系统可以被替换成对应的 C 代码做 MIL 测试时可以通过外部输入批量验证阻力计算结果。这也是把阻力计算从整车模型中拆出来的真正原因不是为了画图好看而是为了可验证、可复用、可替换。2. 行驶阻力的物理模型和参数定义2.1 汽车行驶方程汽车在纵向路面行驶时驱动力与行驶阻力之间满足如下平衡关系Ft Ff Fw Fi Fj其中Ft 为驱动轮上的驱动力。Ff 为滚动阻力。Fw 为空气阻力。Fi 为坡度阻力。Fj 为加速阻力。这个方程的物理含义是发动机或电机输出的扭矩经过传动系统到达驱动轮转换为车轮上的驱动力这部分能量一部分用来克服路面、空气和坡度带来的稳态阻力另一部分用来改变车辆动能也就是加速或减速。在 Simulink 中这个方程既可以以总阻力输出的形式体现也可以分成四个独立支路分别计算。理解这一点很重要因为后续所有子系统的输入输出设计都围绕这个平衡方程。只要驱动力大于总阻力车辆就加速等于总阻力车辆保持匀速小于总阻力车辆减速。最高车速工况正是三者平衡时的速度点。2.2 各项阻力的公式与单位四项行驶阻力的表达式如下阻力类型计算公式单位主要影响因素滚动阻力 Fff·m·g·cos(α)N滚动阻力系数、车重、坡度角空气阻力 Fw0.5·ρ·Cd·A·v²N车速、空气密度、风阻系数、迎风面积坡度阻力 Fim·g·sin(α)N车重、坡度角加速阻力 Fjδ·m·aN旋转质量换算系数、车重、加速度各参数含义m整车质量单位 kg。g重力加速度通常取 9.81 m/s²。f滚动阻力系数与路面类型和轮胎状态有关。ρ空气密度标准大气压常温下取 1.225 kg/m³。Cd空气阻力系数轿车一般在 0.25 到 0.35 之间。A车辆迎风面积单位 m²。v车速单位 m/s。α坡度角单位 rad。δ旋转质量换算系数一般大于 1。a纵向加速度单位 m/s²。使用公式时必须注意单位统一。如果车速输入是 km/h需要先换算成 m/s 再参与空气阻力计算。如果坡度输入是角度需要先转成弧度再传入 sin 和 cos 函数。这是行驶阻力子系统最常见的报错来源。2.3 模型输入输出和参数定义根据上面的物理公式子系统接口可以设计为信号方向信号名称单位说明输入vm/s车辆纵向车速输入alpharad道路坡度角输入am/s²纵向加速度输出F_totalN总行驶阻力输出F_fN滚动阻力输出F_wN空气阻力输出F_iN坡度阻力输出F_jN加速阻力在 Simulink 中这些输入输出对应 Inport 和 Outport 模块。参数则包括 m、g、f、rho、Cd、A、delta 等。参数是否定义得清楚直接影响模型的可维护性。实际项目中可以创建一个 MATLAB 脚本保存参数结构体也可以通过 Mask 封装把参数绑定到子系统图标上两种方式各有适用场景后面会详细说明。3. 环境准备与子系统模型结构设计3.1 MATLAB/Simulink 环境要求搭建这个子系统只需要 MATLAB 基础环境和 Simulink 模块库。推荐使用的版本是 R2020b 或更新的版本旧版本也能完成建模只是在模块外观和总线信号支持上略有差异。需要的工具箱MATLABSimulink不需要额外安装 Simscape、Simscape Driveline 或 Vehicle Dynamics Blockset。这些工具箱虽然提供更完备的整车建模能力但对于行驶阻力计算这样的小系统基础 Simulink 已经足够。这样做的好处是模型依赖轻、打开快、便于后续手工控制模型细节。工程开发时建议在启动 MATLAB 后先执行一组参数初始化脚本把车辆参数放进 MATLAB 工作区。比如% 车辆参数初始化脚本文件名 vehicle_params.m m 1500; % 整车质量 kg g 9.81; % 重力加速度 m/s^2 f 0.015; % 滚动阻力系数 rho 1.225; % 空气密度 kg/m^3 Cd 0.30; % 空气阻力系数 A 2.2; % 迎风面积 m^2 delta 1.05; % 旋转质量换算系数在模型运行前执行这个脚本模型里的 Gain 和 Constant 模块就可以直接引用这些变量名。如果不执行仿真会报“Undefined function or variable”这一点初学者经常忽略。3.2 子系统顶层接口设计在 Simulink 中子系统本质上是一组模块的分组容器。可以从模型库拖入 Subsystem 模块也可以先搭建好模块再使用“Create Subsystem from Selection”功能自动生成子系统。推荐的结构是顶层模型输入v、alpha、a。顶层模型输出F_total、F_f、F_w、F_i、F_j。子系统内部使用 Gain、Product、Sum、Math Function 等基础模块。这样设计的好处是后续接入整车闭环时只需要把 F_total 输出连接到纵向动力学模块再把纵向动力学模块计算出的 v、a 反馈回阻力子系统输入端无需重新设计内部结构。如果只想输出总阻力可以把 F_f、F_w、F_i、F_j 这四个分项输出暂时删除或者只在调试阶段打开。保留分项输出对排查问题非常有利因为一旦总阻力异常你可以快速判断是哪一项阻力算错了。4. 用 Simulink 搭建行驶阻力计算子系统4.1 基于基础模块搭建滚动阻力和坡度阻力滚动阻力和坡度阻力都涉及车重和坡度角区别在于滚动阻力使用 cos(alpha)坡度阻力使用 sin(alpha)。在 Simulink 中建议复用同一个 alpha 输入分别接两个 Math Function 模块再分别乘对应的常量。具体模块连接如下从 In2 接出坡度角 alpha连接到 Math Function 模块的 cos 和 sin。cos(alpha) 乘以常量 mgf得到 F_f。sin(alpha) 乘以常量 m*g得到 F_i。如果使用 Constant 块定义常量Value 可以直接写成表达式F_f 支路常量m*g*fF_i 支路常量m*g这里要注意表达式中的 m、g、f 必须在 MATLAB 工作区存在或者在后续 Mask 封装中作为 Mask 参数存在。否则仿真时 Simulink 无法解析这些符号。实际建模时可以使用两个 Product 模块解决乘法。对于滚动阻力Product 的输入端一个是 cos(alpha)另一个是常量 mgf对于坡度阻力Product 的输入端一个是 sin(alpha)另一个是常量 m*g。两条支路互不影响便于单独检查。4.2 搭建空气阻力支路空气阻力公式中有车速平方项因此需要先把速度 v 平方再乘空气阻力系数常量。Simulink 中实现平方有两种常见方式使用 Math Function 模块选择 square。使用 Product 模块把 v 同时接到两个输入端口。推荐使用 Math Function 的 square 形式因为模型图上更清晰。连接方式如下从 In1 接出 v进入 square 数学函数。输出 v² 进入 Product 模块的一个输入。Product 模块另一个输入是常量0.5*rho*Cd*A。Product 输出即为空气阻力 F_w。如果用常量块写空气阻力系数Value 可以写为0.5*rho*Cd*A这样整个空气阻力支路的模块数量很少参数集中在一个常量块中便于查询。避免在模型中写死数字例如把 0.6125 直接放入 Gain 模块那样很难看出这个数值对应的是哪些物理参数。4.3 搭建加速阻力支路和总阻力汇总加速阻力 F_j deltama这是一个线性关系直接用 Gain 模块即可。把 In3 的加速度 a 传入 Gain 模块Gain 值设置为delta*m输出就是加速阻力。如果需要对外输出分项可以将四个分项分别接到 Outport 模块。总阻力则采用一个多输入 Sum 模块把 F_f、F_w、F_i、F_j 相加后输出到 Outport。整体模块清单如下模块类型数量用途Inport3v、alpha、a 输入Outport5总阻力及四项分阻力Math Function3cos、sin、squareProduct3阻力分项乘法Constant3mgf、mg、0.5rhoCdAGain1delta*m 加速阻力Sum1总阻力求和对于 F_f 和 F_i如果希望减少模块数量也可以用一个 Fcn 模块直接计算但要降低模型可读性。基础模块组合虽然连线多一些但是每个环节都能加 Display 或 Scope 查看中间量排错更方便。4.4 使用 Fcn 模块的快速实现方式如果不想搭太多连线也可以用 Simulink 的 Fcn 模块直接写公式。Fcn 模块中输入信号用 u 表示u(1) 是第一个输入 vu(2) 是第二个输入 alphau(3) 是第三个输入 a。总阻力 Fcn 表达式可以写为f*m*g*cos(u(2)) 0.5*rho*Cd*A*u(1)^2 m*g*sin(u(2)) delta*m*u(3)这种方式实现最快模型最简洁。但它的缺点也很明显表达式越长越难排查中间变量无法单独观测参数来源更容易混乱。如果 Fcn 中使用的 m、f、rho 等变量没有在工作区定义仿真时会直接报错。因此只有在参数定义非常规范、模型测试已经充分的情况下才推荐完全使用 Fcn 方案。实际项目中更稳妥的方案是“基础模块为主、Fcn 只做辅助计算”。5. 子系统封装与参数配置5.1 使用 Mask 封装把参数收敛到子系统图标模型里如果出现大量 Constant 和 Gain 模块换一辆车时就要逐个修改参数容易漏改。使用 Mask 功能可以把参数显示在子系统图标上实现“双击子系统弹出参数框填写完直接运行”的效果。创建 Mask 的步骤选中已经搭建好的阻力计算子系统。右键选择 Mask Create Mask。在 Parameters Dialog 页面添加参数m、g、f、rho、Cd、A、delta。设置每个参数的默认值例如 m 默认 1500g 默认 9.81。在 Initialization 页面不需要额外写代码因为模块表达式会直接引用这些参数名。封装之后双击子系统会看到参数编辑面板。填入新车型参数后不需要再打开 MATLAB 脚本仿真输出会直接更新。这是工程实践中很常用的一种做法。5.2 Mask 参数与工作区变量的取舍Mask 参数和工作区变量都能为 Simulink 模块提供数值但使用时需要注意差异方式优点缺点适用场景工作区变量批量管理方便脚本循环仿真容易换机器需要执行初始化脚本开发调试、批量工况计算Mask 参数参数跟随模型保存双击即可修改批量扫描工况时需要配合 set_param模型交接、参数整理数据字典可做版本管理支持类型定义配置流程略复杂团队协作、代码生成学习阶段建议先用 MATLAB 脚本配合工作区变量尽快跑通仿真。项目交付或代码生成阶段使用 Mask 或数据字典会更稳定。需要注意Mask 中的变量名如果与工作区变量名相同Mask 参数会覆盖工作区变量不要依赖“同名覆盖”这种隐式规则。在 Fcn 模块中引用 Mask 参数时不需要额外处理因为 Fcn 模块位于子系统内部可以直接访问所在子系统的 Mask 工作区。如果 Fcn 模块在顶层模型中则只能访问 MATLAB 基础工作区或模型工作区。这是一个容易踩坑的差异。6. 运行验证与结果对比6.1 用 MATLAB 脚本做理论校核建好模型后不能只满足于“模型能跑”还要验证结果是否符合物理公式。这里给定一个典型工况m 1500 kgf 0.015rho 1.225 kg/m³Cd 0.30A 2.2 m²delta 1.05v 20 m/salpha 3° 0.05236 rada 0.5 m/s²按理论公式手工计算滚动阻力 Ff 0.015 × 1500 × 9.81 × cos(3°) ≈ 220.42 N空气阻力 Fw 0.5 × 1.225 × 0.3 × 2.2 × 20² 161.7 N坡度阻力 Fi 1500 × 9.81 × sin(3°) ≈ 770.57 N加速阻力 Fj 1.05 × 1500 × 0.5 787.5 N总阻力 F_total ≈ 1940.19 N这个理论值就是模型输出的校核标准。如果模型输出明显偏离这个值说明建模链路或参数定义有误。可以编写一个 MATLAB 校核脚本% 校核行驶阻力子系统输出 m 1500; g 9.81; f 0.015; rho 1.225; Cd 0.30; A 2.2; delta 1.05; v 20; alpha deg2rad(3); a 0.5; Ff_theory f * m * g * cos(alpha); Fw_theory 0.5 * rho * Cd * A * v^2; Fi_theory m * g * sin(alpha); Fj_theory delta * m * a; Ftotal_theory Ff_theory Fw_theory Fi_theory Fj_theory; fprintf(Ff %.2f N\n, Ff_theory); fprintf(Fw %.2f N\n, Fw_theory); fprintf(Fi %.2f N\n, Fi_theory); fprintf(Fj %.2f N\n, Fj_theory); fprintf(Ftotal %.2f N\n, Ftotal_theory);把这组理论值与 Simulink 模型输出的 Display 数值对比能够快速发现参数连接错误、单位错误和表达式错误。6.2 模型仿真验证为了在 Simulink 中观察输出可以在模型输入端接入 Constant 块。给三个 Constant 分别设置为v 20alpha 0.05236a 0.5然后在输出端接入 Display 模块运行仿真。Display 显示的总阻力应接近 1940.2 N。四个分项输出应分别接近 220.4、161.7、770.6、787.5 N。如果数值偏差大于 1 N需要检查重力加速度 g 是否为 9.81而不是 10。角度 alpha 是否误用了 3° 而没转弧度。空气密度 rho 是否被遗漏。delta 是否写成了 1。在模型里加入 Scope 或数据记录还可以观察输入阶跃变化时四个分项的响应趋势。比如车速提高时空气阻力按平方增大坡度角增大时坡度阻力按 sin 增大这些趋势符合物理直觉也是模型可信度的直观证据。6.3 不同工况下的批量验证单个工况验证通过后可以用 MATLAB 脚本批量修改模型输入观察输出是否跟随理论值变化。例如把车速从 10 m/s 增加到 30 m/s空气阻力应近似从 40.4 N 增加到 363.8 N变化不是线性的而是平方关系。v_list 10:2:30; for i 1:length(v_list) v v_list(i); Fw_theory 0.5 * rho * Cd * A * v^2; fprintf(v %2d m/s, Fw_theory %8.2f N\n, v, Fw_theory); end在 Simulink 中批量验证时可以通过 set_param 修改 Constant 块的 Value再调用 sim 函数运行。也可以把模型输入改为 Inport在 Simulink 中通过根级输入端口连接 MATLAB 数据。对于学习阶段更简单的方式是手动修改三个输入 Constant 的值再观察 Display 和 Scope。生产环境建议把所有输入信号使用时间序列数据在 MATLAB 中构造工况曲线做一次完整的整车循环工况仿真。7. 常见问题排查7.1 单位换算错误导致空气阻力偏大或偏小现象模型输出的空气阻力与理论值差一个数量级或者在车速从 km/h 改成 m/s 后输出异常。可能原因车速没有统一单位。空气阻力公式中 v 的单位必须是 m/s。如果把 80 km/h 直接代入公式计算结果会偏大因为 80 比换算后的 22.22 大很多。检查方式确认模型中 In1 的输入信号单位。如果来自其他模块可以加一个 Signal Conversion 或 Unit Conversion 模块也可以直接用 Gain 实现 km/h 到 m/s 的换算Gain 值为 1/3.6。处理建议在模型输入端明确标注信号单位或者在参数脚本中统一换算后传入。不要在两个模块之间依赖“约定单位”。7.2 角度与弧度混淆导致坡度阻力错误现象坡度角输入 3但输出阻力远大于理论值或者正弦余弦结果不合理。可能原因cos 和 sin 函数默认使用弧度如果直接把角度值输入计算结果错误。检查方式用 MATLAB 计算 cos(3) 和 cos(deg2rad(3)) 的差异。前者接近 -0.99后者接近 0.9986。差异非常大。处理建议如果系统输入是角度在子系统内部加一个 Gain 模块值为 pi/180把角度转成弧度后再进入 cos 和 sin。如果输入是坡度百分比需要先通过 atan 换算成角度再转弧度。建议在模型注释中写清接口单位。7.3 信号维度不匹配导致编译错误现象模型编译报错提示输入输出维度不一致或者 Product 模块的输入维度不匹配。可能原因某个输入信号是向量或矩阵而其他模块期望标量。比如从整车模型接入的 v 是 1×N 的数组而 Constant 是标量Product 无法直接运算。检查方式在模型画布上用 Line Style 查看信号线显示检查端口标签和维度提示。也可以在 MATLAB 中使用 whos 查看工作区变量维度。处理建议在子系统入口使用 Selector 模块选取需要的信号分量或者将输入统一为标量。对于总线信号建议先用 Bus Selector 取出 v、alpha、a 三个标量信号再进入阻力子系统。7.4 代数环导致模型运行缓慢或无法计算现象系统接入整车闭环后Simulink 提示检测到代数环仿真速度明显下降甚至报错。可能原因阻力子系统输入了加速度 a而加速度本身又依赖于总阻力导致 a 和 F_total 形成瞬时循环a 由驱动力和阻力决定阻力又依赖 a。检查方式在模型诊断窗口中查看代数环路径或者使用 Simulink 中的“Model Advisor”检查代数环。处理建议在整车闭环模型中推荐把加速阻力项移出阻力子系统或者不要直接反馈 a。常用做法是阻力子系统只输入 v 和 alpha输出 Ff、Fw、Fi加速度 a 由纵向动力学模块计算即 a (Ft - Ff - Fw - Fi) / (delta·m)。这样既能保持物理意义又避免了加速度瞬时反馈导致的代数环。如果确实需要在同一子系统中保留 Fj 输出可以通过加入 Unit Delay 模块把 a 延迟一个仿真步长但这会引入一定误差适合离散模型或固定步长仿真环境。8. 最佳实践与扩展方向8.1 学习环境与生产环境的差异学习阶段可以直接用 Constant 和 Display 搭好模型修改参数后手动运行。生产环境则要额外关注几个方面参数来源不要把所有车辆参数硬编码在模型里推荐使用数据字典或 Mask 封装。单位规范输入信号统一单位必要时增加单位注释或转换模块。求解器设置整车仿真建议使用固定步长求解器例如 ode4步长根据模型中最高频率决定。信号记录使用 To Workspace 或者 Simulink.SimulationOutput 记录输出便于批量处理。模型检查发布前使用 Model Advisor、Simulink Check 进行静态检查和规范检查。对于行驶阻力子系统本身还有一个容易被忽略的问题滚动阻力系数会随车速和胎压变化空气密度会随温度和海拔变化。学习环境把这些参数当作常数是合理的生产级别的整车模型可能需要把这些参数做成查表或计算公式。8.2 与整车动力性模型的集成方案阻力子系统建好后最常见的使用方式是接入整车动力性能模型。一个典型的纵向动力学模型包括发动机或电机外特性模型。变速器与主减速器模型。轮胎驱动力模型。行驶阻力子系统。纵向动力学积分环节。此时的信号连接关系可以设计为驾驶员需求扭矩 - 动力系统 - 驱动力 Ft Ft 减去 F_total - 剩余驱动力 - a (Ft - F_total) / (delta*m) a 积分 - v v 反馈到阻力子系统输入在这种结构中建议把加速阻力项的处理方式提前设计好方案一阻力子系统只输出 Ff、Fw、Fi不输出 Fj加速度在纵向动力学模块中处理。方案二阻力子系统输出全部四项但加速度来自积分输出通过 Unit Delay 延迟一拍避免代数环。方案三使用 Simscape 等物理建模工具让求解器自动处理微分与代数约束。初学者推荐方案一因为它物理意义清晰、模型结构简单、不容易出现代数环问题。只有在需要对比“旋转质量换算系数对加速性能的影响”时才需要考虑把 Fj 完整放在阻力子系统中。在扩展方向上阻力子系统还可以加入迎风风速、路面附着系数、载荷变化等输入用于研究侧风、重载、低附着路面等工况下的动力性和经济性表现。这些扩展都会增加模型复杂度但基础建摸思路保持不变所有输入统一单位所有参数有明确来源所有输出可验证。8.3 建模验收清单每次搭建完阻力子系统后可以按下面的清单做一次自检输入信号是否标明单位是否与整车模型接口一致。车速是否统一为 m/s坡度角是否统一为 rad。空气阻力是否包含 0.5、ρ、Cd、A 四个因子。滚动阻力是否使用 cos(alpha)坡度阻力是否使用 sin(alpha)。加速阻力是否乘以 1 或加上了旋转质量换算系数 delta。总阻力是否为四个分项之和Sum 模块的正负号是否正确。理论工况计算结果是否与 MATLAB 脚本一致。接入整车闭环后是否出现代数环如果出现是否已处理。参数是否来自工作区、Mask 或数据字典而不是散落在多个 Constant 中。模型是否添加了必要的注释说明接口含义和单位。这份清单也可以作为代码审查或模型评审的检查项。写清楚这些内容后行驶阻力子系统就不再只是一堆模块的堆叠而是一个可以长期维护、支持多人协作、可扩展到更复杂整车模型的基础部件。下一步建议用不同速度和坡度组合做一组仿真观察最高车速和加速时间是否合理这也是验证整车动力性能模型是否正确的关键步骤。
返回列表