4、线性卡尔曼滤波原理:五大核心公式推导、预测与更新步骤详解

说实话,很多做BMS的工程师一听到「卡尔曼滤波」就头大。我当年也一样,看了三天公式,脑子里还是一团浆糊。后来在项目里硬着头皮调代码,才慢慢悟出点门道。

今天咱们就把这层窗户纸捅破。线性卡尔曼滤波,说白了就是一套「预测+修正」的循环。你想想看,我们估算SOC时,既相信模型(安时积分),又相信测量(开路电压),但两者都有误差。卡尔曼滤波干的事就是:把这两个不完美的信息揉在一起,给出一个最优估计

核心思想一句话:用上一时刻的最优值预测当前时刻,再用当前时刻的测量值修正预测值。

线性卡尔曼滤波:预测与更新循环 k-1 时刻 状态估计 x̂k-1 误差协方差 Pk-1 预测步骤 先验估计 x̂k- 先验协方差 Pk- 更新步骤 后验估计 x̂k 后验协方差 Pk k → k+1,循环迭代 测量值 zk

五大核心公式:其实就两组

卡尔曼滤波的五大公式,看着吓人,其实就分两拨:预测公式(2个)更新公式(3个)。我习惯把它们叫做「时间更新」和「测量更新」。

预测步骤(时间更新)

公式1:状态预测

k- = A · x̂k-1 + B · uk-1

这个公式在说啥?说白了就是:根据上一时刻的状态,推测当前时刻的状态。A是状态转移矩阵,B是控制输入矩阵。

拿SOC估算举例:

  • k-1 是上一时刻的SOC估计值
  • A 就是「1」(因为SOC本身不会突变)
  • B · uk-1 就是安时积分那一项:电流 × 时间 / 容量

我的经验:在实际项目中,A矩阵往往就是单位矩阵或者接近单位矩阵。别把它想得太复杂。我曾经在一个项目中把A矩阵设得太复杂,结果滤波效果反而变差——过拟合了。

公式2:误差协方差预测

Pk- = A · Pk-1 · AT + Q

这个公式描述的是:预测的不确定性是如何增长的。Q是过程噪声协方差矩阵,代表模型本身的不确定性。

嗯,这里要注意:Q值设得越大,说明你越不相信模型,卡尔曼滤波就会更依赖测量值。反之亦然。

更新步骤(测量更新)

公式3:卡尔曼增益计算

Kk = Pk- · HT · (H · Pk- · HT + R)-1

卡尔曼增益K,是整个滤波器的「灵魂」。它决定了:你更相信预测值,还是更相信测量值

  • 如果测量噪声R很小(测量很准),K会变大,滤波器更相信测量
  • 如果过程噪声Q很小(模型很准),P会变小,K也会变小,滤波器更相信预测

避坑指南:我曾经在调试一个BMS项目时,发现SOC估计值剧烈跳动。查了两天,最后发现是R值设得太小了——我把电压测量噪声设成了0.001V,但实际上ADC的量化误差就有0.005V。记住:R值要基于实际硬件精度来设,别拍脑袋。

公式4:状态更新

k = x̂k- + Kk · (zk - H · x̂k-)

这就是最终的「最优估计」。括号里的 (zk - H · x̂k-) 叫新息(innovation),就是「测量值减去预测值」的残差。

你想想看:如果预测值和测量值完全一致,新息为0,那就不需要修正。如果不一致,就用K乘以这个差值来修正。

公式5:误差协方差更新

Pk = (I - Kk · H) · Pk-

这个公式更新了估计的不确定性。每次做完测量更新后,不确定性都会降低——因为你又多了一条信息。

一个完整的迭代流程

把上面五个公式串起来,就是卡尔曼滤波的完整流程。我习惯用伪代码来理解:

// 初始化
x̂₀ = 初始SOC估计值(比如50%)
P₀ = 初始误差协方差(体现你对初始值的信心)

// 每个时间步执行
for k = 1, 2, 3, ...:
    // ---- 预测步骤 ----
    x̂ₖ⁻ = A * x̂ₖ₋₁ + B * uₖ₋₁      // 预测状态
    Pₖ⁻ = A * Pₖ₋₁ * Aᵀ + Q          // 预测协方差

    // ---- 更新步骤 ----
    Kₖ = Pₖ⁻ * Hᵀ / (H * Pₖ⁻ * Hᵀ + R)  // 计算增益
    x̂ₖ = x̂ₖ⁻ + Kₖ * (zₖ - H * x̂ₖ⁻)      // 更新状态
    Pₖ = (I - Kₖ * H) * Pₖ⁻              // 更新协方差

关键点:预测步骤增加不确定性(P变大),更新步骤降低不确定性(P变小)。一增一减,循环往复,这就是卡尔曼滤波的「呼吸」节奏。

SOC估算中的具体应用

在BMS里,我们通常这样映射:

符号 物理含义 典型取值
x SOC(有时加上极化电压) 0~1 或 0%~100%
u 电池电流 安培(A)
z 端电压测量值 伏特(V)
A 状态转移矩阵 [1] 或 [1 Δt; 0 1]
B 控制输入矩阵 [-Δt/Qnom]
H 观测矩阵(OCV-SOC曲线斜率) dOCV/dSOC
Q 过程噪声(模型不确定性) 1e-4 ~ 1e-2
R 测量噪声(电压传感器噪声) 1e-4 ~ 1e-3

我的建议:刚开始调参时,先把Q和R设成对角矩阵,只调对角线元素。等系统跑顺了,再考虑加耦合项。我见过太多人一上来就搞全矩阵,结果把自己绕晕了。

为什么卡尔曼滤波适合SOC估算?

说白了,SOC估算有两个痛点:

  1. 安时积分有累积误差——电流传感器漂移、采样误差,时间长了SOC就跑偏
  2. 开路电压法需要静置——车在跑的时候没法用

卡尔曼滤波正好对症下药:

  • 用安时积分做「预测」——随时都能算
  • 用端电压做「修正」——消除累积误差
  • 两者加权融合——比单独用任何一个都准

我记得第一次在实车上跑通卡尔曼滤波时,看着SOC曲线从「锯齿状」变成「平滑曲线」,那种感觉真的很爽。虽然调参调了两周,但值了。

一句话总结:线性卡尔曼滤波就是「预测+修正」的数学化表达。五个公式,两个步骤,一个循环。理解了这一点,你就掌握了它的精髓。


专注资料整理