卡尔曼滤波器与电池SoC估计

卡尔曼滤波器的通俗理解

————————————————————————
卡尔曼滤波器的工作过程实际上就是不断地对目前构建的模型进行状态估计、不断地测量实际模型的状态值、并将这两个状态向量融合成更加准确的状态向量、将该状态向量带入新的模型进行下一轮估计的不断迭代的过程。

最开始看到卡尔曼滤波也是非常非常头疼,之前学过的数学知识、控制原理什么的基本都忘光了,完全是一点都摸不着头绪,直到在知乎上看到了大神的简易无公式版卡尔曼滤波描述:

由于传感器(也有可能是别的、比如尺子?)在测量过程中必定存在的误差,导致观测值一般来说与真实值均存在一定的误差。这个误差也就是所谓的观测噪声。所以当我们获得一个观测值的时候、比如5V,实际上真实的状态值可能是4.98V或者5.05V,一般来说这个真实的状态值是4.98V的概率要比是5.23V的概率要大一些。故根据观测的结果,可以推测出真实的状态值的概率分布。

同样也存在所谓的激励噪声。并且,在构建系统模型的过程中,不可避免地存在系统模型的误差,实际上我们可以根据上一时刻的状态值、模型和输入推测出该时刻的状态值。必然这个状态的估计值与真实值也存在一定的误差。同样,根据获得的估计值,我们可以推测真实值的概率分布可能是这样的:

而根据刚刚得到的观测值得到的真实值概率分布可能是这样的:

这两个得出的真实的状态值的概率分布分别是通过估计值和观测值推测出来的。现在得到这两个概率分布之后,我们必然要根据这两组概率分布推测出一个更理想、更切合实际的分布。如果根据一个很棒的规则将其融合、得到新的分布,则根据我们的预想这个新的结果会更加贴近实际情况,如下图这样:

绿色的新结果把它看成是目前最满意的对当前真实的状态值的判断。并会将得到的这个值,带入到下一时刻计算得到对下个状态估计值。这是一个不断进行迭代的过程。而这个理想的规则就是所谓的Kalman增益。

其中状态向量的协方差矩阵$P$代表了内部各变量的相关性,$H$则为在观测方程中的输出矩阵的雅可比矩阵(即对其中各变量求偏导)、以将非线性方程线性表示。

基于卡尔曼滤波器的电池SoC估计

————————————————————————
使用卡尔曼滤波器进行SoC估计首先需要构建电池模型。等效电路模型是最常用的电池模型,R-2RC模型构建如下:

电池模型搭建好之后,接下来就是通过卡尔曼滤波算法进行电池的SoC估计。描述分析一下该模型:模型的输入或者说是激励应当是电流、电流的大小变化决定了电池内部SoC的变化与各个内阻消耗的电压值;而模型我们能够通过传感器测量的值为电池两端的电压值,也就是我们将电压值作为直接观测变量;电池内部的SoC、各内阻消耗电压作为状态参数。

状态方程

首先构建卡尔曼滤波器的第一个方程,一般将其称为状态方程。状态方程构建的是电池内部的状态参数方程、同样也是进行循环的主体方程之一,根据上一时刻的内部参数与激励输入推测该时刻的状态值,也就是说,该值是估计值(“*”上标代表估计值).

依据之前构建的电池模型,将系统构建一阶线性微分方程组如下:
$$ \begin{cases} \dfrac{dSoC}{dt}=-\dfrac{i}{C_{cap}}\\ \dfrac{du_{1}}{dt}=-\dfrac{1}{R_{1}C_{1}}u_{1}+\dfrac{1}{C_{1}}i\\ \dfrac{du_{2}}{dt}=-\dfrac{1}{R_{2}C_{2}}u_{1}+\dfrac{1}{C_{2}}i \end{cases} $$
$$ u=E+u_{1}+u_{2}+i\cdot R_{0} $$
$u$为电池的开路电压。

