ARTICLE DETAIL

资讯详情

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

七自由度整车模型与魔术公式轮胎的Simulink实现

七自由度整车模型与魔术公式轮胎的Simulink实现 做底盘控制的工程师大概都经历过一段“模型焦虑”CarSim这类多体动力学软件精度好但参数多、授权成本高跑一轮联合仿真动不动几十秒起步还得跟各种DLL版本较劲线性二自由度自行车模型算起来飞快却把轮胎死死钉在“线性刚度”上ESP、ABS这些恰恰要靠轮胎进入非线性区才能工作的算法根本没法在上面验证。试过一圈之后我是越来越觉得七自由度Simulink模型才是性价比最高的一档。它把整车纵向、侧向、横摆运动连同四个车轮的旋转动态全部显式解出来一个双移线工况跑完不到一秒钟而整个模型里最核心、最容易建歪的部分就是轮胎模型——目前工程界用得最普遍的还是Pacejka魔术公式。这篇东西打算把从零搭一套“七自由度整车 魔术公式轮胎”Simulink模型的完整思路写出来。会先从自由度构成和坐标系约定这种底层问题讲起然后把魔术公式的结构、参数怎么标定、载荷转移怎么跟轮胎力耦合都拆开说清楚最后是模型落地时的代数环处理、低速除零保护以及我实际调试中踩过的几个坑。无论你是研究生课题要用还是要给控制器做快速验证跟着这套思路走至少能少走小半个月弯路。1. 七自由度模型解决了什么问题“坐标约定”为什么是第一步1.1 七个自由度到底从哪来七自由度的“七”是这样数的把整个车身当做一个刚体只保留它在水平面内的三个运动——纵向速度 (u)、侧向速度 (v)、横摆角速度 (r)这是三个自由度剩下的四个自由度是四个车轮各自绕旋转轴线的转动角速度 (\omega_{FL}, \omega_{FR}, \omega_{RL}, \omega_{RR})。加起来正好七个积分状态没有车身垂向跳动没有俯仰没有侧倾。看到这里你可能会问不建立侧倾自由度悬架载荷转移怎么办我的做法是把侧倾引起的轴向载荷重新分配直接折算进四个车轮的垂直载荷里而不是去显式解悬架运动学。这样做的好处是模型保留了对魔术公式影响最大的那个因素——轮胎垂直载荷 (F_z) 的动态变化代价是没有办法直接输出车身侧倾角如果你做的控制器需要侧倾信息得后续再加一个侧倾动力学方程。这种“先保住主要矛盾、再按需扩展”的思路是做整车简化模型的通用心法。1.2 ISO还是SAE符号约定直接决定后面所有公式是否顺滑轮胎力方向、横摆角速度正方向、侧偏角符号这些看似琐碎的问题几乎是我见过初学者在Simulink里翻车最多的地方。举个例子同一个前轮侧偏角如果在推导时把 (v a\cdot r) 的符号弄反魔术公式出来的侧向力就会变成“正反馈”仿真跑不了几秒整车就甩出去了。建议统一采用ISO坐标系(x) 轴向前(y) 轴向左(z) 轴向上。横摆角速度 (r) 以逆时针为正也就是车头向左转时 (r0)前轮转角 (\delta) 同样以向左转为正。侧偏角的定义采用[ \alpha -\arctan\left(\frac{V_y}{V_x}\right) ]其中 (V_x, V_y) 是轮胎接地中心在轮胎坐标系下的速度分量。这样约定之后正常转向工况下侧偏角为负、侧向力为正魔术公式曲线落在常用的第一象限和第三象限画图和后续做符号判断都会直观很多。记住一个原则全模型只认一套坐标约定所有轮胎力、载荷、传感器输出进模型时先统一变换不要在每个模块里各写各的符号。1.3 模型边界哪些东西被刻意省略了七自由度模型看起来方程不多但它是有明确适用边界的。它把四个车轮的垂直载荷用静载加上纵向、侧向动态转移来近似不考虑悬架弹簧和减振器的瞬态响应不考虑轮胎的松弛长度relaxation length也就是轮胎力的建立被认为是瞬时的不考虑空气动力学不考虑转向系统本身的惯量和柔性前轮转角就是直接输入。这意味着这套模型适合什么场景适合开发ABS、TCS、ESC这类以车轮滑移和整车横摆为主要对象的控制算法适合做稳态回转、双移线、正弦扫频这些操纵稳定性工况。它不适合做平顺性分析不适合做转向系统手感仿真也不适合研究悬架几何带来的外倾推力变化。把这些边界想清楚后续跟CarSim对标的时候你才知道哪些偏差该找轮胎参数哪些偏差根本不在模型能力范围内。2. 先吃透魔术公式一条公式如何撑起轮胎非线性2.1 魔术公式的数学骨架Pacejka在20世纪80年代提出的“魔术公式”本质上是用一组三角函数组合来逼近轮胎在稳态工况下的力与滑移/侧偏关系。通用形式是这样的[ y(x) D \sin\left[ C \arctan\left( B x - E ( B x - \arctan(B x) ) \right) \right] S_v ]其中 (x X S_h)(X) 是输入变量纵向滑移率 (\kappa) 或侧偏角 (\alpha)(S_h) 和 (S_v) 分别是水平偏移和垂直偏移。把这个公式套到纵向力上(X\kappa)输出 (yF_x)套到侧向力上(X\alpha)输出 (yF_y)。第一次看到这个公式的人都会觉得它长得有点劝退但拆开看其实很优雅。(D) 决定曲线的峰值也就是最大摩擦力(C) 决定曲线是“一直上升”还是“到峰值后回落”对应轮胎力是否会出现明显的饱和后下降段(BCD) 三者相乘近似等于曲线在原点的斜率也就是我们常说的侧偏刚度或纵向刚度(E) 控制曲线靠近峰值时的弯曲程度可以说直接影响了不稳操工况下轮胎力“渐变”还是“突变”的表现。2.2 B、C、D、E不是常数而是垂直载荷的函数这里有一个新手特别容易忽略的关键点魔术公式的四个核心参数并不是恒定值它们都随轮胎垂直载荷 (F_z) 变化。原因也很直观胎压、接地印迹、橡胶摩擦特性都会随载荷改变所以侧偏刚度在小载荷区间近似线性增长大载荷后增长变缓甚至下降峰值附着系数也会随载荷升高而有所降低。在Pacejka 94参数体系里典型处理方式是[ D a_1 F_z^2 a_2 F_z ][ BCD a_3 \sin\left( 2 \arctan\left( \frac{F_z}{a_4} \right) \right) ][ E a_6 F_z^2 a_7 F_z a_8 ][ S_h a_9 F_z a_{10}, \quad S_v a_{11} F_z a_{12} ]其中 (BCD) 整体表示原点斜率再除上 (C \cdot D) 得到刚度因子 (B)。这个 (BCD) 用反三角形式拟合的原因是侧偏刚度随载荷呈现“先上翘后饱和”的趋势正弦型反正切组合刚好能描述这种饱和特性。2.3 一套能直接跑通模型的示例参数很多刚接触的人卡在“没有轮胎实测数据”这一步。这里分享一套我在教学模型里常用的乘用车轮胎参数量级合理能把整个模型跑起来用来验证控制算法没问题。但必须强调这不是某一款具体轮胎的实测拟合值正式工程项目里一定要用MTS Flat-Trac这类轮胎试验台的数据重新标定或者从轮胎厂家获取参数。下表是一套按ISO约定、力单位用N、角度单位用rad的示意参数侧向力参数数值纵向力参数数值(a_0) (C形状因子)1.30(b_0) (C形状因子)1.65(a_1) (1/N²)-1e-7(b_1) (1/N²)-1e-7(a_2) (1/N)0.95(b_2) (1/N)1.05(a_3) (N)60000(b_3) (1/N)0(a_4) (N)5000(b_4)28.0(a_5)0.0(b_5)0.0(a_6) (1/N²)0.0(b_6) (1/N²)0.0(a_7) (1/N)0.0(b_7) (1/N)0.0(a_8)-0.1(b_8)0.3(a_9, a_{10}, a_{11}, a_{12})0(b_9, b_{10}, b_{11}, b_{12})0用这套参数在MATLAB里把侧向力曲线画出来能看到典型的饱和特性侧偏角从0增大到约10度时侧向力快速上升超过8到12度后进入饱和平台这正是做稳定性控制最关心的区域。换一个 (F_z)整个曲线峰值和刚度都会变这就是魔术公式耦合整车模型的物理基础。2.4 轮胎的输入量侧偏角和纵向滑移率怎么算有了公式还得把公式的输入 —— 侧偏角和纵向滑移率 —— 从整车状态里算出来。七自由度模型里四个车轮的速度不完全一样转向、横摆都会让内外侧车轮的接地中心速度产生差异。对前轮考虑前轮转角 (\delta) 后车轮坐标系下的速度分量可以写成[ V_{xw} u\cos\delta (va r)\sin\delta ][ V_{yw} (va r)\cos\delta - u\sin\delta ]后轮直接代入 (\delta0)。然后侧偏角按前面的约定计算。纵向滑移率则是一个分段定义驱动工况(\omega R V_{xw}) [ \kappa \frac{\omega R - V_{xw}}{\omega R} ]制动工况(\omega R V_{xw}) [ \kappa \frac{\omega R - V_{xw}}{V_{xw}} ]这个定义的物理含义是“车轮实际前进速度与纯滚动速度之间的相对差”。驱动时滑移率为正制动时为负魔术公式在正负区间都能输出合理的纵向力。3. 整车动力学方程推导从受力到车身加速度3.1 车身纵向、横向、横摆三个方程车身运动方程是整个模型的中枢。在ISO坐标系下考虑到车身坐标系本身在旋转纵向和侧向加速度表达式里都会出现耦合项[ m(\dot{u} - v r) \sum F_x ][ m(\dot{v} u r) \sum F_y ][ I_z \dot{r} \sum M_z ]四个车轮的轮胎力需要先从轮胎坐标系变换到车身坐标系。前轮因为有转角 (\delta)单个前轮对车身纵向和侧向的贡献分别是[ F_{x,body} F_x \cos\delta - F_y \sin\delta ][ F_{y,body} F_x \sin\delta F_y \cos\delta ]后轮因为 (\delta0)直接使用轮胎力本身。把四个车轮都叠加起来就得到方程右边的合力与合力矩。横摆力矩的推导藏着头号易错点前轴轮胎力既要算侧向力分量对质心产生的力矩还要算左右轮纵向力之差通过轮距产生的力偶矩。完整的横摆力矩表达式如下[ \begin{aligned} \sum M_z , a\left( F_{y,FL}\cos\delta F_{x,FL}\sin\delta F_{y,FR}\cos\delta F_{x,FR}\sin\delta \right) \ - b\left( F_{y,RL} F_{y,RR} \right) \ \frac{t_f}{2}\left[ (F_{x,FL}-F_{x,FR})\cos\delta - (F_{y,FL}-F_{y,FR})\sin\delta \right] \ \frac{t_r}{2}\left( F_{x,RL} - F_{x,RR} \right) \end{aligned} ]初学者特别容易漏掉前轴那两项交叉项。比如左右轮纵向力不等时哪怕前轮转了个小角度也会因为力臂 (t_f/2) 产生额外的横摆力矩这在差动制动策略里是绝对不能忽略的。3.2 四个车轮的旋转方程四个车轮的旋转自由度方程形式完全一致只是输入输出各自独立[ I_w \dot{\omega}i T{d,i} - T_{b,i} - F_{x,i} R_e ]其中 (I_w) 是车轮转动惯量(T_{d,i}) 是驱动转矩(T_{b,i}) 是制动转矩(R_e) 是有效滚动半径。轮胎纵向力 (F_{x,i}) 在这里作为阻力矩出现这正好形成轮胎与整车之间的闭环整车状态决定轮胎滑移率滑移率决定轮胎力轮胎力又反过来改变车轮转速和整车速度。如果在Simulink里直接连这个环就会出现代数环这在第4节会说。3.3 垂直载荷转移把整车和轮胎耦合起来的关键魔术公式需要每个轮胎当前的垂直载荷 (F_z)而 (F_z) 由静载加上动态载荷转移决定。四个轮的静载很容易前轴两轮各承担 (m g b / (2L))后轴两轮各承担 (m g a / (2L))。动态载荷转移分纵向和侧向两部分。纵向加速度会让前后轴之间转移载荷加速时后轴增载、前轴减载[ \Delta F_{z,f} -m a_x \frac{h}{L} ][ \Delta F_{z,r} m a_x \frac{h}{L} ]侧向加速度则让左右轮之间转移载荷。前轴的侧向载荷转移量约等于[ \Delta F_{z,lat,f} -m a_y \frac{h}{t_f} \frac{b}{L} ]后轴的侧向载荷转移量约等于[ \Delta F_{z,lat,r} -m a_y \frac{h}{t_r} \frac{a}{L} ]这里的 (a_x, a_y) 是车身坐标系下的纵向和侧向加速度由3.1节的方程直接算出。把静载和两类转移叠加就得到每个轮胎的 (F_z)。注意一个物理事实左转时(a_y0)左侧车轮减载、右侧车轮增载魔术公式里左右轮侧向力峰值不一致这直接导致整车出现不足/过度转向趋势的变化也是七自由度模型能捕捉到动态载荷转移对稳定性的影响的根本原因。4. Simulink落地模块划分、数据流与代数环4.1 顶层架构六个模块各司其职Simulink里的模型我建议按信号流拆成几个清晰子系统而不是把所有方程塞进一个巨大的MATLAB Function里。拆开的好处是调试时能直接看中间物理量比如某个轮子的垂直载荷、侧偏角到底是多少一眼定位问题。顶层架构大致如下输入模块前轮转角 (\delta) 和四个轮的驱动/制动转矩向量整车运动学子系统由轮胎力和力矩积分得到 (u, v, r)车轮运动学子系统由轮胎纵向力和驱动/制动转矩积分得到四个 (\omega)运动学计算子系统由整车状态计算每个车轮的 (V_{xw}, V_{yw}, \alpha, \kappa)载荷计算子系统由加速度计算四个 (F_z)轮胎力子系统用魔术公式计算四个轮的 (F_x, F_y)轮胎力子系统在具体落地时可以写成一个MATLAB Function内部用结构体传参数。下面是一个核心计算的片段相当于模板可以直接抄function [Fx, Fy] magic_force(alpha, kappa, Fz, p) % p为参数结构体字段命名与m文件一一对应 % 纵向力 Dx p.b1 * Fz^2 p.b2 * Fz; BCDx p.b3 * Fz^2 p.b4 * Fz; Cx p.b0; Bx BCDx / (Cx * Dx); Ex p.b6 * Fz^2 p.b7 * Fz p.b8; x_k kappa (p.b9 * Fz p.b10); Fx Dx * sin(Cx * atan(Bx * x_k - Ex * (Bx * x_k - atan(Bx * x_k)))) ... (p.b11 * Fz p.b12); % 侧向力 Dy p.a1 * Fz^2 p.a2 * Fz; BCDy p.a3 * sin(2 * atan(Fz / p.a4)); Cy p.a0; By BCDy / (Cy * Dy); Ey p.a6 * Fz^2 p.a7 * Fz p.a8; x_a alpha (p.a9 * Fz p.a10); Fy Dy * sin(Cy * atan(By * x_a - Ey * (By * x_a - atan(By * x_a)))) ... (p.a11 * Fz p.a12); end四个车轮可以复制四份这个Function各自输入自己的 (\alpha, \kappa, F_z)。虽然代码有冗余但胜在清晰后面改成独立查表或者加入轮荷差异也方便。4.2 求解器设置与单位一致性仿真参数建议用固定步长求解器选ode4四阶龙格库塔步长1毫秒。魔术公式在轮胎力进入非线性区后曲线斜率变化很快太大的步长会让固定步长积分产生明显误差甚至数值震荡。我做过步长敏感性测试同样的双移线工况5毫秒步长和1毫秒步长结果差3%到5%而1毫秒和0.5毫秒只差不到0.5%。单位一致性也要提前定死质量用kg、长度用m、力用N、角度用rad。尤其是角度很多人习惯用deg但魔术公式里所有角度输入必须是rad不然 (B) 参数的数值会差57倍出来的力完全不对。4.3 代数环的成因与三种应对方案搭建过程中最经典的坑就是代数环。它的来源在3.3节已经暴露出来了垂直载荷 (F_z) 依赖纵向加速度 (a_x) 和侧向加速度 (a_y)而 (a_x, a_y) 又依赖轮胎力轮胎力又依赖 (F_z)。在Simulink里如果直接把 (F_z) 信号连进轮胎模块、轮胎力再连回车身方程就会形成一个没有状态延迟的环求解器不得不迭代求解轻则拖慢速度重则报“cannot solve algebraic loop”。我的处理方案有三个按推荐程度排序第一种是“延迟一拍法”在载荷计算子系统的加速度输入处加一个Unit Delay或Memory模块让当前时刻的 (F_z) 由上一仿真步长的加速度计算。在1毫秒固定步长下这个延迟带来的误差完全可以忽略但代数环被彻底打断。这是我在工程模型中用得最多、也最稳的办法。第二种是“重写方程法”把加速度表达式代入载荷转移公式经过整理后让代数环变量显式化。这个方法在纯线性轮胎下可行魔术公式那种强非线性下推导非常繁琐不推荐。第三种是开启Simulink的代数环求解器理论上能处理但在轮胎模块这种带查表和强非线性的路径里经常不收敛仿真速度也可能骤降我只在临时调试时用过。4.4 低速除零与数值保护还有一个必须处理的问题是低速度保护。侧偏角计算里 (V_{xw}) 在分母上纵向滑移率里 (V_{xw}) 也在分母上车辆起步或刹停瞬间 (V_{xw}) 接近零直接除会得到无穷大紧接着模型就浮点溢出了。工程上常见的办法是给分母加一个很小的正值 (V_{min})比如0.1 m/s并让滑移率在速度低于这个值时直接输出0。实际测试中这个保护对仿真结果影响很小但能彻底避免起步阶段莫名其妙的炸模型。5. 调试图鉴三个让我查了很久的问题5.1 角阶跃工况横摆角速度系统性偏低有一次做前轮角阶跃输入仿真前轮转角给到3度、车速80 km/h理论上稳态横摆角速度应该有大概8.5 deg/s但模型跑出来只有7 deg/s左右低了快两成。一开始怀疑是魔术公式参数标定不对后来把所有中间量都拉出来看才发现前轮侧偏角公式里 (v a r) 的符号在处理 (\delta) 旋转时出错了绕质心的速度分量 (v a r) 需要投影到车轮坐标系我当时忽略了 (-u \sin\delta) 这项导致侧偏角被高估轮胎始终工作在更饱和的区段侧向力偏小横摆角速度自然偏低。排查思路是先把模型线性化把魔术公式在小侧偏角下近似成线性轮胎 (F_y C_\alpha \alpha)用二自由度自行车模型的稳态横摆角速度增益公式做对照[ \frac{r}{\delta} \frac{u}{L (1 K u^2)} ]其中不足转向梯度 (K \frac{m}{L^2}\left( \frac{a}{C_{\alpha,r}} - \frac{b}{C_{\alpha,f}} \right))。当魔术公式在小角度下的切线刚度与线性轮胎一致时两个模型在2度以下小转角工况结果应该重合。这一步对照直接暴露了侧偏角计算的问题。5.2 联合工况下纵向力符号反了另一次做制动转向联合工况本意是验证车辆在弯道中制动时是否有向外侧摆出的趋势结果仿真显示车辆反而向弯道内侧“拉”过去物理方向完全不对。排查了很久最终发现是轮胎坐标系里纵向力正方向的定义和车身坐标变换没对齐。魔术公式在制动工况(\kappa0)下输出的 (F_x) 是负值表示制动力向后但我在前轮坐标变换里直接用了 (F_x \cos\delta - F_y \sin\delta)没有意识到自己的 (F_x) 正方向定义已经是“向前为正”再乘上负的 (\kappa) 倒是没问题。真正出问题的环节是把轮胎力从“轮胎坐标系”转换到“车身坐标系”时(\delta) 的正方向定义搞反了。修正之后联合工况的横摆响应立刻正常了。从那之后我养成一个习惯所有信号总线里都带单位并且在总线上标注是“车身坐标”还是“轮胎坐标”减少这种低级但隐蔽的符号事故。5.3 大侧向加速度时台架没炸模型先炸了蛇形绕桩工况里侧向加速度到了0.8g左右时模型突然发散整车横摆角速度直接飞到天上。刚开始以为是数值积分不稳定把步长从1毫秒降到0.25毫秒还是炸。后来把中间变量打印出来发现 (F_z) 在某些瞬间已经落到300 N以下这时魔术公式里 (D a_1 F_z^2 a_2 F_z) 几乎为零而 (BCD) 的近似公式对极小载荷的外推行为非常差导致 (B) 变成很大的数曲线形状变得极其陡峭轮胎力在一个步长内剧烈跳变最后把积分器冲垮了。解决办法有两层第一层是对 (F_z) 做限幅保证输入的垂直载荷不低于某个下限比如300 N第二层是对 (BCD) 的计算结果做最小值保护防止除出极端大的 (B)。加了这两层之后再怎么跑极限工况模型都能稳住。这其实反映了魔术公式的一个已知缺点——它是一个面向拟合范围内的插值型公式外推特性并不保证合理使用前一定要做边界保护。6. 模型验证思路与后续可以怎么扩展6.1 最低成本的验证路径线性退化对比法模型搭完之后验证必须做不然你根本不知道它到底是“对”还是“看起来对”。我的最低成本验证流程分四步。第一步做静态自检把所有输入置零整车直线匀速行驶各状态应该保持不变。这一步能查出一堆初始化错误。第二步做对称性检查左转与右转、左轮与右轮载荷交换结果应该镜像对称。如果左右不对称多半是某个轮位左右搞反。第三步做线性退化对比在2度以下小转角、低侧向加速度工况下把魔术公式的切线刚度代入二自由度解析公式和七自由度模型输出对比。两者差在5%以内说明整车方程和坐标变换基本没大毛病。第四步再上标准工况ISO 7401的阶跃转向、ISO 3888的双移线跟同参数的CarSim模型或实测数据对标。如果对标偏差大优先检查轮胎参数和载荷转移系数而不是急着改整车方程。6.2 从七自由度出发的扩展方向这套模型的可扩展性很强。对转向手感类研究可以在魔术公式里加入回正力矩 (M_z) 的输出项Pacejka公式的扩展形式支持这个对ABS/TCS开发可以给每个轮子加上独立制动压力模型把 (T_{b,i}) 换成制动器动力学对ESC开发可以加一个简单侧倾自由度让外侧轮载荷更真实还能输出侧倾角信号如果你需要跟外部软件数据交互Simulink里可以直接导出FMU模型供其他车辆仿真环境调用跟CarSim联合仿真做控制器快速验证也是常见用法七自由度模型可以当作被控对象的快速原型CarSim负责高精度验证。我在实际使用中的体会是这套模型最大的价值不是“精度高”而是“快且可控”。它把所有物理量都放在眼前想改哪个参数就改哪个参数改完立刻能看到结果这对前期算法迭代来说比多几万块钱的仿真软件更顺手。等算法基本定型了再上高保真软件做最终验证效率和可靠性两头都占到。
返回列表