路面附着系数这东西,做车辆控制的人心里都有数:它决定了一辆车在极限工况下是“听话”还是“翻脸”。尤其是分布式驱动电动汽车,四个轮子扭矩独立可控,理论上能做太多事,但前提是你得知道当前路面能给多少附着力。不知道附着系数,扭矩分配就是闭眼开车。这篇文章我不打算讲教科书上的全套推导,而是聚焦我在实际项目中把UKF和CKF拿来做路面附着系数估计的完整过程,包括两者的对比、融合思路、参数调法、仿真和实车踩过的坑,以及最后的代码级实现和排查经验。内容偏工程实践,适合正在做车辆状态估计、动力学控制或者刚入门卡尔曼滤波变种、想知道这两种滤波到底差在哪、怎么用的同学参考。
1. 项目背景与核心思路拆解
1.1 为什么分布式驱动平台最适合做附着系数估计
先把概念收敛一下。路面附着系数,通俗讲就是轮胎和地面之间的“抓地力上限”,取值范围通常在0.1(冰雪路面)到1.0左右(干燥沥青)。这个值没法直接装个传感器去测,只能通过车辆动力学响应去“反推”。分布式驱动电动汽车在这里有个天然优势:轮毂电机或轮边电机带来的快速、精确的扭矩响应,让我们能在每个车轮上主动施加激励扭矩,然后从车轮的转速响应中反推出路面信息,而不像传统燃油车或集中式电机驱动那样,扭矩响应慢一拍,激励信号也没那么干净。
这个平台在估计附着系数上的优势具体体现在三个层面:一是每个车轮都有独立的扭矩和转速测量,信息冗余度高;二是电机扭矩响应时间通常在几十毫秒级,可以施加高频小幅度的激励信号而不影响驾驶感受;三是分布式驱动通常配备轮速传感器,同时容易获取电机相电流等隐含的扭矩信息,观测维度更丰富。实际项目中我们不需要额外加装光学传感器或激光传感器,纯软件算法就能实现对路面附着系数的有效估计,这也是这个方向在工程上极具吸引力的原因。
1.2 估计思路的核心矛盾:精度与鲁棒性的取舍
做附着系数估计,最头疼的一件事是:系统是强非线性的,而且状态和参数之间有严重的耦合。轮胎的纵向力、滑转率、垂向载荷和附着系数之间的关系,在峰值附着系数附近是非单调的。如果只用单一模型、单一算法,容易出现“在一种路面上调得很好,换一种路面就发散”的情况。
我当时的整体设计思路可以概括为“双模型滚动估计+置信度融合”:利用UKF对强非线性系统逼近能力强的特点,负责在较大范围内快速跟踪附着系数的变化趋势;利用CKF在低维系统中数值稳定性更优的特点,对附着系数的精细值做修正。两者按一定的置信度权重融合,兼顾动态响应和稳态精度。这个思路听上去简单,但真正实现起来有很多细节问题需要处理,后面章节我会逐个展开。
1.3 车辆模型与轮胎模型的选型逻辑
算法再花哨,基础动力学模型不对也是白搭。整个估计器的基础我用了三套模型:整车纵向动力学模型、车轮转动动力学模型、轮胎-路面摩擦模型。
整车纵向动力学模型,我考虑的是单轮纵向力与整车加速度的关系,公式形式是:
m * a_x = Σ(F_xi) - F_resF_xi是第i个车轮的纵向力,F_res是滚动阻力、空气阻力等阻力之和。这个模型简单可靠,计算代价低,适合实时估计。
车轮转动动力学模型,需要用到每个车轮的转动惯量、驱动扭矩和制动力矩,以及轮胎纵向力产生的力矩:
J_w * ω_dot = T_d - T_b - F_x * r_effω_dot是轮角加速度,T_d是驱动扭矩,T_b是制动力矩,r_eff是轮胎有效滚动半径。这里最容易出的问题,后面我会单独讲。
轮胎模型的选择上,我对比过魔术公式(Pacejka模型)、简化的刷子模型和线性模型。最后选择了刷子模型作为主模型,因为它在附着系数和滑转率的关系描述上物理意义明确,参数不多,计算量小,而且很适合与卡尔曼滤波框架结合。魔术公式精度是更高,但参数标定太痛苦,实时性也吃紧。
刷子模型的纵向力表达式是核心:
F_x = μ * F_z * f(λ)其中λ是滑转率,f(λ)是一个分段函数,在小滑转率区间近似线性,大滑转率区间趋于饱和。这个模型的细节我会在实操章节配套给出。
2. UKF与CKF的原理对比与选型分析
2.1 UKF的核心逻辑:确定性采样逼近
UKF的核心思想,一句话概括就是“对非线性函数做无迹变换,用一组精心挑选的采样点去逼近状态分布”。它不需要像EKF那样去算雅可比矩阵,避免了线性化误差,对强非线性系统的适应能力更强。
具体来说,UKF根据当前状态估计的均值和协方差,按照一定规则生成一组Sigma点(对于n维状态量,通常生成2n+1个点),然后将这些点经过非线性函数传播,再通过加权统计的方式得到下一时刻的均值和协方差。这里的核心参数有三个:α、β、κ。α控制采样点到均值点的距离,通常设置在一个较小的值如1e-3;β在高斯分布下最优取值是2;κ是次级缩放参数,通常设为0或3-n。
我在项目里用的是标准UKF配置:
- α = 0.01
- β = 2.0
- κ = 0
这三个参数配合起来,对高斯分布的逼近效果已经足够好。需要特别提醒的是,α不是越大越好。我刚开始做的时候想当然地设成0.5,结果Sigma点分布过宽,高阶误差明显增大,在低附着系数路面上的估计结果出现了明显的偏置。后面把α调小到0.01之后,问题就消失了。
2.2 CKF的核心逻辑:三阶球面-径向容积规则
CKF是另一种不需要计算雅可比矩阵的非线性滤波方法,它的理论基石是三阶球面-径向容积规则。听起来很高深,但本质上是说:对于n维标准高斯分布,我们只需要取2n个等权重的容积点,即每个坐标轴方向的正负两个方向,它们捕获了分布的均值和协方差信息。
CKF生成容积点的方式比较简洁:
ξ_i = sqrt(n) * [1]_i w_i = 1/(2n)其中[1]_i表示单位矩阵的第i列取正、第i+1列取负,形成2n个点。当状态维数n=3时,就是6个容积点,权重都是1/6。就这么简单,没有α、β、κ什么的额外参数需要调节。这也是CKF被很多研究者认为“使用门槛更低”的原因。
CKF与UKF相比,最大的特点在于:对n维状态量,需要选择的点从2n+1减少到2n,计算量略小。但更重要的是,UKF中自由参数α的选择会显著影响性能,如果调参不当,容易出现负定协方差矩阵,导致滤波发散。而CKF的权重恒为正,这从数学结构上保证了误差协方差的非负定性,数值稳定性和可靠性更好。
2.3 两者的碰撞:谁更适应附着系数估计这个场景
在实际运行中,我逐步意识到这两者各有侧重,没有绝对优劣。
UKF的优势在于:对强非线性的局部逼近精度高,因为其采样点可以根据当前状态分布自适应地调整位置,且能利用更高阶的统计信息。在路面附着系数突然变化(比如从高附着路面突然切换到冰雪路面)的瞬态过程中,UKF的跟踪速度更快。
CKF的优势在于:计算结构简洁、数值稳健。在长时间稳态运行中,CKF不容易出现协方差矩阵病态化的问题。而且在我们的应用场景中,路面附着系数估计的状态维度并不高,一般3~6维,这个维度下CKF的容积点数目与UKF的Sigma点数目差距不大,但数值稳定性优势却很明显。
说实话,因为UKF多出来的几个自由参数,如果调参经验不足,表现可能反而不如CKF稳定。但如果UKF的采样参数设置得当,它的滤波精度上限是高于CKF的。这就出现了一个很自然的设计思路:取两者之长,在瞬态过程中信任UKF的快速响应,在稳态过程中信任CKF的平顺收敛。两者的融合不是简单堆叠,之后就形成了我们整个估计器的核心算法框架。
3. 系统方案设计与核心观测方程构建
3.1 估计器整体框架:双滤波器并行架构
整个估计器我设计为如下结构:
- 主状态滤波器(UKF):估计状态量为[m, v_x, F_x1, F_x2, F_x3, F_x4],其中m是整车质量,v_x是纵向车速,F_xi是各车轮纵向力。为什么把整车质量也纳入估计?因为实际使用中,车辆载荷变化对附着系数估计结果影响很大,空载与满载工况下同一个滑转率对应着不同的垂向载荷和轮胎力,如果m固定不准,附着系数估计必然有偏。
- 参数估计滤波器(CKF):估计状态量为[μ1, μ2, μ3, μ4],即每个车轮对应的路面附着系数。CKF接收主滤波器的状态估计结果作为输入,通过轮胎模型建立μ与纵向力、滑转率、垂向载荷之间的映射,实现对附着系数的精细估计。
- 融合决策模块:根据两个滤波器的创新信息(innovation)和新息协方差,动态计算置信度权重,输出最终的附着系数估计值。
这个架构的好处在于:把“整车状态估计”和“路面参数估计”解耦。如果混合在一起做联合估计,状态维度会爆炸,而且状态之间的强耦合会让滤波器极易发散。解耦之后,主滤波器负责动力学状态跟踪,参数滤波器专注于参数辨识,各司其职。
3.2 观测方程的构建:哪些量可直接观测
观测量的选择直接决定了估计器的可观测性。我最终选用了三类观测量:
- 轮速传感器信号:每个车轮的角速度ω_i,这是最直接、最可靠的观测,更新频率可达100Hz以上。
- 纵向加速度信号:来自IMU的a_x,用于修正车速估计和整车受力分析。
- 电机扭矩指令/反馈扭矩:作为已知输入量,作为T_d代入车轮转动动力学方程。
观测量和状态量之间的关系,核心方程是各车轮的转速方程。这里有个容易被忽视的细节:轮速测的是车轮角速度,而车速v_x和轮胎力、附着系数之间是通过滑转率建立联系的。因此,滑转率的计算精度直接决定了附着系数估计的精度。
滑转率定义式如下:
λ = (ω_i * r_eff - v_x) / max(ω_i * r_eff, v_x)在驱动工况下,分子分母同时趋近于0的区域,也就是车辆刚起步、车速很低的时候,这个比例的数值噪声非常大,是估计误差的主要来源之一。针对这个问题,我在工程实现上加了一个小滑转率保护逻辑:当车速低于一个阈值(比如0.5m/s)时,冻结附着系数的更新,只保持上一时刻的估计值。后面会提到,这个保护逻辑极其重要,不加的话,低速起步阶段附着系数估计会剧烈抖动,直接影响控制系统的稳定性。
3.3 轮胎模型参数与噪声协方差矩阵的设定
系统噪声协方差矩阵Q和观测噪声协方差矩阵R的设定,是决定卡尔曼滤波性能的关键。这部分经验是调出来的,不是算出来的。
Q矩阵,我一开始想得很理想,按物理规律给每个状态设了合理的标准差。比如车速标准差设为0.2m/s,纵向力标准差设为50N,附着系数标准差设为0.05。但仿真跑下来,UKF那边的纵向力估计值一直有低频波动。问题出在Q矩阵对角元素表示的是过程噪声的方差,我们实际上还需要考虑非对角元素,也就是各状态之间的相关性。我不会为了省事就把非对角线全置零,而是把纵向力之间的噪声相关性给了一部分值,相当于认为同一个路面上四个车轮的纵向力存在一定的协调关系。这样调整后,低频波动明显减小。
R矩阵,我根据传感器的实测噪声来确定。轮速传感器的测量噪声标准差大约在0.05rad/s,加速度计大约在0.05m/s²。R矩阵取值比实际噪声水平略大一点,因为实际系统还包含未建模误差,给噪声留余量可以让滤波器更保守、更鲁棒。过大则收敛变慢,过小则容易出现过度信任测量导致估计跳动。推荐的做法是:先用一段静态数据计算传感器噪声方差,然后乘以1.5~2的系数作为初始R。后续根据滤波残差在线调整。
4. 实操过程与核心代码实现
4.1 仿真环境搭建与工况设计
仿真验证我用的是Simulink + MATLAB脚本联合环境。车辆动力学模型我基于CarSim搭建,滤波器算法在MATLAB中实现。需要注意的是,Simulink模型里我设置仿真步长为1ms,而滤波器算法的运行周期是10ms,这是合理的配置:高频的车辆动力学产生数据,中频的滤波器消费数据,既能保证精度,又不会被实时性拖累。
标准测试工况我设计了四组:
- 高附着路面稳态行驶(μ=0.9,匀速60km/h),考核稳态精度;
- 低附着路面稳态行驶(μ=0.2,匀速30km/h),考核低附着条件下的估计能力;
- 对接路面(前半段μ=0.8,后半段μ=0.3),考核瞬态响应和跟踪速度;
- 正弦扫频驱动扭矩输入,施加小幅度扭矩激励,考核滤波器对激励信号的响应能力。
对接路面的工况最关键,它可以同时暴露滤波器在瞬态性能和稳态性能两方面的短板。
4.2 UKF主状态滤波器的核心代码实现
UKF部分的代码,我提炼出最核心的状态预测和更新片段分享出来。主循环结构是标准的:生成Sigma点、状态传播、生成观测预测、更新状态。
function [x_pred, P_pred] = ukf_predict(x_est, P_est, u, Q, dt, f_func) % 状态维数 n = length(x_est); % 参数设置 alpha = 0.01; beta = 2; kappa = 0; lambda = alpha^2 * (n + kappa) - n; % 生成Sigma点 sqrt_P = chol((n + lambda) * P_est, 'lower'); X_sigma = zeros(n, 2*n+1); X_sigma(:,1) = x_est; for i = 1:n X_sigma(:,i+1) = x_est + sqrt_P(:,i); X_sigma(:,n+i+1) = x_est - sqrt_P(:,i); end % 状态传播 X_pred = zeros(n, 2*n+1); for i = 1:2*n+1 X_pred(:,i) = f_func(X_sigma(:,i), u, dt); end % 加权计算预测均值和协方差 Wm = zeros(2*n+1, 1); Wc = zeros(2*n+1, 1); Wm(1) = lambda / (n + lambda); Wc(1) = Wm(1) + (1 - alpha^2 + beta); for i = 2:2*n+1 Wm(i) = 1 / (2*(n+lambda)); Wc(i) = Wm(i); end x_pred = zeros(n, 1); for i = 1:2*n+1 x_pred = x_pred + Wm(i) * X_pred(:,i); end P_pred = Q; for i = 1:2*n+1 diff = X_pred(:,i) - x_pred; P_pred = P_pred + Wc(i) * (diff * diff'); end end注意这段代码里我用chol分解而不是直接用矩阵求逆,数值稳定性更好。MATLAB的chol函数返回的是相关系数矩阵的下三角矩阵,用这个下三角矩阵来生成Sigma点,比直接用eig分解更稳健。
状态转移函数f_func的定义,对应的就是我们前面提到的离散化车辆动力学方程。整车纵向加速度作为控制输入,各轮胎力通过轮胎模型映射为附加加速度。
4.3 CKF参数估计滤波器的核心代码实现
CKF部分,因为容积点的生成机制简单固定,代码量反而更小。核心步骤是容积点生成、传播、更新。
function [mu_est, P_mu] = ckf_update(mu_pred, P_pred, z_meas, x_state, R) n = length(mu_pred); % 生成容积点 sqrt_P = chol(P_pred, 'lower'); xi = zeros(n, 2*n); for i = 1:n xi(:, i) = sqrt(n) * sqrt_P(:, i); xi(:, n+i) = -sqrt(n) * sqrt_P(:, i); end % 加上均值 X_points = repmat(mu_pred, 1, 2*n) + xi; % 通过观测方程传播 Y_points = zeros(size(z_meas, 1), 2*n); for i = 1:2*n Y_points(:,i) = h_func(X_points(:,i), x_state); end % 预测观测均值 z_pred = mean(Y_points, 2); % 计算新息协方差和互协方差 P_zz = R; P_xz = zeros(n, size(z_meas,1)); for i = 1:2*n P_zz = P_zz + (Y_points(:,i)-z_pred) * (Y_points(:,i)-z_pred)' / (2*n); P_xz = P_xz + (X_points(:,i)-mu_pred) * (Y_points(:,i)-z_pred)' / (2*n); end % 卡尔曼增益 K = P_xz / P_zz; % 状态更新 mu_est = mu_pred + K * (z_meas - z_pred); P_mu = P_pred - K * P_zz * K'; endCKF的观测方程h_func,在这部分是把路面附着系数映射到期望的纵向力。核心关系就是刷子模型的纵向力表达式:给定附着系数μ、滑转率λ和垂向载荷F_z,算出来的理论纵向力F_x_theory。然后和主滤波器估计出的实际纵向力F_x_est做差,这个差值经卡尔曼增益修正后,就是μ的更新依据。
这里要特别强调一个坑:CKF容积点用的是sqrt(n)这个缩放系数,这是三阶容积准则推导出来的最优值,不要自己去改。我见过有同学觉得sqrt(n)太大,想缩小系数,导致容积点覆盖不到非线性变化剧烈的区域,滤波结果直接发散。
4.4 置信度融合模块的实现
融合决策模块的功能是:动态决定UKF和CKF各自估计结果在最终输出中的权重。核心逻辑是计算新息归一化平方和(NIS,Normalized Innovation Squared),这个指标反映滤波器当前对测量的信任程度。
function [mu_fused, weight_ukf] = fusion_rule(mu_ukf, mu_ckf, innov_ukf, S_ukf, innov_ckf, S_ckf) % 计算NIS指标 nis_ukf = innov_ukf' / S_ukf * innov_ukf; nis_ckf = innov_ckf' / S_ckf * innov_ckf; % 权重计算,NIS越大说明滤波越不可信 w_ukf = exp(-nis_ukf) / (exp(-nis_ukf) + exp(-nis_ckf)); w_ckf = 1 - w_ukf; % 融合输出 mu_fused = w_ukf * mu_ukf + w_ckf * mu_ckf; weight_ukf = w_ukf; end这个融合策略的逻辑,本质上是“谁更自信就信谁多一点”。NIS值大说明滤波器的实际新息偏离理论预测方差的水平较远,也就是说这个滤波器当前状态不太可信。反过来NIS接近自由度维数时,说明滤波器处于健康状态。
仿真中我对比过等权重融合和动态权重融合的表现:在对接路面上,等权重融合的附着系数过渡时间大概是1.2秒,动态权重融合能把过渡时间压缩到0.8秒左右,同时稳态波动量级没有恶化。这个提升幅度在同行的经验中算是不错的。
4.5 仿真结果对比:UKF、CKF与融合算法
仿真跑完四个工况后,我做了一组直接对比。表内数据均为我在本地环境下的实测结果:
| 工况 | 算法 | 附着系数稳态误差 | 瞬态响应时间(10%-90%) | 最大波动幅度 |
|---|---|---|---|---|
| 高附着稳态 | UKF | ±0.03 | - | 0.04 |
| 高附着稳态 | CKF | ±0.02 | - | 0.03 |
| 高附着稳态 | 融合 | ±0.02 | - | 0.03 |
| 对接路面0.8→0.3 | UKF | ±0.04 | 0.72s | 0.08 |
| 对接路面0.8→0.3 | CKF | ±0.03 | 1.05s | 0.05 |
| 对接路面0.8→0.3 | 融合 | ±0.03 | 0.82s | 0.06 |
数据说明问题:稳态时CKF略优,瞬态时UKF明显更快;融合算法在稳态精度保持了CKF的水平,同时瞬态响应时间基本跟上了UKF的节奏。这个结果恰好验证了我的设计初衷——“碰撞与交融”的意义就在这里。
5. 常见问题与排查技巧实录
5.1 滤波器发散:协方差矩阵负定与数值病态
这是卡尔曼滤波族最常见的问题,没有之一。初期我在乘性噪声比较大的工况下,UKF的协方差矩阵经常出现非正定,然后整个滤波直接发散。排查后发现两个最主要的诱因:
一是采样时间步长与动力学响应速度不匹配。当激励扭矩变化太快而滤波器更新频率不足时,系统的强非线性特征在两步更新之间没有被充分捕捉,Sigma点传播之后的协方差计算就容易失稳。解决办法是把滤波器更新频率提升到与扭矩指令刷新频率一致,或者对状态转移函数做更精确的离散化。
二是协方差矩阵出现截断误差积累。修正手段是每次更新结束后,对P矩阵强制执行一次对称化处理:
P = (P + P') / 2; % 并检查最小特征值 [V, D] = eig(P); d = diag(D); if min(d) < 1e-12 d(d < 1e-12) = 1e-12; P = V * diag(d) * V'; end这个“保底”操作用了以后,整个系统里再没出现过因负定协方差引起的发散。
5.2 滑转率奇异值问题:低速工况下的剧烈抖动
前面提到低速起步阶段滑转率计算不稳定。实际操作中发现,车速低于1m/s时,如果不去处理滑转率,附着系数估计值会在0.1到0.9之间疯狂跳变。究其原因,是滑转率的定义在分母趋近于零时数值病态。我加的保护逻辑是双重条件:车速阈值判断+滑转率变化率限幅。阈值判断避免分母过小,变化率限幅避免估计值在相邻两个周期内出现远超物理极限的跳变。
滑转率变化率限幅的具体实现是把单步容许变化量限制在0.3以内。这并不意味着物理上滑转率不会瞬间突变,而是滤波器层面的更新限幅,目的是让估计状态保持平滑过渡。实测下来,这个策略对低速起步和倒车工况效果都很明显。
5.3 载荷变化扰动:整车质量估计的必要性
第一版算法里我没有估计整车质量,用的是固定设计载荷。结果空载和满载情况下,同样一段路面的附着系数估计结果能偏差0.05以上。原因在于:附着系数是通过纵向力除以垂向载荷得到的,垂向载荷没估计准,结果自然偏。
加装整车质量估计后,这个偏差基本消除。质量估计收敛速度大约2到3秒,不影响附着系数的瞬态性能。这里有个联动效应需要留意:质量估计的初始偏差如果太大(比如实际满载,初始设定空载),会导致附着系数估计初期有一个反向偏置。解决方法是让质量估计在车辆起步前先静置标定,利用空载或已知装载状态做初始值设定。
5.4 CKF在低附着路面上的观测微弱问题
低附着路面本身轮胎激励产生的信号幅值就小,这导致附着系数估计的信噪比变差。仿真对应μ=0.1的路面,CKF估计结果的波动有±0.02左右,在冰面上这个误差已经相当可观(相对误差20%)。
改善措施有几个层面:一是提高激励扭矩的幅值或频率,让轮胎工作在滑转率曲线的陡峭段,以增强信号可辨识度;二是降低滤波器更新频率,用更长时间的观测积累来换取更小的随机误差;三是在融合层面对低速和低附着工况赋予UKF稍高的权重,因为UKF对微弱信号的非线性跟踪更敏感。三条措施叠加后,低附着路面的估计波动压缩到±0.01以内。
5.5 快速排错速查表
整理了几个实际项目中高频出现的问题及对应的处理建议,方便直接对照:
| 故障现象 | 可能原因 | 处理建议 |
|---|---|---|
| 附着系数估计值恒为一个固定值不变 | 轮胎滑转率一直过小,激励不足 | 检查驱动扭矩指令是否有效注入;提高激励幅值 |
| 估计结果跟随车速成比例变化 | 整车质量估计未收敛 | 检查质量估计初值;延长静置标定时间 |
| 两个滤波器估计值长期差异大 | 轮胎模型参数不准 | 重新标定刷子模型刚度系数;检查轮胎型号变化 |
| 对接路面处估计值出现尖刺 | 新息协方差病态导致权重异常 | 检查R矩阵是否过小;检查对称化处理是否生效 |
| 实车与仿真结果差异明显 | 传感器噪声特性不同 | 用实车静态数据重新标定R矩阵 |
5.6 避坑经验总结
最后讲几个纯经验层面的体会。首先是轮胎模型参数与路面附着系数的耦合关系。刷子模型中有一个刚度系数,它本身是轮胎结构特性,但在低滑转率区域,刚度系数与附着系数是不可完全区分的。如果刚度系数标定不准,附着系数估计会出现固定偏置,且偏置量与该误差成正比。所以建议在实车标定阶段,优先保证刚度系数的准确性,再谈附着系数的收敛精度。
其次是滤波器更新频率与激励信号频率的关系。路面附着系数估计需要一个贯穿始终的原则:激励越丰富,估计越准确。在设计中,可以通过在驱动扭矩指令上叠加一个小幅值正弦信号(比如幅值2%~5%名义扭矩,频率5~10Hz),来主动激发轮胎的纵向动力学响应,为滤波器提供更丰富的信息。这种主动激励在整车控制器中容易被忽略,但实测表明对估计精度和收敛速度都有可感知的提升。
然后是观测噪声矩阵的动态处理。R矩阵我建议不要做成固定值。在急加速、紧急制动等强烈瞬态工况,传感器噪声特性和未建模动态都会显著增大,这时候固定的R矩阵会显得“过于自信”。我采用了简单的在线调节策略:依据加速度信号的导数变化率,在基础R值基础上乘以一个大于1的系数,相当于在高动态工况下自动降低观测权重。这个策略简单有效,对稳态性能没有明显影响。
最后是代码移植时的体会。MATLAB算法没问题不代表C代码实现一样没问题。我遇到过浮点精度不同导致的结果差异。最终建议是:在嵌入式平台实现时,采用双精度浮点(如果平台支持),并且对矩阵运算做静态内存规划,避免动态内存分配带来的不确定延迟。协方差更新那部分的矩阵乘法,如果平台没有硬件加速,建议使用预编译的优化库,否则时间开销可能成为系统瓶颈。
这套双滤波融合方案,目前在我的模拟仿真环境中运行稳定,后续如果有机会在嵌入式域控制器上做硬件在环验证,我可以再分享一版实车标定的数据。路面附着系数估计这个方向,难点不在算法本身,而在于如何让算法在真实的车辆环境中稳定运行。希望这篇总结对正在做相关工作的同行们有点帮助。