4、卡尔曼滤波法(EKF):从原理到实战

卡尔曼滤波,说白了就是一套“预测+修正”的数学框架。我最早接触它是在做无人机姿态解算时,后来发现它在SOC估算里简直是神器。为什么?因为电池是个非线性系统,电流、电压、温度之间的关系不是简单的加减乘除。EKF(扩展卡尔曼滤波)就是专门处理这种非线性问题的。

4.1 卡尔曼滤波基本原理

先讲个故事。你开车去一个陌生城市,手机GPS告诉你当前位置,但GPS有误差。同时,你根据车速和方向也能估算出大概位置,但估算也有误差。卡尔曼滤波干的事就是:把这两个有误差的信息融合起来,得到一个更准的位置。

在SOC估算里,我们也有两个信息来源:

  • 模型预测:根据电流积分(安时法)估算SOC变化
  • 观测修正:根据开路电压(OCV)反推SOC

卡尔曼滤波的核心思想就是:我不完全相信模型,也不完全相信观测,我信“加权平均”。这个权重就是卡尔曼增益K。

核心公式(离散卡尔曼滤波):

预测步:
  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ₖ|ₖ₋₁

别被公式吓到。你只需要记住:预测步是“猜”,更新步是“改”。Q是过程噪声协方差,R是观测噪声协方差。这两个参数,我后面会讲怎么调。

4.2 状态方程与观测方程

在SOC估算中,我们需要建立两个方程:

状态方程(描述SOC怎么变):

SOCₖ = SOCₖ₋₁ - (η·Iₖ·Δt)/Qₙ + wₖ

其中:

  • η:库仑效率(充电≈1,放电≈0.99)
  • Iₖ:电流(放电为正)
  • Δt:采样周期
  • Qₙ:电池额定容量
  • wₖ:过程噪声(模型误差)

观测方程(描述电压和SOC的关系):

Vₖ = OCV(SOCₖ) - Iₖ·R₀ - V₁ₖ + vₖ

其中:

  • OCV(SOCₖ):开路电压与SOC的映射关系(查表或多项式拟合)
  • R₀:欧姆内阻
  • V₁ₖ:RC网络极化电压
  • vₖ:观测噪声(电压测量误差)

我的经验:OCV-SOC曲线一定要实测标定。我见过有人直接用网上找的曲线,结果SOC误差飙到8%以上。不同温度、不同老化程度的OCV曲线差异很大,别偷懒。

4.3 EKF在SOC估算中的应用

标准卡尔曼滤波假设系统是线性的。但电池的OCV-SOC关系是非线性的,怎么办?EKF的做法是:在每一步对非线性函数做泰勒展开,只取一阶项。说白了就是“用切线代替曲线”。

具体实现步骤:

  1. 初始化:设定SOC初始值x̂₀和协方差P₀
  2. 预测SOC:用安时法估算当前SOC
  3. 预测协方差:计算预测的不确定性
  4. 计算雅可比矩阵:对OCV函数求导(这一步是EKF和KF的关键区别)
  5. 计算卡尔曼增益:决定相信模型还是相信观测
  6. 更新SOC:用电压测量值修正SOC
  7. 更新协方差:减小不确定性

代码示例(简化版EKF-SOC估算):

// 预测步
soc_pred = soc_est - (current * dt) / capacity;
P_pred = P_est + Q;

// 计算雅可比矩阵(OCV对SOC的导数)
dOCV_dSOC = (OCV(soc_pred + delta) - OCV(soc_pred - delta)) / (2 * delta);

// 观测方程
V_pred = OCV(soc_pred) - current * R0 - V1;

// 卡尔曼增益
K = P_pred * dOCV_dSOC / (dOCV_dSOC * P_pred * dOCV_dSOC + R);

// 更新步
soc_est = soc_pred + K * (V_measured - V_pred);
P_est = (1 - K * dOCV_dSOC) * P_pred;

嗯,这里要注意:雅可比矩阵的计算精度直接影响EKF的收敛速度。我建议用中心差分法,比前向差分更准。

4.4 EKF参数调优

调参是EKF落地最头疼的部分。我踩过不少坑,分享几个关键点:

参数 物理含义 调大影响 调小影响
Q(过程噪声) 模型的不确定性 更相信观测,SOC波动大 更相信模型,SOC响应慢
R(观测噪声) 电压测量的不确定性 更相信模型,SOC收敛慢 更相信观测,SOC易受噪声干扰
P₀(初始协方差) 初始SOC的不确定性 收敛快,但初期波动大 收敛慢,但初期稳定

我曾经踩过的坑:把Q设得太小,以为模型很准。结果电池老化后,模型偏差越来越大,SOC误差直接飙到15%。后来我改用自适应Q,根据电流变化率动态调整,才把误差压回3%以内。

调参实战建议:

  • 先粗调后细调:先用经验值(Q=1e-5, R=1e-3),再根据残差调整
  • 观察新息序列:如果新息(测量值-预测值)均值不为零,说明模型有偏
  • 分工况调参:恒流、脉冲、动态工况需要不同的Q/R组合
  • 考虑温度补偿:低温下R要适当增大(电压测量噪声变大)

我的个人习惯:在BMS开发阶段,我会把Q和R做成可配置参数,通过CAN总线在线修改。这样在台架测试时可以快速迭代,不用每次烧录固件。你想想看,省了多少时间?

最后说一句:EKF不是万能的。如果电池模型本身误差太大(比如忽略迟滞效应),再好的滤波器也救不了。先把模型做准,再谈滤波。

EKF-SOC估算核心逻辑 预测步(时间更新) ① SOC预测:SOCₖ = SOCₖ₋₁ - I·Δt/Qₙ ② 协方差预测:Pₖ = Pₖ₋₁ + Q ③ 电压预测:Vₖ = OCV(SOCₖ) - I·R₀ - V₁ 雅可比矩阵计算 Hₖ = ∂OCV/∂SOC | SOC=SOCₖ 更新步(测量更新) ④ 卡尔曼增益: Kₖ = Pₖ·Hₖ/(Hₖ·Pₖ·Hₖ + R) ⑤ SOC修正: SOCₖ = SOCₖ + Kₖ·(Vₘₑₐₛ - Vₚᵣₑ) ⑥ 协方差更新:Pₖ = (1 - Kₖ·Hₖ)·Pₖ 反馈至下一时刻 输入/输出 输入:Iₖ(电流)、Vₖ(电压) 输出:SOCₖ(修正后SOC) 状态:SOC、V₁(极化电压) 关键参数 Q(过程噪声):模型不确定性 → 调大则更相信观测 R(观测噪声):测量不确定性 → 调大则更相信模型