☰
分布式驱动电动车路面附着系数估计:UKF与CKF对比实战
2026/10/18 20:27:13 网站建设 项目流程

路面附着系数估计这个方向,做底盘控制和车辆状态估计的同学一定不陌生。ABS、TCS、ESP这些功能,核心都在回答一个问题:轮胎当前能传递多大的力。而路面附着系数 μ 正是这个问题的关键输入,它没法直接测量,只能靠动力学反推。分布式驱动电动汽车出现后,这个问题的解法变了不少——电机能给出每个轮子的扭矩和转速,等于直接给估计器提供了高精度的输入信号。

这篇文章把我实际做过的方案完整拆开讲:基于分布式驱动电动汽车的纵向动力学模型,分别用无迹卡尔曼滤波(UKF)和容积卡尔曼滤波(CKF)在线估计路面附着系数,包括模型怎么搭、滤波器怎么写、参数怎么定、真车调试会踩到哪些坑。适合正在做车辆状态估计的研究生、底盘算法工程师,以及准备把分布式驱动落地到实车的团队参考。

1. 分布式驱动给附着系数估计带来的红利

1.1 传统车辆为什么估不准附着系数

传统燃油车不是没有做附着系数估计的方案,而是能用的信号太有限。轮速传感器只能测轮速,发动机和制动系统产生的力矩虽然可以估算,但要经过变速器、差速器、传动轴一系列环节,扭矩从源头到轮端损失多少、延迟多少,很难精确建模。没有精确的轮端扭矩输入,轮胎力就无法从车轮动力学方程里解出来,附着系数自然成了“盲人摸象”。

传统方案里最常用的还是滑移率门限法:观测到车轮滑转加剧、轮加速度超过阈值,就判断当前路面附着为低附着。这个方法的缺点是滞后明显,而且标定参数受车型、胎压、载荷影响很大,换一个底盘就要重新调一遍阈值。

1.2 电机带来的高精度扭矩与转速信号

分布式驱动电动汽车的四轮轮毂电机或轮边电机,把“轮端扭矩不可测”这个问题直接消解了。电机控制器的扭矩指令和实际输出扭矩误差在几个百分点以内,电机转速信号来自旋变或编码器,分辨率和刷新率都远高于传统轮速传感器。也就是说,系统可以在每个采样周期内同时拿到四个轮子的驱动扭矩和四个轮子的转速。

这些信号再配合车身上的纵向加速度计,就构成了一个信息量足够做非线性状态估计的观测组合。用一句话总结分布式驱动的红利:它让“轮胎力到底有多大”不再是一个靠猜的量,而是可以靠动力学方程算出来的量。附着系数估计因此从“门限触发”升级为“连续在线估计”。

1.3 为什么选UKF和CKF,而不是EKF和粒子滤波

路面附着系数估计问题本质是个强非线性状态估计问题。轮胎力对滑移率的关系是明显非线性且非单调的,峰值附着系数前后曲线形态完全不同,EKF在这里表现不稳定,雅可比矩阵求解繁琐,遇到分段特性的轮胎模型还容易发散。

粒子滤波理论上能处理任意非线性,但计算量太大,嵌入式平台上跑几万个粒子做四轮独立估计,算力完全扛不住。UKF和CKF正好在精度和计算量之间取了平衡:通过一组确定性采样点去逼近非线性分布,不需要解析求导,三到八维的状态空间里精度足够,而且计算量在实时系统里完全可接受。

我这次选择两套滤波算法做对比,还因为它们在处理“强非线性+多状态耦合”时的表现差异很有意思。状态维数不高时两者精度几乎无差,但实现复杂度和调参灵活性差别明显。这些细节我会在第三章详细拆。

2. 动力学模型搭建:状态方程和观测方程怎么定

2.1 单轮模型到整车纵向模型

附着系数估计不需要一个复杂的整车动力学模型。我的做法是分两套视角:整车纵向运动用于估计车速,单轮旋转动力学用于估计每个轮子的受力状态。

