资讯动态

基于Dugoff轮胎模型的Simulink-Carsim联合仿真力反馈验证实践

发布时间:2026/9/9 21:32:40 来源:尧图企业网站定制
做驾驶模拟器方向盘力反馈那阵子我发现Carsim自带的轮胎模型算得确实准但想把四个轮胎的受力单独拿出来按自己的想法做路面反馈再从Simulink侧做验证总是要被各种封装细节卡住。后来我干脆把Dugoff轮胎模型在Simulink里从零搭了一遍再和Carsim做联合仿真把模型算出来的力回注到整车模型里验证整个力反馈链路整个过程反而清晰、可控得多。这篇文章不是论文复述而是把我从建模、接线、联合仿真到力反馈验证踩过的坑、最后用的方案完整记录下来适合正在做车辆动力学仿真、驾驶模拟器力反馈、底盘控制快速原型的工程师参考。1. 为什么力反馈链路里要“绕一圈”自己搭Dugoff模型1.1 力反馈项目对轮胎模型的要求方向盘力反馈和ABS、ESP这类控制算法不一样它对轮胎模型的要求非常“刁钻”第一模型输出必须是连续的不能有跳变否则驾驶员手感上就是“咯噔”一下第二参数要能被外部脚本或上位机实时修改方便做不同路面、不同载荷的标定第三计算开销要小因为同一个仿真里可能同时跑电机、控制器、通信协议留给轮胎模型的CPU预算往往只有几百微秒第四模型要能解释“为什么产生这个力”也就是输入输出关系要足够透明方便我定位问题。Carsim内置的轮胎模型在这些点上都不太好用。它算得当然准但很多内部状态不开放我也不想为了拿一个轮胎侧偏力去翻它那一大堆输出的变量手册。Dugoff模型恰好踩中了这个空子输入就是车速、轮速、侧偏角、垂向力和几个刚度参数输出就是纵向力和侧向力逻辑简单到可以在十分钟内写进一个MATLAB Function之后无论是做C代码生成还是接方向盘力矩映射都是顺理成章的事。1.2 为什么不是Pacejka公式也不是简单的线性轮胎模型做轮胎力估算很多人第一反应是Pacejka“魔术公式”。说实话如果只做高保真离线仿真Pacejka确实更准但它的代价是几十个拟合系数。这些系数需要通过轮胎试验台数据拟合学生或者小团队根本拿不到完整的高质量数据网上找来的系数经常是别人某个通配胎的拿去和Carsim对比反而两头不对。线性轮胎模型倒是参数少但它没有办法体现“接近附着极限时力不再增长”这个关键现象。对力反馈来说最怕的恰恰是极限工况下手感一片虚假刚度。Dugoff模型用一个λ削减函数把纵向力和侧向力在附着极限附近“压弯”本质上是用一个参数μ和一些基本刚度描述出轮胎力饱和的趋势。它不如Pacejka精细但已经把最关键的物理特性抓住了。我整理过一张选型对比表基本可以看出我的决策逻辑轮胎模型参数数量实时性附着极限表达能力工程可控性Dugoff非常少极高有通过μ和f(λ)削减很高参数语义清晰Pacejka Magic Formula非常多中强低系数来源不透明线性轮胎模型极少极高无高但极限工况失真1.3 我最终采用的力反馈闭环结构本文讲的“力反馈验证”不是空泛概念它有一个明确结构Carsim提供整车运动状态和垂向载荷Simulink里的Dugoff模型根据这些状态算出四轮纵向力和侧向力然后把力一方面回注给Carsim形成动力学闭环另一方面送入方向盘力矩映射模块生成驾驶员能够感知的反馈力矩。这样既能验证模型算的力准不准又能验证这条力反馈链路在动态工况下是否稳定、是否延迟过大、是否让人有“不真实感”。信号流很直观Carsim输出车速、横摆角速度、前轮转角、轮速、垂向力Dugoff模块输出Fx、Fy一路回到Carsim的外部轮胎力输入通道一路做显示和方向盘反馈。后面所有章节都是围绕这条链路展开的。2. 从公式到模块Dugoff模型的Simulink实现与关键数值保护2.1 我采用的符号约定与核心公式Dugoff模型网上版本很多符号约定不统一抄别人的代码很容易翻车。我这里先说明自己的定义纵向滑移率s按驱动为正即s(ω*R−Vx)/Vx侧偏角α按直角坐标定义αatan2(Vy,Vx)。轮胎纵向速度为Vx轮心线速度为轮速ω乘以滚动半径R。核心公式分三块。第一块是纵滑和侧偏的组合项λ (μ·Fz) / (2·sqrt((Cs·s)^2 (Cα·tan(α))^2))第二块是削减函数f(λ) λ·(2−λ)当λ1 f(λ) 1当λ≥1第三块是受力输出Fx Cs·s·f(λ) Fy −Cα·tan(α)·f(λ)这里要提醒一句Dugoff原始论文里的写法和我这个版本不完全相同不同文献里Fx分母上可能挂着(1s)或者(1−s)。我在工程中采用了不带分母的简化形式原因很简单车速接近零时滑移率本身就会发散再带一个分母项会让数值问题雪上加霜去掉之后在常见车速范围内物理趋势不会错而且仿真稳定性好得多。如果你需要严格复现某篇论文请回到那篇论文的符号体系不要直接混用。f(λ)这个削减函数是整个模型的灵魂。λ大于等于1时说明轮胎还处于线性工作区力直接由刚度决定λ小于1时说明轮胎已经接近附着极限纵向力和侧向力同时被压缩。两个方向的力共享同一个f(λ)这就自然实现了“摩擦椭圆”的耦合效果。侧偏大时纵向力也上不去纵向打滑时侧向力也会变小这和真实轮胎的物理特性是一致的。2.2 在MATLAB Function里实现单轮Dugoff逻辑我不喜欢用一堆Gain、Sum、Fcn模块把公式拆得七零八落那样改参数和查错都痛苦。实际项目里我直接用Simulink里的MATLAB Function实现代码就是上面公式的直接翻译function [Fx, Fy] DugoffTire(s, alpha, Fz, mu, Cs, Ca) % 纵向滑移率s驱动为正制动为负 % 侧偏角alpha弧度atan2(Vy,Vx) % Fz垂向载荷单位N % mu路面附着系数 % Cs纵向滑移刚度 % Ca侧偏刚度 if Fz 0 Fx 0; Fy 0; return; end tan_a tan(alpha); denom 2.0 * sqrt((Cs * s)^2 (Ca * tan_a)^2); if denom 1e-6 Fx 0; Fy 0; return; end lambda mu * Fz / denom; if lambda 1.0 f lambda * (2.0 - lambda); else f 1.0; end Fx Cs * s * f; Fy -Ca * tan_a * f; end这个函数输入是标量四轮可以各放一个MATLAB Function实例也可以用向量化总线。我建议第一版先用标量模块把单个轮胎的行为和Carsim对比清楚后再改写成矩阵输入排查问题会容易很多。2.3 低速保护、垂向力滤波和模块封装的细节单轮模型搭完还要处理几个很容易让联合仿真直接崩掉的细节。首先是低速保护。s(ω·R−Vx)/Vx这个公式在Vx接近0时会算出巨大的值。实际项目里踏板工况、起步工况、停车转向工况都会遇到这个问题。我的处理是在调用Dugoff函数之前加一个判断当Vx小于0.5m/s时纵向力直接置0侧向力仍按小角度近似计算并限幅。如果Vx非常小但车轮还在转动就用轮速计算一个等效纵向“打滑趋势”但力幅值限死防止力反馈在停车时乱抖。其次是垂向力问题。Carsim直接输出来来的Fz包含悬挂动态和路面激励信号本身是抖的。Dugoff模型对Fz是线性敏感关系Fz一抖Fx/Fy就跟着抖反馈手感会变成高频噪声。我给Fz加了一阶低通滤波时间常数取20ms左右这个值既能滤掉路面高频激励又不会明显影响100Hz以下的车辆动力学。最后是模块封装。我建议把整个单轮模型封装成一个子系统输入口固定为纵向速度Vx、横向速度Vy、轮速ω、垂向力Fz输出为Fx和Fy。参数Cs、Ca、μ、R不要放在MATLAB Function内部写死而是做成子系统参数或者从工作区用结构体引入这样后续在联合仿真里做参数扫描会非常省事。3. Carsim侧配置输入输出通道、步长、代数环与初速对齐3.1 Carsim与Simulink联合仿真的两种接法和Carsim对接首先要分清你是要做“开环观测”还是“闭环回注”。开环观测最简单Carsim跑它自己的动力学内部轮胎模型照常工作Simulink里的Dugoff模型只是读取Carsim状态并计算自己的力对比两条力曲线的差异。这个方案不会影响车辆运动适合第一步验证模型趋势。闭环回注才是标题里的“力反馈验证”真正需要的接法。这时要在Carsim里关闭内部轮胎模型或者把轮胎力来源改成外部导入然后把Simulink里Dugoff算出的四个力通过Carsim的Import通道灌回整车模型。车辆的质量、悬挂、转向都还是Carsim的但轮胎与地面的作用力由Dugoff代替。这样车辆动力学和力反馈信号用的是同一个力源闭环一致性才好。3.2 Carsim输入输出通道的核对经验Carsim和Simulink之间的数据通道看起来简单实际非常容易错。我先说输出侧。Dugoff需要的状态量包括纵向车速Vx、横向车速Vy、横摆角速度、前轮转角、四个车轮的轮速和四个车轮的垂向力。不同版本的Carsim对这些变量的命名有差异我常用的变量是Vx_SM、Vy_SM、Steer_L1、WheelSpeed_L1到L4、Fz_L1到L4但这只是参考你在自己的版本里一定要到Output Variables列表里确认。输入侧Carsim通常支持External Tire Forces/Moments这类导入通道可以分别给四个车轮指定FX、FY甚至MZ。我习惯把纵向力通道记为IMP_FX_L1这类格式同样要以你版本实际的通道名为准。第一次做的时候我犯过一个典型错误漏了通道单位换算。虽然Carsim内部用国际单位制但前轮转角输出常常是角度制轮速可能是rpm把角度当成弧度送进Dugoff侧偏角直接大了近60倍力反馈当场乱套。所以配置完之后务必先停车状态踩油门检查轮速、转向角、车速这几个信号的量级是不是符合直觉。3.3 步长选择、初始速度对齐和代数环处理Carsim与Simulink联合仿真的求解器设置原则是“固定步长、离散求解器优先”。我在项目中用的是固定步长0.001s也就是1kHz。这个步长对轮胎力反馈来说足够再小计算量浪费再大容易在附着极限附近出现振荡。这里有一个非常关键的点Carsim的S-Function模块通常有直接馈通也就是同一仿真步内它既接收外部力输入又输出车辆状态Simulink如果直接把Dugoff模块的输出接到Carsim的输入会形成一个代数环。代数环虽然在一些情况下能解出来但容易导致仿真卡死、迭代不收敛尤其在力反馈这种强非线性链路里。我的做法是在信号回路里加一个Memory模块把Dugoff算出的力延迟一个仿真步再送给Carsim。1ms延迟对于0到15Hz的方向盘力反馈来说几乎感知不到换来的是仿真稳定性非常划算。初始速度也要两边对齐。Carsim里设置初始速度60km/hSimulink侧的IMU模块、积分器初始状态、以及轮胎模型当前速度值如果还是0前几十毫秒会出现一个巨大的冲击力。我的习惯是在仿真前用脚本从Carsim读写文件里把初始速度读出来再写进Simulink的初始条件常量保证两边一致。在Simulink里配置好以下内容后先别急着看力反馈建议先观察四个轮的Fz和轮速是否平滑。这三个环节步长、初速、代数环是联合仿真里最容易“东边稳了西边炸”的地方每次都值得单独花时间验证。4. 力反馈验证的三种工况设计与结果解读4.1 方向盘力反馈映射的简化公式验证力反馈先要明确一个映射关系Dugoff输出的是轮胎力驾驶员感受到的是方向盘力矩。我不可能直接把5000N的轮胎力推到方向盘上需要经过转向传动比和助力特性的换算。我采用一个工程上足够用的简化映射方向盘反馈力矩T_sw (Fy·t_p) / i_ratio其中t_p是气胎拖距i_ratio是转向传动比。气胎拖距随侧偏角变化侧偏角小时约0.03m侧偏角增大后线性衰减到0.005m左右。这个公式没有考虑回正力矩中由主销内倾、主销后倾带来的几何项但作为验证Dugoff力反馈链路已经足够。横向力越大、拖距越大、传动比越小方向盘手感越重这个趋势和实际车辆是一致的。纵向力在方向盘上通常不直接呈现但刹车时会有踏板力反馈或者通过左右纵向力差产生的横摆力矩间接影响方向盘手感。所以我对Fx的验证重点放在“左右轮力差是否准确”这个量直接决定对开路面制动时驾驶员能否感觉到车辆被拉向一侧。4.2 工况一阶跃转向下的侧向力稳态与瞬态对比第一个验证工况是60km/h稳定直线行驶在第2秒给前轮一个3°的阶跃转角干沥青μ0.85。这个工况考察的是Dugoff模型在中度侧偏下的稳态精度和瞬态特征。结果对比很有代表性。稳态阶段Dugoff算出的前轴侧向力约为4200NCarsim内置轮胎模型约为4300N偏差不到3%侧偏角大约在5°附近还在模型的好用区间内。瞬态阶段差异就明显了Dugoff模型没有轮胎松弛长度力几乎瞬间建立输出有一个很陡的上升Carsim内置模型则表现出约0.05到0.08秒的渐进建立过程。这个差异直接导致方向盘力反馈的手感不同Dugoff原始输出会让驾驶员觉得“转向瞬间特别贼”少了真实轮胎的黏滞感。所以我在Dugoff输出后加了一个一阶低通滤波时间常数按松弛长度L和车速Vx估算τL/VxL取0.3m60km/h下对应约18ms。加上这个滤波后侧向力的上升过程明显接近Carsim的曲线方向盘反馈的“贼感”基本消失。这个滤波模块就是Simulink里很常见的传递函数或一阶低通滤波器模块。4.3 工况二对开路面制动下的纵向力差第二个工况是对开路面直线制动左侧μ0.85右侧μ0.3初始车速80km/h制动压力以斜坡上升。这个工况重点看左右纵向力差也就是车辆制动时产生偏航力矩的那股源头力量。Dugoff模型在这个工况下的表现让我比较满意。制动初期滑移率较小两侧纵向力差直接跟随μ的差异比例关系正确Dugoff算出的横摆力矩方向和量级都和Carsim一致进入ABS触发区后Carsim内置模型有明显的轮速脉动导致的力波动Dugoff因为没有模拟ABS控制器力曲线反而偏平滑。这说明如果单纯用Dugoff做ABS控制开发需要搭配一个轮速控制器或轮胎瞬态模型不能直接拿原始输出当真实力。对力反馈来说更重要的是“趋势是否连续”。对开路面制动时驾驶员最需要感知的就是车辆往低附着侧偏的力差。Dugoff在这一点上没有丢信息左右力差曲线在0到0.5秒内平滑增大反馈手感的渐变是准确的。4.4 工况三正弦扫频与频域评价第三个工况是80km/h下方向盘角以0.1到3Hz正弦扫频输入幅值3°。这个工况能同时看出力反馈的幅值和相位特性。我用频谱分析对比了Dugoff侧向力与Carsim侧向力在1Hz附近的响应。结果符合预期在0.5Hz以下两个模型幅值接近相位差很小在1Hz以上Dugoff原始输出的相位明显超前Carsim高频段幅值也偏大。这是因为Dugoff本身是代数模型缺少轮胎侧向松弛动态。加入前述一阶滤波后1Hz到2Hz的相位差从18°左右降到5°以内幅值误差也缩小到可接受范围。这验证了一个重要结论Dugoff力反馈用于驾驶模拟器时滤波不是可选项而是必选项。4.5 误差指标的整理方式每次仿真结束后我会把关键信号记录到工作区按稳态平均误差、峰值误差、相位滞后三个指标归档。表格是我常用的记录格式工况主要对比量稳态误差峰值误差经滤波后相位差阶跃转向前轴侧向力小于3%约4%基本一致对开路面制动左右纵向力差约5%约8%趋势连续正弦扫频侧向力幅值/相位小于5%约12%小于5°这套指标并不追求Dugoff和Carsim完全重合因为Dugoff本来就是简化模型它追求的是在力反馈所需的频率范围0到15Hz内趋势正确、相位可补偿、峰值不失控。5. 参数敏感性、C代码生成与调试经验5.1 三个参数里先调谁用Dugoff模型做力反馈最常被问的问题就是参数怎么标定。我的经验是先调μ再调Cα最后调Cs。μ是全局瓶颈它决定所有接近极限工况的饱和值。假设Carsim内置模型在干燥路面能放出0.9g的侧向加速度Dugoff模型μ设成0.8那峰值侧向力肯定被压低再调刚度也没用。反过来如果直线制动工况纵向力差对不上问题多半出在μ的差异而不是Cs。Cα敏感的区域在小侧偏角范围内。阶跃转向工况稳态侧向力偏差如果在5%以内尽量不要动Cα超过8%优先怀疑Cα和Carsim等效侧偏刚度不匹配。Cs在大滑移率下的作用会被f(λ)削减函数稀释所以它在稳态上的影响力反而没有μ大。这个调参顺序能省下大量试错时间。5.2 Fz抖动、低速发散和平方根分支三个最容易让人心梗的数值问题我都踩过。第一个是Fz抖动解决办法是滤波前面已经说过。第二个是低速发散如果Vx低于阈值还在算滑移率力反馈会在停车瞬间突然跳到几百牛方向盘猛地一抖。务必在进入Dugoff模块之前做好速度保护。第三个是平方根分母接近0也就是四轮都处于纯滚动、侧偏角也为0的情况。此时λ的表达式分母是0如果不做保护结果是NaN方向盘的力反馈直接断线。我的代码里给了denom一个1e-6的下限低于它就把力和刚度全部归零这个细节小但至关重要。5.3 从Simulink到实车/模拟器生成C代码前的检查如果力反馈验证通过接下来通常要把模型部署到驾驶模拟器或HIL环境。我的经验是MATLAB Function里的代码在生成C代码前要过一遍硬性规范只用固定大小的数组或标量不用动态内存atan2、tan这些函数要确保输入不是NaN所有参数都定义成可调参数使用Embedded Coder生成C代码如果目标是DLL选择共享库目标即可。在实时环境里我还会开启Simulink的外部模式验证参数在线调参能力。外部模式下μ可以在运行中从0.3切到0.85力反馈应该平滑过渡不会出现阶梯感。如果做驾驶模拟器务必确认目标机支持双精度运算。我遇到过模拟器用单精度float在低速小侧偏角下侧向力只有几十牛量化后反馈手感一卡一卡改成double后问题消失。5.4 联合仿真稳定的检查清单最后给一份每次跑联合仿真前会过一遍的检查清单照着做基本不会翻车检查项检查要点初始速度Carsim和Simulink是否完全一致步长是否固定步长是否统一为1ms代数环力回注路径上是否有Memory断环单位转角、轮速、力的单位是否统一低速保护Vx阈值是否符合最低工况车速Fz滤波是否已加被动滤波时间常数是否在20ms量级输出记录四轮Fx/Fy、方向盘力矩是否都进记录文件我自己最深刻的体会是联合仿真出问题不要急着怀疑Dugoff公式写错了。多数情况下是接口、单位、初始状态这些“非模型”环节在捣乱。先把链路里每个信号打出曲线确认量级和趋势再回到模型本身会少走很多弯路。后面再做新的轮胎模型我大概都会沿用这套流程先在纯Simulink里单轮验证再进Carsim闭环最后布到模拟器做手感确认层级清晰问题也容易定位。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价