4、卡尔曼滤波入门:从贝叶斯滤波到卡尔曼滤波,核心思想“预测+更新”

各位同学,咱们今天聊点硬核的——卡尔曼滤波。

说实话,我刚入行做BMS那会儿,听到“卡尔曼滤波”这四个字,第一反应是:这玩意儿是不是得数学博士才能搞?后来真正啃下来才发现,它的核心思想其实特别朴素,就四个字:预测 + 更新

你想想看,我们做SOH估计,本质上就是在干一件事:。猜电池现在还剩多少容量,猜内阻涨了多少。但光猜不行,你得有依据,还得不断用新数据去修正你的猜测。卡尔曼滤波,就是帮你干这个的。

4.1 从贝叶斯滤波说起

要理解卡尔曼滤波,得先聊聊它的老祖宗——贝叶斯滤波。

贝叶斯滤波的核心思想,说白了就是一句话:用先验知识 + 新观测数据 = 后验估计

我举个例子。你早上出门,看天阴沉沉的。根据经验(先验),你觉得今天有70%的概率会下雨。但你刚走到楼下,发现邻居老王正收伞(新观测)。这时候你更新判断:嗯,下雨概率得提到95%了。

这就是贝叶斯滤波的直觉。在BMS里,我们的“先验”就是上一时刻对SOH的估计,“新观测”就是当前时刻的电压、电流、温度数据。两者一结合,得到当前时刻更准确的SOH估计。

贝叶斯滤波的通用公式(理解即可,不用背):

P(x|z) = [P(z|x) * P(x)] / P(z)

其中:P(x)是先验概率,P(z|x)是似然,P(x|z)是后验概率。

但问题来了。贝叶斯滤波在理论上很完美,实际用起来却要算积分。对于高维状态空间(比如我们同时估计SOC、SOH、内阻),计算量会爆炸。我当年第一次尝试用贝叶斯滤波做SOH估计,跑了三天三夜没出结果……后来才明白,得用它的“简化版”——卡尔曼滤波。

4.2 卡尔曼滤波的三大假设

卡尔曼滤波之所以高效,是因为它做了三个关键假设。这些假设让问题从“算积分”变成了“算加减乘除”。

假设 含义 在BMS中的体现
1. 线性系统 状态变化和观测都是线性的 电池模型通常用等效电路模型(线性近似)
2. 高斯噪声 过程噪声和观测噪声都服从高斯分布 传感器噪声、模型误差近似为高斯白噪声
3. 马尔可夫性 当前状态只与上一时刻有关 SOH变化是缓慢的,短期可视为一阶马尔可夫过程

⚠️ 注意:实际电池系统是非线性的。所以我们在工程中用的不是标准卡尔曼滤波,而是扩展卡尔曼滤波(EKF)或无迹卡尔曼滤波(UKF)。但别急,先搞懂线性版本,非线性版本就是加个“泰勒展开”的事儿。

4.3 核心思想:预测 + 更新

卡尔曼滤波的整个流程,就两个步骤循环往复:

  1. 预测(Predict):根据上一时刻的最优估计,预测当前时刻的状态和误差。
  2. 更新(Update):用当前时刻的实际观测值,修正预测值,得到最优估计。

我习惯把它比作“开车看导航”。

  • 预测:导航告诉你,按当前速度,5分钟后你应该在A点。这是基于历史数据的推算。
  • 更新:但实际GPS信号显示,你现在在B点。导航就会修正:哦,原来你堵车了,重新规划路线。

卡尔曼滤波每时每刻都在做这件事。它不会完全相信预测,也不会完全相信观测,而是根据两者的“可信度”(协方差矩阵)做一个加权平均。

4.4 五条黄金公式

好了,上干货。卡尔曼滤波的核心就这五条公式。别怕,我一条条拆给你看。

预测阶段(2条):

1. 状态预测:x̂ₖ⁻ = A · x̂ₖ₋₁ + B · uₖ₋₁
2. 误差协方差预测:Pₖ⁻ = A · Pₖ₋₁ · Aᵀ + Q

更新阶段(3条):

3. 卡尔曼增益:Kₖ = Pₖ⁻ · Hᵀ · (H · Pₖ⁻ · Hᵀ + R)⁻¹
4. 状态更新:x̂ₖ = x̂ₖ⁻ + Kₖ · (zₖ - H · x̂ₖ⁻)
5. 误差协方差更新:Pₖ = (I - Kₖ · H) · Pₖ⁻

咱们一条条说人话:

  • 公式1:用上一时刻的SOH估计值,加上系统输入(比如电流积分),预测当前SOH。
  • 公式2:预测的误差有多大?上一时刻的误差会传递过来,再加上过程噪声Q(模型不准的程度)。
  • 公式3:卡尔曼增益Kₖ,就是“预测”和“观测”谁更可信的权重。如果观测噪声R小(传感器准),Kₖ就大,更相信观测。
  • 公式4:最终估计 = 预测值 + Kₖ × (观测残差)。观测残差就是“你预测的和实际测的差多少”。
  • 公式5:更新完状态后,误差协方差要缩小,因为我们的估计更准了。

💡 我的经验:调卡尔曼滤波,80%的时间都在调Q和R矩阵。Q太大,滤波会“抖”;R太大,滤波会“钝”。我曾经在一个项目中,Q设小了,SOH估计死活跟不上电池老化速度;R设小了,估计值又跟着噪声乱跳。最后花了整整一周,才找到那个“黄金比例”。

4.5 一个简单的SOH估计例子

假设我们用容量衰减来定义SOH。初始容量100Ah,当前容量95Ah,SOH=95%。

我们用一个最简单的模型:SOH变化很慢,近似为常数(A=1)。观测是电压和电流,通过安时积分法算出的容量(H=1)。

# 伪代码示例
# 初始化
x = 0.95  # SOH初始值95%
P = 0.01  # 初始误差协方差
Q = 0.001 # 过程噪声(SOH变化很慢)
R = 0.01  # 观测噪声(安时积分有累积误差)

# 每个时间步
for each measurement:
    # 预测
    x_pred = x          # SOH不变
    P_pred = P + Q      # 误差增加一点
    
    # 更新
    K = P_pred / (P_pred + R)  # 卡尔曼增益
    z = measure_capacity() / 100  # 观测到的SOH
    x = x_pred + K * (z - x_pred) # 更新SOH
    P = (1 - K) * P_pred          # 更新误差

你看,就这么几行代码。但效果呢?比单纯用安时积分法准得多。安时积分法误差会累积,卡尔曼滤波每步都在“纠偏”。

4.6 避坑指南

最后,分享几个我踩过的坑:

我曾经……在初始化P矩阵时设得太小,觉得初始估计很准。结果卡尔曼滤波“过度自信”,前几百步都不怎么相信观测数据,收敛极慢。后来学乖了:初始P设大一点,让滤波先“虚心学习”

  • 坑1:忘记检查可观性。如果系统不可观,卡尔曼滤波估计会发散。做SOH估计时,一定要保证电流激励足够丰富(有充有放)。
  • 坑2:Q和R设为固定值。实际电池在不同温度、不同SOC下,噪声特性不一样。我后来改用自适应卡尔曼滤波,在线调整Q和R。
  • 坑3:忽略数值稳定性。在嵌入式平台上,矩阵求逆容易出问题。建议用UD分解或平方根滤波。

好了,这一章就到这儿。卡尔曼滤波的“预测+更新”思想,是整个SOH估计算法的基石。下一章,咱们会把这个框架套到具体的电池模型上,看看怎么一步步搭出完整的SOH估计器。

记住:预测让你有方向,更新让你不跑偏。做算法如此,做工程亦如此。