整车纵向动力学简化形式:

m * d(vx) / dt = Fx_total - F_air

其中 Fx_total 是四个轮子纵向力之和,F_air 是空气阻力,可以写成 0.5 * ρ * Cd * A * vx²。对于算法验证阶段,空气阻力项可以先忽略或当作已知扰动量,因为它在低速和中等车速下占比不大,误差由滤波器Q矩阵吸收。

单轮旋转动力学方程:

J * d(ω) / dt = T_drive - r * Fx

这里 T_drive 是电机驱动扭矩,J 是车轮转动惯量,r 是轮胎静力半径,Fx 是该轮纵向力。这个方程是估计附着系数的核心入口——扭矩已知、转速可测,剩下的轮胎力 Fx 就可以通过滤波器的观测修正反推出来。

2.2 轮胎-路面模型怎么选

轮胎纵向力与滑移率、路面附着系数之间的关系,常用Burckhardt模型或者魔术公式描述。

Burckhardt模型形式简洁:

μ(λ) = c1 * (1 - exp(-c2 * λ)) - c3 * λ

其中 λ 是滑移率,c1、c2、c3 是路面参数。驱动工况下滑移率定义:

λ = (vx - r * ω) / vx

我在仿真和算法预研阶段优先选Burckhardt,因为参数少、计算量小,实时性好。以下是几类典型路面的参考参数值,可以在初始仿真时直接使用:

路面类型c1c2c3
干燥沥青1.2823.990.52
湿沥青0.8633.820.35
雪地0.1994.130.06
冰面0.05306.390.001

如果追求更高拟合精度,可以用魔术公式,但参数更多,标定工程量更大。实际项目里可以先在仿真中用Burckhardt完成滤波器验证,实车阶段再根据目标轮胎单独标定模型参数。

2.3 状态方程、观测方程与离散化

以单轮附着系数估计为例,我采用的状态向量是:

x = [vx, ω, μ]^T

把 μ 作为慢时变状态,用随机游走模型描述:

d(μ) / dt = q_μ

整个连续状态方程:

d(vx) / dt = (1/m) * (Fz * μ(λ) - F_air) d(ω) / dt = (1/J) * (T_drive - r * Fz * μ(λ)) d(μ) / dt = q_μ

观测方程取两个量:轮速和纵向加速度。

y1 = ω + v_1 y2 = (Fz * μ(λ) - F_air) / m + v_2

纵向加速度计测的是比力,这在实际装车时要特别注意标定和坡道重力分量问题,后面我会单独讲。离散化采用一阶欧拉法,采样周期10ms,也就是100Hz,这是工程上比较通用的配置。10ms周期下,一阶欧拉带来的截断误差对车辆动力学这种时间尺度完全够用,没必要用更高阶积分浪费算力。

这里有一个容易被忽略的细节:状态向量的三个量纲差异巨大,vx一般在20m/s量级,ω在50rad/s量级,μ只有零点几。如果不做归一化处理,协方差矩阵的条件数会很差,滤波数值上容易出问题。我建议在实际代码里先做量纲归一化,或者至少在初始化P矩阵、Q矩阵时把这种量纲差异考虑进去,否则Cholesky分解可能直接失败。

3. UKF和CKF的原理拆解与工程实现

3.1 核心思想:用确定性采样点逼近非线性分布

UKF和CKF的共同出发点,是“近似一个概率分布比近似一个非线性函数更容易”。EKF的做法是泰勒展开后直接线性化函数,在强非线性工况下误差会被放大。UKF和CKF则是选择一组确定性的采样点,让它们经过非线性函数传播后,用加权均值和加权协方差来近似真实的后验分布。

UKF使用的采样点叫sigma点,数目是2n+1个,通过无迹变换生成。CKF使用的采样点叫容积点,数目是2n个,由球面径向容积规则生成。两者在数学上都保证了至少能精确捕捉到二阶矩,也就是均值和协方差,因此对非线性系统的估计精度在同一个量级。

3.2 UKF参数选定:α、β、κ的经验值

