尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于Simulink的EKF路面附着系数估算:从原理到仿真实践

基于Simulink的EKF路面附着系数估算:从原理到仿真实践 做过车辆动力学仿真的朋友应该都有这种体会路面附着系数这个东西论文里一句话“设μ0.85”但实际项目里它才是ABS、ESP、TCS标定工作里最让人头大的未知量。它直接决定轮胎能提供多大的纵向力和侧向力却没法用车载传感器直接测。最近我把基于Simulink的扩展卡尔曼滤波EKF路面附着系数估算模型完整跑通了一套算法核心用MATLAB实现里面还带道路工况验证Demo正好把整个建模思路、EKF推导、参数整定和踩坑记录整理出来给正在做底盘控制或者车辆状态估计的同学一份可以直接上手的参考。这套方案的核心价值在于不需要加装额外的光学传感器或路面传感器只需要利用车上已有的轮速传感器、方向盘转角、纵向加速度这些常规信号通过EKF把路面附着系数作为扩展状态量在线估计出来。我用典型的双轨车辆模型加Burckhardt轮胎模型在Simulink里搭建了完整闭环实测在干沥青、湿滑路面切换工况下能在大约0.3秒内收敛到真实值附近对ABS逻辑预判和滑转率门限调整有很实际的参考意义。1. 为什么路面附着系数这么难估从工程场景说起1.1 谁在天天和附着系数打交道悬架工程师未必关心附着系数但底盘控制工程师几乎每天都在跟它纠缠。ABS需要知道当前路面是干沥青还是冰面决定要不要降低轮缸压力调节频率TCS需要判断驱动轮滑转是正常起步还是低附着打滑ESP的横摆力矩控制更是依赖前后轴侧偏刚度的变化而侧偏刚度本质就是附着系数的函数。我最早接触这个问题是在做商用车ABS的硬件在环测试时标定工程师在环模型里把路面附着固定成0.8但实车在高架匝道的接缝处遇到了附着急剧下降的情况ABS介入时机明显偏晚车辆直接冲出了预设路径。那会儿我们才意识到所有依赖固定附着系数的控制策略在真实道路上都是在赌运气。1.2 直接测量和间接估计的分水岭直接测量附着系数在工程上几乎不可行。光学传感器可以测路面纹理但成本高、怕脏污声学传感器可以听轮胎噪声但环境干扰太大。量产车上唯一可行的手段就是间接估计利用车辆动力学响应和轮胎力特性反向推断当前路面的附着上限。这也是为什么估计附着系数通常走两条技术路线。一条是基于滑移率-附着系数曲线的斜率辨识在小滑移区用归一化纵向力除以滑移率得到初始斜率斜率越大附着系数越高。另一条就是本文要说的基于状态观测器的估计方法把附着系数作为扩展状态量通过卡尔曼滤波家族算法在线更新。前者计算量小但精度有限后者稍重但在瞬态工况下表现好得多。1.3 为什么偏偏选EKF而不是UKF或标准卡尔曼标准卡尔曼滤波要求系统是线性的而车辆动力学里的轮胎力、滑移率、附着椭圆全都是强非线性关系直接套用线性KF必然会滤波发散。UKF无迹卡尔曼不需求导雅可比矩阵对强非线性系统理论上精度更高但它的计算量大约是EKF的3到5倍在单片机或者快速原型控制器上实时性压力很大而且UKF的sigma点参数调试起来也麻烦。EKF的核心思路是把非线性方程在当前估计点做一阶泰勒展开得到雅可比矩阵后沿用标准卡尔曼的预测-更新框架。它的优势是计算量可控、工程实现成熟、MATLAB代码可以直接生成C代码做硬件部署。对于附着系数这种缓慢变化的状态量一阶线性化的误差完全在可接受范围内。我做过的对比仿真里EKF和UKF在附着系数估计结果上的差异不到5%但单步计算时间差了近4倍所以EKF是性价比最高的选择。2. EKF状态方程怎么搭车辆模型与轮胎模型的取舍2.1 状态量选多少维才够用路面附着系数估计的模型复杂度有很多档位。最简单是单轮模型状态量只有车速和轮速外加一个附着系数适合做纵向滑转率控制。中等复杂度是二自由度单轨模型加前后轮附着系数能覆盖横摆工况。再往上就是七自由度整车模型状态量十几个实时性就吃紧了。我这次选的是纵向动力学为主、兼顾横摆的二自由度方案。状态向量取为x [vx, vy, γ, μ]其中vx是纵向车速vy是侧向车速γ是横摆角速度μ就是我们要估计的路面附着系数。轮速信号作为量测输入而方向盘转角作为已知输入量。这样做的好处是状态量不算太多雅可比矩阵的推导工作量可控而且能通过vy和γ的耦合捕捉到部分弯道工况下附着系数的变化特征。2.2 Burckhardt轮胎模型为什么适合通车况估计轮胎模型是整个EKF设计里最关键的环节它决定了预测方程里μ到底是怎么影响车辆动力学的。魔术公式精度高但公式里的系数多标定一套参数需要大量试验数据。Dugoff模型计算简单但精度粗糙。Burckhardt模型是我个人用得最顺手的折中方案形式为μ(λ) c1 × (1 - exp(-c2 × λ)) - c3 × λ其中λ是滑移率c1、c2、c3是根据路面类型标定的系数。干沥青典型系数是c11.28、c223.99、c30.52湿沥青是c10.857、c233.82、c30.35积雪路面是c10.195、c294.13、c30.46。这个模型最大的好处是μ和λ的关系曲线平滑且单调对EKF的雅可比矩阵求导非常友好。估计附着系数的本质不是直接去猜路面材料而是通过车辆实际产生的纵向力、侧向力与轮胎模型预测的力之间的差异反推出使模型最贴近实车响应的μ值。所以轮胎模型的精度上限直接决定了估计结果的理论上限。2.3 预测方程与量测方程的完整推导把车辆动力学方程写成连续时间形式纵向力平衡如下m × (dvx/dt - vy × γ) Fxf Fxr侧向力平衡和横摆力矩平衡分别为m × (dvy/dt vx × γ) Fyf Fyr Iz × dγ/dt a × Fyf - b × Fyr其中a、b是质心到前后轴的距离Iz是横摆转动惯量。轮胎纵向力和侧向力通过摩擦椭圆关系耦合Fxi μ × Fzi × (λi / sqrt(λi² tan(βi)²)) × (1 - exp(...))为了不在这篇文章里堆满烧脑公式占用太多篇幅我在代码里把事情算完了。实际建模时我直接用了归一化简化形式Fxi μ × Fzi × fx(λi) Fyi μ × Fzi × fy(αi)其中fx和fy是归一化力函数由Burckhardt模型和侧偏模型给出。于是EKF的状态方程可以写成dx/dt f(x, u) [纵向车速导数, 侧向车速导数, 横摆角速度导数, 0]ᵀ这里第四维是附着系数μ因为路面附着相对于车辆动力学是一个慢变量所以预测方程里直接认为它的导数为零依靠量测更新来修正。这是扩展卡尔曼滤波做参数估计的标准做法也叫随机游走模型实际效果非常好。量测方程取车载传感器最容易获得的信号z [ax_meas, ay_meas, γ_meas]ᵀ其中ax和ay是纵向和侧向加速度传感器信号γ是横摆角速度传感器信号。量测方程h(x, u)直接由状态量计算对应的加速度和横摆角速度和实车传感器输出做差。3. Simulink里的EKF模块实现从S-Function到MATLAB Function3.1 顶层模型怎么搭最清晰Simulink模型我推荐采用三层结构最上层是工况输入层负责给路面附着系数真值模块、驾驶员输入模块提供参数中间层是车辆动力学层用Simulink标准模块搭建整车模型或者直接集成Carsim整车模型最底层才是EKF估计器层。千万不要把EKF算法和车辆模型揉在一个子系统里后续调试会让心态崩掉。我习惯的做法是EKF估计器封装成一个独立的MATLAB Function模块输入是量测信号z和控制输入u输出是状态估计x_hat和中间变量比如滑移率估计值、估计协方差矩阵的对角线元素。这样在模型里区分真值信号和估计信号做对比曲线时直接拉线就行。3.2 MATLAB Function里写EKF的离散递推MATLAB Function是Simulink里最灵活的写法比S-Function门槛低又比纯模块连线可读性强。EKF递推用离散形式设采样周期为Ts核心循环如下function [x_est, P_diag, lambda_est] EKF_estimator(z, u, Ts) % z [ax; ay; gamma_meas] % u [delta; omega_fl; omega_fr; omega_rl; omega_rr] persistent x P if isempty(x) x [10.0; 0.0; 0.0; 0.8]; % [vx; vy; gamma; mu] P eye(4) * 0.1; end % 离散时间预测采用一阶欧拉近似 x_pred x Ts * vehicle_dynamics(x, u); A compute_A(x, u, Ts); P_pred A * P * A Q; % 量测预测 z_pred compute_h(x_pred, u); H compute_H(x_pred, u); % 卡尔曼增益 K P_pred * H / (H * P_pred * H R); % 状态更新 x_est x_pred K * (z - z_pred); P (eye(4) - K * H) * P_pred; P_diag diag(P); lambda_est compute_lambda(x_est, u); x x_est; end这里最需要注意的是状态更新顺序。预测方程里对μ的导数为零意味着预测步x_pred(4) x(4)真正让μ动起来的是量测更新里的创新项。如果量测方程没法提供足够的信息来修正μ或者雅可比矩阵H里对μ的偏导数值太小滤波器就会认为μ不可观估计值会死死钉在初值附近不动。这也是很多初学者说“EKF根本不更新附着系数”最常见的原因。3.3 雅可比矩阵的解析解与数值差分雅可比矩阵计算有两种方式。一种是手推解析解精确但推导量大每次改状态方程都得重新推一遍。另一种是数值差分直接把状态量微扰一个epsilon用差分逼近偏导数代码通用性好但计算精度略低且数值噪声会让滤波器性能下降。我在这套模型里用的是解析解和数值差分结合的方案对车辆动力学部分用解析解因为公式固定不会有变动但对量测方程里μ的偏导数用数值差分因为Burckhardt模型在边界处的导数解析式容易出错。数值差分的步长我取了1e-6车速度量纲下这个步长稳定缩放到状态域里噪声影响可以忽略。4. 噪声矩阵和初值整定仿真不发散的关键4.1 Q、R矩阵各维度怎么设EKF的调参核心就是Q和R两个协方差矩阵。过程噪声协方差Q反映了对状态预测模型的信任程度量测噪声协方差R反映了对传感器信号的信任程度。这两个矩阵设不对滤波器要么响应迟钝要么彻底发散。我初始的Q矩阵设计成对角阵取值逻辑如下车速和侧向车速的噪声方差给0.01量级横摆角速度给0.001量级而附着系数μ的过程噪声是重点。μ的随机游走噪声方差决定了对附着系数变化的响应速度取太大估计值会抖得厉害取太小则路面突变时收敛极慢。我的经验是先给0.001然后逐步增大到0.01观察估计曲线的跟踪速度。R矩阵直接对标传感器的实际噪声水平。加速度计在实车上典型噪声标准差在0.05 m/s²左右方差约2.5e-3横摆角速度陀螺仪噪声标准差约0.01 rad/s方差约1e-4。直接用这些值作为R对角元就能让滤波器进入比较合理的信任区间。4.2 μ状态初值离真值太远会不会发散这个问题我在仿真里专门验证过。把μ初值设为0.8而真实路面是0.2的积雪路面EKF在1秒内能把μ估计值拉到0.35附近在2秒内收敛到0.25以下。这说明在持续加速或有滑移激励的工况下EKF对μ初值不敏感。但反过来的情况要小心如果车辆一直匀速行驶轮胎工作点接近零滑移区所有量测对μ的敏感性都会变得极低此时不管初值是什么估计值都会停留在原处。这就是可观测性问题。工程上处理这个问题的标准做法是在μ的随机游走噪声上叠加一个inflated噪声也就是当检测到纵向加速度绝对值小于某个阈值时主动增大Q(4,4)让滤波器“允许”μ漂移跟随真值。我在这套模型里设了0.3 m/s²的激励判断阈值低于这个值时Q(4,4)放大10倍避免了μ卡死在初值附近的尴尬。4.3 典型工况下的参数速查表我把整套参数整理成表格方便直接复用参数推荐初始值调整方向说明Ts0.01 s固定仿真步长需与控制器一致P0对角线0.1初始协方差适当给大利于快速收敛Q(1,1) Q(2,2)0.01车速噪声模型准确可适当调小Q(3,3)0.001横摆角速度过程噪声受侧风影响增大即调大Q(4,4)0.005μ跟踪速度路面突变工况下加大R(1,1)2.5e-3对应ax噪声与加速度计性能匹配R(2,2)2.5e-3对应ay噪声同上R(3,3)1e-4对应γ噪声陀螺仪噪声方差这套参数的逻辑是让EKF信任量测信号大于信任模型。车辆动力学模型总有简化和未建模误差如果Q给得太小模型误差会被量测更新强行压低导致估计值长期偏离真值而不自知。5. 三种路面工况的仿真结果与波形判读5.1 干沥青恒定附着工况基准验证先把车辆放在μ0.85的干沥青路面上跑一个从10 m/s急加速到25 m/s的工况方向盘转角保持为零。这个工况是所有验证的第一步目的是确认滤波器在强激励下能稳定收敛并且稳态误差足够小。仿真结果显示EKF估计的μ值在初始0.5的初值基础上大约0.4秒后就进入0.8到0.9的区间稳态均值在0.84左右误差约1.2%。滑移率在这个工况下最大到了0.12正处于Burckhardt模型提供足够敏感信息的区域。需要专门看的一条波形是估计协方差P(4,4)的收敛轨迹它会从初始值快速下降并稳定在10⁻⁴量级说明滤波器对μ估计的信心在增加。如果P(4,4)长期无法下降大概率是模型激励不足或者H矩阵对μ的偏导数值过小。5.2 对接路面突变工况考验收敛速度路面突变是对EKF性能最残酷的考验。我在模型中用0.5秒的阶跃把路面附着系数从0.85切换到0.3模拟高速公路上从干燥路段突然碾过一段积水路面的场景。此时车辆已经进入稳态巡航驾驶员还没有意识到路面变化但EKF必须在轮胎滑移率还没有明显增大之前就给出可用的附着系数预判。这个工况暴露出来的问题很有代表性。初始版本里Q(4,4)设置为0.001时μ估计值用了1.5秒才从0.85掉到0.5以下这对车辆稳定控制来说太慢了。把Q(4,4)加大到0.01之后收敛时间缩短到0.6秒代价是稳态波动从±0.02增大到±0.05。实际工程中这不是一个纯算法问题而是控制资源的权衡如果执行器响应慢那就保持小Q让估计平稳如果执行器响应快优先保证突变工况的响应速度。5.3 噪声环境下估计发散的排查链路做噪声敏感性测试时遇到过一次发散问题排查过程值得记录。现象是估计的车速vx开始震荡随后γ估计值和真值出现明显反向偏差最后μ估计值直接跳到边界。一开始以为是Q、R没调好但无论怎么调都不解决问题。逐项排查后发现根因在量测方程和预测方程的时间对齐上。我在构造车辆动力学模型时MATLAB Function内部使用了上一时刻的输入信号而量测方程用的是当前时刻的传感器信号在连续变步长求解器下这两个信号差了半个步长导致滤波器的创新项里混入了系统性相位误差。解决办法是把输入信号用单位延迟模块和量测信号强行对齐统一用同一时刻快照问题立刻消失。这提醒我EKF在Simulink里跑的时候信号寄存和时序对齐的重要性不亚于参数整定。另一个噪音相关的问题是加速度计信号里的高频抖动。虽然R矩阵已经给了高斯噪声的方差但如果传感器信号里混有低频漂移或者偏置EKF的估计结果会出现固定偏移。工程上最稳妥的做法是在传感器信号进EKF之前先做高速滤波滤掉5 Hz以上的抖动但不能滤得太狠否则把有用的动力学信息也滤掉了。6. 从仿真到工程落地联合仿真、代码生成与实时性取舍6.1 Carsim与Simulink联合仿真的接线思路纯Simulink搭建的车辆模型做算法验证足够但要验证EKF在真实车辆动力学下的表现最好把整车模型换成Carsim。Carsim的输出端口直接给到EKF估计器的是车速、横摆角速度、纵向加速度和四个轮速信号而EKF估计的μ又可以回传给Carsim去实时修改路面附着配置形成一个闭环。接线时最容易忽略的是Carsim的仿真步长和Simulink的步长设置不一致。Carsim默认在1 kHz下运行而EKF估计器采样率可以取100 Hz或50 Hz这时必须在估计器模块前加一个Rate Transition模块。我一开始没加结果出现了轮速信号混叠μ估计值在0.4和0.8之间来回跳当时还以为是滤波器设计问题排查了半天才发现是采样率不匹配。6.2 模型生成C代码的下位机实现注意点MATLAB Function写好的EKF可以直接通过Simulink Embedded Coder生成C代码部署到快速原型控制器上。这个过程有几点要注意首先所有的矩阵运算在代码生成时会被展开成循环确认目标芯片的RAM和算力能承受4×4矩阵求逆操作其次生成代码里的单精度和双精度选项要严格检查嵌入式控制器上通常用single精度但协方差矩阵在单精度下容易出现数值对称性问题需要加入对称化处理代码。我在一个英飞凌TC277平台上做过实际移植EKF单步运算时间大约在0.12毫秒加上外围信号处理整个估计器占用的CPU时间不到3%。这说明EKF在量产级控制器上跑实时估计完全可行。相比之下UKF在同样的平台下单步运算要0.4毫秒以上如果控制策略本身已经有复杂的查表和状态机留给状态估计的时间预算会很紧张。6.3 EKF二维估计和三维修正下一步的扩展方向目前这套模型假设前后轴共用一个附着系数这在大多数测试工况下够用但在左右附着不对称的开坡路面上会引入估计偏差。后续扩展可以考虑把状态向量改成[x vx, vy, γ, μf, μr]ᵀ两个附着系数分开估计同时利用左右轮速差提供附加量测信息能进一步提升非对称路面的估计精度。还可以考虑用交互多模型IMM的思路维护几个不同路面类型的Burckhardt参数集EKF输出权重最终附着系数按权重融合。这种做法的优势是利用了路面的离散先验信息收敛速度比纯连续估计更快但代码复杂度会明显上升。从我个人的项目经验来看先把单μ的EKF在实车上跑稳再根据实际暴露的问题决定要不要上多模型是性价比最高的路径。回到标题里提到的“内含道...”按我的理解应该是指模型里附带了道路工况验证Demo。这套Demo的价值不只是展示EKF能收敛更重要的是它给了你一个标准化的调参起点——你在干沥青和对接路面工况下跑出来的波形才是判断EKF设计是否合格的依据。整车控制器上了台架之后真值没法直接测绝大多数情况下能依靠的就是仿真模型里的标准工况验证结果。所以把这套Demo留着别轻易删以后改模型、换传感器、调噪声参数它都是你判断改动有没有回归问题的基准。
返回列表