卡尔曼滤波总结与思考

这两天开始N+1刷DR_CAN的视频,刚学过现代控制理论,又被可以收敛的全阶观测器震撼了一波,寻思挑战一下原本一头雾水的卡尔曼滤波,看完推导过程稍微有点头绪,还没来得及做实验,先总结一下理论部分。

系统模型

过程模型:

xk=Axk1+Buk1+wk1x_k=Ax_{k-1} + Bu_{k-1} + w_{k-1}

测量模型:

zk=Hxk1+vkz_k=Hx_{k-1}+v_k

卡尔曼滤波模型

预测部分
先验状态估计:

x^k=Ax^k1+Buk1(1)\hat{x}_k^-=A\hat{x}_{k-1}+Bu_{k-1} \tag{1}

先验误差协方差矩阵:

Pk=APk1AT+Q(2)P_k^- = AP_{k-1}A^T +Q \tag{2}

更新部分
卡尔曼增益:

Kk=PkHTHPkHT+R(3)K_k=\frac{P_k^- H^T}{H P_k^- H^T + R} \tag{3}

后验估计:

x^k=x^k+Kk(ZkHx^k)(4)\hat{x}_k=\hat{x}_k^- + K_k(Z_k - H \hat{x}_k^-) \tag{4}

更新误差协方差矩阵:

Pk=(IKkH)Pk(5)P_k = (I-K_k H)P_k^- \tag{5}

过程推导

上述便是卡尔曼滤波的系统模型和观测器模型,卡尔曼滤波虽叫“滤波器”但其本质上是一个观测器,而且也是是一个最优化递归 的数字处理算法,其本质是为了解决在测量系统中存在的不确定性,而系统的不确定性主要来自:

  • 不存在完美的数学模型(控制系统建模无法绝对精准)
  • 系统扰动不可控而且难以建模
  • 测量过程中传感器存在误差

在现代控制理论中我们使用全阶观测器对系统的状态进行观测,并且使用反馈矫正的思想使观测器的误差不断减小,其与状态反馈控制在数学上使等价的,因此我们可以采用极点配置的方法确定观测增益LL,在工程实践中往往观测器的极点要比控制器小4~5倍,然而当极点配置过小时,虽然观测系统响应更加迅速,但是会增加观测噪声,影响最终的控制品质,所以要平衡控制器和观测器的配置,提高控制品质。

而卡尔曼观测器和上述全阶观测器的区别就是在于如何选取状态观测增益:状态观测器通过极点配置设计观测器增益,而卡尔曼滤波器通过结合量测噪声与与系统噪声估计误差的方差确定卡尔曼增益

协方差

为了量测噪声,我们在系统模型中引入了过程噪声ww和测量噪声vv,这两个参数属于先验知识,需要我们通过估计给出,过程噪声主要反应系统模型的不确定性,测量噪声则是反应测量传感器的不确定性,但是两者都符合高斯分布,即:

wP(0,Q)w \sim P(0,Q)

vP(0,R)v \sim P(0,R)

已知方差Var(x)=E(x2)E2(x)Var(x)=E(x^2)-E^2(x),由于E(w)=E(v)=0E(w)=E(v)=0
所以:

Var(w)=E(w2)Var(w)=E(w^2)

Var(v)=E(v2)Var(v)=E(v^2)

wvwv都是矩阵,所以QQRR分别为两者的协方差,两者的期望都为0,即:

Q=E[wwT]Q=E[ww^T]

R=E[vvT]R=E[vv^T]

如果写成矩阵的形式(假设为二阶矩阵):

Q=[σw12σw1σw2σw2σw1σw22]Q= \begin{bmatrix} \sigma_{w1}^2 & \sigma_{w1}\sigma_{w2} \\ \sigma_{w2}\sigma_{w1} & \sigma_{w2}^2 \end{bmatrix}

