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的做法是:在每一步对非线性函数做泰勒展开,只取一阶项。说白了就是“用切线代替曲线”。
具体实现步骤:
- 初始化:设定SOC初始值x̂₀和协方差P₀
- 预测SOC:用安时法估算当前SOC
- 预测协方差:计算预测的不确定性
- 计算雅可比矩阵:对OCV函数求导(这一步是EKF和KF的关键区别)
- 计算卡尔曼增益:决定相信模型还是相信观测
- 更新SOC:用电压测量值修正SOC
- 更新协方差:减小不确定性
代码示例(简化版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不是万能的。如果电池模型本身误差太大(比如忽略迟滞效应),再好的滤波器也救不了。先把模型做准,再谈滤波。