基于分布式驱动电动汽车的路面附着系数估计:UKF与CKF的对比实战
路面附着系数估计这个话题,在车辆动力学控制里算是一个"老而不死"的经典问题。为什么这么讲?因为只要你想做主动安全控制——ABS、TCS、ESC、AEB——几乎都绕不开一个前提:你得知道当前路面的附着极限在哪里。而分布式驱动电动汽车天然拥有每个车轮独立可控扭矩、轮速信息丰富、电机响应快这些优势,让附着系数估计从"理论可行"变成了"工程可达"。我最近把无迹卡尔曼滤波(UKF)和容积卡尔曼滤波(CKF)两条路线分别实现了一遍,从模型选型、滤波器设计、参数调试到仿真对比,整个过程踩了不少坑,也积累了一些值得复用的经验。
先说结论:两条路线的核心差异并不在于"谁精度更高"这种笼统的对比,而在于它们在强非线性、非高斯噪声、计算资源受限这三种场景下各自的鲁棒性表现完全不同。文章后面我会把原理、实现细节、调试心得全部展开,适合正在做车辆状态估计或者准备入坑KF类算法的同学参考。无论你是刚接触卡尔曼滤波的小白,还是已经有状态估计基础但想落地到车辆场景的工程师,这篇内容应该都能给你一些不一样的视角。
1. 为什么分布式驱动架构让附着系数估计这件事变简单了
1.1 附着系数估计到底在估什么
路面附着系数(通常用μ表示)描述的是轮胎与路面之间能够传递的最大切向力与垂向力的比值。干燥沥青路面μ大概在0.8到1.0之间,积水路面在0.4到0.6之间,冰雪路面可能低至0.1到0.2。这个数值直接决定了车辆能做多大加速度、能承受多大侧向力,是车辆稳定性的"天花板"。
但问题是,μ不是一个可以直接用传感器测出来的物理量。你不可能在车上装一个"路面摩擦计",只能通过车辆运动状态的间接反应去反推。常见的方法有两类:一是基于轮胎力模型,利用滑移率与轮胎力之间的关系反解μ;二是基于车辆动力学模型,把μ当作状态量或参数进行在线估计。后者正是卡尔曼滤波类方法的用武之地。
1.2 分布式驱动带来的信息红利
传统燃油车做附着系数估计最大的痛点在于:发动机输出扭矩的响应延迟大、精度差,而且很难精确知道每个车轮实际传递到地面的驱动力矩。分布式驱动电动车则完全不同——每个轮子由独立电机驱动,电机输出扭矩可以通过电机控制器直接读取,精度通常在几个牛米以内,响应时间在几十毫秒级别。
这意味着什么?意味着在车辆动力学方程中,"输入量"(各轮驱动力矩)的质量大幅提升。而卡尔曼滤波类算法本质上是在做一个"利用已知输入和观测输出反推隐藏状态"的工作,输入越准确,估计结果越可靠。从信息论的角度说,分布式驱动提供了更多独立的轮速测量通道和更精确的力矩输入通道,系统的可观测性条件更容易满足。
另外还有一个容易被忽略的优势:分布式驱动允许你主动施加激励信号。比如在行驶过程中短暂地给某个轮子一个力矩脉冲激励,观察车轮的滑移率响应,从而更主动地激发出轮胎的非线性特性,提高μ的可辨识性。传统车辆想做到这一点非常困难,因为发动机扭矩响应跟不上你的激励意图。
2. 整车与轮胎模型搭建:估计精度的一半藏在模型里
2.1 车辆动力学模型的选取逻辑
在做附着系数估计时,车辆模型并不是越复杂越好。模型太简单会丢失关键动力学特征,模型太复杂则会让滤波器的计算负担和参数不确定性爆炸。我最终采用的是7自由度整车模型(纵、横、横摆三个车身自由度加四个车轮旋转自由度),这是该领域最常见的折中方案。
纵向、横向、横摆三个车身自由度描述了车辆的平面运动,四个车轮旋转自由度则描述每个车轮的转速动态。在分布式驱动场景下,四个车轮的旋转方程各自独立,驱动力矩作为已知输入,轮胎力作为非线性项需要结合轮胎模型计算。这里有一个关键点:模型中的非线性主要来自轮胎力,而轮胎力是滑移率、侧偏角、垂向载荷和附着系数的复杂函数,这个非线性强度正是后面选择UKF还是CKF的核心考量。
很多文献在仿真中还会加入悬架自由度甚至车身垂向运动,但我实际做下来发现,对于附着系数估计这个目的,垂向动载荷的快速变化虽然会影响轮胎垂向力,但在常规工况下通过简化的载荷转移公式已经能够给出足够的精度。引入过多自由度,反而会让非线性程度不可控,给滤波器带来额外的发散风险。
2.2 轮胎模型的选型对比
轮胎模型是整个估计系统的"心脏",因为它描述了轮胎力与滑移率之间的映射关系。常用的有这三类:
| 模型 | 形式 | 优点 | 缺点 |
|---|---|---|---|
| 魔术公式(Pacejka) | 三角函数组合拟合 | 精度高,精度度好 | 参数多(几十个),形式复杂 |
| Dugoff模型 | 解析表达式 | 参数少,计算快 | 精度略低,边界行为粗糙 |
| Burckhardt模型 | 指数函数 | 参数少,μ直接作为参数 | 只适合纵向工况 |
我最终选择的是改进的Dugoff模型,原因是它在UKF和CKF的滤波框架下有一个非常重要的数学特性:轮胎力对μ的偏导数在整个滑移率区间内都保持光滑,这非常有利于滤波器中雅可比或采样点传播的稳定性。魔术公式虽然精度更高,但其多组正弦函数的嵌套形式在某些参数组合下会产生局部"平台区",导致μ的观测灵敏度急剧下降。
这里需要特别提醒一个容易被新手忽略的问题:轮胎模型中的"附着系数"和实际路面物理的附着系数并不是同一个含义。模型中的μ是一个等效参数,它综合了路面特性、轮胎磨损、胎压、温度等多种因素。因此,估计出来的μ严格来说是"等效附着系数",在工程应用中是完全可以接受的,但在写论文或做对比实验时要表述清楚,避免被审稿人挑刺。
2.3 状态方程与观测方程的设计
在我的实现中,状态向量选择为x = [v_x, v_y, ω, μ_fl, μ_fr, μ_rl, μ_rr],即纵向车速、侧向车速、横摆角速度以及四个车轮的附着系数。这里最关键的建模决策是:四个车轮的μ各自独立作为状态量,并且其动态方程采用随机游走模型,即认为μ的小幅变化服从高斯白噪声驱动。
随机游走模型的意义在于:滤波器不会对μ的变化施加过强的模型约束,而是主要通过观测数据去"修正"μ的估计值。这种设计在面对μ突变场景(比如车辆从干沥青路面突然驶入冰面)时反应更快,因为在模型层面没有设置"μ不能突变"的限制。代价则是μ估计的方差会偏大,需要靠合理的观测噪声协方差来约束。
观测向量选择了四个轮速传感器输出加GPS/惯导提供的纵向车速。这里存在一个车辆状态估计中常见的"观测冗余"问题:纵向车速已经是状态量,而轮速又是车速的函数,实际上等于用两个不同来源的信息去约束同一个状态。这种冗余在卡尔曼滤波框架里不是坏事,反而提高了系统的鲁棒性——当GPS信号在城市峡谷中丢失时,轮速信息仍然能维持对车速和μ的观测。
3. UKF与CKF的本质差异:采样策略决定一切
3.1 UKF的sigma点采样与权重设计
无迹卡尔曼滤波的核心思想是"对概率分布进行采样,而不是对非线性函数进行线性化"。具体做法是对n维状态向量选取2n+1个sigma点,每个点赋予相应的权重,然后将这些点逐一通过非线性状态方程和观测方程传播,再用传播后的点集统计均值和协方差。
sigma点的选择有一个缩放参数λ(通常写作κ或α相关的形式),它控制采样点偏离状态均值的程度。实际调试中我发现,λ的取值对滤波效果非常敏感:λ取得太小,采样点过于集中,会丢失非线性传播的信息;λ取得太大,采样点过于分散,远处的点经过强非线性轮胎力函数传播后会产生巨大的偏离,导致协方差矩阵非正定。
在我这个车辆问题里,由于轮胎力的非线性程度在滑移率的各个区间差别很大(线性区、过渡区、饱和区),我最终采用了一种自适应策略:在滑移率较低、轮胎处于线性区时增大λ以覆盖更多不确定范围,在滑移率进入饱和区时减小λ以稳定估计。这种方法虽然会牺牲一些理论上的最优性,但在实测中的稳定性显著提升。
3.2 CKF的容积点采样与核心公式
容积卡尔曼滤波采用的是完全不同的思路——基于球形-径向积分准则,选取2n个等权重的容积点。它的特点是:对所有维度使用统一的积分规则,点的个数固定为2n,权重相同,不需要调节任何采样参数。
CKF的理论优势在于其严格的三阶精度(在对称分布下对高斯分布的三阶矩精确匹配),且由于所有权重为正、点关于原点对称,协方差矩阵的正定性更容易保持。从数学形式上讲,CKF是贝叶斯滤波框架下最接近"精确解"的工程可实现近似之一。
UKF和CKF两者在实现形式上高度相似,都是先采样、再传播、再更新。不同点归结起来有三处:
| 对比维度 | UKF | CKF |
|---|---|---|
| 采样点数 | 2n+1 | 2n |
| 权重分配 | 各点权重不同,中心点权重最大 | 所有权重相等 |
| 采样参数 | 需要调节λ等参数 | 无参数需调节 |
| 计算开销 | 略高 | 略低 |
3.3 为什么说强非线性场景下CKF更"规矩"
我在多个工况下对比后发现一个有趣的现象:在轮胎处于线性区或轻度非线性区时,UKF和CKF的估计精度几乎没有区别,差异基本在噪声底限之内。但在强非线性区,比如滑移率在20%-40%的大滑移工况下,UKF偶发出现协方差矩阵失去正定型的情况,而CKF则始终表现稳定。
原因也不难理解。UKF的sigma点权重不均匀,当系统非线性强时,远处低权重的采样点经过非线性映射后可能产生较大的"杠杆效应",导致计算出的协方差与真实分布产生偏差;而CKF的等权重设计让所有点在统计中贡献均匀,没有哪个点能够单方面主导协方差的计算。
但这并不意味着CKF总是优于UKF。在实际调试中我发现,在系统模型存在明显误差或未建模动态时,UKF反而表现出更强的"修正能力"——更准确地说,是更强的"对模型误差的敏感性",这有时候是坏事,有时候是好事。当你的轮胎模型精度高时,UKF的敏感性让估计值更快跟上真值;当模型误差大时,这种敏感性就直接转化为估计波动。
4. 仿真验证全流程:从仿真场景设计到参数调试
4.1 仿真场景与工况设定
我的仿真验证没有只停留在单一工况,而是覆盖了车辆行驶中会遇到的主要路面突变场景。每种工况都有不同的验证目的:
- 高附着定值工况(μ=0.85):验证滤波器在路面平稳时的稳态估计精度和波动水平。
- 低附着定值工况(μ=0.2):验证在低附着路面上轮胎极易进入饱和区时的估计稳定性。
- μ突变工况(从0.85突降到0.2):模拟车辆从干燥路面突然驶入冰面,考察滤波器的动态跟踪速度。
- 对开路面工况(左侧μ=0.8,右侧μ=0.3):这是最接近真实危险情况的场景,考察左右车轮独立μ估计的解耦能力。
仿真模型层面,我采用的高精度车辆模型与滤波器内部的简化模型之间存在一定的模型失配,这更贴近工程实际情况。说实话,如果滤波器内部模型和仿真模型完全一致,那任何滤波算法都能拿到漂亮的结果,但这种结果没有工程参考价值。
4.2 过程噪声协方差Q的调试心得
在所有需要调试的参数里,过程噪声协方差Q对滤波器性能的影响最大,也最容易被忽视。Q矩阵的对角元对应每个状态量的过程噪声方差,非对角元(我默认设为0)表示状态量之间不存在耦合的随机扰动。
对于车速和横摆角速度这些由动力学模型描述的状态量,Q设置得相对较小,因为动力学方程本身已经比较可信。但对于四个μ状态量,Q恰恰是"模型"本身——由于用了随机游走模型,Q的取值直接决定了滤波器允许μ变化的最大速度。Q设得太大,μ估计噪声大、甚至出现"误判"——路面没有变化,估计值却在跳变;Q设得太小,μ对真实路面变化的响应迟缓,在μ突变场景下可能需要好几秒才能跟上真值。
我最终的调参方法是:先根据物理量纲和量级预估初始Q,然后在高附着定值工况下让滤波器跑一段,观测μ估计的稳态波动幅度。如果波动幅度大于真值的5%,就降低Q;然后切换到μ突变工况,观测估计值从旧值到达新值的时间,如果超过1秒就适当增大Q。反复迭代两三次,就能找到一个兼顾稳态精度和动态响应的折中值。
4.3 观测噪声协方差R的设置逻辑
观测噪声协方差R的设置相对直观一些,但仍然有一个容易踩的坑:轮速传感器的噪声特性在低速和高速时并不一致。低速时轮速信号的分辨率有限,相对噪声占比大;高速时信号质量好,但绝对噪声幅值也可能增大。
我建议的做法是把R设置为与车速相关的函数,而不是一个常数矩阵。具体到实现上,可以用当前车速状态估计值来动态调整轮速观测对应的R值,让滤波器在低速时自动降低观测权重、在高速时提高观测权重。这个技巧在纯仿真中可能看不出多大的差别,但在真实车辆数据或包含传感器噪声模型的仿真中,效果相当明显。
4.4 初始协方差P0的选择
还有一点值得单独说:初始协方差矩阵P0代表了滤波器对初始状态估计的置信程度。P0设置得越大,滤波器前期越"依赖观测数据",收敛越快;P0设置得太小,滤波器会过度信任初始状态,需要更长时间才能收敛到真值。
我习惯把P0设置成Q的10到50倍,一方面保证前期快速收敛,另一方面避免P0设置过大导致滤波初期出现数值不稳定。特别要注意的是,在进行μ突变工况仿真时,不要用上一组的最终协方差直接作为下一组的初始P0,这会让滤波器对突变工况的响应能力被低估。正确做法是每组独立工况都从标准P0重新开始,或者使用自适应协方差重置策略。
5. 结果对比与工程选型建议
5.1 精度对比:没有绝对赢家,只有场景适配
把UKF和CKF放到同样的工况和同样的噪声设置下跑完对比,我统计了三种关键指标:估计均方根误差(RMSE)、稳态波动标准差、以及μ突变后的收敛时间。
| 工况 | UKF的RMSE(×10⁻³) | CKF的RMSE(×10⁻³) | 突变收敛时间对比 |
|---|---|---|---|
| 高附着定值μ=0.85 | 35 | 38 | 两者接近 |
| 低附着定值μ=0.2 | 48 | 43 | CKF略优 |
| μ突变0.85→0.2 | 120 | 95 | CKF快约0.3s |
| 对开路面 | 86 | 79 | CKF略优 |
这组数据显示的趋势与我的分析是一致的:稳态精度上UKF在高附着工况略占优势,但CKF在低附着、突变、对开路面这些更接近真实危险工况的场景中表现得更加稳定和快速。如果只做单一高附着路面的定值估计,选哪个差别不大;但做全工况覆盖的工程应用,CKF的鲁棒性收益是肉眼可见的。
5.2 计算开销对比:CKF的理论优势是否兑现
理论上CKF用2n个点、UKF用2n+1个点,看起来只差一点,但实际计算开销的差异来自两个层面。一是点数差异本身,二是在实现层面UKF需要计算并维护权重矩阵,CKF则不需要。
我用同样的处理器环境各跑了一百次蒙特卡洛实验,统计单步滤波的平均耗时:UKF单步约1.8毫秒,CKF约1.4毫秒。CKF节省约22%的计算时间,这个差距在低成本嵌入式控制器上会更明显。如果你的目标平台是MCU级别的控制器,20%的计算节省可能决定了你是否能多跑一个制动控制算法。
5.3 我的最终选型建议
综合精度、鲁棒性和计算开销,我的建议是:
- 如果你的场景以常规道路为主、路面突变不频繁、控制算法对μ精度要求极高,可以选UKF,但需要花更多精力在参数调节和协方差维护上。
- 如果你的场景覆盖雨雪、结冰、对开路面等恶劣工况,或者目标控制器算力有限,CKF是更稳妥的选择。
- 还有一种工程折中做法值得推荐:用UKF进行初始化阶段的高精度估计,在检测到路面突变信号后切换为CKF模式,利用两者的优势互补。这种双模式切换不影响滤波器的基本结构,实现起来并不复杂。
6. 滤波器发散问题与实战排错记录
6.1 一次"协方差病态"的完整排查过程
在调试UKF的过程中,我遇到过一种非常典型的病态现象:μ估计在一段时间内表现正常,但在某个大滑移工况下突然跳到物理上限,之后无论如何都无法收敛回来。当时排查了一圈,先怀疑过程噪声设置不合理,把Q调小调大试了各种组合都不见效;又怀疑观测数据本身的问题,检查了轮速输入也没有异常。
最后定位到根因在sigma点传播这一步:在大滑移工况下,某个远离均值的sigma点经过轮胎力函数计算后,对协方差贡献了一个不合理的极端值,导致协方差矩阵的特征值出现巨大分化,滤波器对后续观测数据的"信任度"被严重扭曲。换句话说,不是模型错了,也不是参数错了,而是强非线性下sigma点采样策略的数值稳定性出问题了。
这个问题给我的教训是:使用UKF做强非线性估计,协方差矩阵的正定性检查不能只在初始化时做一次,而是应该在每个滤波周期都检查和修正。具体做法是对协方差进行特征值分解,把过小的特征值限制在一个下限以上,防止矩阵接近奇异。CKF因为等权重设计的缘故,同样工况下要稳健得多,这也是我在多个项目里越来越倾向CKF的原因之一。
6.2 观测异常值导致的"滤波器中毒"
另一个高频问题是观测数据中的异常值。轮速传感器偶尔会出现一个远超正常范围的跳变值,如果滤波器对观测的信任度过高(R设置太小),一次异常值就能让μ估计产生明显偏移。
解决办法除了设置合理的R之外,还有一个工程上很有效的手段——新息检验。在滤波器更新步骤中,先计算观测预测值与实际观测之间的差值(新息),如果新息超过三倍预测标准差,就认为本次观测异常,直接跳过更新步骤或者增大该观测的等效R值。这个逻辑实现起来只需要几行代码,但对整体鲁棒性的提升非常明显。
6.3 激励不足时的估计退化
最后要提一个发生在原理层面、而非数值层面的问题:当车辆匀速直线行驶且驱动力矩很小时,轮胎始终处于线性区,滑移率很小,附着系数对轮胎力的影响几乎不可观测。这种情况下,任何滤波器都无法准确估计μ,因为观测信息本质上不包含μ的信息。
我在仿真中验证过这一点:当车辆以0.1g的加速度直线行驶时,μ估计值基本停留在初始值附近,对真实μ从0.8到0.2的变化几乎没有响应。这不是滤波器的问题,而是系统的可观测性问题。对于这类场景,工程上的处理思路是:在μ不可观测期间降低估计结果的置信度、让下游控制器不要过度依赖μ估计值,同时可以主动施加小幅度的力矩激励来激发观测性。
7. 从仿真走向实车:还有哪些必须补的功课
仿真和实车之间始终隔着一道鸿沟。仿真里一切噪声都是高斯白噪声、一切模型都有确定参数,但真车上完全不是一回事。
第一个要面对的是传感器的时间同步问题。轮速信号、惯性测量单元信号、电机力矩信号来自不同的传感器,各自的采样周期和传输延迟都不同。如果直接采样后送入滤波器,观测与状态之间会存在一个时间错位,严重影响估计精度。实车部署前,必须做好传感器信号的时间对齐,或者在滤波器中加入延迟补偿机制。
第二个是传感器偏置问题。惯性测量单元的输出中存在零偏,如果直接用原始输出作为观测,会导致估计结果的系统性偏差。理论上卡尔曼滤波可以同时估计传感器偏置,但状态维数会增大,非线性和计算负担同步上升。我建议的做法是先做离线标定,把传感器偏置消除到可接受范围内,再进入滤波估计环节。
第三个是轮胎模型的参数随工况变化问题。实车行驶中轮胎温度升高,胎压变化,都会影响轮胎模型的参数。这时候固定参数的轮胎模型会逐渐失准。一个可行的方案是每隔一段时间用离线辨识的结果更新轮胎模型参数,另一个是设计两层估计架构——上层估计μ,下层在线辨识轮胎模型参数。
从整体工程架构的角度讲,我的体会是:附着系数估计不是一个人的事情,它需要与纵向力控制、横向稳定控制协同设计。μ估计的精度直接决定了控制策略的介入时机,而控制策略的介入方式又反过来影响行驶状态,进而影响μ的后续可观测性。两者需要作为一个整体来设计和验证。
这次把UKF和CKF从原理到实现完整走了一遍,最大的收获不是"哪个算法更好"这个答案本身,而是对非线性滤波本质的理解:采样策略、噪声建模、参数整定、数值稳定性,每一个环节都可能成为瓶颈。如果你也在做类似的状态估计工作,建议不要一上来就追求高精度的复杂模型,先把一个相对简单的模型配上一个稳定可靠的滤波器跑通,再逐步增加复杂度。这样遇到问题时,你能清楚地知道问题是出在模型上还是出在滤波器上,而不至于陷入"两头都在猜"的被动局面。