而且协方差矩阵是对称正定矩阵,即σw1σw2=σw2σw1\sigma_{w1}\sigma{_{w2}}=\sigma_{w2}\sigma{_{w1}},而两侧的值表示两个噪声的关联程度,如果两个噪声是相互独立的,则σw1σw2=σw2σw1=0\sigma_{w1}\sigma{_{w2}}=\sigma_{w2}\sigma{_{w1}}=0

我们知道,当一组数据的方差越小,其越接近期望值,所以我们也采用协方差的方式来表述系统预测值与真实值的差值,则k时刻的误差值为:

ek=xkx^ke_k = x_k - \hat{x}_k

当然ee也符合期望为0,协方差为PkP_k高斯分布:

eP(0,Pk)e \sim P(0,P_k)

但是注意这个差值我们无法算出具体值,因为我们无法得知具体的系统真值xkx_k,但是我们可以表示它的协方差:

Pk=E(eeT)P_k=E(ee^T)

只要找到某种条件使得此时的误差方差最小,就能使系统收敛,而这个过程正是确定卡尔曼增益KkK_k的过程

数据融合

但在具体推导之前我们再补充关于数据融合的知识,如果你会计算平均值的话,那么你一定熟悉这个公式:

x^k=1k(z1+z2+z3++zk)\hat{x}_k=\frac{1}{k}(z_1+z_2+z_3+\dots+z_k)

x^k\hat{x}_k是测量kk次后的平均值,如果我们对公式进行简单变换,便可得到当前平均值和上次平均值的关系:

x^k=1k(z1+z2+z3+zk)=1kk1k1(z1+z2++zk1)+1kzk=k1kx^k1+1kzk=x^k1+1k(zkx^k1)\begin{aligned} \hat{x}_k &=\frac{1}{k}(z_1+z_2+z_3\dots+z_k) \\ &=\frac{1}{k}\frac{k-1}{k-1}(z_1+z_2+\dots+z_{k-1})+\frac{1}{k}z_k \\ &=\frac{k-1}{k}\hat{x}_{k-1}+\frac{1}{k}z_k \\ &=\hat{x}_{k-1}+\frac{1}{k}(z_k-\hat{x}_{k-1}) \end{aligned}

从上式不难看出:

当前预测值=上次预测值+系数(当前测量值上次预测值)当前预测值=上次预测值+系数(当前测量值-上次预测值)

kk就是我们测量的次数,在测量初期和后期会呈现不同的规律

  • k0k\to0时(kk很小时),x^kzk\hat{x}_k\to z_k,预测结果越接近测量值

  • kk \to \infty时,x^kx^k1\hat{x}_k \to \hat{x}_{k-1},预测结果越接近于上次预测值

而系数1k\frac{1}{k}在卡尔曼滤波中通常用KkK_k表示,意为卡尔曼增益(KalmanGainKalman Gain),现在我们引入上述的两个误差,估计误差方差和测量误差方差:

估计误差方差:eEST=Var(xkx^k)测量误差方差:eMEA=Var(zkxk)估计误差方差:e_{EST} =Var( x_k-\hat{x}_k) \\ 测量误差方差:e_{MEA} =Var(z_k-x_k)

  • 估计误差是我们观测器测量出的误差和真实值的误差(P)

  • 测量误差是由传感器测量过程中的误差®

引入卡尔曼增益:

Kk=eESTk1eESTk1+eMEAkK_k=\frac{e_{EST_{k-1}}}{e_{EST_{k-1}}+e_{MEA_k}}

这里的卡尔曼增益和最前面推导完的卡尔曼增益是等价的(假设测量值和状态值不需要变换,即观测矩阵H为单位阵):

Kk=PkPk+RK_k=\frac{P_k^-}{P_k^- + R}

这里的Pk=Pk1P_{k}^-=P_{k-1}即估计噪声(过程噪声)的先验误差协方差矩阵,或是上次噪声的误差协方差矩阵,他们在一维状态下是等价的。

