ARTICLE DETAIL

资讯详情

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

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

基于Simulink的汽车行驶阻力计算子系统建模与验证方法 很多做整车动力性能仿真的人第一步不是急着搭建发动机或电机模型而是把车辆行驶阻力算清楚。这个子系统看似简单却直接决定后续动力性指标——最高车速、加速时间、最大爬坡度——算得准不准。Simulink 里建阻力模型难的不是那几个公式而是输入输出怎么定义、参数从哪里来、仿真时单位怎么统一、以及和整车其它模块怎么对接。这一讲围绕的目标很明确在 Simulink 中搭建一个可复用的汽车行驶阻力计算子系统把滚动阻力、空气阻力、坡度阻力、加速阻力算出来并输出总阻力。适合正在做车辆动力性建模课程设计、毕业设计或入门整车性能仿真的读者。最值得关注的点不是模型本身多复杂而是建模顺序和验证方法先搞清楚物理公式再拆端口再搭模块最后用典型工况验证。1. 行驶阻力子系统在整个动力性能模型中的位置1.1 为什么先做阻力计算汽车动力性能建模本质上是在处理一对矛盾驱动力把车往前推行驶阻力把车往后拉。两者之差决定了车辆加速度。如果阻力算不准后面无论发动机模型建得多精细仿真结果都会偏差很大。在整车纵向动力学模型里行驶阻力子系统通常处于信号流的中间位置它接收车辆状态信号车速、加速度、道路坡度输出总阻力或阻力矩上游是驾驶员模型、动力源模型和传动系统模型下游是车辆运动方程模块通过驱动力减阻力算出加速度再积分得到车速。所以这一讲看起来只做一个子系统实际上是整个动力性能仿真链路的“基准件”。后面做百公里加速、最高车速、爬坡性能仿真时都要复用这个阻力子系统。从建模顺序看我建议先单独把阻力子系统建出来用固定输入验证再接入整车模型。不要一上来就把所有模块连在一起否则一旦结果不对很难定位是阻力问题还是动力源问题。1.2 四种行驶阻力与动力学方程汽车在水平或坡道上行驶时总行驶阻力由四部分组成。滚动阻力轮胎与路面接触变形产生的阻力与车辆法向载荷和滚动阻力系数有关。空气阻力车身与空气相对运动产生的阻力与空气密度、迎风面积、空气阻力系数和车速平方成正比。坡度阻力车辆在上坡时重力沿坡道方向的分量。加速阻力车辆加速时需要克服的惯性力包括平移质量和旋转质量两部分。动力学方程为驱动力 滚动阻力 空气阻力 坡度阻力 加速阻力对应的常见表达式滚动阻力 Ff f · m · g · cos(α)空气阻力 Fw 0.5 · ρ · Cd · A · V²坡度阻力 Fi m · g · sin(α)加速阻力 Fj δ · m · a其中 f 是滚动阻力系数m 是整车质量g 是重力加速度α 是坡道角ρ 是空气密度Cd 是空气阻力系数A 是迎风面积V 是车速δ 是旋转质量换算系数a 是车辆纵向加速度。这套公式是建模的物理基础。Simulink 里搭子系统本质就是把以上四个公式用模块连接起来。关键在于输入信号怎么给参数存在哪里以及公式中的 V 和 a 到底是来自仿真闭环还是外部给定。2. 建模前的准备输入输出与参数定义2.1 子系统输入输出信号梳理在动手拖模块之前先想清楚子系统对外暴露哪些端口。这一步做不好后面接整车模型时会反复改端口。行驶阻力子系统建议至少包含以下输入车速 V单位 m/s。如果是后面接入整车闭环车速来自积分环节反馈单独测试时可以用斜坡或常数信号模拟。加速度 a单位 m/s²。在闭环模型里加速度由驱动力与阻力之差算出后反馈回来这里直接作为输入接入。坡道角 α单位 rad。如果只用坡度百分比可以在子系统内部或外部转换成弧度建议统一用弧度。子系统输出总行驶阻力 F_res单位 N。各个分项阻力滚动阻力 Ff、空气阻力 Fw、坡度阻力 Fi、加速阻力 Fj。如果不需要单独观察可以在子系统内部把四路信号汇成一路总线或 Mux 输出便于调试。为什么加速度要作为输入而不是在子系统内部计算因为加速度是整车动力学方程的解算结果不是阻力子系统的直接输入。阻力子系统负责“根据当前状态计算阻力”车辆运动学模块负责“根据驱动力与阻力之差计算加速度”。职责分开模型结构才清晰也方便单独测试子系统。2.2 车辆参数与初始化方式阻力模型需要一批车辆参数。常见做法有两种。一种是在 MATLAB 工作区定义变量然后在 Simulink 模块参数里直接写变量名。例如在 MATLAB 命令行或脚本里定义m 1500; % 整车质量 kg g 9.8; % 重力加速度 m/s^2 f 0.015; % 滚动阻力系数 Cd 0.32; % 空气阻力系数 A 2.2; % 迎风面积 m^2 rho 1.2258; % 空气密度 kg/m^3 delta 1.1; % 旋转质量换算系数在 Gain 模块、Constant 模块或参数对话框中直接填变量名模型会读取工作区数值。这种方式的优点是参数集中管理做参数扫描时直接改脚本变量即可不需要打开模型逐个改。另一种是把参数封装到子系统内部用 Constant 模块或 Mask 参数。适合模型要发给别人、不想依赖外部脚本的场景。教学演示阶段我更推荐先在脚本里定义变量模型清爽改参数也快。注意Simulink 模型参数引用工作区变量时模型运行前必须确保变量已存在否则会报“Undefined variable”错误。建议把参数定义脚本和模型放在同一目录或者在模型初始化回调里执行。2.3 单位与坐标方向约定单位不一致是这类模型最常见的错误来源。这里要统一约定车速使用 m/s。如果后续要和车速表、换挡逻辑对接很多模块习惯用 km/h需要在接口处做换算。加速度使用 m/s²。力使用 N。坡道角度使用 rad。Simulink 的三角函数模块默认输入输出都是弧度如果直接输入度数结果会完全错误。方向约定也要明确默认车辆前进方向为正行驶阻力均为阻止车辆前进的力在整车方程中取负号或作为被减项。坡度阻力在平路时为零上坡为正下坡为负。建模时不需要在阻力子系统内部纠结符号统一按公式计算正值符号处理放在整车动力学方程中即可。3. 在 Simulink 中搭建行驶阻力子系统3.1 创建子系统外壳与端口在 Simulink 模型窗口中新建一个空模型从模块库中拖入 Subsystem 模块双击进入子系统内部。也可以先拖入需要的模块再选中后右键选择“Create Subsystem from Selection”Simulink 会自动生成端口。子系统内部需要若干个 Inport 模块分别命名为 V、a、alpha。一个或多个 Outport 模块命名为 F_res以及可选的 Ff、Fw、Fi、Fj。端口命名建议和变量含义一致不要用 In1、Out1 这种默认名称。模型稍大之后端口名就是最好的注释。下面按四种阻力分别搭建。3.2 滚动阻力与坡度阻力模块滚动阻力 Ff f · m · g · cos(α)需要用到 Cos 函数、Product 和 Gain 模块。搭建方式从数学运算库拖入 Trigonometric Function 模块选择 cos。把输入 alpha 接到 cos 模块。用 Gain 模块或常量参数模块表示 f · m · g。这里有两种做法把 f、m、g 做成三个常数的乘积也可以直接用一个 Gain 模块Gain 参数填 f * m * g。建议写成多项式乘积形式更好读。用 Product 模块把 cos 输出和 f · m · g 相乘得到 Ff。坡度阻力 Fi m · g · sin(α)搭建方式类似用 sin 模块乘上 m · g。很多教学模型会把滚动阻力和坡度阻力合并成一项因为它们在同一个法向载荷表达式中。但从学习角度分开建更容易理解每个物理项后续如果要分别分析各阻力占比也方便。如果车辆在平路上仿真alpha 可以是常数 0模型里 cos(0)1sin(0)0结果自然退化到平路工况。这一点验证时非常有用。3.3 空气阻力模块空气阻力 Fw 0.5 · ρ · Cd · A · V²核心是车速平方。搭建方式输入车速 V。用 Math Function 模块选择 square得到 V²。用 Gain 模块设置 0.5 * rho * Cd * A或者用三个 Gain 串联体现物理过程。用 Product 把 V² 和系数相乘得到 Fw。这里要注意空气阻力与车速平方成正比意味着高速时空气阻力急剧增加是影响最高车速的主要因素。如果车速输入是 km/h必须先在子系统内除以 3.6 转成 m/s否则结果会差很多。实测时我一般会让模块参数保持“可读性优先”比如 Gain 参数直接写0.5 * rho * Cd * ASimulink 支持在参数框中写表达式。这样别人看模型时能直接看到物理含义调试也方便。3.4 加速阻力模块与旋转质量换算系数加速阻力 Fj δ · m · a这里输入的加速度 a 要和车辆运动模块反馈保持同一个物理量。搭建方式输入加速度 a。用 Gain 模块乘以 delta * m得到 Fj。如果后面要把模型扩展到不同挡位旋转质量换算系数 δ 通常会随挡位变化此时 δ 应该作为子系统的另一个输入或者在子系统内部根据挡位信号查表。教学阶段先按常数处理但在文档或注释里要标明这一简化。旋转质量换算系数的含义是车辆加速时不仅整车平移质量要加速飞轮、车轮等旋转部件也要加速等效质量比整车质量大。常见经验公式为 δ 1 0.04 0.0025 · ig²其中 ig 是变速器传动比。不过这个公式只是估算实际建模时建议根据教材或实验数据取值。3.5 阻力合成与输出四个分项都建好后用 Sum 模块把 Ff、Fw、Fi、Fj 相加得到总阻力 F_res。为了调试方便可以把四个分项和总阻力一起输出Outport: Ff Outport: Fw Outport: Fi Outport: Fj Outport: F_res如果不想占用太多端口可以用 Bus Creator 把信号组合成一个 Bus子系统只输出一个总线信号。整车模型里再用 Bus Selector 取用。初学者先直接用多个 Outport 更直观。总阻力计算得到之后还可以再转换成阻力矩输出到传动系统或车轮模块。阻力矩等于阻力乘以车轮滚动半径 r_w即 T_res F_res · r_w。这一步是否要做取决于整车模型是力驱动还是力矩驱动。多数教材模型用“驱动力 - 阻力”直接算加速度所以保留力输出即可。4. 参数设置、仿真验证与结果判断4.1 典型车辆参数与测试工况建完模型先不要急着接入整车。先用一组典型参数和简单输入单独验证子系统计算是否正确。一组常用于教学的小型乘用车参数示例参数符号数值单位整车质量m1500kg重力加速度g9.8m/s²滚动阻力系数f0.015无量纲空气阻力系数Cd0.32无量纲迎风面积A2.2m²空气密度rho1.2258kg/m³旋转质量换算系数delta1.1无量纲需要说明这些参数是教学示例实际车型参数要以具体车辆数据为准。滚动阻力系数和路面、轮胎气压、车速都有关系这里按常数简化。测试输入可以用三种方式用 Constant 模块直接给固定车速、固定加速度、固定坡度。用 Ramp 模块让车速线性增加观察空气阻力按平方规律增长。用 Signal Builder 或 From Workspace 给一段真实工况数据比如加速工况和匀速工况。我建议先做最简的固定值验证手算一遍阻力再和仿真结果对比。4.2 单点验证方法例如选取车速 V 30 m/s加速度 a 2 m/s²坡度角 α 0 rad平路工况。手算滚动阻力Ff 0.015 × 1500 × 9.8 × cos(0) 220.5 N空气阻力Fw 0.5 × 1.2258 × 0.32 × 2.2 × 30² 约 388.4 N坡度阻力Fi 1500 × 9.8 × sin(0) 0 N加速阻力Fj 1.1 × 1500 × 2 3300 N总阻力F_res 220.5 388.4 0 3300 约 3908.9 N在模型里设置同样输入运行后查看 Output 数值。如果和手算结果一致说明模型逻辑正确。如果偏差很大优先检查单位、三角函数设置和 Gain 参数。再用一个上坡工况验证α 5° 换算成 rad 约 0.08727 rad其他条件不变。滚动阻力Ff 0.015 × 1500 × 9.8 × cos(0.08727) 约 219.7 N坡度阻力Fi 1500 × 9.8 × sin(0.08727) 约 1281.0 N这里能顺便检查三角函数部分是否正常工作。注意 Simulink 里 5° 不能直接当作 5 输入必须除以 180 再乘 π或者用 deg2rad 模块。4.3 判断阻力模型是否合理的关键指标模型能跑通只是第一步还要判断结果是否合理。在平路匀速工况下加速阻力应为 0坡度阻力应为 0总阻力等于滚动阻力加空气阻力。空气阻力随车速平方增长车速从 20 m/s 提高到 40 m/s空气阻力应变成原来的约 4 倍。在 50 m/s 到 60 m/s 的高速区间空气阻力占总阻力比例应该明显上升滚动阻力占比下降这是判断模型是否符合实际的重要特征。在爬坡工况下坡度阻力随坡度增大而增大且 sin(α) 在坡角较小时接近坡度百分比除以 100。如果仿真结果和这些规律不符多半是公式选错、参数单位不对或输入信号没有正确换算。不要急着调模型先回到手算验证。5. 常见模型问题与排查顺序5.1 单位不一致导致数量级错误这是出现频率最高的错误。车速给了 km/h 直接进空气阻力公式结果差了 12.96 倍坡度给了角度直接进 sin 模块结果完全乱套加速度给了 g 值没换算结果差了近 10 倍。排查时先看每个输入信号的单位从源模块一路查下来。建议在信号线上添加信号标签或注释写明单位。比如V_mps、a_mps2、alpha_rad模型可读性会好很多。5.2 三角函数输入单位错误Simulink 的 sin、cos 模块默认按弧度计算。如果输入是角度需要先转换。可以在子系统的 Inport 后面加一个 Gain 模块Gain 参数设为pi/180把角度转弧度或者直接用 deg2rad 模块。还有一种情况是输入是坡度百分比而不是角度。坡度百分比 p 和坡道角 α 的关系是 tan(α) p / 100。如果信号源给的是坡度百分比需要在模型内转换成弧度不能直接代入 sin 或 cos。5.3 旋转质量换算系数处理不当加速阻力里的 δ 很容易被漏掉或写错。这个系数不是整车质量的简单修正而是和动力传动系统旋转部件惯量有关的等效系数。如果模型后续要仿真换挡过程δ 随挡位变化时需要把挡位信号引入阻力子系统。如果只算匀速工况加速阻力为零δ 不影响结果。但做百公里加速仿真时加速阻力是主要阻力之一δ 处理错误会使加速时间偏小或偏大。5.4 代数环、初始值与信号维度问题把车速反馈到阻力子系统、再计算加速度、再积分得到车速这种闭环结构中可能出现代数环。Simulink 会报警告此时可以在反馈路径上加 Memory 模块或 Unit Delay 模块切断代数环或者给积分器设置合理的初始速度。信号维度问题也很典型如果输入 V 是向量或矩阵Gain 和 Product 模块会按元素运算输出维度会变大。建议在子系统内部使用 Signal Specification 模块或明确 Matrix 标量属性避免端口传进来的信号维度不一致。排查顺序建议先看报错信息是语法类还是数值类。再看输入信号单位、维度、数值范围是否合理。检查参数变量是否在 MATLAB 工作区中已定义。用 Scope 或 To Workspace 记录中间信号逐步定位哪一项阻力异常。最后检查模块参数设置尤其是 Gain 和三角函数的配置。提示如果仿真结果显示车速一直很小或一直为负先别怀疑阻力模型先看驱动力是否给对了方向以及积分器初值是否符合初始工况。6. 从教学模型到整车性能仿真后续扩展思路6.1 与动力源外特性模块对接阻力子系统单独跑通后下一步就是把驱动力加入闭环。整车动力学方程可以写成a (Ft - F_res) / (delta * m)其中 Ft 是驱动力来自发动机或电机的转矩外特性、变速器传动比、主减速比和传动效率。这里要注意加速阻力公式里的 δ 是旋转质量换算系数如果在动力学方程中已经用 δ · m 作为等效质量计算加速度那么阻力子系统中 Fj 的分量在整车闭环里就不能再重复计入。常见做法是两种阻力子系统只计算滚动阻力、空气阻力、坡度阻力加速阻力由整车动力学模块中的等效质量来体现。阻力子系统输出四部分总阻力整车方程直接用 Ft - F_res 计算加速度等效质量已经包含在 δ 中。两种方式都可以但必须保持一致否则加速阻力会被重复计算。这是整车联调时最容易出现的问题。6.2 与驾驶员模型、换挡逻辑联调接入驾驶员模型后需求油门踏板、目标车速或目标加速度会驱动动力源输出。换挡逻辑会让传动比发生变化进而影响车速变化率、驱动力和旋转质量换算系数。此时阻力子系统的输入不再只是常数信号而是来自仿真回路的状态反馈。建议在接入之前先做开环测试给一段固定的油门开度或固定的驱动力序列观察车速和阻力变化曲线是否平滑合理。如果车速出现震荡优先检查闭环里是否有代数环、积分器步长是否过大、驱动力是否在车速接近目标时没有减小。阻力子系统本身通常不是震荡的主因。6.3 批量参数分析与优化模型稳定之后可以用 MATLAB 脚本批量修改车辆参数分析质量、风阻系数、滚动阻力系数对动力性能的影响。例如把整车质量从 1300 到 1700 kg 分多档扫描记录百公里加速时间和最高车速绘制敏感性曲线。实现方式是用sim命令在 for 循环里多次运行模型每次修改工作区参数再把结果存入数组。如果后续要做优化可以把阻力子系统封装成带 Mask 的模块参数通过 Mask 对话框修改这样批量扫描时不需要碰模型内部连线。从教学角度看这个扩展过程比单纯建模块更有价值。它让学生理解阻力参数如何影响整车性能也能顺带掌握 Simulink 的参数化仿真和结果后处理方法。回到这一讲的主题行驶阻力子系统建模核心不在于模块拖得多漂亮而在于物理公式是否清晰、端口划分是否合理、单位是否统一、验证是否充分。按这个顺序做下来一个能复用的阻力子系统就有了。后面接入动力源、整车闭环时你会发现前期把端口和参数约定清楚能省下大量调试时间。
返回列表