
前两年做操稳性能对标项目我最初图省事直接用线性轮胎模型搭了一套Simulink整车模型。结果双移线工况推出来的横摆角速度响应跟试验数据对不上侧向加速度峰值差了将近20%。后来把轮胎换成魔术公式轮胎模型重新拟合参数、搭子系统、做联合仿真整套曲线才拉回来。那次之后我就把Simulink里搭建魔术公式轮胎模型的完整流程沉淀了下来从公式原理、三种建模实现路径的取舍到纵向、侧向、综合滑移工况的处理再到参数辨识和与Carsim联合仿真验证。这篇文章就是给那些同样在车辆动力学仿真里被轮胎模型折磨的同学一份能直接照着落地的工作笔记。1. 为什么选魔术公式从一次对不上试验的操稳仿真说起1.1 整车仿真里轮胎是唯一创收的力源做底盘控制算法或者整车操稳仿真的朋友应该都有同感一台车不管车身建模得多精细悬架KC特性标定得多准最后所有力都得通过轮胎接地点传出去。车辆加速要靠轮胎纵向力过弯要靠轮胎侧向力制动距离、横摆响应、侧偏特性全部由轮胎的附着状态决定。轮胎模型精度不够整车仿真的可信度就是空中楼阁。我那次翻车就是典型的反面案例。当时用的线性模型里侧偏刚度按常数给认为侧偏角小的时候勉强可用。但操稳仿真一进到极限工况比如双移线避障、蛇行绕桩轮胎早就进入非线性区侧向力随侧偏角增大出现饱和线性模型完全表达不出这种力先增大后回落的特性。仿真结果是横摆角速度发飘、方向盘转角响应滞后怎么调PID都救不回来。后来我把轮胎模型换成魔术公式同样的整车框架、同样的驾驶员模型曲线一下子就对上了。那次经历让我彻底明白轮胎模型的复杂度不是锦上添花而是整车级仿真能否反映真实物理过程的基本前提。1.2 主流轮胎模型横评与选型逻辑在做选型之前我先梳理过市面上常用的几类轮胎模型大家可以根据自己的应用场景对号入座。模型类别表达能力计算量适用场景局限线性轮胎模型只覆盖小侧偏角线性区极低经典车辆动力学理论推导、线性控制设计无法进入极限工况Dugoff模型有纵向/侧向耦合的简化表达低控制算法快速验证无法精确拟合试验曲线UA模型基于刷子理论半经验中需要一定物理外推时参数解释性较弱魔术公式MF高精度拟合试验数据中低操稳仿真、ABS/TCS开发、整车级实时仿真对参数数据质量依赖高FTire等柔性环模型高频、高精度高NVH、路面冲击参数多辨识成本高我的结论很直接做整车级操纵稳定性、底盘控制算法开发魔术公式是精度和计算量的最优平衡点。它本质上是经验模型把轮胎的力特性通过一组带明确物理含义的参数拟合出来既能反映非线性饱和又不至于像柔性环模型那样动辄上百个参数Simulink里跑实时仿真毫无压力。2. 魔术公式的数学骨架B、C、D、E四旋钮如何控制曲线2.1 一个公式通吃三个方向的由来魔术公式最早是Pacejka等人在上世纪80年代末提出的核心思路很有意思用一个统一的三角函数表达式分别描述纵向力、侧向力、回正力矩与滑移率/侧偏角的关系。以纵向力为例纯滑移工况下的表达式是Fx D·sin(C·arctan(B·s − E·(B·s − arctan(B·s)))) Sv其中s是纵向滑移率定义是驱动时(ω·R − Vx)/Vx制动时可能取不同定义但要保持一致性。Sv是垂直力偏移通常处理滚动阻力或残余力。我最初看到这个公式的时候觉得挺玄乎但后来理解了一个关键点反正切函数天然自带先近似线性、后趋向饱和的形状外层再套一个正弦函数通过改变参数就可以压出各种各样的轮胎力曲线。这就是它为什么能用一个表达式同时拟合纵向力、侧向力的原因——反正切配正弦的组合表达能力足够强。2.2 四个因子的几何意义与载荷依赖魔术公式里最核心的四根旋钮是B、C、D、E理解清楚它们对调参至关重要。因子名称几何意义对曲线的影响D峰值因子决定曲线峰值直观对应最大附着系数下的峰值力C形状因子决定曲线整体形状接近正弦程度控制峰值的宽窄B刚度因子与原点斜率相关B·C·D就是原点斜率即纵向刚度E曲率因子决定峰值附近的曲率控制从线性区到饱和区过渡的陡缓这里最容易踩的一个坑是这四个因子通常不是常数而是随垂直载荷Fz变化的。比如D随Fz基本呈抛物增长但有饱和趋势原点斜率B·C·D也随Fz增大而增大。完整的PAC2002参数表里每个系数都带载荷多项式我实战中用到的典型数值是某B级车前轮在Fz4000N左右时纵向力的D大约在4500~5500NC取1.65附近B约10~13E约0.3~0.6。侧向力的C通常在1.3左右E可能是负值要注意不要按纵向的参数习惯去猜。所以在Simulink里建模时我建议把四个因子都先表达成Fz的函数再代入主公式而不是图省事把四个因子设成固定常数。固定常数的模型载荷一变就失真后面做制动转向联合工况时误差会特别明显。2.3 侧向力与回正力矩公式换汤不换药但系数要重标定侧向力的表达式和纵向力长得几乎一样只是自变量从滑移率s换成了侧偏角αFy D·sin(C·arctan(B·α − E·(B·α − arctan(B·α)))) Sv但同一套字母系数含义和数值完全不同。侧向工况通常还要考虑水平偏移Sh和垂直偏移Sv因为轮胎本身有锥度、帘布层转向效应导致侧偏角为零时侧向力不一定为零。这类偏移项在赛车轮胎上尤其明显民用车会小一些。回正力矩Mz也是用同构公式只是形状更复杂。我的建议是如果刚起步做轮胎模型第一版可以先不管Mz用简化方式估算或直接置零先把纵向、侧向力做准。等把Fx、Fy调通、再往整车模型集成那时候再回头加Mz否则一上来就要拟合三组公式参数辨识工作量会把你劝退。3. Simulink里落地从函数到可复用封装子系统3.1 三种实现路径的取舍在Simulink里实现魔术公式我见过三种主流做法各有适用场景。实现方式优点缺点适合场景Fcn模块直接写表达式搭建快模型简单多输入表达式需要拼向量易写错不支持复杂分支快速验证纯工况MATLAB Function模块可写完整m函数支持分支、循环、代码生成编译慢一点调试稍麻烦正规工程模型推荐Lookup Table查表不需拟合公式直接插值试验数据数据颗粒度不够时插值结果不平滑有大量实测台架数据时我自己主力用的是MATLAB Function模块。一方面是因为参数多、公式长Fcn模块的字符串解析写着实在太痛苦另一方面是MATLAB Function天然兼容Embedded Coder后面做C代码生成、硬件在环时不至于推倒重来。3.2 MATLAB Function实现关键代码下面给一个可以抄作业的代码框架包含纵向力和侧向力的纯工况计算。我用的是简化PAC89风格参数常量可以后续替换成Fz的多项式函数。function [Fx, Fy] MF_Tire(Fz, kappa, alpha) % 魔术公式轮胎模型简化实现纯工况 % Fz: 垂直载荷(单位N) % kappa: 纵向滑移率(无因次驱动为正) % alpha: 侧偏角(单位deg使用前转弧度) alpha_rad alpha * pi / 180; % 纵向力参数示例某205/55R16型轿车胎 Dx 1.15 * Fz; % 峰值因子随Fz线性近似 Cx 1.65; % 形状因子 BCDx 0.28 * Fz; % 原点刚度N/滑移率单位 Bx BCDx / (Cx * Dx); % 刚度因子反算 Ex 0.55; % 曲率因子 % 纵向力公式 Fx Dx * sin(Cx * atan(Bx * kappa - Ex * (Bx * kappa - atan(Bx * kappa)))); % 侧向力参数示例 Dy 1.12 * Fz; Cy 1.30; BCDy 0.09 * Fz; % 侧偏刚度( N/deg )注意角度单位 By BCDy / (Cy * Dy); Ey -0.25; % 侧向E一般取负曲线峰值后回落更明显 % 侧向力公式角度用弧度 Fy Dy * sin(Cy * atan(By * alpha_rad - Ey * (By * alpha_rad - atan(By * alpha_rad)))); end这段代码里藏了两个我在实际项目中反复强调的细节。第一侧偏刚度的单位。轮胎厂家给的侧偏刚度很多是N/deg我习惯保留这个单位去算B但公式里sin/atan的自变量必须用弧度所以入口要把alpha转成rad。单位不统一是Simulink里曲线一开始完全变形的最常见原因。第二B不直接设参数而是通过B·C·D反算。这样做的原因是你手头能查到的数据往往是原点斜率或者侧偏刚度而不是孤立的B值。直接给B然后指望凑出正确刚度效率太低了。3.3 子系统封装和信号防呆代码写好之后我会在Simulink里创建一个子系统把MATLAB Function放进去然后做Mask封装。输入接口做成三个Fz、kappa、alpha输出两个Fx、Fy。封装的好处是整车模型里其他模块看到的是一个干净的轮胎组件双击可以填参数、换参数组而不是面对一大团连线和公式。我在做多工况仿真时会提前准备好Set1、Set2、Set3三组参数通过Mask参数切换方便做干湿路面、不同载荷的对照试验。信号集这块我强烈建议用Bus信号做整车集成。把轮胎的力输出定义成Bus后续接到车身模型、悬架模型时接口字段一目了然比徒手拉一根根信号线清晰得多。另外MATLAB Function里所有输入输出都要显式声明类型避免仿真过程中出现隐式类型转换导致的数据抖动。防除零也是仿真实战里必须处理的点。滑移率的计算会除Vx车辆起步瞬间Vx接近零直接把0放进去会出现-inf或者NaN仿真直接发散。我一般在除之前加一个下限保护Vx max(0.1, Vx_measured); % 车速下限保护单位m/s kappa (wheel_speed * Re - Vx) / Vx;4. 综合滑移工况为什么不能把纯工况结果简单叠加4.1 附着椭圆纵向力吃掉一部分附着余量很多刚开始做轮胎模型的人会下意识以为综合工况就是纵向力按纯纵向算侧向力按纯侧向算然后直接叠加。这个想法在物理上不成立。轮胎与地面的附着能力是有限的可以想象成一个椭圆包络纵向力占用的附着多侧向能用的余量就少反过来刹车过弯时车速越高侧向力越大能施加的制动力就越小。这正是所谓摩擦圆或附着椭圆的本质。制动力分配策略、弯道ABS策略都建立在这个耦合关系之上轮胎模型如果不反映这一点后面做纵向-侧向联合控制策略开发时完全不可用。4.2 G函数加权法用余弦加权把纯工况力打折Pacejka模型处理综合工况的核心思路不是重新拟合一整张二维曲面而是在纯工况结果上乘一个衰减因子也就是G函数。基本形式是Fx Fx0 · Gxα(α)Fy Fy0 · Gyκ(κ)这里的G函数通常也是魔术公式结构比如Gxα cos(Cxα · atan(Bxα · α))Gyκ cos(Cyκ · atan(Byκ · κ))我特意选这个结构是有原因的当自变量为0时atan(0)0cos(0)1G函数恰好等于1也就是说纯工况的力完全不变当侧偏角或滑移率逐渐增大时G函数从1开始单调下降相当于按比例削弱纯工况力。这个巧妙的性质让综合模型在低速小侧偏时能平滑退化为纯工况模型。实际PAC2002里面的G函数更复杂一些分母里会多出归一化项但原理完全一致。我在工程模型里常用简化版参数少、代码清爽只要数据范围不跑到太极端的地方精度完全够用。4.3 综合工况仿真发散的三个常见原因把G函数加进去之后仿真发散的概率一下子就上来了我总结三个高频翻车点。第一G函数出现负值。cos(C·atan(B·x))在自变量很大的时候是有可能穿越零点的一旦G变成负值轮胎力方向反了整车模型立刻震荡。解决办法是加边界保护把G限制在0到1之间Gx max(0, cos(Cxa * atan(Bxa * alpha_rad)));第二滑移率定义切换引起的跳变。驱动和制动工况的滑移率定义不同如果不统一处理模型在油门松踩切换的时候力会跳变。我的做法是统一用一版定义并在模块内部做平滑过渡。第三固定步长仿真时步长太大。综合工况两个G函数叠加上去曲线梯度比纯工况陡步长一大会漏掉峰值点。我把固定步长从1ms改到0.5ms后模型震荡立刻缓解。实时性允许的情况下尽量先加密步长验证模型稳定性再逐步放宽。5. 参数从哪来数据集、辨识流程与拟合避坑5.1 参数获取渠道很多同学卡在公式我懂了但参数去哪找。市面上轮胎模型的参数来源大概有四条路径轮胎制造商提供的试验数据或MF参数文件这是精度最高的来源。Carsim、Adams等商业软件自带的轮胎参数示例文件比如扩展名为tir的PAC2002参数文件可以直接读出来参考但注意版权和使用边界。Pacejka专著《Tyre and Vehicle Dynamics》附录中公开的参数表适合起步验证模型。自己搭胎架试验或用高精度轮胎模型生成虚拟试验数据再反向辨识。我自己做预研的时候用的是第三条路径先确保模型框架没问题再等有台架数据后进实验室精修。5.2 先粗后精的四步辨识流程拿到一堆试验散点数据后不要直接扔给优化算法硬啃。魔术公式参数辨识最稳的是分步走每步只解少量未知数。第一步估算D。直接取试验曲线峰值附近的值峰值力除以对应载荷就是D的初值。第二步估算BCD。看原点附近曲线的斜率B·C·D就是这个斜率所以B 斜率/(C·D)。第三步估算C和E。C通常在一个窄区间里波动纵向约1.65侧向约1.30E决定曲线回落趋势可以先用手调几个值看趋势。第四步把前三步的结果当作初始值用非线性最小二乘整体优化。我用lsqcurvefit做过一个最小二乘辨识的例子代码思路如下% x [B, C, D, E] fun (x, s) x(3) * sin(x(2) * atan(x(1) * s - x(4) * (x(1) * s - atan(x(1) * s)))); x0 [12, 1.65, 4800, 0.5]; % 初始值 lb [5, 1.0, 1000, -1]; % 下界 ub [30, 2.0, 9000, 2]; % 上界 x_opt lsqcurvefit(fun, x0, s_data, Fx_data, lb, ub);这里务必注意一定要给参数设置合理的上下界。魔术公式这套函数存在多个局部最优解不给约束直接优化很容易收敛到一个错误谷底。5.3 拟合中最容易翻车的三个细节第一量纲。Fz你用N还是kNα你用deg还是rad力你用N还是kN差一个数量级整个优化结果全错。我的习惯是内部统一SI单位N、m、rad只在与外部接口交互时做单位换算。第二数据覆盖不足。如果只有小侧偏角数据拟合出的E毫无意义外推到大侧偏时曲线随便飞。一定要确保试验数据覆盖你要仿真的全部工况范围尤其是饱和段。第三初值离谱。lsqcurvefit这类算法对初值很敏感别指望黑箱自动收敛。我是按照峰值估D-斜率估B-经验定C-调试定E的顺序手动粗调一轮再交给优化算法精修收敛速度快且结果物理上更合理。6. 把轮胎模型接进整车控制器联合仿真、外部模式与代码生成6.1 整车信号流与代数环处理轮胎模型在整车模型里处于信号流的中游从车辆运动状态计算出滑移率和侧偏角喂给轮胎模型得到Fx、Fy再反馈给车身模型更新加速度和速度。即Vx、Vy、ω → κ、α → 轮胎力Fx、Fy → 整车加速度 → 速度积分 → 再回到滑移率计算这个回路意味着存在代数环。如果直接用硬反馈连接Simulink在每个步长内都要迭代求解模型一复杂就容易收敛慢甚至报错。我的工程化做法是在反馈路径上加一个Memory模块或者Unit Delay把轮胎力反馈延迟一拍。只要步长足够小延迟一拍引入的误差完全可以忽略但模型稳定性和编译速度大幅提升。6.2 与Carsim联合仿真的两个套路Carsim和Simulink联合仿真是车辆动力学开发中非常经典的配置。和Carsim联合时我用过两种不同的套路。第一种Carsim作为车辆环境提供车身运动状态和车轮转速把魔术公式轮胎模型放在Simulink侧计算轮胎力然后再把力返回给Carsim更新车辆运动。这种方法可以把自研轮胎模型嵌入到成熟的整车动力学环境中适合做轮胎参数影响研究。第二种Carsim本身的虚拟轮胎作为高精度参考模型Simulink侧同时运行我的魔术公式模型两者在相同工况下做对比验证。这是一种非常好的模型确认方式能直观看到简化模型与商业精细模型的偏差做到心里有底。联调过程中最容易出问题的就是接口变量命名和单位不匹配。我自己的习惯是先在Carsim的I/O通道列表里把输出输入变量全部导出成CSV对照表确认单位、符号方向、更新频率之后再在Simulink里建Bus信号这样能省掉大半天的联调时间。6.3 外部模式与C代码生成的工程化注意点做控制算法开发的同学还会用到Simulink外部模式模型跑在目标机或快速原型硬件上通过外部模式通信在宿主机实时调参。魔术公式轮胎模型的B、C、D、E非常适合作为可调参数这样在实车测试或硬件在环时可以不停机地调整轮胎特性观察整车响应。再说C代码生成。Embedded Coder可以把MATLAB Function代码生成C代码烧进控制器里做实时仿真。但有几个写法禁忌不能用eval这类动态执行函数不能使用可变大小数组尽量避免persistent变量在多任务环境下的污染。我有一段代码就是因为用了可变数组代码生成阶段直接报错后来改成固定大小数组才编译通过。如果一开始就注意这些限制MATLAB Function模块的代码生成体验是非常顺滑的。最后再分享一个小技巧。在做多工况轮胎参数切换时用Simulink的Bus对象配合参数组结构体可以避免模型里到处是手工常量。把每一组轮胎参数定义成一个结构体数组通过Mask参数选择索引模型内部自动切换UI干净仿真失控的概率也小很多。这套工作流我前前后后用了几年稳定性和可维护性都经得起考验希望对正在啃轮胎模型的你也有帮助。