类比上面的过程,当eESTk1>>EMEAke_{EST_{k-1}}>>E_{MEA_k}时,Kk1K_k \to 1x^kzk\hat{x}_k \to z_k,即测量误差远小于估计误差时,新预测值越接近测量值;而当eMEAk>>eESTk1e_{MEA_k}>>e_{EST_{k-1}}时,Kk0K_k \to 0x^kx^k1\hat{x}_k \to \hat{x}_{k-1},即估计误差远小于测量误差时,新预测值越接近模型预测值。于是我们便可以有了一个简单的预测更新算法:

Kk=eESTk1eESTk1+eMEAk(1)K_k=\frac{e_{EST_{k-1}}}{e_{EST_{k-1}}+e_{MEA_k}} \tag{1}

x^k=x^k1+Kk(zkx^k1)(2)\hat{x}_k=\hat{x}_{k-1}+K_k(z_k-\hat{x}_{k-1}) \tag{2}

eESTk=(1Kk)eESTk1(3)e_{EST_k}=(1-K_k)e_{EST_{k-1}} \tag{3}

而公式(3)也是标准卡尔曼滤波公式中的误差协方差更新项简化版,同时也是用方差ee代替了高维状态下的协方差PP,并将我们计算得出的最优卡尔曼增益带入得出:

Pk=(IKk)PkP_k = (I-K_k)P_k^-

上述公式可以看作低维、理想情况下简化的卡尔曼滤波

以上便是将模型预测值实际测量值进行融合,最终得出一个更加准确的观测值,下面我们来讨论如何将两个不同的传感器测量的值融合在一起,我们假设有两个不同的传感器z1z2z_1、z_2,他们的测量值都符合高斯分布,我们假设z1z_1的均值μ1\mu_1为30,标准差σ1\sigma_1为2,z2z_2的均值μ2\mu_2为32,标准差σ1\sigma_1为4:

z1P(30,22)z2P(32,42)z_1 \sim P(30,2^2) \\ z_2 \sim P(32,4^2) \\

如何用最优的策略融合这两个传感器的测量值呢,我们不妨用上述的融合公式:

z^=z1+Kk(z2z1)\hat{z}=z_1 +K_k(z_2-z_1)

要使融合后的预测值为最优我们就要使z^\hat{z}的方差最小,关键就是如何确定增益值,这也是卡尔曼滤波器最核心的思想,求解观测器增益使得观测值方差/协方差最小。下面计算两者融合后的预测值的方差:

Var(z1)=σ12Var(z2)=σ22Var(z_1)=\sigma_1^2 \\ Var(z_2)=\sigma_2^2

我们假设两个传感器相互独立,各自测量值不会互相影响:

Var(z^)=Var[z1+Kk(z2z1)]=Var[(1Kk)z1+Kkz2](两项相互独立)=Var[(1Kk)z1]+Var(Kkz2)(独立可拆分)=(1Kk)2Var(z1)+Kk2Var(z2)(提出系数项)\begin{aligned} Var(\hat{z})&=Var[z_1+K_k(z_2-z_1)] \\ &=Var[(1-K_k)z_1 + K_kz_2] \quad \text{(两项相互独立)} \\ &=Var[(1-K_k)z_1]+Var(K_kz_2) \quad \text{(独立可拆分)}\\ &=(1-K_k)^2Var(z_1)+K_k^2Var(z_2) \quad \text{(提出系数项)} \\ \end{aligned}

为了使估计值 z^\hat{z} 最准确,我们需要选择 KkK_k 使得Var(z^)Var(\hat{z})最小,这个过程与下面卡尔曼增益推导是一个原理,只不过扩展到多维后计算更加复杂。

为了求解最小值,我们可以对σz^2\sigma_{\hat{z}}^2关于KkK_k求导,并使其导数等于0,找到其极值点:

ddKkVar(z^)=d(1Kk)2σ12+Kk2σ22dKk=0\frac{d}{dK_k}Var(\hat{z})=\frac{d(1-K_k)^2\sigma_1^2+K_k^2\sigma_2^2}{dK_k}=0

展开整理得:

dσz^2dKk=ddKk(σ122Kkσ12+Kk2σ12+Kk2σ22)=ddKk[σ122Kkσ12+Kk2(σ12+σ22)]=2σ12+2Kk(σ12+σ22)=0\begin{aligned} \frac{d\sigma_{\hat{z}}^2}{dK_k}&=\frac{d}{dK_k}(\sigma_1^2-2K_k\sigma_1^2+K_k^2\sigma_1^2+K_k^2\sigma_2^2) \\ &=\frac{d}{dK_k}[\sigma_1^2-2K_k\sigma_1^2+K_k^2(\sigma_1^2+\sigma_2^2)] \\ &=-2\sigma_1^2+2K_k(\sigma_1^2+\sigma_2^2)\\ &=0 \end{aligned}

通过求导最小化估计方差,我们得到最优增益KkK_k

Kk=σ12σ12+σ22K_k=\frac{\sigma_1^2}{\sigma_1^2+\sigma_2^2}

  • 如果σ12σ22\sigma_1^2 \gg \sigma_2^2(即z1z_1 的误差远大于z2z_2 的误差),则Kk1K_k \approx 1,说明更信任测量值z2z_2

  • 如果σ22σ12\sigma_2^2 \gg \sigma_1^2 (即z2z_2 的误差远大于z1z_1的误差),则Kk0K_k \approx 0,说明更信任预测值z1z_1

这样我们便完成了两个传感器的最优数据融合,而标准卡尔曼滤波就是以最优的增益融合数学模型推导的预测值x^k\hat{x}_k和测量值zkz_k,其对应的协方差矩阵分别是PkP_kRR,其中R是我们根据传感器特性给定的协方差矩阵,这个值是我们针对不同的传感器给的数,而PkP_k是我们在观测过程中不断优化,不断减小的误差协方差矩阵,我们将计算出的最优增益代入到误差协方差矩阵的计算便完成了对其的更新。

标准卡尔曼增益推导

根据上面的思想我们可以扩展到标准卡尔曼滤波中KkK_k的求取,具体的代入推导暂时省略,可以去DR_CAN的视频具体看,最后我们得到了误差的协方差矩阵表达式(可以将PkP_kRR与上边的σ12\sigma_1^2σ22\sigma_2^2等效比较一下,只不过在标准的卡尔曼滤波中不在是一维的方差而是多维的协方差矩阵):

我们令估计误差为:

ek=xkx^ke_k=x_k-\hat{x}_k

则我们用PkP_k来表示协方差矩阵:

Pk=E(eeT)=E[(xkx^k)(xkx^k)T]\begin{aligned} P_k&=E(ee^T)\\ &=E[(x_k-\hat{x}_k)(x_k-\hat{x}_k)^T] \end{aligned}

让我们代入过程模型测量模型估计模型,计算e=xkx^ke=x_k-\hat{x}_k

xkx^k=xk[x^k+Kk(zkHx^k)]=xkx^kKkzkKkHx^k(代入zk)=xkx^kKk(Hxk+vk)Kk=(xkx^k)KkH(xkx^k)Kkvk=(IKkH)(xkx^k)Kkvk(ek=xkxk^)=(IKkH)ekKkvk\begin{aligned} x_k-\hat{x}_k&=x_k-[\hat{x}_k^- + K_k(z_k-H\hat{x}_k^-)] \\ &=x_k-\hat{x}_k^- -K_kz_k-K_kH\hat{x}_k^- \quad \text{(代入$z_k$)}\\ &=x_k-\hat{x}_k^- -K_k(Hx_k+v_k)-K_k \\ &=(x_k-\hat{x}_k^-)-K_kH(x_k-\hat{x}_k^-)-K_kv_k\\ &=(I-K_kH)(x_k-\hat{x}_k^-)-K_kv_k \quad (e_k^-=x_k-\hat{x_k^-})\\ &=(I-K_kH)e_k^--K_kv_k \end{aligned}