UKF的三个参数经常让人头疼,我直接说结论。α控制sigma点在均值周围的散布程度,取值区间是1e-3到1,推荐先取0.01左右。β是分布的先验信息参数,对高斯分布取2是最优的。κ通常取0或者3-n,视状态维度而定。

lambda的计算公式是:

lambda = α² * (n + κ) - n

权重再按以下公式计算:

W0_m = lambda / (n + lambda) W0_c = lambda / (n + lambda) + (1 - α² + β) Wi_m = Wi_c = 1 / (2 * (n + lambda)),i = 1, ..., 2n

听起来不复杂,但实际用起来有个大坑:当n比较大或者κ取负值时,某些权重会变成负值,协方差矩阵就容易失去半正定性,导致Cholesky分解失败。我建议在调试阶段写一个断言,每次更新完P矩阵后检查对称正定性,一旦异常立刻定位。

3.3 CKF的容积点生成与滤波流程

CKF的容积点生成比UKF的sigma点更简单。先对协方差矩阵做Cholesky分解:

P = S * S^T

然后生成2n个容积点:

ξ_i = sqrt(n) * e_i,i = 1, ..., n ξ_{n+i} = -sqrt(n) * e_i,i = 1, ..., n

其中 e_i 是单位矩阵的第i列。每个容积点的权重都是 1/(2n),不涉及任何可调参数。这一点是CKF在工程上最大的优势——少调三个参数,就少三个坑。

完整的CKF流程分为五步:

  1. 容积点传播:χ_i = S * ξ_i + x_hat
  2. 经过状态方程传播:χ_i* = f(χ_i)
  3. 计算先验均值和协方差:x_pred = sum(χ_i*) / (2n),P_pred = sum((χ_i* - x_pred)(χ_i* - x_pred)^T) / (2n) + Q
  4. 同理由观测方程传播容积点,计算新息协方差P_zz和互协方差P_xz
  5. 计算卡尔曼增益K = P_xz * inv(P_zz),然后做标准卡尔曼更新

UKF流程结构一样,只是采样点生成方式和权重不同。代码层面,把采样点生成和权重计算封装成独立函数,两套滤波器可以共用后续的传播和更新模块。

3.4 两种滤波器怎么选

对比项UKFCKF
采样点数量2n+12n
可调参数α、β、κ无
权重特性高维时可能出现负权重等正权重
数值稳健性受参数影响大更稳健
实现复杂度略繁琐更简洁
估计精度(低维)基本一致基本一致
估计精度(高维)可能优于/劣于CKF,取决于参数稳定

我的结论很直接:如果目标只是验证算法、做低维状态估计,两套随便选,精度差距在误差范围内;如果要上嵌入式实车、维护成本压到最低,推荐CKF。UKF的优势在于可调参数多,遇到特定工况可以通过调参强行压误差,但这也意味着换一辆车可能就要重新调一遍参数,长期维护成本高。

4. 仿真与调参实录:从初值设定到工况测试

4.1 初值、Q矩阵和R矩阵的起点设定

所有滤波器对初值都敏感,附着系数估计尤其如此。我的经验是给出一组合适的起始参数,然后在此基础上做小范围扰动测试。

状态初值:

状态初值依据
vx实测车速(或10m/s左右)可观测,给准一些
ω实测轮速(或vx/r)可观测,给准一些
μ0.8(干燥沥青假设)不可直接测,保守给定

P矩阵对角线反映对初值的信任程度。vx和ω给0.1量级,μ给0.5量级,因为μ的初值猜测成分更大。Q矩阵对角线根据模型误差来定,我常用的起点是:

Q = diag([0.1, 0.5, 0.001])

μ的状态噪声取0.001,这是因为随机游走模型假设μ变化缓慢,Q给太大估计值会疯狂跳动。R矩阵根据传感器噪声定,轮速噪声方差给0.1到0.5,纵向加速度噪声方差给0.05到0.2,具体看实际传感器数据。实测后发现滤波器毛刺太大,优先调R而不是Q,先承认量测噪声比想象中大,再回头收紧过程噪声。

