基于Simulink的7自由度与14自由度整车动力学建模与仿真详解
做底盘电控或者整车性能开发的兄弟大概率都有过被“整车动力学模型”这几个字反复支配的经历。最近把手里这套基于Matlab/Simulink的7自由度和14自由度整车动力学模型又重新梳理了一遍从模型搭建、参数标定到典型工况仿真再到和Carsim联合仿真做横向验证整个过程踩了不少坑也积攒了一些心得。这篇文章就把这几个自由度模型的来龙去脉、建模要点、实操步骤和调试经验一次性整理出来给正在搭模型或者准备用Simulink做车辆动力学仿真的朋友做一个参考。1. 整车动力学模型整体设计与自由度取舍1.1 7自由度和14自由度分别指什么整车动力学模型里的“自由度”这个词说通俗一点就是这个模型里面有几个“独立可以动的部分”。自由度越多模型能描述的运动就越精细但对应的建模难度、计算代价和参数需求量也会同步上升。常见的7自由度模型指的是簧载质量车身的3个垂向相关运动——垂向跳动、俯仰、侧倾再加上4个车轮的垂向跳动一共是3加4等于7个自由度。这套模型的核心应用场景是平顺性分析、悬架参数匹配、垂向振动响应研究。它把整车简化成车身加四个悬架加四个轮胎的垂向振动系统能很好地反映车辆过减速带、跑粗糙路面时车身的垂向加速度、俯仰角、侧倾角以及各车轮动载荷的变化。14自由度模型则是在7自由度的基础上把车辆的平面运动也纳入进来。它包含了车身的纵向运动、侧向运动、横摆运动这3个自由度加上原来的垂向跳动、俯仰、侧倾3个自由度再加4个车轮的垂向运动还有4个车轮的旋转运动一共是14个自由度。这是目前工业界做底盘控制策略开发比如ABS、ESP、TCS最常用的“性价比最高”的模型配置之一。它既能反映车辆在转向、制动、加速工况下的横摆和侧偏响应又能兼顾垂向载荷转移对轮胎附着的影响比纯 bicycles 模型两轮单车模型精细得多又比30多自由度的全刚体模型轻量得多跑仿真的效率非常友好。1.2 自由度选择的底层逻辑与场景匹配我在实际项目里见过不少同学一上来就想直接搭一个“大而全”的模型觉得自由度越多越高级。但这里面有个很现实的问题自由度越多需要标定的参数就越多计算效率也会下降。而且有些场景下过高的自由度并不会带来精度上的收益反而会让模型对某些参数极其敏感最后仿真结果连趋势都对不上。我自己的经验是自由度选择一定要匹配你的研究目标。如果做悬架调校、座椅平顺性评估、路面激励下的车身响应分析7自由度模型基本就够用了。它的垂向动力学特性描述得很到位而且由于模型规模小跑蒙特卡洛参数扫描、配合优化算法做悬架参数寻优的时候速度优势极其明显可能一晚上就跑完几千组工况。但如果做的是车辆稳定性控制、转向工况下的横摆响应分析、或者需要给ESP算法提供车辆状态估计信号那就得上14自由度——只有包含纵向、侧向和横摆方向模型才能正确反映出轮胎的非线性附着特性和载荷转移对车辆操稳性的影响。另外还有一个很实际的原因促使我把两套模型都做出来。在做算法验证的时候往往先用简单模型跑通算法逻辑再用复杂模型做精细化验证两套模型搭配使用既可以提升开发效率又能在算法层面做充分验证。所以搭建模型的时候最好从一开始就预留好“模块化切换”的接口7自由度模型里的车身垂向模块和14自由度里的部分模块是可以复用的。2. 模型核心方程与Simulink实现思路2.1 7自由度模型的物理方程拆分7自由度模型本质上是一个“弹簧-质量-阻尼”振动系统。车身作为簧载质量通过四套悬架包含弹簧和减振器连接到四个非簧载质量车轮非簧载质量再通过轮胎刚度连接到路面。先看车身的垂向运动方程这里需要把四个悬架点对应的力叠加起来m_s * z_s F_fl F_fr F_rl F_rr其中m_s是簧载质量z_s是车身质心处的垂向加速度。每个悬架力F_i可以写成F_i k_i * (z_s_i - z_u_i) c_i * (z_s_i - z_u_i)这里z_s_i是车身在第i个悬架安装点处的垂向位移z_u_i是相应的非簧载质量位移k_i和c_i分别是该悬架的刚度和阻尼系数。注意z_s_i和车身质心位移、俯仰角、侧倾角三者是耦合的需要通过几何关系换算。这是模型中最容易出错的地方——悬架安装点的位移不止包含质心垂向跳动还叠加了俯仰和侧倾带来的投影分量。车身的俯仰和侧倾方程也要分别列出I_theta * theta 前后悬架力产生的俯仰力矩之和 I_phi * phi 左右悬架力产生的侧倾力矩之和四个车轮的垂向运动方程为m_u_i * z_u_i k_t_i * (z_r_i - z_u_i) - F_i其中k_t_i是轮胎的等效垂向刚度z_r_i是路面在该轮处的位移输入。这个方程描述了车轮垂向位移对路面激励的跟随同时也反映了轮胎动载荷的变化。在Simulink里面搭建这套方程我推荐采用“积分器链”的方式。每个自由度用一个二阶积分结构表示加速度输入到积分器得到速度再积分得到位移。这样做的好处是方便观察任意状态的瞬态响应也便于设置初始条件。注意一定不要直接对位移求导去算速度数值上会出现严重的噪声放大问题。2.2 14自由度模型的扩展方程与耦合关系14自由度模型在7自由度的基础上要额外处理车辆平面运动和车轮旋转。车身平面运动方程是这套模型的核心。在大地坐标系下车辆的纵向、侧向加速度和横摆角速度之间通过以下运动学关系联系a_x V_x - gamma * V_y a_y V_y gamma * V_x其中V_x、V_y分别是质心处的纵向和侧向速度gamma是横摆角速度。受力方面四个轮胎的纵向力和侧向力需要先分解到车体坐标系再合并求合力。这里每一步的思路就是把轮胎坐标系的力和力矩通过前轮转角以及后轮如果参与转向的话转换到车体坐标系然后汇总到运动方程里。车轮旋转自由度方程为J_w * omega_i T_drive_i - T_brake_i - F_x_i * RJ_w是车轮转动惯量omega_i是车轮角加速度T_drive_i是驱动力矩T_brake_i是制动力矩F_x_i是该轮纵向力R是车轮有效滚动半径。这个方程把车辆纵向运动和车轮旋转“牵”在一起也是ABS/TCS控制策略能够“落脚”的关键方程——控制器通过调节制动力矩和驱动力矩来改变车轮滑移率。这里有一个很重点的耦合关系需要特意处理轮胎侧偏角和纵向滑移率都依赖于车轮平面运动速度与旋转速度的差值。也就是说只有当你有至少13甚至14个自由度的时候轮胎的纵滑和侧偏特性才能真正被统一地表达出来这也是14自由度模型相比“车辆平面模型垂向模型简单叠加”更为合理的原因。2.3 轮胎模型选择与路面输入处理任何自由度模型只要涉及车辆和地面的相互作用轮胎模型就绕不开。7自由度模型里一般只需要轮胎垂向刚度这个比较好处理直接线性或者准静态分段都行。但14自由度模型里必须处理轮胎的纵向力和侧向力这时候就需要选一个合适的轮胎模型。我在这个项目里用的是经典的魔术公式Magic Formula和Dugoff模型的双模切换方案。魔术公式通用形式是Y D * sin(C * arctan(B * x - E * (B * x - arctan(B * x))))这套公式精度高在中大侧偏角、纵向滑移率工况下都能拟合得很好。但它的标定参数多而且纯公式形式在Simulink里搭建稍微复杂一点。我的做法是把魔术公式封装成一个Matlab Function输入为侧偏角、纵向滑移率、垂向载荷输出为纵向力、侧向力。这样模块可以复用维护也方便。Dugoff模型则结构简单、计算量小适合做控制器快速验证的场合。它的纵向力表达式可以写为F_x C_s * s / (1 s) * f(lambda)其中lambda是一个与路面附着系数、轮胎刚度、垂向载荷相关的系数f(lambda)是一个分段函数。如果只做ABS算法的“浅”验证Dugoff模型完全够用而且调试起来比魔术公式至少省一半的时间。路面输入方面7自由度模型我建议用随机路面谱生成路面激励常见的ISO8608路面等级分类可以直接用B级和C级路面跑平顺性是最典型的工况。14自由度模型做操稳性仿真时我一般直接给前轮转角阶跃输入、正弦扫频输入或者双移线工况的期望路径通过横向控制转化成前轮转角不再单独做随机路面。3. Simulink建模实操与关键模块搭建3.1 顶层架构模块化拆分与信号总线设计这块是提升效率的重中之重。我自己已经把整套模型拆成四个大模块驾驶员/环境输入模块、整车核心动力学模块、轮胎模块、以及后处理观测模块。整车核心动力学模块再往下拆成车身运动子模块、悬架子模块、车轮运动子模块、平面运动子模块。每个子模块都做成独立的Simulink Subsystem用Goto/From标签传递信号或者用Bus对象把整车状态打包尽量让模型看起来清爽也方便其他人接手。顶层信号我用的是Bus对象把车身状态、车轮状态、轮胎力、路面输入这些信号统一打包。好处很明显现在模型数据量一多随手拉线拉成蜘蛛网出了问题查起来想哭。用Bus方式做模块间通信整个数据流一目了然配合Simulink的信号标签检查功能能在建模早期就发现不少连线错误。而且Simulink有Bus Object可以把数据结构定义在一个m脚本里方便统一管理不用在模型中一个个去手动指定。3.2 MATLAB Function模块的参数传递与代码封装7自由度、14自由度模型里轮胎模型、悬架限位块、空气阻力这些非线性环节我都用MATLAB Function模块实现。这类模块的好处是可以用熟悉的Matlab语法直接写方程不用去做一堆Simulink基本模块的连线。但在使用过程中有几个坑一定要避开。第一MATLAB Function模块里的输入输出端口一定要用“Edit Data”面板显式定义好每个变量的名称、维度和数据类型不然生成C代码的时候很容易报类型不匹配。第二不要在里面写太重的循环仿真步数多的时候性能会有明显下降。能用向量运算解决的尽量向量化例如四个车轮的动力学方程我就直接写成4维向量的运算。参数传递方面我把所有车辆参数放在一个mat文件里包含车身质量、绕Z轴的转动惯量、轴距、轮距、质心高度、悬架刚度阻尼、轮胎刚度、轮胎模型参数等等。然后用结构体的方式加载到基础工作区模型里的常数参数直接引用结构体字段比如vehicle.m_s、vehicle.a、vehicle.b。这样做的好处是改参数只在mat文件或m脚本里改不需要进模型去翻。仿真测试时如果要批量改参数可以用sim指令结合结构体参数覆盖不需要一个一个模块去手改。3.3 求解器配置与代数环处理求解器配置是我在这个项目里踩过最深的一个坑。7自由度模型因为是纯粹的二阶常微分方程组用变步长的ode45基本上就能搞定。但14自由度模型中涉及到轮胎模型的强非线性以及车轮纵向力、侧向力和垂向载荷之间的耦合系统刚性会变得明显。仿真特别容易在轮胎侧偏角快速变化的时候报“Solver stuck”、提示无法满足积分容差或者步长缩到极小导致仿真直接卡死的情况。解决方法是用ode15s变阶变步长刚性求解器同时把“Max Step”限制在0.001秒以内。限制最大步长的原因很现实如果步长设得过大轮胎非线性的瞬态切换会被严重平滑掉ABS这类控制算法的触发逻辑就可能出问题。另外考虑到要和后续的C代码生成、快速原型验证对接我在最终版本模型里直接改成固定步长求解器用ode4四阶龙格库塔配合1kHz采样率跑实测下来稳定性和精度都令人满意。代数环问题是Simulink建模里另一个让人头疼的情况。常见于轮胎力计算和轮胎运动状态之间的相互依赖关系比较深的时候。我用两类办法基本解决了这类问题一是手动调整模块顺序在不需要严格耦合的地方用Memory模块做一步延迟解环二是在MATLAB Function里面直接用内部状态量把一部分轮胎模型状态比如瞬时滑移率定义为持久变量从本源上切断代数依赖。4. 仿真工况配置与结果对比分析4.1 典型平顺性工况B级路面随机输入下7自由度模型响应我把7自由度模型用在一个悬架参数优化项目里最常用的工况是车速60km/h行驶在B级随机路面上。步骤是先根据ISO8608标准用白噪声构造路面粗糙度输入通过滤波整形生成左右轮相关、前后轮时间延迟的路面不平度信号然后作为四个车轮的路面输入。仿真时间30秒用变速积分把瞬态段的数据截掉取稳态段的垂向加速度做RMS值同时观察俯仰角、侧倾角的最大值以及各车轮的动载荷系数。模型跑出来的结果和实际道路试验以及Carsim参考模型对比后车身质心垂向加速度的RMS误差能控制在10%以内。这里有一个关键点想提醒路面输入的时间延迟不能忽略。前后轴距、行驶速度决定了后轮输入相对前轮有一个滞后时间如果没有正确设置这个延迟俯仰角的响应幅值和相位都会差很多。我自己第一次搭的时候就是忽略了这个问题仿真出来的俯仰角比实测数据大了将近一倍。延迟计算公式是tau L / VL为轴距V为车速。用Transport Delay模块即可实现注意延迟时间要用车速信号动态更新而不是写死一个常数值。4.2 典型操稳工况双移线与阶跃转向下的14自由度模型响应14自由度模型我主要用来做ESP算法的开发验证最常跑的是前轮转角阶跃输入和双移线工况。阶跃转向工况是ISO标准的操稳测试方法之一。给前轮一个0.2g稳态侧向加速度对应的转角阶跃保持方向盘不动记录车辆的横摆角速度、侧偏角以及质心侧偏角的瞬态和稳态响应。这个工况检验的是模型对轮胎侧偏特性的参数敏感度——如果轮胎侧偏刚度标定误差大稳态横摆角速度增益会有明显偏差。双移线工况则是模拟紧急变道再回到原车道的情况用来考验ESP介入逻辑。在这个工况下车辆会经历大幅度的横向加速度切换轮胎工作点快速进入非线性区。之前用纯简单线性轮胎模型的方案在双移线工况中几乎无法复现真实的横摆响应车辆很容易就“飘”了。换成14自由度加魔术公式轮胎模型后整车横摆角速度的响应趋势和Carsim输出的参考结果能够很好的吻合这说明新增的垂向载荷转移模型起到了应有的作用。4.3 7自由度与14自由度在应用场景上的分工两套模型都跑通之后我对它们的分工总结是7自由度解决“垂直方向”的问题14自由度解决“水平方向”的问题。具体来划分一下做悬架刚度、阻尼参数寻优时推荐只用7自由度模型配合优化算法和并行计算可以快速扫出参数的最优区间。做ABS、TCS控制策略开发时候用14自由度模型重点关注车轮滑移率、制动距离和车身减速度。做ESP/VSC车辆稳定性控制时候也一定用14自由度模型并且需要特别关注横摆角速度和质心侧偏角这两个关键状态。做平顺性和操稳性联合优化比如主动悬架加后轮转向的集成控制时14自由度模型就是最低配置了只有同时具备垂向与平面运动控制器才能考虑到载荷转移对操稳性的影响。5. 常见问题、调试技巧与联合仿真经验5.1 仿真发散和数值不稳定如何排查建模初期几乎绕不开仿真发散。发散现象分为两类一类是模型完全“爆掉”输出直接飞到10的几十次方另一类是结果无规则震荡看着没爆但明显不符合物理规律。先看第一类。最常见的原因是初始条件设置不合理。比如车身初始垂向位移和速度没有根据静平衡状态设置悬架弹簧初始压缩量对不上重力模型一启动就相当于从非平衡态掉落产生很大的瞬态冲击。解决思路是做一个“静平衡初始化”计算。在正式仿真前先单独跑一个平衡工况让模型自己稳定到平衡位置或者说让车“平稳地坐在悬架上”然后把稳定后的状态值作为正式仿真初始值。另一类发散的“惯犯”是轮胎模型计算错误。滑移率表达式里分母有车速一旦车速趋近于零特别是车辆从静止起步的工况直接套公式就会让力变成无穷大。我一般会给分母加一个最小限幅值比如0.5 m/s或者用带平滑过渡的分段函数来处理近零车速区域。再来说数值震荡问题。这类问题往往和求解器的容差设置有关。如果模型用了变步长调小相对容差一般能改善震荡。如果是固定步长那就要检查步长是否过大了。对于14自由度模型我实测的结论是固定步长1e-4秒更加稳妥1e-3秒在某些工况下控制算法和轮胎模型之间容易出现振荡。5.2 与Carsim联合仿真的配置经验模型搭建完成后交叉验证这一步我强烈建议做。对比对象就选Carsim这是业内最常用的整车动力学商业软件作为参考基准没有什么争议。联合仿真我主要用CarSim的S-Function接口方式在Simulink里加载CarSim S-Function模块把Simulink模型作为控制端比如输出某个车轮的制动力矩CarSim作为被控整车模型。这里最关键的配置是保证两个软件的通信步长一致我通常是统一设置成0.001秒并且两个工具的头文件路径要添加正确。CarSim默认自带高精度的车辆动力学模型40个左右自由度。所以验证的时候一般不需要让Simulink的14自由度模型直接替代CarSim而是用你自己搭的模型跑曲线趋势重点看稳态增益、模态频率和响应相位是否吻合。有一件事要特别留心CarSim和Simulink通信的数据类型要设置一致。CarSim导出的数值默认是double但S-Function模块的某些中间变量可能默认成int或single如果不注意数值在传递过程中会被截断最终导致明明模型没问题但曲线“毛刺”很多。5.3 模型FMU导出与代码生成注意事项我最近被问得比较多的是如何把模型导出FMUFunctional Mock-up Unit因为不少项目需要使用功能样机接口做跨平台联合仿真。从Simulink导出FMU需要做好几个准备。模型里用到的模块必须是支持C代码生成的模块MATLAB Function模块要确保能正常编译成C。所有输入输出端口需要明确标定数据类型和维度不能有从工作区直接引入的不定长变量掺杂在里面。换句话说模型要做到“干净”才能顺利转为FMU。代码生成方面还有一点实战经验如果你的模型将来要部署到快速原型设备或者硬件在环系统上建议从建模之初就遵循MBD的规范例如信号名不要用中文、不要用Goto/From把信号传得太远导致代码生成后依赖关系不清晰、以及周期性任务一定要用Rate Transition明确采样周期。这一步做的越早后面遇到代码生成错误时就越省心。我自己就曾经因为违规使用了几个“不和谐”的模块导致生成C代码的过程报错排查就花了一整天。5.4 参数标定过程中的实用技巧最后分享两个我实测下来非常好用的参数标定技巧。第一个是做“单自由度扫频”。整车动力学是多个自由度耦合的结果但参数标定时不要一次性把所有变量放开。先把车身固定死单独测悬架系统的频率响应标定悬架刚度与阻尼再把悬架固定住单独测轮胎垂向刚度。这样分层标定比整体优化稳定得多也更容易发现哪个参数出了问题。第二个是“合成激励法”。在做轮胎模型参数标定时不要只用正弦扫频输入因为轮胎力是高度非线性的单一频率无法让参数在全工况范围内可信。先做一组白噪声激励下的数据用频响匹配粗调参数再做一组高频大振幅的正弦输入精调。这样粗细搭配标定出来的轮胎模型参数在后续的阶跃工况和双移线工况里泛化性都更好。6. 后续扩展思路与个人心得整车动力学模型搭到能稳定跑出和参考结果吻合的曲线只是第一步。这个模型真正有价值的地方在于它作为后续算法验证载体的可能性。我下一步计划在14自由度模型基础上再叠加一个主动悬架控制器因为模型已经具备完整的垂向和平面运动耦合正好可以验证主动悬架对车身姿态和操稳性的协同改善效果。另外也在考虑把神经网络轮胎模型引进来替代一部分魔术公式的标定工作。回到最开始的感受整车动力学仿真这个方向模型本身只是载体真正拉开差距的地方在于对物理过程的理解和对Simulink这种工具的熟练程度。自己从零搭一遍7自由度和14自由度模型虽然过程确实费了不少精力但相比直接拿现成模板或者只用商业软件的人对整个车辆系统的理解深度是完全不一样的。建议有条件的朋友都亲手从方程推导、模块搭建、到参数标定走一遍完整的流程。这个过程积累下来的经验远比拿到一个能跑通的模型本身要值钱得多。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →