4、线性卡尔曼滤波原理:五大核心公式推导、预测与更新步骤详解
说实话,很多做BMS的工程师一听到「卡尔曼滤波」就头大。我当年也一样,看了三天公式,脑子里还是一团浆糊。后来在项目里硬着头皮调代码,才慢慢悟出点门道。
今天咱们就把这层窗户纸捅破。线性卡尔曼滤波,说白了就是一套「预测+修正」的循环。你想想看,我们估算SOC时,既相信模型(安时积分),又相信测量(开路电压),但两者都有误差。卡尔曼滤波干的事就是:把这两个不完美的信息揉在一起,给出一个最优估计。
核心思想一句话:用上一时刻的最优值预测当前时刻,再用当前时刻的测量值修正预测值。
五大核心公式:其实就两组
卡尔曼滤波的五大公式,看着吓人,其实就分两拨:预测公式(2个)和更新公式(3个)。我习惯把它们叫做「时间更新」和「测量更新」。
预测步骤(时间更新)
公式1:状态预测
x̂k- = A · x̂k-1 + B · uk-1
这个公式在说啥?说白了就是:根据上一时刻的状态,推测当前时刻的状态。A是状态转移矩阵,B是控制输入矩阵。
拿SOC估算举例:
- x̂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:状态更新
x̂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估算有两个痛点:
- 安时积分有累积误差——电流传感器漂移、采样误差,时间长了SOC就跑偏
- 开路电压法需要静置——车在跑的时候没法用
卡尔曼滤波正好对症下药:
- 用安时积分做「预测」——随时都能算
- 用端电压做「修正」——消除累积误差
- 两者加权融合——比单独用任何一个都准
我记得第一次在实车上跑通卡尔曼滤波时,看着SOC曲线从「锯齿状」变成「平滑曲线」,那种感觉真的很爽。虽然调参调了两周,但值了。
一句话总结:线性卡尔曼滤波就是「预测+修正」的数学化表达。五个公式,两个步骤,一个循环。理解了这一点,你就掌握了它的精髓。