ARTICLE DETAIL

资讯详情

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

基于CarSim数据的魔术公式轮胎纵向力参数拟合实战

基于CarSim数据的魔术公式轮胎纵向力参数拟合实战 前年冬天我帮一个团队做轮胎数据分析对方给了一堆CarSim离线仿真结果目标很明确把魔术公式轮胎模型的纵向力参数拟合出来塞进他们自建的Simulink模型里做纵向控制开发。听起来就是个lsqcurvefit能收尾的小任务结果实际折腾了快一周才搞定。真正卡住人的从来不是“调用工具箱”那一步而是几个藏在细节里的硬骨头CarSim里导出的滑移率符号跟魔术公式的坐标系对不对得上一组看起来完美的拟合参数为什么换个载荷工况就崩初值稍微给偏一点优化器怎么就能飞得连曲线轮廓都看不出来。这篇文章就把这套流程从头到尾写一遍。内容按数据来源与清洗、魔术公式纵向力公式拆解、MATLAB参数辨识实现、常见翻车点、验证闭环来组织适合正在做车辆动力学仿真、CarSim与Simulink联合仿真的研究生和工程师参考。代码、初值估算表、边界设置、加权策略我都会给出来尽量让我当时踩过的坑你不必再踩一遍。1. 拆解魔术公式拟合纵向力到底是在拟合什么1.1 纵向力Pacejka公式与参数含义魔术公式的“魔术”在于一个简单三角函数层层嵌套几个参数就能覆盖轮胎在稳定工况下的大部分受力特性。纯纵滑工况下最常用的是Pacejka 89/94形式的纵向力表达式Fx0 Dx·sin(Cx·arctan(Bx·κx - Ex·(Bx·κx - arctan(Bx·κx)))) Svx其中 κx κ Shx。这里每个参数都有明确的物理角色不是说凑一个拟合优度就完事的Dx峰值因子决定曲线最大绝对值。物理上基本对应“当前路面附着系数 × 垂向载荷”也就是纵向力峰值。Dx到最大值时对应的滑移率位置由Bx和Cx共同决定。Bx刚度因子决定原点附近的斜率。原点处曲线的切线斜率约等于Bx·Cx·Dx所以Bx直接反映轮胎纵向刚度。这个参数对ABS、TCS控制最重要因为大部分控制工况都发生在小滑移区。Cx形状因子决定曲线像sin还是更像方波一般取值1.2~2.2。纵向力拟合里你不去主动识别它也能凑合但固定Cx1.65左右会让其他参数的辨识稳定性大幅提升。Ex曲率因子修正峰值附近的回落形态。Ex越大曲线过峰后下降越明显Ex接近1时峰后区域会变得比较“塌”。Shx水平偏移曲线在滑移率轴上的漂移。正常轮胎纯纵滑工况下应该接近0如果拟合出来很大先别高兴大概率是数据坐标系或者滑移率定义出了偏差。Svx垂直偏移曲线在力轴上的平移。同样应该接近0出现大偏移时要检查数据是不是混入了滚动阻力或者其他系统性偏差。看公式会以为参数之间相互独立实际拟合中它们高度耦合。Bx、Cx、Dx三者的乘积固定时原点斜率就被钉死了此时单独调大Bx、调小Dx也能得到差不多的曲线前段。这说明“数值上收敛”和“参数物理上可辨识”是两码事后面我会专门展开。1.2 CarSim输出的纵向数据适用边界CarSim的轮胎模型内部远比这套简化Pacejka公式复杂包含松弛长度、瞬态效应、复合滑移、载荷变化等机制。我们拿CarSim数据来拟合魔术公式本质上是用简化模型去逼近复杂模型的稳态输出。因此首先得明确适用范围边界纯纵滑工况。拟合纵向力时侧偏角尽量保持为0或很小不要混入带明显转向的 maneuver 数据。如果硬把侧偏工况数据也丢进去拟合出来的纵向参数会被侧向力耦合污染。稳态或者准稳态。轮胎松弛长度带来的瞬态滞后不是B、C、D、E这几个参数能表达的。用瞬态数据拟合出来的参数往往把滞后效应也吸收进去了换一个工况就发散。有限滑移率区间。如果数据只覆盖到滑移率0.1那么峰值因子Dx实际上是不可辨识的。此时强行拟合出的Dx只是外推值几乎不具备物理意义。这个约束条件决定了你必须专门设计CarSim仿真工况来覆盖足够宽的滑移率范围。垂向载荷分组处理。不同Fz下轮胎力学特性完全不同把所有载荷数据混在一起拟合得到的是某种“平均轮胎”而不是真实轮胎。1.3 为什么不建议一次性拟合全部工况域我见过很多初学者拿到CarSim一长串时间序列数据kappa从0到0.8都有Fx从几百牛到几千牛都有Fz还在不停波动然后直接一把梭丢进lsqcurvefit搞出一套B、C、D、E。这种做法的结果是拟合优度可能不差但参数组合完全没有可解释性换个输入工况就崩。正确打开方式应该是先把数据按垂向载荷分成若干组比如1000N、3000N、5000N、8000N。每个载荷组单独拟合一套B、C、D、E。观察各个参数随Fz的变化趋势是否平滑尤其是Dx随Fz是否近似线性上涨。后续如果需要统一模型再对参数做Fz依赖关系的多项式拟合而不是一开始就直接拟合“全工况大杂烩”。2. 先把CarSim里的轮胎数据变成“能喂给算法”的样子2.1 仿真工况怎么设滑移率覆盖范围是硬指标我在实际操作中推荐两种方式获取纯纵向轮胎数据。第一种是整车直行制动/驱动阶跃工况。车辆直线行驶通过CarSim的驾驶员模型或者外部输入给一个固定的制动主缸压力或驱动扭矩阶跃。每一个阶跃对应一个比较稳定的滑移率区间等待轮胎力稳定后再采集数据段。第二种是CarSim的轮胎测试台模式。如果版本支持直接把车轮放在测试台上对轮心施加固定转速差垂向载荷设成恒定值。这种方式最干净能精确控制Fz和滑移率可惜不是每个用户都有这个模块。不论用哪种方式我强烈建议按下面这个套路来固定3到5个垂向载荷例如1000N、3000N、5000N、8000N。每个载荷下做6到10次不同强度的制动阶跃让稳态滑移率分别覆盖0.05、0.1、0.15、0.2、0.4、0.6、0.8这些点位。每个阶跃事件中等轮胎力进入平稳段后截取2~5秒数据求平均得到一个kappa, Fx, Fz的代表性数据点。采样频率不用太高稳态平均完全不需要1000Hz那种高速率50~100Hz足够。这样处理得到的数据点噪声极小拟合曲线时干净利落。反之如果你把一段连续长斜坡制动的所有原始采样点都丢给优化器那不是拟合是给自己找麻烦。2.2 导哪个通道、如何对齐时间和单位CarSim的输出通道里轮胎力相关变量一般是这种风格Fx_L1、Fz_L1表示左前轮纵向力、垂向力滑移率可能是KAPPA或KAPPA_L1具体命名随软件版本略有差异。导出时注意把时间戳一并导出否则后续在MATLAB里对齐会很痛苦。两个特别容易出错的地方单位问题CarSim默认国际单位制时力是N但有些老模型或者导入过英制参数力会变成lb。拟合前务必确认Fx量纲不然Bx初值会差一个数量级。时间同步如果同时导出多个通道不同通道可能采用不同的写入间隔。进入MATLAB后先用t做主键对kappa和Fx做interp1统一到同一时间基准再做清洗和截取。我个人习惯把CarSim导出的整个数据集存成一个结构体第一列时间戳第二列车速第三列滑移率第四列纵向力第五列垂向力后续所有处理都围绕这个结构体进行不容易乱。2.3 数据清洗与稳态截取这个环节看似简单实际翻车率非常高。四个最典型的坑第一开始段的瞬态数据要扔掉。每个阶跃事件刚开始的0.2~0.5秒内轮胎处于松弛动力学过渡状态Fx和kappa之间不是一一对应关系。用这些点拟合曲线会被人为拉出滞回环。第二数据噪声。可以先用MATLAB的smooth函数做移动平均或者设计一个截止频率10~20Hz的低通滤波器。采样率100Hz时滑动窗口取10个点就够了。注意不要过度滤波否则峰值会被削掉Dx会偏小。第三离群点。仿真数据理论上没有传感器噪声但数值求解在极限工况下会产生个别跳点。手动剔除耗时我习惯用中位数滤波法某个点偏离邻域中位数超过5%就删掉。第四符号方向。这一点放到第4章细说但清洗阶段可以先做一个快速检查——把小滑移区数据拿出来做线性拟合看斜率是正还是负。如果斜率符号跟你的物理直觉相反说明驱动/制动方向定义反了。3. MATLAB里跑通拟合目标函数怎么写、初值怎么猜、边界怎么给3.1 写成MATLAB函数六参数版魔术公式下面是简化后的纯纵向魔术公式函数。用六个参数实现基本形态足以覆盖绝大多数CarSim纵向力标定需求。function Fx paczek90_long(p, kappa, Fz) % 简易魔术公式纵向力 % p [B C D E SV SH] % Fz当前为垂向载荷本版本假设参数已按该载荷标定 B p(1); C p(2); D p(3); E p(4); SV p(5); SH p(6); kg kappa SH; % 水平偏移 arg B * kg; inside C * atan(arg - E .* (arg - atan(arg))); Fx D * sin(inside) SV; end这里没有把Fz写进公式内部因为你分组拟合时每个载荷组单独出一套参数。如果你希望做一个带Fz依赖的连续模型就需要把Dx构造成Fz的函数比如Dx mu·Fz那是后话。先跑通这版才有资格谈扩展。3.2 初值直接“读图”五步估出可用初值初值的重要性无论如何强调都不过分。非线性最小二乘对初值极度敏感尤其魔术公式这种嵌套三角函数给错一个数量级优化器直接发散到天际。我的做法是“看图说话”非常朴素但有效把清洗后的kappa, Fx散点图画出来。读曲线最高点绝对值作为Dx初值。比如3000N垂向载荷下峰值纵力大概3300ND03300。读原点附近斜率。取kappa在±0.02范围内的点线性回归得到斜率K。原点斜率约等于B·C·D所以B0 K / (C0·D0)。Cx先固定为1.65Ex取0.3~0.5之间任意值Sh和Sv取0。如果曲线明显不对称或者整体平移再让Sh、Sv参与拟合否则保持0约束。举个例子。假设3000N载荷工况下原点斜率拟合值为130000N/滑移率单位D03300C01.65那么B0 130000 / (1.65×3300) ≈ 23.9。初值向量就是[23.9, 1.65, 3300, 0.4, 0, 0]。初值不用精确量级对、符号对优化器通常就能收敛。反过来量级不对一切都是白搭。3.3 调用lsqcurvefit边界、选项、加权策略MATLAB的lsqcurvefit是最顺手的工具。我这里给一个实际可跑的示例流程针对一个垂向载荷组做拟合% 假设已经读取并清洗好数据 % ki 为该载荷组下的滑移率Fi 为纵向力 D0 max(abs(Fi)); k_small ki(abs(ki) 0.02); fx_small Fi(abs(ki) 0.02); K0 (fx_small(end) - fx_small(1)) / (k_small(end) - k_small(1)); B0 K0 / (1.65 * D0); p0 [B0, 1.65, D0, 0.4, 0, 0]; lb [1, 1.2, 100, 0, -100, -0.1]; ub [80, 2.2, 20000, 1.2, 100, 0.1]; options optimset(Display, off, ... MaxFunEvals, 30000, ... TolFun, 1e-8, ... TolX, 1e-10); w ones(size(ki)); w(abs(ki) 0.15) 3; % 小滑移区加权贴合ABS控制关注区 fcn_w (p, k) w .* paczek90_long(p, k, Fz_this); y_w w .* Fi; p_fit lsqcurvefit(fcn_w, p0, ki, y_w, lb, ub, options);注意lsqcurvefit不直接支持权重所以我把权重乘到目标函数和观测值两边实现等价加权最小二乘。权重3倍看似随意但在ABS/TCS控制器开发场景里小滑移区是最关键的工况区间。如果你更关心大滑移区的拟合精度就把权重的加法反过来这完全取决于你的应用场景。另外一个小技巧把力的单位从N换成kN再去拟合数值尺度更接近1能有效改善优化器的数值稳定性。你甚至可以把kd除以1000获得参数后最后还原。4. 拟合翻车现场符号打架、参数相关性、局部最优4.1 符号约定冲突最常见的“第一杀手”CarSim和Pacejka公式的符号约定经常不一致。有的地方正滑移率对应驱动工况有的地方对应制动工况纵向力同理。一旦符号反了拟合出来的Bx会是负的或者Shx、Svx出现特别大的偏移曲线形似但物理上完全错误。我的排查套路是在拟合前先做一个极简判断只取小滑移区数据|kappa|0.05画出来看看。如果曲线从左到右是单调上升且跨过原点说明符号方向大概是匹配的。如果曲线是单调下降果断把kappa或Fx中某一个乘上-1。如果曲线不过原点先查是不是混入了滚动阻力矩再查零位偏置。有一个更稳的判断办法以CarSim整车轮心速度Vx和轮胎有效半径Re、角速度ω来手工计算滑移率跟你导出通道里的KAPPA对比。公式有很多种定义方式常见的制动滑移率是κ(Vx-ω·Re)/Vx。如果CarSim内部换算逻辑跟你的手工计算结果差一个负号那说明导出通道里的符号定义跟你想的不一样。这类问题隐蔽在数据里不仔细看会一直以为是拟合算法的问题。真遇到时别急着调优化器先把数据本身的物理一致性管好。4.2 参数相关性为什么拟合“收敛了”参数却不可用魔术公式参数之间的相关性非常高这是它的固有结构决定的。比如同一个原点斜率可以是BCD乘积固定的多个组合峰值附近的曲率变化Cx和Ex会互相补偿。我在实践中遇到过非常典型的案例一组数据摆幅只到kappa0.15还没有到峰值优化器却声称收敛了残差也很小。一看结果Dx5000NEx1.15Cx1.35明显是在用E和C的配合硬拟合未饱和区Dx的置信区间跨了几千N。这种参数一旦用于联合仿真只要滑移率超过0.2纵向力预测会严重失真。对付相关性我的措施按优先级排序固定Cx1.65。纵向力曲线形状相对固定Cx在设计范围内波动有限固定它是性价比最高的选择。未覆盖峰值的工况不拟合Dx和Ex。如果数据没到峰值就让Dx固定在一个物理估计值上比如μ·Fz只用这个数据优化B和E。拟合完成后查看参数的置信区间。nlparci函数可以从残差和雅可比矩阵获得参数置信区间。如果某个参数的置信区间跨越0那它就不是可辨识的要么固定它要么补数据。用多组初值跑多次拟合。取“物理解最合理”而不是“残差最小”的那组结果。这个听起来反直觉但残差最优往往是参数补偿的结果不是物理真实。4.3 多解、局部最优与边界约束嵌套三角函数产生的目标函数非凸局部极小值点不止一个。同一个数据集初值不同可能收敛出好几组B、D、E组合残差差异不大但参数背离物理。应对方法跑一个初值网格。比如B0取[15, 25, 40]三档E0取[0.2, 0.4, 0.7]两档组合成6组初值分别拟合最后比较。这不是浪费时间多花几十秒能避免后续几个小时的返工。边界要设置得够宽但又不过宽。Bx上限80下限1Cx上限2.2下限1.2Dx上限20000NEx上限1.2。给得太宽会让优化器探索到完全没有物理意义的大参数区域给得太窄又会漏掉真解。检查残差分布。如果残差在图上呈“波浪形”大概率是卡在局部极值或者参数组合失真而不是数据噪声。我自己最常用的判断指标是“参数是否在合理区间内”。比如Bx20左右典型Dx≈0.9~1.1倍Fz典型Ex落在0.2~0.7之间合理。一旦某个参数跑到边界顶格或者非常反直觉先别庆祝收敛回头查数据覆盖范围和初值。5. 验证环节残差、载荷外推与联合仿真闭环5.1 残差图拟合优度会骗人残差分布不会拟合完成第一步不是看R²而是画残差图。把kappa作为横轴把拟合残差预测值减实测值作为纵轴画散点图。如果残差在零轴附近随机分布且幅度均匀拟合质量基本可信。如果残差呈现出明显的“S形”“碗形”或“尖峰”说明曲线形状和真实数据系统性不匹配往往是参数组合在“内部补偿”。我还会额外计算两个指标RMS误差反映整体贴合度。建议用力的单位N不要用百分比。因为滑移率大时的纵向力基数大百分比误差会显得很小容易掩盖小滑移区的问题。最大绝对误差这个指标对控制设计最致命。ABS控制往往关心某个特定滑移率点的纵向力是否准确如果一个点的误差达到500N反应到整车加速度上就是不可忽略的偏差。顺手给个判断标准对3000N载荷组RMS误差控制在50N以内算不错100N以内可接受超过200N就要返工看数据或调整权重。5.2 多载荷下的参数趋势与载荷外推单载荷拟合完成只是阶段性结果。要真正能进车辆动力学模型必须处理载荷依赖。最简单可靠的做法是对每个载荷组拟合完B、C、D、E后单独把Dx提取出来画Dx-Fz散点图。理论上Dx≈μ·Fz应该近似一条过原点的直线。我有个项目里四组载荷拟合出的Dx分别是1050N、3100N、4950N、7300N对应Fz是1000N、3000N、5000N、8000N线性度非常好μ约为1.0。于是直接构造Dx 0.98·Fz作为统一表达式再把Bx做轻度的Fz依赖拟合。这种“先分后合”的模式比直接全局拟合稳健得多。如果Dx-Fz趋势没有规律先不要急着做多项式拟合回头检查每个载荷组的峰值数据是否真的覆盖到了饱和段。没有饱和段Dx就是外推出来的没有规律很正常。这部分也提醒一点如果CarSim仿真里设了不同路面附着系数μ那么纵向力峰值Dx会随μ变化。常规做法是把Dx的载荷表达式写成μ的函数比如Dxμ·q·Fzq是某个标定因子。这样后续联合仿真切换路面时只需要改变μ输入模型就能保持物理一致性。5.3 接回Simulink做闭环验证拟合完成后的最后一关是把参数接回Simulink模型做一个整车闭环对比。这一步不是可选的而是必须的。因为参数拟合本身只是“静态曲线对标”而整车仿真涉及载荷转移、车轮动态、控制器触发等环节任何参数误差都会被放大。我推荐一个快速验证方法在Simulink里用刚才拟合出的参数搭一个Magic Formula纵向力计算函数输入是滑移率和垂向载荷。设置同一个仿真场景比如50km/h直线行驶0.2秒后施加固定制动压力阶跃。对比CarSim原模型和替换轮胎模型后整车行为的速度曲线、减速度、制动距离。如果速度曲线偏差在5%以内说明拟合参数基本合格如果偏差在10%以上回到残差分析往往问题出在小滑移区刚度Bx不准。另外简化魔术公式没有轮胎松弛动态联合仿真里可能出现响应过快、振荡加剧的现象。这不是拟合参数错而是模型阶次不够。工程上处理方式有两种一是给纵向力计算结果加一个短时间常数比如5~10ms的低通环节模拟松弛效应二是在滑移率计算端加入轮胎松弛模型把瞬时滑移率处理成有效滑移率再输入魔术公式。后者精度更高但工程量也更大看你项目周期决定。就我个人的经验绝大多数拟合翻车都不是算法本身的问题而是数据准备或者验证环节偷了懒。参数拟合只是中间步骤真正决定项目能不能交付的是参数能不能在更复杂的仿真环境里稳定工作。先做好分组、初值估计和残差验证要比在优化器里调那些花哨的容差参数有用得多。最后再多嘴一句如果你拟合出来的参数Ex特别大、Dx特别小或者Bx冲到边界别犹豫回到数据覆盖范围看看大概率是某个滑移区没有采集够而不是轮胎真的长那样。
返回列表