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的五个步骤(记住这个流程):

  1. 状态预测:用安时积分更新SOC
  2. 误差协方差预测:预测的不确定性传播
  3. 卡尔曼增益计算:权衡预测和测量
  4. 状态更新:用电压测量值修正SOC
  5. 误差协方差更新:更新不确定性

嗯,这里要注意:第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的区别:

EKF vs UKF 核心逻辑对比 EKF:线性化近似 真实曲线 一阶近似 近似误差 输入:SOC预测值 输出:电压估计值 需要计算雅可比矩阵 UKF:无迹变换 合成高斯分布 输入:sigma点集 输出:加权统计量 无需计算雅可比矩阵

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