最后我们得出估计误差协方差矩阵PkP_k

Pk=PkKkHPkPkHTKkT+KkHPkHTKkT+KkRKkTP_k=P_k^- -K_kHP_k^- -P_k^-H^TK_k^T + K_kHP_k^-H^TK_k^T +K_kRK_k^T

于是我们也可以利用刚才对KkK_k求导等于0的思想去求最优的卡尔曼增益,但是这里需要注意的是,PkP_k是协方差矩阵:

Pk=[σe12σe1σe2σe2σe1σe22]P_k= \begin{bmatrix} \sigma_{e1}^2 & \sigma_{e1}\sigma_{e2} \\ \sigma_{e2}\sigma_{e1} & \sigma_{e2}^2 \end{bmatrix}

真正需要降低的误差方差只是对角线上的方差,而两者之间的方差我们无需在意,这时候我们便可以利用矩阵的迹(对角线元素相加)来求解误差方差:

tr(Pk)=σe12+σe22=tr(Pk)2tr(KkHPk)+tr(KkHPkHTKkT)+tr(KkRKkT)tr(P_k)=\sigma_{e_1}^2+\sigma_{e_2}^2 \\ =tr(P_k^-)-2tr(K_kHP_k^-)+tr(K_kHP_k^-H^TK_k^T)+tr(K_kRK_k^T)

同样我们可以对tr(Pk)tr(P_k)关于KkK_k求导:

ddKktr(Pk)=0\frac{d}{dK_k}tr(P_k)=0

最后化简为:

ddKktr(Pk)=PkHT+Kk(HPkHT+R)=0\frac{d}{dK_k}tr(P_k)=-P_kH^T+K_k(HP_k^-H^T+R)=0

得出最优卡尔曼增益:

Kk=PkHTHPkHT+RK_k=\frac{P_k^-H^T}{HP_k^-H^T+R}

求先验误差协方差矩阵

观察上述卡尔曼增益公式,我们发现现在先验误差协方差矩阵PkP_k^-还是未知,但根据定义我们可知:

Pk=E(ekekT)P_k^-=E(e_k^- e_k^{-T})

先验误差eke_k^-:

ek=xkx^k=Axk1+Buk1+wk1Ax^k1Buk1=A(xk1x^k1)+wk1=A(ek1)+wk1\begin{aligned} e_k^-&=x_k-\hat{x}_k^- \\ &=Ax_{k-1}+Bu_{k-1}+w_{k-1}-A\hat{x}_{k-1}-Bu_{k-1} \\ &=A(x_{k-1}-\hat{x}_{k-1})+w_{k-1}\\ &=A(e_{k-1})+w_{k-1} \end{aligned}

注意,现在先验误差出现了wk1w_{k-1},是在过程模型中引入的过程噪声(模型不精确、物理环境干扰),所以PkP_k^-会引入过程噪声协方差矩阵QQ

下面继续推导,将其带入到PkP_k^-,得:

Pk=E[(Aek1+wk1)(Aek1+wk1)T]=E[(Aek1+wk1)(ek1TAT+wk1T)]=E(Aek1ek1TAT)+E(wk1ek1TAT)+E(Aek1wk1T)+E(wk1wk1T)=AE(ek1ek1T)AT+E(wk1wk1T)=APk1AT+Q\begin{aligned} P_k^-&=E[(Ae_{k-1}+w_{k-1})(Ae_{k-1}+w_{k-1})^T] \\ &=E[(Ae_{k-1}+w_{k-1})(e_{k-1}^TA^T+w_{k-1}^T)] \\ &=E(Ae_{k-1}e_{k-1}^TA^T)+E(w_{k-1}e_{k-1}^TA^T) \\ &+E(Ae_{k-1}w_{k-1}^T)+E(w_{k-1}w_{k-1}^T)\\ &=AE(e_{k-1}e_{k-1}^T)A^T+E(w_{k-1}w_{k-1}^T)\\ &=AP_{k-1}A^T+Q \end{aligned}

