ARTICLE DETAIL

资讯详情

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

基于Simulink的二分之一车辆悬架半车模型搭建与仿真分析

基于Simulink的二分之一车辆悬架半车模型搭建与仿真分析 前一阵子帮一个做底盘控制的朋友捋项目他卡在“二分之一车辆悬架半车模型”这个点上只知道Simulink能搭四分之一模型但一旦涉及车身俯仰、前后轴耦合就不知道从哪下手。我干脆把自己用Simulink实现半车模型的过程完整整理了一遍。二分之一车辆悬架半车模型常说的half-car model是把整车沿纵向切成左右对称的两半保留前、后两个车轮以及车身的垂向位移和俯仰角一共4个自由度。它比四分之一模型多了一个俯仰维度又比全车模型少了两条轮胎和侧倾正好适合研究制动点头、路面随机输入下的平顺性、还有主动悬架前后轴协调控制。这篇文章我会从模型为什么这么建、运动方程怎么写、Simulink里怎么一步步搭出来到结果怎么分析、常见坑怎么排全程按我实际跑通的流程来讲。适合正在做车辆动力学课程设计、准备毕设或者刚接触Simulink仿真想快速上手半车悬架模型的工程师和学生。下面直接进正题。1. 为什么要用二分之一半车模型从四分之一到半车的取舍1.1 四分之一模型能做什么缺什么很多教材讲悬架都会从二自由度四分之一模型开头一个簧上质量、一个簧下质量、一个弹簧阻尼车身只有垂向运动。它最大的优点是方程简单、参数少Simulink里用积分器加加减法几分钟就能跑起来适合快速验证减振器阻尼比、车身固有频率这些最基本的概念。但四分之一模型有个硬伤它默认四个轮子彼此独立车身是一个刚性的“点质量”没有长度也没有俯仰姿态。真实车辆在制动时车头下沉、在通过单边减速带时车身点头这些现象四分之一模型完全描述不了。尤其当你关心前后悬架刚度如何匹配、怎么用主动悬架同时抑制车身垂向加速度和俯仰角速度时四分之一模型根本给不出有用结论。我见过有人拿四个独立的四分之一模型拼成“全车”结果车身四个角各自乱跳质心和俯仰完全对不上就是因为忽略了整车的几何约束。1.2 半车模型多出的俯仰自由度二分之一半车模型的核心改进是把车身看成一根有质量的刚性梁质心前后各有一个悬架和轮胎车身既能上下平动也能绕质心俯仰。这样系统就有4个自由度车身垂向位移z、车身俯仰角θ、前轮垂向位移z_tf、后轮垂向位移z_tr。多了这个俯仰自由度后仿真结果会非常直观。比如给前轮一个凸块激励车身垂向振动还没起来俯仰角先出现明显变化前后轴路面输入有相位差时俯仰角会持续被激发。这也是为什么做平顺性仿真时半车模型经常被用来评价座椅位置处的加权加速度——你不再只能看质心加速度还能算驾驶员前后排位置的垂向响应。如果你后续要做主动悬架半车模型还很容易加入前后轴两个控制力后面我会在第4节给一个简单的对比思路。1.3 模型假设条件与适用边界半车模型虽然比四分之一模型复杂但它仍然是一堆简化假设下的“玩具模型”用之前心里要有数。我的模型做了这几个基本假设车辆左右完全对称所以不带侧倾自由度横向载荷转移、侧向加速度都不考虑。车身是刚体不做弹性变形忽略高阶模态。俯仰角是小角度sinθ约等于θcosθ约等于1方程只保留线性项。悬架弹簧、减振器都是线性的最多再加一个简单的限位缓冲弹簧不做非线性油液模型。轮胎简化为线性弹簧且不考虑轮胎阻尼也不考虑轮胎离地的情况。这套假设决定了它的适用范围铺装路面、正常行驶工况、线性悬架参数、不需要关注侧倾的纵向动力学问题。如果你要做极限操稳、侧翻分析、或者悬架非线性限位撞块半车模型就不够用了得换七自由度全车模型甚至更复杂的多体模型。把这个边界想清楚就不会出现拿着线性半车模型硬解释侧倾问题的尴尬情况。2. 半车模型的数学方程与Simulink建模思路2.1 坐标约定与微分方程推导Simulink建模前必须先把微分方程写对否则后面排查起来很痛苦。我这里采用的坐标符号如下车身质心垂向位移为z向上为正车身俯仰角为θ车头下沉为正前轮垂向位移为z_tf后轮垂向位移为z_tr前、后路面输入分别为z_rf、z_rr。质心到前轴距离为a到后轴距离为b轴距L等于a加b。在刚体平面运动假设下前轴对应车身的垂向位移可以写成z_sf z - a * θ后轴对应车身的垂向位移写成z_sr z b * θ这里要留意符号。车头下沉时θ为正前轴处车身相对质心是降低的所以用z减aθ后轴处是抬高的所以用z加bθ。很多教材符号定义不同但只要自洽就行关键是Simulink里所有模块的加减号要和推导保持一致别一会用z-aθ一会又搞成zaθ。定义前悬架对车身的垂向作用力F_sf为F_sf kf * (z - aθ - z_tf) cf * (ż - aθ̇ - ż_tf)后悬架对车身的垂向作用力F_sr为F_sr kr * (z bθ - z_tr) cr * (ż bθ̇ - ż_tr)轮胎简化为线性弹簧作用在前轮上的力F_tf为F_tf ktf * (z_rf - z_tf)后轮同理。接下来写牛顿第二定律和动量矩定理。车身垂向运动方程mb * z̈ F_sf F_sr车身俯仰运动方程Ic * θ̈ -a * F_sf b * F_sr这里负号很多人会问为什么前悬架力前面是负号因为前悬架作用力向上时作用点位于质心前方该力产生的力矩是让车头抬起的而我规定车头下沉为正所以前悬架力矩取负。后悬架力作用在质心后方向上力会让车头下沉所以取正。前轮垂向运动方程m_tf * z̈_tf ktf * (z_rf - z_tf) - F_sf后轮垂向运动方程m_tr * z̈_tr ktr * (z_rr - z_tr) - F_sr注意F_sf对车身是向上作用力对车轮就是反方向的下压力所以车轮方程里要减去F_sf。2.2 参数表与状态空间表达式我用的是一组偏乘用车的半车典型参数量纲齐全你可以直接替换成自己项目的参数。符号含义数值单位mb车身质量1200kgIc车身俯仰转动惯量2100kg·m²a前轴到质心距离1.2mb后轴到质心距离1.4mkf前悬架刚度20000N/mkr后悬架刚度22000N/mcf前悬架阻尼1300N/(m/s)cr后悬架阻尼1400N/(m/s)ktf前轮胎刚度200000N/mktr后轮胎刚度200000N/mm_tf前非簧载质量45kgm_tr后非簧载质量45kg如果把状态变量取为8个分别是x [z, ż, θ, θ̇, z_tf, ż_tf, z_tr, ż_tr]ᵀ输入选路面位移u [z_rf, z_rr]ᵀ输出可以取车身垂向加速度、俯仰角加速度、悬架动行程、轮胎动位移等。把上一节四个二阶方程降阶成一阶状态方程就能得到标准形式ẋ Ax Bu。实际工程里我建议在MATLAB里用符号工具先把矩阵展开避免手算错。比如车身垂向加速度的表达式可以写成z̈ [kf/mb]z [cf/mb]ż [-akf bkr? no...] 等等。其实不用展开完整矩阵Simulink直接按框图搭建更直观。但如果你想用State-Space模块我会在下一节给出状态空间矩阵的思路。2.3 在Simulink里选哪种建模路线Simulink里实现半车模型有三种常见路线纯模块积分器拓扑、State-Space模块、MATLAB Function块。我个人的建议是教学和调试首选用积分器把方程拆开因为每一个信号都能直接拉线观察哪里不对一眼就看得出来。State-Space模块适合模型已经验证过、想封装成标准状态空间接口或者做控制器设计时方便把A、B、C、D矩阵直接丢给LQR、H∞工具的场景。用这种方案时矩阵写错一个符号跑出来的物理意义会非常离谱而且很难定位。MATLAB Function块适合喜欢用语言描述微分方程的工程师。它的优点是代码可读性好方程和公式几乎一一对应缺点是如果里面写了代数环或者连续状态用global变量仿真效率会下降而且版本升级时有些外部代码接口会变。我的建议先按“积分器增益加法器”搭一个能看懂的模型跑通后再考虑封装State-Space。很多项目卡住不是因为模型高级而是基础的信号流还没理清。下面第3节我按模块拓扑路线详细走一遍。3. 实战在Simulink中搭建二分之一半车悬架模型3.1 模块布置与参数初始化脚本打开Simulink前先在MATLAB脚本里把参数写清楚方便统一修改。我习惯新建一个叫init_halfcar.m的初始化脚本每次仿真前先跑一下% init_halfcar.m 二分之一半车模型初始化参数 mb 1200; % 车身质量 kg Ic 2100; % 俯仰转动惯量 kg*m^2 a 1.2; % 前轴到质心距离 m b 1.4; % 后轴到质心距离 m kf 20000; % 前悬架刚度 N/m kr 22000; % 后悬架刚度 N/m cf 1300; % 前悬架阻尼 N/(m/s) cr 1400; % 后悬架阻尼 N/(m/s) ktf 200000; % 前轮胎刚度 N/m ktr 200000; % 后轮胎刚度 N/m mtf 45; % 前非簧载质量 kg mtr 45; % 后非簧载质量 kg新建一个空白模型命名halfcar_model.slx。不用先去拖模块先在MATLAB命令行运行init_halfcar确保工作区有这些变量。Simulink里的Gain模块直接填mb、kf、cf这些变量名就行不用写成数字这样后期调参数非常方便。3.2 用积分器搭出车身与车轮运动方程Simulink模型的核心是“加速度积分成速度速度积分成位移”。车身部分我先拖出4个积分器一个给z̈积分得到ż再积分得到z另一个给θ̈积分得到θ̇再积分得到θ。前轮和后轮也分别用两个积分器串联这样整个模型一共8个积分器。从位移和速度引线出来按照2.1节的公式计算悬架力F_sf和F_sr。这个计算建议单独用一个子系统我给它起名Suspension Force。子系统内部结构很直白输入z、ż、θ、θ̇、z_tf、ż_tf内部先算悬架相对位移delta_f z - a*θ - z_tf再算悬架相对速度delta_dot_f ż - a*θ̇ - ż_tf最后输出F_sf kf * delta_f cf * delta_dot_f用加法器、Gain模块就能拼出来。注意a*θ这里的a要填在Gain里符号究竟是加是减回到我的坐标定义车头下沉为正时前轴悬架相对位移是z减aθ。你要是用另一个符号定义后续控制逻辑也要同步改。后悬架子系统类似只是相对位移变成z bθ - z_tr。前轮、后轮各自再做一个Tire Force子系统轮胎力分别取ktf(z_rf - z_tf)和ktr*(z_rr - z_tr)。然后把四个运动方程用加法器汇总z̈ (F_sf F_sr) / mbθ̈ (-aF_sf bF_sr) / Icz̈_tf (ktf*(z_rf - z_tf) - F_sf) / mtfz̈_tr (ktr*(z_rr - z_tr) - F_sr) / mtr每个加速度信号分别送给对应的积分器链闭环回路由位移速度反馈回悬架力计算模块。这里不存在代数环因为每个闭环都经过两次积分信号有明确的时序关系。接好后双击Scope直接可以看到车身垂向位移和加速度的波形。3.3 路面激励的三种实现方式路面输入是仿真里最灵活的部分。我通常准备三种按需切换。第一种是阶跃输入最能反映系统固有特性。前轮用一个Step模块后轮用一个Delay或者Transport Delay模块把同样阶跃延后一个轴距除以车速的时间时间差t_delay L / v。假设车速20 m/s轴距2.6 m那么前轮过减速带后后轮延迟0.13秒才过。这样就会看到车身先抬一下再俯仰一下非常直观。第二种是正弦输入适合做扫频分析。用Sine Wave模块设频率和幅值分别给前后轮输入同相或反相的正弦位移。通过改变频率区间多次运行可以画出车身加速度幅频特性。第三种是随机路面用Band-Limited White Noise模块或者From Workspace加载实测路面谱数据。我一般用后者因为白噪声模块生成的信号高频能量太大直接喂给轮胎弹簧容易把非簧载质量激起100Hz以上高频仿真步长被迫压得很小。用实测数据限定频率范围比如0.5到30Hz的路面不平度结果更有工程意义。另外要设置好路面输入信号的幅值单位。常用毫米比米更直观但Simulink里所有力和位移计算都是国际单位制如果你输入路面用的是毫米必须在Gain模块里除以1000转换成米否则悬架力会差三个数量级仿真直接发散。3.4 子系统封装与仿真求解器设置模型搭好后我会把整个物理模型封装成一个名为HalfCar Model的子系统。方法是框选模型右键Create Subsystem from Selection然后在子系统内部给需要对外连接的信号添加Inport和Outport。封装的好处是后续做主动悬架时可以在外面叠加控制器模块而不是整天扒开内部拉线。对子系统添加Mask把mb、Ic、a、b等参数做成Mask变量右键子系统Mask Create Mask参数列表里加上这些变量名然后内部Gain模块自动读取Mask变量。这样以后双击子系统直接弹出一个参数表不用再到工作区翻脚本。求解器设置也很关键。连续系统我优先用变步长求解器默认ODE45一般够用如果模型里加了白噪声输入容易高频抖动可以换成ODE15s也就是刚性求解器稳定性更好。步长上限建议设成最大步长0.001秒尤其是要对比主动和被动悬架时步长不一致会导致结果不可比。输出方面建议在模型参数里勾选固定步长或变步长下的Zero Crossing Detection避免异常尖峰。4. 仿真结果分析与悬架性能指标4.1 从示波器到工作区的数据导出Scope只能看波形不能做量化分析。要得到工程指标我通常在需要观察的信号线末端接To Workspace模块变量名填z_ddot_out、theta_out、susp_force_f等保存格式选Timeseries。仿真结束后直接在工作区用mean、rms、max这些函数处理。一个常见的坑是Simulink里To Workspace默认采样点可能很少导致灵敏度不够。解决办法是打开模型配置把输出选项设为“输出信号中的所有元素”并把保存格式设为Timeseries再保证仿真步长足够小。如果做频域分析还需要保证时域数据足够长建议至少仿真10秒以上让低频响应充分收敛。4.2 车身加速度RMS与俯仰角分析车身垂向加速度是平顺性最直接的指标。仿真完成后在MATLAB命令行用rms函数计算z̈的均方根值z_ddot_rms rms(z_ddot_out.Data); theta_rms rms(theta_out.Data);例如我的半车模型在20 m/s通过单个凸块时车身垂向加速度峰值大约在2.1 m/s²左右俯仰角峰值约0.015 rad看起来不大但加速度曲线里包含明显的低频车身模态约1Hz和高频车轮模态约10Hz以上。通过波形能看出前轮激励先作用后轮滞后到达后产生更强的俯仰响应。4.3 悬架动行程和轮胎动载荷的权衡悬架评价不能只看加速度。悬架动行程越大越容易碰到限位块轮胎动载荷波动越大抓地力越不稳定。半车模型刚好把这两个指标分开前后悬架动行程分别定义为s_f z - aθ - z_tf和s_r z bθ - z_tr轮胎动载荷分别为ktf*(z_rf - z_tf)和ktr*(z_rr - z_tr)。你会发现阻尼调大可以快速衰减车身加速度但会把高频路噪传到车身上同时悬架动行程明显减小。阻尼调小则相反舒适性变差但轮胎动载荷波动变小。这就是经典的舒适性、安全性、动行程三角权衡。做仿真研究时我建议把这几个指标同时绘在一张图上用subplot生成4个子图车身加速度、俯仰角、前悬架动行程、前轮胎动载荷然后肉眼观察阻尼变化对各指标的影响趋势。4.4 被动悬架与主动悬架的简单对比半车模型最大的附加值是可以验证主动悬架控制。我做过最简单的PID反馈分别测量前、后悬架动行程和车身垂直速度用控制力u_f、u_r去修正悬架力。修改方程时只需要把车身两个方程改为mb * z̈ F_sf F_sr u_f u_rIc * θ̈ -aF_sf bF_sr - au_f bu_r前轮方程同时减去u_f后轮减去u_r。在Simulink里实现很直接把悬架力F_sf和F_sr输出经过一个加法器叠加控制力再回到车身方程。我试过最简单的比例控制主动悬架能让车身加速度RMS比被动悬架下降大约20%到25%代价是控制力峰值比较高。如果做LQR可以把四个性能指标加权进代价函数这也是很多毕业设计喜欢选的课题方向。注意一点主动控制回路加进去后模型里会出现新的不稳定性来源。增益调太大高频颤振就开始出现。调试时先把控制增益全部归零确认被动模型没问题再从小到大慢慢增大增益同时在示波器里观察控制力和悬架力是否出现明显的高频抖振。5. 常见报错、发散问题与调试经验5.1 代数环为什么会出现我在半车模型里搭好之后有一阵在后轮悬架力计算里直接引用了ż_tr而没经过积分器结果Simulink弹出一个Algebraic Loop警告。代数环的直观原因是某个信号在同一计算步内既依赖于输出又依赖于输入形成了没有积分的闭环。悬架力计算本身只要包含速度和位移的即时代数运算而速度和位移来自积分器所以按理说不会产生代数环。但如果你不小心在同一个子系统里直接用了积分器输出和加速度输入交叉相乘就可能触发。处理代数环最简单的方法是在反馈通路上加一个很小的惯性环节比如1/(s1000)或者在输出端加Unit Delay。但单元延迟会引入额外相位滞后会改变高频响应。我推荐优先检查信号流把积分器放在正确的层级中而不是简单粗暴加延迟。5.2 仿真发散的几个根源仿真发散最常见的三个原因单位不统一、参数数量级错误、求解器步长过大。轮胎刚度20万N/m车身质量1200kg如果路面输入单位错按毫米直接参与计算轮胎力会大得离谱一两步就溢出。我的排查顺序是先设所有路面输入为常数0看模型是否稳定在零平衡点。如果发散说明模型内部方程或参数符号有错。给前轮一个小阶跃0.01m后轮保持0看车身位移曲线是否先正向再回归零点附近。如果一直正增长说明这组参数下的系统不平衡可能泄漏了零位。检查z、θ、z_tf、z_tr的初始值是否合理。我一般把初始位移设为0速度设0路面输入从0开始这样系统初始处于静平衡。若初始值不为0瞬态响应会叠加一个偏移。5.3 参数标定和量纲检查清单做悬架模型最容易栽在参数上。我给你一个最终核对清单刚度单位是N/m阻尼单位是N/(m/s)别把kN/mm和N/m混用。轮胎刚度通常是悬架刚度的8到15倍如果设置值只有几万甚至几百非簧载质量会乱跳。俯仰转动惯量的单位是kg·m²数量级大概在1000到4000之间。如果填成400俯仰响应会异常迟钝。前后轴距a加b应该等于实际轴距L不要填成质心到前后轴的距离之和大于轴距。阻尼比通常在0.2到0.4之间换算公式是c/(2sqrt(km))。比如前悬架等效车身质量约mb*b/L阻尼比算出来在合理范围才正常。5.4 快速调参技巧与扩展建议调试时我习惯把模型里的Gain模块直接填成变量名然后写一个for循环批量仿真例如遍历cf从1000到1800每次调用sim函数记录车身加速度RMS最后绘制趋势曲线。这样5分钟就能看清楚阻尼变化的影响规律。如果你想往深度方向发展可以在现在的半车模型上做三件扩展加座椅模型把座椅刚度和阻尼串联到车身质心前某个位置用来评价人体加速度加载限位块非线性用饱和模块模拟悬架撞到缓冲块或者把模型改成C代码生成通过Simulink Coder部署到实时仿真机做硬件在环。半车模型虽然简单但它是理解主动悬架、半主动悬架以及整车参数匹配的很好载体。最后一件事也是我踩坑最多的地方任何模型改动之前先把当前能跑的版本另存一份。Simulink工程文件很容易因为一个接线改动就变得不可回退有了备份你才敢大胆试参数。我个人在实际操作中的体会是半车模型调试90%的时间不在Simulink操作而在物理参数和符号约定这一关过了剩下的就是水磨工夫。希望这篇内容能帮你少走点弯路。
返回列表