4.2 让滤波真正收敛的操作顺序

直接丢一组阶跃扭矩信号给滤波器,前几百毫秒大概率会看到一个缓慢爬升又掉下来的μ估计曲线,这是正常现象。原因有两个:一是滤波器还在收敛初期,P矩阵处于调整阶段;二是车辆刚起步,滑移率在极低的线性区,附着系数本身观测性差。

让估计器真正进入稳定状态,我的操作顺序是:

  1. 先用一组小幅扭矩信号做预激励,让滑移率抬升到5%左右,给滤波器一个初始收敛窗口。
  2. 待新息序列稳定后,再叠加阶跃或扫频扭矩,让滑移率进入10%到20%的敏感区间,此时μ的估计才有实质意义。
  3. 每个路面工况至少跑10秒以上,观察μ估计的静态误差,不要一上来就评判动态响应。

滑移率是λ这个量决定了μ的观测性强弱。小滑移率区间,轮胎力随滑移率变化太平缓,任何小的量测噪声都可能扰动μ估计。实际调试时,我会在代码里打印出λ和μ的联合曲线,如果看到λ只有1%到2%时μ线已经开始抖动,那说明估计器在“无效学习”,需要加强激励或减小状态噪声。

4.3 载荷转移和多工况联合变化的影响

如果模型里把Fz当作常量,高附着路面急加速时,μ估计很快就会失真。原因是车辆加速时前后轴载荷转移,前轮Fz减小、后轮Fz增大,而模型里用的还是静态载荷。载荷转移对一辆普通乘用车,在0.8g纵加速度下前后轴载荷变化量可能超过整车质量的20%,这足以让μ估计产生明显偏差。

我采用的解决方法是把Fz作为时变输入量,由纵向加速度粗略估算:

Fz_f = m * g * Lr / L - m * ax * h / L Fz_r = m * g * Lf / L + m * ax * h / L

其中Lf、Lr是质心到前后轴的距离,L是轴距,h是质心高度。弯道里还要叠加侧向载荷转移,左右轮分别补偿。对于直线工况验证,纵向补偿基本够用;如果做极限工况,侧向载荷转移也必须加进去,否则左右轮的μ估计会出现虚构的差异。另外,如果每轮独立做μ估计,四轮估计结果不一致时要有判别逻辑,不能直接求平均,因为单侧车轮压到冰面时平均的结果会让整体控制策略做出错误判断。

5. 常见问题与排查技巧实录

5.1 滤波器发散的前三名原因

这类滤波项目里出现发散,大概率是以下三个原因之一。

第一名:P矩阵失去正定性。UKF的高维负权重、Cholesky分解失败、数值截断误差积累都可能引发这个问题。排查手段是在每次状态更新后检查P矩阵的行列式是否处处为正,或者直接Assert能够正定分解。实测中,当κ取负值时最容易触发,所以工程代码里我宁愿牺牲一点理论最优性,也要保证数值稳定性。

第二名:Q和R的比例严重失衡。Q给得太大,滤波器会过度相信过程模型,抗量测噪声能力差;Q给得太小,滤波器会过度相信预测值,新息长期不衰减,最终出现“假收敛”。遇到这种情况,先画新息序列,如果新息方差远大于理论计算的P_zz,基本就是过程噪声不足。

第三名:轮胎模型突变。路面附着突变时,Burckhardt模型的c1、c2、c3参数在滤波器内部其实是固定的,模型无法表达“同一条曲线形状突然变成另一种”这种变化,滤波器会在切换瞬间产生很大的新息,严重时直接震荡。解决办法是给μ的状态噪声一个自适应的上限:检测到滑移率增大且新息超阈值,就临时放大Q_μ,让滤波器更快追踪新的附着平台。

5.2 低滑移率时μ估计值漂移怎么办

低滑移率区间的观测性弱,这是个原理问题,不是滤波器的问题。在滑移率低于3%时,无论怎么调参数,μ估计值都容易呈现随机游走的漂移。我的处理办法是从软件层面限制更新:当λ低于某个门限时,冻结μ状态对应的P矩阵更新,只在λ进入敏感区时才放开。做法上可以给滤波器加一个“观测性门控”:λ小于1%时不执行μ相关量测更新,λ在1%到10%之间按比例衰减状态噪声,λ大于10%才全速更新。这个启发式门控看起来很土,但实测下来比任何调参都有效。

5.3 车上实测与仿真差距的处理

仿真和实车最大的差距在信号质量和参考值。仿真里我叠加的高斯白噪声很“干净”,真车上轮速信号在低速时会有跳齿,加速时传感器馈线的电气噪声也容易混进来。我踩过的坑是,用仿真标定的R矩阵直接上实车,结果μ估计曲线毛刺大到没法看。

解决流程是:先用一段实际采集的轮速和加速度静态数据,统计测量噪声方差,再把R矩阵调整为实测值的1.5到2倍,留出裕量。另外一个容易出问题的点是IMU的安装偏差和坡道。如果车辆停在坡道上,加速度计会直接测到重力分量g*sin(坡度),这个偏置会强烈污染纵向加速度观测。要么在状态方程里增加坡度估计状态,要么在实车测试时选择平整场地,先把算法验证通过后再做坡度补偿。

5.4 常见问题速查表

现象可能原因解决措施
滤波发散、数值溢出P矩阵非正定检查UKF负权重、Cholesky分解、关闭异常P更新
μ估计在低滑移区漂移观测性弱增加λ门控,冻结μ更新
μ收敛慢、曲线拖尾长Q_μ太小或激励不足加强滑移激励,或自适应放大Q_μ
新息长期不归零Q和R比例失衡画新息序列,按实测噪声重设R
左右轮μ差异大载荷转移未补偿引入纵向/侧向载荷转移模型
实车噪声导致毛刺大R矩阵来自仿真、未用实测噪声标定用静态实测数据重设R矩阵

6. 从仿真到嵌入式的几个实操要点

模型和算法跑通了,真正耽误时间的是工程化环节。这里补充几个我在代码层面花过大力气的细节。

首先是矩阵运算库的选择。UKF和CKF每步都要做Cholesky分解和矩阵求逆,手写循环效率低且数值不稳定。我直接用了现成的线代库,在桌面验证时用Eigen,嵌入式移植时用对应的轻量化版本,只保留需要的分解和求逆函数。特别注意,矩阵求逆不要直接用逆矩阵,先尝试用Cholesky分解求逆,数值稳定性更好。

其次是采样周期。我把滤波主循环放在定周期中断里跑,10ms周期在常见的MCU上完全是富余的。一个八维状态、双传感器观测的CKF,单帧计算时间大概在几十微秒量级,CPU占用很低。真正耗时间的是调试中频繁修改模型参数后重新编译烧录,因此我会把轮胎模型参数、Q/R对角线做成可外部修改的标定量,不固化在代码里,这样标定工程师在车上改参数不用重新刷写固件。

最后是输出曲线的平滑问题。滤波器本身输出的μ估计已比较光滑,但如果你把μ和λ同时画出来做联合分析,会看到μ曲线在某些工况下仍有小幅锯齿。这种锯齿不是滤波器坏了,而是路面附着系数在物理上确实存在微小波动。不要在滤波后再做一遍低通滤波,那会掩盖真实趋势,正确的做法是增加状态方程的激励约束,或者提高轮速信号的采样质量。

我个人做完这个项目最大的体会是:UKF和CKF本身只解决“给定模型怎么把状态推出来”的问题,模型准不准、激励够不够、初值和噪声设得合不合理,才是决定估计结果能不能用的关键。仿真是验证工具,真车才是试金石。如果只做算法对比,两套滤波器的精度差距远小于它们的实现复杂度差异;真要落地,把精力放到滑移率激励检测、载荷补偿和路况自适应上,比反复纠结滤波器形式有价值得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询