上式中,由于wk1w_{k-1}ek1e_{k-1}是相互独立的,且二者的期望均为0,所以两项直接消除,剩下的两项凑成了上次误差协方差Pk1P_{k-1}和过程噪声协方差QQ

公式小结

至此,我们便大致的推导出了卡尔曼滤波器的五个核心公式:

预测部分

先验状态估计

x^k=Ax^k1+Buk1(1)\hat{x}_k^-=A\hat{x}_{k-1}+Bu_{k-1} \tag{1}

首先我们利用系统模型建立了大致的数学模型来估计先验值,这一项要和过程模型区分开,过程模型是我们抽象出来的真实系统的真实值,它是再有过程噪声ww的,由于我们并无法对噪声进行建模,所以在先验状态估计中只是利用能建模的数学模型做理论值的推导

先验误差协方差矩阵

Pk=APk1AT+Q(2)P_k^- = AP_{k-1}A^T +Q \tag{2}

先验误差协方差矩阵是我们最后推导出来的,但是它是在预测阶段的,因为它用到了上次的误差协方差矩阵,所以在初始阶段需要我们给这个P0P_0赋予初始值,之后便可以不断迭代更新卡尔曼增益KkK_k,因为我们可以看到,卡尔曼增益更新主要是由先验误差协方差确定的,而不断迭代的增益也进一步影响了下次协方差矩阵的更新,使其能够不断迭代优化到误差最小的状态;因为先验误差计算过程中eK=xkx^ke_K^-=x_k-\hat{x}_k^-中含有真实过程模型中的的xkx_k,其是带有过程噪声ww的,因此最后有其协方差矩阵Q,当然这里的Q阵是卡尔曼滤波过程中需要调节的重要参数之一。

更新部分

卡尔曼增益

Kk=PkHTHPkHT+R(3)K_k=\frac{P_k^- H^T}{H P_k^- H^T + R} \tag{3}

首先我们一开始在均值滤波过程中发现了滤波增益,其次在数据融合过程中我们通过对方差关于滤波增益求导找到了最优增益,发现滤波增益的大小在调节这所要融合的两个数据的权值,在两个传感器融合中,KkK_k调节的是两个传感器的权重,而在标准的卡尔曼滤波中KkK_k调节的理论模型预测值和测量值之间的权重,由于引入了测量值,所以其包含测量过程中产生的噪声协方差矩阵R,R也是我们调节卡尔曼滤波中的一个重要的参数,不过我们可以通过研究我们的测量设备大概确定这个参数。

后验估计

x^k=x^k+Kk(ZkHx^k)(4)\hat{x}_k=\hat{x}_k^- + K_k(Z_k - H \hat{x}_k^-) \tag{4}

后验估计是卡尔曼滤波最后输出的部分,我们通过融合理论模型预测值与实际测量值得出了我们观测的状态,而增益项来调节更加相信理论模型值还是实际预测值。

更新误差协方差矩阵

Pk=(IKkH)Pk(5)P_k = (I-K_k H)P_k^- \tag{5}

先前我们由PKP_K求导得出了最优的滤波增益KkK_k,这一步我们便将求出来的增益代入到公式中来更新误差协方差矩阵,这项也用到了先验计算的误差协方差,同时也作为更新项将值传入下一次的先验误差协方差的预测,从而不断迭代更新,让误差协方差不断减小,预测值不断接近真实值。

DR_CAN指路

最后附上DR_CAN博士原视频链接: