4、SOC估算方法(下):卡尔曼滤波(EKF/UKF)入门、神经网络与数据驱动方法简介
好,咱们接着聊SOC估算。上一节讲了安时积分和开路电压法,说白了就是“积分算电量”和“查表看电压”。这两种方法简单,但都有硬伤——安时积分会漂移,开路电压法又不能在线用。
那工业界怎么解决的呢?我2015年做第一个BMS项目时,就被这个问题折磨过。当时用的安时积分,跑了两个月,SOC误差从2%漂到了15%。客户投诉说“你们的电池怎么越用越虚?”——其实不是电池虚,是算法飘了。
后来我换上了卡尔曼滤波。嗯,效果立竿见影。今天我就把这块内容掰开揉碎了讲给你听。
4.1 卡尔曼滤波的核心思想
卡尔曼滤波,说白了就是一个“预测+修正”的循环。你想想看,我们开车时怎么判断位置?
- 预测:根据上一秒的速度和方向,猜一下现在在哪
- 测量:看一眼GPS,得到当前位置
- 融合:把预测值和测量值加权平均,得到最优估计
SOC估算也是一样的道理。我们有一个“过程模型”(比如安时积分),还有一个“观测模型”(比如电压查表)。卡尔曼滤波就是把这两者结合起来,取长补短。
核心公式(简化版):
估计值 = 预测值 + 卡尔曼增益 × (测量值 - 预测值)
卡尔曼增益 = 预测误差 / (预测误差 + 测量误差)
这里有个关键点:卡尔曼增益是动态调整的。如果预测误差大,就多相信测量值;如果测量噪声大,就多相信预测值。我当年调试时,最头疼的就是调这两个误差的协方差矩阵——调好了,收敛飞快;调不好,直接发散。
4.2 扩展卡尔曼滤波(EKF)
标准的卡尔曼滤波要求系统是线性的。但电池这玩意儿,你想想看,电压和SOC的关系是非线性的,开路电压曲线弯弯曲曲的。怎么办?
EKF的思路很简单:把非线性函数做泰勒展开,只取一阶项。说白了就是“用切线代替曲线”。
我在项目中用过EKF,效果还不错。但有个坑——雅可比矩阵的计算。电池模型的非线性强,雅可比矩阵稍微算错一点,滤波器就发散。我曾经debug了三天,最后发现是开路电压曲线的导数算错了0.01。
避坑指南:我曾经在EKF实现中忽略了电池老化的影响。结果新电池时SOC误差3%,用了半年后误差涨到8%。后来我加了一个在线辨识参数的自适应模块,才把误差稳定在5%以内。
EKF的五个步骤(记住这个流程):
- 状态预测:用安时积分更新SOC
- 误差协方差预测:预测的不确定性传播
- 卡尔曼增益计算:权衡预测和测量
- 状态更新:用电压测量值修正SOC
- 误差协方差更新:更新不确定性
嗯,这里要注意:第2步和第5步的矩阵运算,在嵌入式平台上跑起来挺费劲的。我建议用定点数运算,或者用查表法近似,能省不少算力。
4.3 无迹卡尔曼滤波(UKF)
EKF有个毛病——它用一阶泰勒展开,精度有限。如果电池模型的非线性特别强(比如磷酸铁锂的平坦OCV曲线),EKF就容易翻车。
UKF换了个思路:我不去近似非线性函数,而是去近似概率分布。它用一组“sigma点”来代表状态分布,把这些点通过非线性函数传播,再重新合成高斯分布。
说白了,EKF是“用直线代替曲线”,UKF是“用一群点来模拟曲线”。
我的经验:UKF的精度确实比EKF高,但计算量也大。在STM32F4这种级别的MCU上,EKF跑一遍大概2ms,UKF要5-8ms。如果你的BMS主控算力够,我建议上UKF;如果算力紧张,EKF加一些补偿也能用。
下面我画了一张图,帮你理解EKF和UKF的区别:
4.4 神经网络与数据驱动方法
卡尔曼滤波虽然好,但它依赖电池模型。模型不准,滤波就白搭。那有没有不用模型的方法?
有——数据驱动方法。说白了,就是让神经网络自己学习SOC和电压、电流、温度之间的关系。
我2018年试过用LSTM做SOC估计。训练数据用了三块电池的完整充放电循环,大概200万条数据。效果确实惊艳——测试集上的RMSE只有1.2%。但问题也很明显:
- 计算量大:LSTM在MCU上跑不动,得用NPU或者云端
- 泛化性差:换一种电池,模型就得重新训练
- 可解释性差:你没法解释为什么神经网络输出这个SOC值
我的建议:目前工业界的主流方案还是EKF/UKF。神经网络更适合做辅助——比如用NN来修正OCV曲线,或者预测电池老化后的参数变化。纯数据驱动的SOC估计,在量产BMS上还很少见。
几种常见的数据驱动方法对比:
| 方法 | 精度 | 计算量 | 泛化能力 | 适用场景 |
|---|---|---|---|---|
| BP神经网络 | 中等(3-5%) | 低 | 差 | 简单场景,固定工况 |
| LSTM/RNN | 高(1-2%) | 高 | 中等 | 复杂工况,云端处理 |
| CNN | 中等(2-4%) | 中等 | 中等 | 特征提取,辅助EKF |
| 迁移学习 | 高(1-3%) | 中等 | 好 | 多型号电池适配 |
4.5 实战建议:怎么选?
你可能会问:那我到底该用哪种方法?
我个人习惯这样选:
- 算力够(Cortex-M7以上):上UKF,精度高,鲁棒性好
- 算力一般(Cortex-M3/M4):用EKF,注意调好协方差矩阵
- 算力紧张(8位MCU):安时积分+开路电压修正,加个温度补偿
- 有云端支持:本地跑EKF,云端用LSTM做长期修正
一个小技巧:不管用哪种方法,一定要做SOC初始化。我见过太多项目,算法本身没问题,但上电时SOC初始值设错了,导致后面一直收敛不回来。我的做法是:上电先静置30秒,用OCV查表得到初始SOC,再启动卡尔曼滤波。
好了,SOC估算的方法就讲到这里。卡尔曼滤波这块内容确实有点烧脑,但它是BMS的核心技术之一。你如果能把EKF/UKF吃透,面试BMS岗位时绝对能加分。
公众号:蓝海资料掘金营,微信deep3321