资讯动态

基于Simulink的四分之一被动悬架建模与参数优化指南

发布时间:2026/9/10 7:03:48 来源:尧图企业网站定制
1. 项目概述与建模思路1.1 为什么从四分之一模型开始做悬架仿真的人应该都有体会一上来就搭整车模型是给自己挖坑。整车模型涉及十几个自由度、复杂的转向与侧倾耦合、非线性衬套与减振器特性先把动力学方程写出来就能劝退一批人。但日常工作中很多核心问题——比如车身垂向加速度的舒适性评价、悬架动行程是否触底、轮胎动载荷的接地性变化——用四分之一车辆模型就完全能回答。这也是为什么学术界和企业里的悬架前期预研都习惯先用四分之一模型做快速验证。所谓四分之一模型就是把整车按四个车轮对称分割取其中一个车轮及其对应的车身质量来研究。对于垂向动力学分析这种简化是站得住脚的因为车辆在对称路面激励下左右轮的垂向响应基本一致前后轴之间的俯仰耦合在平顺性分析里也可以解耦处理。除非你研究的是弯道工况或单侧冲击这种强耦合场景否则四分之一模型的精度足够用来评价悬架参数匹配的优劣。另外从工程效率角度看四分之一模型的状态变量少、仿真速度快非常适合做参数扫描和优化迭代。我见过不少人直接拿整车模型做遗传算法优化跑一轮要几个小时甚至一天而用四分之一模型做同样的优化几分钟就能出结果。先简化、再扩展这才是悬架仿真正确的打开方式。1.2 二自由度动力学方程的推导四分之一被动悬架最经典的形式是二自由度模型。两个自由度分别是车身质量的垂向位移和车轮质量的垂向位移。被动悬架的核心特征在于悬架的弹簧和减振器都是无源元件弹簧刚度固定减振器阻尼系数固定不存在外部能量输入。建模时取静止平衡位置为零点我们可以直接写出车身质量 m_s 和车轮质量 m_u 的运动方程m_s * x_cc_s -k_s * (x_s - x_u) - c_s * (x_dot_s - x_dot_u) m_u * x_cc_u k_s * (x_s - x_u) c_s * (x_dot_s - x_dot_u) - k_t * (x_u - z_r)其中m_s 为簧载质量车身等效质量m_u 为非簧载质量车轮、制动器等质量k_s 为悬架弹簧刚度c_s 为减振器阻尼系数k_t 为轮胎等效垂向刚度x_s 为车身垂向位移x_u 为车轮垂向位移z_r 为路面输入位移这两个方程的物理含义很直观车身受到弹簧力与悬架相对位移成正比和阻尼力与悬架相对速度成正比车轮除了受到悬架传来的力之外还要承受轮胎与路面之间的弹性力。轮胎本身阻尼很小建模时常忽略不计引入 k_t 时直接用线性弹簧近似。为了在 Simulink 里搭建模型我们需要把二阶方程改写成状态空间形式。取状态变量为x1 x_s 车身位移 x2 x_dot_s 车身速度 x3 x_u 车轮位移 x4 x_dot_u 车轮速度输入为路面位移 z_r输出可以根据需要定义为车身加速度 x_cc_s、悬架动行程 (x_s - x_u)、轮胎动位移 (x_u - z_r) 等。状态空间表达式写出来就是dx1/dt x2 dx2/dt (-k_s*(x1-x3) - c_s*(x2-x4)) / m_s dx3/dt x4 dx4/dt (k_s*(x1-x3) c_s*(x2-x4) - k_t*(x3-z_r)) / m_u这是标准的线性时不变系统。在 Simulink 里实现这种系统有三种常见方式直接用积分器搭建微分方程框图、用 State-Space 模块填 ABCD 矩阵、用传递函数模块但传递函数不太适合多输出场景。下面我会先讲怎么做参数准备再逐一说明这两种主流搭建方式。1.3 参数选取与量纲检查模型搭起来很快但参数给不对仿真结果就毫无意义。以下是一组典型轿车的四分之一模型参数来源是公开文献中的常用取值可以作为初始参考参数符号数值单位簧载质量m_s317.5kg非簧载质量m_u45.4kg悬架刚度k_s22000N/m阻尼系数c_s1500N·s/m轮胎刚度k_t192000N/m需要提醒的是这里 m_s 是单轮对应的车身等效质量不是整车整备质量。常见的错误是把整车质量直接除以4就当 m_s这忽略了前后轴载荷分配的区别。更严谨的做法是实测前后轴单侧载荷或者从整车质心位置推算。参数给完之后建议先做个量纲校验和自然频率计算。车身固有频率大约为f_s sqrt(k_s / m_s) / (2*pi) ≈ 1.32 Hz车轮固有频率大约为f_u sqrt((k_s k_t) / m_u) / (2*pi) ≈ 11.0 Hz这两个频率范围与实车经验吻合——车身频率通常在1到2 Hz之间保证舒适性车轮频率通常在10到16 Hz之间保证操控稳定性。如果算出来偏差太大先检查参数是否合理再开始搭模型不要等到仿真跑完才发现问题。2. Simulink 模型搭建的两种方式2.1 积分器框图法从方程到模型第一种搭建方式是直接从微分方程出发用积分器、增益、加法器等基础模块把方程翻译成框图。这种方式最贴近物理本质也最容易排查问题缺点是模型连线较多、视觉上不够简洁。以车身质量 m_s 的方程为例x_cc_s (-k_s*(x_s-x_u) - c_s*(x_dot_s-x_dot_u)) / m_s在 Simulink 中的思路是把 x_cc_s 通过一个积分器得到 x_dot_s再通过一个积分器得到 x_s。同时将 x_s 和 x_u 的差值反馈回去乘以 -k_s将 x_dot_s 和 x_dot_u 的差值反馈回去乘以 -c_s两者求和后除以 m_s就重新得到 x_cc_s。这是一个典型的闭环积分结构。车轮质量的方程同理x_cc_u (k_s*(x_s-x_u) c_s*(x_dot_s-x_dot_u) - k_t*(x_u-z_r)) / m_u把 x_cc_u 积分两次得到 x_dot_u 和 x_u然后按方程把各路反馈连接起来。搭建时几个实用技巧用 Goto 和 From 模块传递信号避免连线交叉混乱。比如 x_s 和 x_u 同时被车身和车轮方程用到直接拉线会绕来绕去用 Goto/From 能让模型清晰很多。信号命名用带下划线的中文或英文都行但建议全工程统一。我的习惯是xs、xu、zs这种简洁命名配合模型的备注说明。积分器初始化建议设 0不要设成非零数否则瞬态初值会引入额外的响应成分。2.2 状态空间法更工程化的选择如果你不想看到一堆连线或者后续要做控制器设计更推荐用状态空间方式。把前面推导的 ABCD 矩阵填入 State-Space 模块一个模块就搞定整个动力学模型。按前面定义的状态变量顺序四个矩阵为A [0, 1, 0, 0; -k_s/m_s, -c_s/m_s, k_s/m_s, c_s/m_s; 0, 0, 0, 1; k_s/m_u, c_s/m_u, -(k_sk_t)/m_u, -c_s/m_u] B [0; 0; 0; k_t/m_u] C [1, 0, 0, 0; % 输出车身位移 0, 0, 1, 0; % 输出车轮位移 -k_s/m_s, -c_s/m_s, k_s/m_s, c_s/m_s] % 输出车身加速度 D [0; 0; 0]C 矩阵的行数对应你关心的输出数量。这里我选了三个输出车身位移、车轮位移、车身加速度。如果你想同时输出悬架动行程 (x_s - x_u) 和轮胎位移 (x_u - z_r)可以再增加两行或者干脆只输出全部四个状态变量然后用额外的 Gain 和 Sum 模块去计算。这种方式的优点是模型层次清晰、方便把 ABCD 矩阵放在 MATLAB 脚本里统一管理。修改参数时只需要改脚本里的变量模型本身完全不用动。2.3 求解器配置与仿真参数模型搭好后求解器设置是决定仿真成败的关键一步也是最容易被新手忽略的地方。对于悬架这种典型的线性常微分方程系统建议使用变步长求解器。默认的 ode45 通常可以但如果路面输入是带棱角的信号比如阶跃建议切到 ode23t 或 ode15s后者对刚性问题的处理更稳。悬架系统的频率范围横跨1到16 Hz本质上是刚性比例差别较大的系统ode45 偶尔会报“发散”或者“步长压缩到机器精度”的警告这时候不用慌换 ode23t 基本能解决。仿真步长的上限建议设 1e-3 秒。虽然变步长求解器会自动调整步长但设置一个最大步长能避免求解器在信号突变处跳过某些细节。仿真时长取决于你要分析的工况阶跃输入跑 5 到 10 秒足够看到完整的衰减过程随机路面输入建议跑 30 到 60 秒让统计结果有足够的样本量。提示在 Configuration Parameters 里把 Stop Time 设置成变量名比如T_end然后到 MATLAB 脚本里统一赋值。这样后面做参数扫描时不用反复进界面改参数。2.4 拿到结果后如何验证模型模型跑通之后的第一件事不是急着分析结果而是做模型验证。最简单的验证方式是观察阶跃响应是否与理论预期吻合。给路面输入一个 0.05 米5厘米的阶跃模拟车辆驶上一个小台阶。仿真结果应该看到车身位移从 0 逐渐上升到稳态值附近伴随一定程度的超调和振荡衰减。稳态时车身的静位移可以理论计算x_s_ss (m_s m_u) * g / k_t ≈ 0.018 m 仅考虑轮胎静压缩但实际中阶跃输入对应的稳态值还要考虑悬架弹簧的压缩完整计算公式为x_s_ss z_r * (k_t / (k_s k_t)) (m_s m_u) * g / k_s - m_u * g / k_s这里可能有点绕如果你的模型是在静平衡位置构建的、输入 z_r 也是相对位移那更简单的验证方式是观察车身位移最终趋近于 0.05 米。因为路面抬高了 5 厘米车身跟随路面也抬高 5 厘米这是无 gravitation 参与的最小位移建模方式。具体看你建模时是否引入了重力项没有引入重力项的话稳态值就是 z_r。如果稳态值对不上检查一下状态空间矩阵 A 的第三行第四列等符号是否写错。我在刚开始做这个项目时就因为在 A 矩阵里把 k_t 项符号搞反导致仿真结果看起来像悬架刚度变成负的车身无限下沉。3. 路面输入模型与仿真工况设计3.1 几种典型路面输入的构建方法悬架仿真能不能反映真实性能很大程度上取决于路面输入给得对不对。我在这里整理三种最常用的路面输入以及它们在 Simulink 中的实现方式。阶跃输入模拟车辆通过减速带、路坎等离散障碍物。用 Step 模块即可实现。Step time 设为 1让系统先稳定 1 秒再加扰Initial value 设为 0Final value 设为 0.05。阶跃输入适合做悬架响应的基本特性分析比如超调量、调节时间、峰值时间等时域指标。正弦输入模拟路面周期性起伏。实际路面很少是纯正弦但正弦输入可以用来测试系统在不同频率激励下的响应配合扫频功能还能画出频响曲线。如果要做定频分析直接用 Signal Generator 模块选正弦波频率按需求设置。更专业的做法是用 Chirp 信号做扫频Frequency sweep 设为 0.1 Hz 到 20 Hz时间跨度 50 秒这样能在一次仿真中看到系统在主要频段内的响应变化。随机路面输入这是最接近真实路面的输入。国标 GB/T 7031 和 ISO 8608 都给出了路面功率谱密度的定义可以用滤波白噪声法生成时域路面谱。Simulink 里常见做法是使用 Band-Limited White Noise 模块加一个一阶成形滤波器。成形滤波器的传递函数取决于路面等级。以 B 级路面为例城市一般公路路面不平度系数 G_q(n0) 约为 64e-6 m^3/cycle车速 20 m/s 时滤波器的形式可以取为G(s) 2 * pi * sqrt(G_q(n0) * v) / (s 2 * pi * f0)其中 f0 是截止频率一般取下截止频率 0.1 Hz 左右。白噪声模块的功率谱密度设置为 1采样时间设置为 0.001 秒与模型的步长匹配。这样生成的 z_r 时间序列在统计意义上符合目标路面等级。注意Band-Limited White Noise 的 Sample time 必须和仿真步长协调否则高频成分会混叠。我的建议是 Sample time 设为仿真最大步长的一半效果更稳。3.2 悬架性能评价指标模型建好、路面给定接下来要回答的问题是怎么看结果好不好。悬架评价通常看三个指标它们之间存在相互制约的关系这也是悬架调校的核心矛盾。车身加速度均方根值RMS车身垂向加速度直接反映乘坐舒适性。按照 ISO 2631 标准加权加速度均方根值越小舒适性越好。一般轿车在 B 级路面以 60 km/h 行驶时车身加速度 RMS 大约在 0.4 到 0.8 m/s^2 之间。做参数研究时阻尼比增大通常会让 RMS 先降后升存在一个最优阻尼区间。悬架动行程Suspension Working Space悬架动行程是车身与车轮之间的相对位移它反映了悬架被压缩或拉伸的程度。动行程过大说明悬架容易触底或拉伸到限位块这会带来冲击和噪音。评价时通常看动行程的峰值或 RMS并保证不超过悬架设计的最大行程。一般轿车的悬架动行程限位在 ±0.1 米左右。轮胎动载荷Tire Dynamic Load轮胎动载荷反映车轮与路面的附着稳定性。动载荷的 RMS 与静载荷的比值称为相对动载荷当相对动载荷大于 1 时意味着轮胎有离地的风险。轮胎离地是悬架设计绝对要避免的情况它会导致制动力和侧向力丧失威胁行车安全。评价指标常用轮胎动位移 (x_u - z_r) 来代替因为轮胎刚度已知位移乘以刚度就是力。这三个指标之间往往是矛盾的悬架偏硬弹簧刚度大车身加速度会增大舒适性变差但动行程减小操控稳定性变好阻尼偏大车身加速度短时峰值降低但高频传递率增大而且动载荷可能恶化。所以悬架设计的本质是在这三个指标之间寻找平衡。3.3 仿真结果的可视化与分析Simulink 里看结果最简单的方式是直接在 Scope 模块里观察波形。但要做专业的分析建议用 To Workspace 模块把关键信号导出到 MATLAB 工作区然后写脚本统一后处理。在模型中添加几个 To Workspace 模块分别记录车身加速度、悬架动行程、轮胎动位移Variable name 设为acc_body、susp_deflect、tire_deflectSave format 选 Timeseries。仿真结束后在 MATLAB 里执行plot(susp_deflect.Time, susp_deflect.Data);就可以画图并计算 RMSrms_acc sqrt(mean(acc_body.Data.^2));另外可以用bodeplot或linearize对模型做线性分析。State-Space 模块本身就支持线性化在 Simulink Control Design 里可以一键得到系统的 Bode 图观察车身加速度对路面输入的幅频特性。悬架系统在车身固有频率附近约 1.3 Hz会有共振峰在车轮固有频率附近约 11 Hz也会有一个较小的峰。被动悬架无法同时压低这两个峰如果发现仿真频响曲线在 11 Hz 处峰值很高说明阻尼可能偏小或者轮胎刚度偏大。在随机路面工况下建议对车身加速度做功率谱密度分析。用 MATLAB 的pwelch函数[pxx, f] pwelch(acc_body.Data, hann(1024), 512, 1024, 1/dt); plot(f, 10*log10(pxx));观察功率谱主要集中在哪个频带能帮助定位共振问题。我在实际项目中发现很多舒适性投诉问题的根因其实是轮胎刚度偏大导致 10 Hz 附近的振动能量没有被有效衰减而不是悬架弹簧或减振器本身的问题。4. 参数扫描与优化方向4.1 阻尼和刚度的灵敏度分析四分之一模型的参数很少做灵敏度分析非常方便。把阻尼系数 c_s 从 800 扫到 3000步长 200用循环跑完整个仿真然后画出 RMS 车身加速度、悬架动行程 RMS、轮胎动载荷 RMS 随阻尼变化的曲线。这里我可以给出一个基于所给参数的初步预期结果随着阻尼增大车身加速度 RMS 会先下降后上升在某个中间值达到最低点悬架动行程 RMS 几乎单调下降阻尼耗散能量轮胎动载荷 RMS 则先下降后上升但拐点比车身加速度更靠后。阻尼的调校规律在工程上有个经验公式汽车悬架的阻尼比一般在 0.2 到 0.4 之间。阻尼比定义为xi c_s / (2 * sqrt(k_s * m_s))按给定参数计算c_s 1500 时阻尼比约为 0.28在合理范围内。如果你做参数扫描发现最优阻尼比落在 0.15 以下或 0.5 以上先怀疑参数取错了而不是相信这个优化结果。刚度的灵敏度分析类似但要注意 k_s 变化会同时影响车身固有频率和阻尼比解释结果时要把频率变化的影响分离出来。一种做法是保持阻尼比不变同时调整 c_s这样能单独看刚度变化的效果。4.2 使用 MATLAB 脚本批量仿真参数扫描不建议手动一个个改参数再点仿真用 MATLAB 脚本循环是最佳实践。核心思路是在脚本里改变参数值然后使用 Simulink 的sim函数驱动模型运行。% 参数扫描脚本示例 cs_range 800:200:3000; results zeros(length(cs_range), 3); for i 1:length(cs_range) cs cs_range(i); simOut sim(quarter_car_model.slx); acc simOut.acc_body.Data; susp simOut.susp_deflect.Data; tire simOut.tire_deflect.Data; results(i, 1) sqrt(mean(acc.^2)); % 车身加速度RMS results(i, 2) sqrt(mean(susp.^2)); % 悬架动行程RMS results(i, 3) sqrt(mean(tire.^2)); % 轮胎动位移RMS end注意脚本中cs变量需要定义为模型工作区的变量如果模型和脚本不在同一个工作区使用sim之前用assignin或者直接在脚本里定义好再调用模型即可。模型参数如果写死在 State-Space 模块的 mask 里而不是引用工作区变量脚本循环就没法改参数这是新手最容易踩的坑。跑完扫描后把三条 RMS 曲线归一化画在一张图里你会直观看到悬架调校的 trade-off 关系。平时做技术方案汇报时这张图非常有说服力。4.3 悬架参数优化的方向建议如果你想更进一步做优化四分之一模型加上 MATLAB 内置的fmincon或全局优化工具箱就能做。目标函数可以设为车身加速度 RMS 和悬架动行程 RMS 的加权和约束条件为轮胎动载荷不超过某个阈值。一个典型的优化设置是设计变量k_s 变化范围 10000 到 50000c_s 变化范围 500 到 5000目标函数0.5 * (acc_rms / acc_ref) 0.5 * (susp_rms / susp_ref)约束tire_dynamic_load_rms / static_load 0.9注意目标函数中的归一化非常关键。因为车身加速度的数值量级0.5 左右和悬架动行程的数值量级0.01 左右差距很大如果不归一化优化器会只顾大数值项忽略小数值项。优化结果通常给出的 Pareto 最优解是如果追求舒适性弹簧会偏软、阻尼中等偏上如果追求操控性弹簧偏硬、阻尼也偏大。这个结论和实际悬架调校经验一致。5. 常见问题与排查技巧5.1 代数环和发散问题怎么解决用积分器框图法搭建模型时经常遇到代数环警告。代数环产生的原因是一个模块的输出直接反馈到自身的输入中间没有经过状态积分器或单位延迟。在悬架模型中阻尼力的计算需要相对速度而相对速度可能在某些信号路径中形成闭环。解决代数环的常用方法有这几种在反馈回路中插入 Memory 模块打破代数环。这会引入一个步长的延迟对秒级时长的悬架响应来说影响很小。使用单位延迟 Unit Delay 模块。它的功能和 Memory 类似但更适合离散系统。把模型改写成状态空间形式推荐。State-Space 模块本身就是状态显式表达天然不会有代数环问题。另一个常见现象是仿真报错显示“发散”或“数值奇异”。出现这种情况先检查是否有模块输出为无穷大然后用 Scope 看中间变量定位发散源。通常是对加速度信号再积分时由于数值误差在共振频率处被放大导致的。解决办法换 ode23t 或 ode15s 求解器减小最大步长到 1e-4 或 1e-5看是否好转。5.2 仿真结果与理论对照不上我见过不少人模型跑通了但曲线明显不合理这时候需要系统的排查方法。先看稳态值。给阶跃输入后车身最终位移应该等于路面阶跃高度前提是无重力建模。如果稳态值偏大或偏小优先检查状态空间矩阵 A 中的刚度项符号尤其是 k_t 项的符号。我在第一次做这个模型时就把第三行第四列里的 -c_s/m_u 写成了 c_s/m_u导致系统变成负阻尼仿真结果越来越发散当时还在怀疑是不是算法有问题。再看振荡频率。从车身位移响应曲线测量相邻峰值之间的时间间隔换算成频率。如果车身振荡频率明显偏离 1.32 Hz按前面参数说明 m_s 或 k_s 取值有误或者模型里多了额外的等效刚度。用车轮位移曲线测量高频成分应该接近 11 Hz。最后检查单位。N·s/m 和 kN/m 混用的错误在参数传递时比较常见。把全部参数统一换算成国际单位再写一份参数表贴在模型说明里方便自己排查也方便团队协作。5.3 扩展到CarSim联合仿真的思路四分之一模型跑通之后下一步自然是往整车、联合仿真方向扩展。CarSim 和 Simulink/Simscape 是常见的联合仿真工具。CarSim 提供高精度的整车动力学模型Simulink 作为控制策略开发平台两者通过 CarSim S-Function 接口交换信号。与 CarSim 联合仿真时四分之一模型可以作为快速验证控制算法的初步平台比如验证天棚阻尼控制、自适应阻尼控制等主动悬架算法是否有效然后再移植到 CarSim/Simulink 联合环境中做整车级别的验证。如果你用的是 Simscape 而不是纯 Simulink可以考虑搭建一个 Simscape 物理模型版本的悬架它和 Simscape Battery 等电气域模型一样属于物理建模领域。Simscape 版本的好处是可以直接连接电力、机械等多物理域组件对后续做主动悬架的电液执行器建模更方便。不过物理建模的求解速度和灵活性不如信号流建模两种方式各有优劣按需选择。在实际项目中我还遇到过需要把 Simulink 模型生成 C 代码并部署到硬件上的场景比如快速控制原型或半实物仿真。这部分涉及 Simulink Coder 和 Embedded Coder。模型在 PC 上跑通之后用 External Mode 连接目标硬件可以实时调参。如果只是入门悬架仿真这个功能可以先放一放但要知道 Simulink 的模型最终不只是用来“看波形”的它还能直接变成产品代码。5.4 仿真效率与迭代建议最后聊两个提升效率的习惯。一个是模型结构分层。把路面输入封装成一个子系统把车辆模型封装成一个子系统把评价指标计算封装成另一个子系统顶层只留三个子系统加 Scope。这样修改路面类型时不用动车辆模型修改悬架参数时不用动评价模块。另一个是批量仿真的结果管理。每次参数扫描生成大量数据建议在脚本里给每次仿真的结果加标签包含参数值和工况信息存成.mat文件命名规则类似cs_1500_step.mat。这样后续回顾结果时不用重新仿真直接加载同名文件就行。写在最后从搭建四分之一被动悬架的 Simulink 模型到跑通阶跃、随机路面工况再到做参数扫描和分析频响特性这套流程走下来我对悬架系统的理解深入了不少。个人体会是四分之一模型虽然简单但它把悬架的“弹簧-质量-阻尼”本质展现得清清楚楚很多看似高深的悬架调校问题回到这个模型上都能找到直观的解释。阻尼比在什么范围合适、弹簧刚度一变会连锁影响哪些指标、轮胎刚度对高频舒适性的贡献有多大这些工程直觉都可以从这个小模型里建立起来。如果你正在做这个方向我建议先把基础模型做扎实确认阶跃响应和频响曲线都与理论吻合再往随机路面、参数优化甚至联合仿真扩展。底子打好了后面每一步都会顺很多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价