将上述连续系统近似转化为离散系统并写为矩阵形式如下(具体过程在本文中不详细展开;假设步长为T,即上一时刻与下一时刻采样为T):
$$ \left[ \begin{matrix} SoC_{k}\\ u_{k}^{1}\\ u_{k}^{2}\end{matrix} \right]= \left[ \begin{matrix} 1& & \\ & 1-\dfrac{T}{R_{1}C_{1}}& \\ & & 1-\dfrac{T}{R_{2}C_{2}}\end{matrix} \right]\left[ \begin{matrix} SoC_{k-1}\\ u_{k-1}^1\\ u_{k-1}^2\end{matrix} \right]+\left[ \begin{matrix} -\dfrac{T}{C_{cap}}\\ \dfrac{T}{C_{1}}\\ \dfrac{T}{C_{2}}\end{matrix} \right]i_{k-1} $$
故状态方程可以表现成如下的形式:
$$ x_{k}^{*}=Fx_{k-1}+Gi_{k-1} $$
该状态方程是线性的。

观测方程

第二个方程是观测方程。观测方程主要构建的是观测值(在SoC估计中也就是电池的工作电压)与内部状态参数的函数关系,即上文提到过的:
$$ u=E+u_{1}+u_{2}+i\cdot R_{0} $$
其中$E$是电池的平衡电势,即$EMF$与$V_{h}$的合成值,其与电池的SoC存在非线性的函数关系、且与电池的充放电状态等等有关,如下图所示:

1、2、3分别为充电平衡、EMF以及放电平衡曲线。
忽略滞回电压对平衡电势的影响以及其他因素的影响,将平衡电势曲线近似看为只与SoC有关:
$$ E=g\left(SoC\right) $$
如果运用查表来在BMS中获得该函数关系的话,将会大大增加嵌入式系统的压力,所以一般采用多项式拟合的方法,获得该函数并带入计算。
$$ E=n_{0}SoC^0+n_{1}SoC^1+n_{2}SoC^2+n_{3}SoC^3+…+n_{n}SoC^n $$
很明显,观测方程是一个非线性方程。所以这里的卡尔曼滤波器实际上是扩展的卡尔曼滤波器,经典卡尔曼滤波器的状态方程和观测方程都只能是线性方程。

将上述模型方程写成矩阵形式并离散化:
$$ u_{k}^{*}=\left[ \begin{matrix} h_{k}^{*}& 1 & 1 \end{matrix} \right]\left[ \begin{matrix} SoC_{k}\\ u_{k}^{1}\\ u_{k}^{2}\end{matrix} \right]+R_{0}\cdot i_{k} $$
故观测方程可以表现成如下的形式:
$$ y_{k}^{*}=H_{k}x_{k}+Ji_{k} $$
理论上$H_{k}$是由观测方程得到的雅可比矩阵:
$$ H_{k\left[i,j\right]}=\dfrac{\partial h_{\left[i\right]}}{\partial x_{\left[j\right]}} \left[x_{k}^{*}\right] $$
这里$h_{k}$是$g\left(SoC\right)$对$SoC$的导数(这是一种将非线性方程线性化的方法)。上面两个方程都可以看成是模型方程,也就是说这两个方程根据物理模型,得到了激励、电池内部状态与电池工作电压的关系——根据上一时刻的电池状态和输入激励可以推测出该时刻的电池内部状态,通过该时刻电池内部状态的估计值可以估计出该时刻的电池工作电压。这两组模型公式实际上也是在控制原理中讲过的标准的状态空间方程,即用一阶微分方程组来描述有界动态系统的运动、用线性方程组描述系统的输出。

Kalman增益

第三个方程就是就是求解卡尔曼增益矩阵$K_{k}$。所谓的卡尔曼增益,即为将根据模型计算出的状态值分布与通过传感器获取的测量值分布融合成一个新的分布的方法。
得到卡尔曼增益,首先要计算状态向量$x_{k}$的协方差矩阵$P_{k}^{*}$。这个协方差矩阵表示出了状态向量中各元素之间的相关关系。一个例子:

这个图描述了一个小车的运动,运动状态向量包含速度和位移两个变量。小车在某一时刻的状态是符合正态分布的(如中间的图片所示)(当然这是卡尔曼滤波器成立的前提),图中越亮的地方表示概率越大。如果小车的速度与位移之间存在一定联系的话(比如我们合理地推测,当小车速度越大时、位移很大概率也是更大的),则相应地,发亮的部分的形状会发生一定地改变(如右边的图片所示)。右图中很容易能看出,速度和位移呈正相关关系。而这个影响状态向量概率分布形状的相关关系,就用状态向量的协方差矩阵来表示。
相应地,我们通过传感器获得的观测值的随机分布可能是这样的:

所以有理由相信,紫色部分和绿色部分重合的部分,是集合了两个分布的更加可信的值。

因为实际应用中,我们没法直接求解出协方差矩阵具体的值,而且由于激励噪声和系统本身性质的原因,所以状态向量的协方差矩阵也不是确定的值,而是一个不断更新的值。故通过设定初值并不断更新的方法,得到每个时刻的协方差矩阵。具体就是:
$$ P_{k}^{*}=F_{K}P_{k-1}F_{k}^{T}+Q_{k-1} $$
$Q_{k}$是过程激励($i_{k}$)噪声的协方差矩阵。$P_{k-1}$为上一时刻的状态向量的协方差矩阵。

之后所需要做的是通过一定的方法把重合的新的状态向量的分布求出来,其实就是求解卡尔曼增益(根据正态分布的特殊性质,新的分布仍旧是正态分布)。

Kalman增益矩阵(需要计算观测方程中的$H_{k}$。上文中已介绍了$H_{k}$的求法):
$$ K_{k}=P_{k}^{*}H_{k}^{T}\left(H_{k}P_{k-1}H_{k}^{T}+R_{k}\right)^{-1} $$
$R_{k}$为观测($u_{k}$)噪声的协方差矩阵。
此时便得到了卡尔曼增益矩阵,下一步需要做的就是运用卡尔曼增益矩阵求得最终的状态向量。

修正方程

第四个方程是修正方程,即真正将两个颜色融合的过程。根据Kalman增益修正状态值,得到我们满意的对目前状态的判断。并求解相应的协方差矩阵,在接下来的循环之中作为上一状态值与上一状态的协方差矩阵带入计算。
$$ x_{k}=x_{k}^{*}+K_{k}\left(z_{k}-H_{k}x_{k}^{*}\right)=x_{k}^{*}+K_{k}\left(y_{k}-y_{k}^{*}\right) $$
$$ P_{k}=\left(I-K_{k}H_{k}\right)P_{k}^{*} $$
$I$是单元矩阵.

至此便完成了一个循环。这个过程可以很容易通过MATLAB实现。至于具体实现过程中的初值设定,由于卡尔曼滤波器本身的特性,不用提供准确的初值即可以得到快速的收敛。所以状态向量的初值可以设定为$\left[ \begin{matrix} 0.9& 0& 0 \end{matrix} \right]^T$(假设),初始协方差矩阵也可以设置为单位矩阵$I$。根据一些文献的做法,两个噪声矩阵设置为$0.0001I$(?)。

其他及参考资料

————————————————————————
了解卡尔曼滤波更详细的参数解释,参考知乎李阳的专栏文章-说说卡尔曼滤波,英文原版内容是How a Kalman filter works, in pictures
还有作者文中提到的几个关于协方差相关知识的理解:A geometric interpretation of the covariance matrixWhat is an eigenvector of a covariance matrix?

本文只是给出了一种简单的连续电池模型的离散形式,以后详细学习一下该过程与几种离散化实现。
(零基础不容易啊~~)

参考文献:

1.知乎-如何通俗并尽可能详细解释卡尔曼滤波?-问题下Kent Zeng的回答
2.谭晓军. 电动汽车动力电池管理系统设计[M]. 中山大学出版社, 2011.
3.谭晓军. 电池管理系统深度理论研究:面向大功率电池组的应用技术[M]. 中山大学出版社, 2011.
4.Understanding the Basis of the Kalman Filter Via a Simple and Intuitive Derivation.
5.CH03-StateEstimation
6.How a Kalman filter works, in pictures.
7.知乎李阳的专栏文章-说说卡尔曼滤波.
8.A geometric interpretation of the covariance matrix.
9.What is an eigenvector of a covariance matrix?