卡尔曼滤波的一个推导思路

        一个较为简单的的卡尔曼滤波器的公式推导思路。但是公式推导嘛,再简单也还是一堆公式,看完前两部分了解个差不多也就行了。不过认真看,应该还是比较容易的。

一、问题描述

        给定系统状态更新方程(可以认为是根据物理原理建模得到的)以及观测方程(就是有关系统状态的传感器读数),即如下两个公式,并给出对当前时刻系统的观测\boldsymbol{y}_{n},要怎么样能够得到一个较好的对系统状态的预测\hat{\boldsymbol{x}}_{n}

        \begin{array}{l} \boldsymbol{x}_{n}=\boldsymbol{F} \boldsymbol{x}_{n-1}+\boldsymbol{G} \boldsymbol{u}_{n}+\boldsymbol{w}_{n} \\ \boldsymbol{y}_{n}=\boldsymbol{H} \boldsymbol{x}_{n}+\boldsymbol{v}_{n} \end{array}

        上面两个式子中,我们不能确定的变量仅有两个噪声\boldsymbol{w}_{n}\boldsymbol{v}_{n},但知道它们均值皆为0,协方差分别为\boldsymbol{Q}\boldsymbol{R}其它变量都是已知的。

        单独看第一个公式,可以从上一次的系统状态\boldsymbol{x}_{n-1}求得{\boldsymbol{x}}_{n},但是由于噪声\boldsymbol{w}_{n}不知道,我们做不到。

        单独看第二个公式,可以从对当前系统进行观测得到的\boldsymbol{y}_{n}进行反推得到{\boldsymbol{x}}_{n},但是由于噪声\boldsymbol{v}_{n}不知道,我们也做不到。

        噪声是无法避免的,是一定存在的。因为噪声的存在,单独靠一个方程无法解决问题,所以我们需要融合两个方程并结合观测值\boldsymbol{y}_{n }得到一个正确的系统状态估计\hat{\boldsymbol{x}}_{n},这就是卡尔曼滤波要做的事情。

二、问题求解思路

        按理来说,假如知道噪声的具体大小,我们观测到的值{\boldsymbol{y}}_{n}就是下面这条式子:

\boldsymbol{y}_{n}=\boldsymbol{H} \boldsymbol{x}_{n}+\boldsymbol{v}_{n} =\boldsymbol{H} (\boldsymbol{F} \boldsymbol{x}_{n-1}+\boldsymbol{G} \boldsymbol{u}_{n}+\boldsymbol{w}_{n})+\boldsymbol{v}_{n}

        很可惜,我们不知道噪声的大小,所以我们只能忽略噪声,做一个大致的预测,这里预测的符号咱们先加上一撇,代表不是最优的结果。

\hat{\boldsymbol{x^{'}}}_{n}=\boldsymbol{F} \boldsymbol{x}_{n-1}+\boldsymbol{G} \boldsymbol{u}_{n}

\hat{\boldsymbol{y^{'}}}_{n}=\boldsymbol{H} \hat{\boldsymbol{x^{'}}}_{n} =\boldsymbol{H}(\boldsymbol{F} \boldsymbol{x}_{n-1}+\boldsymbol{G} \boldsymbol{u}_{n})

        不难看出,这里的\hat{\boldsymbol{y^{'}}}_{n}融合了最开始提到的两条方程,即状态方程和观测方程。对比\boldsymbol{y}_{n}\hat{\boldsymbol{y^{'}}}_{n},我们发现观测值\boldsymbol{y}_{n}相比于预测值\hat{\boldsymbol{y^{'}}}_{n},其实就是多了噪声的作用。现在,定义一个变量叫做"新息",也就是包含了两个噪声信息的变量为\boldsymbol{\alpha}_{n}

\boldsymbol{\alpha}_{n} = \boldsymbol{y}_{n}-\hat{\boldsymbol{y^{'}}}_{n}=\boldsymbol{y}_{n}-\boldsymbol{H} \hat{\boldsymbol{x^{'}}}_{n}

        新息\boldsymbol{\alpha}_{n}里面包含了两个噪声的信息,我们不妨假设其中一个噪声\boldsymbol{w}_{n}占了\boldsymbol{\alpha}_{n}\boldsymbol{K}_{n}倍,也就是说:

\boldsymbol{w}_{n} = \boldsymbol{K}_{n}\boldsymbol{\alpha}_{n}

        好了,现在定义了一个关于噪声\boldsymbol{w}_{n}的表达式,这个表达式很牛逼,融合了我们所知道的全部信息,即状态方程、观测方程以及观测值\boldsymbol{y}_{n}。把噪声\boldsymbol{w}_{n}带回到最开始那条式子里面,得到一个优化过的系统状态估计\hat{\boldsymbol{x}}_{n}优化后的估计变量就不带一撇了希望读者能理解我这里的带一撇和不带一撇的含义。

\hat{\boldsymbol{x}}_{n}=\boldsymbol{F} \boldsymbol{x}_{n-1}+\boldsymbol{G} \boldsymbol{u}_{n}+\boldsymbol{K}_{n}\boldsymbol{\alpha}_{n}=\hat{\boldsymbol{x^{'}}}_{n}+\boldsymbol{K}_{n}\boldsymbol{\alpha}_{n}

        好了,现在我们得到了一个最优预测的表达式,可以认为就是在原先估计的基础上添加一个修正项。但是式子中的\boldsymbol{K}_{n}咱们还不知道呢。我们把这个比例因子叫做卡尔曼增益,当求出卡尔曼增益之后,咱们的工作就认为结束了。

三、进入数学推导

        首先咱们要知道什么叫做最优估计,这里咱们采用MMSE(最小均方误差)准则,也就是当预测和实际的差值的平方的均值(均方误差)最小时,我们认为是最优估计。

        然后定义两个预测误差和两个预测误差协方差矩阵,大家注意带一撇和不带一撇的区别。

{\boldsymbol{e}}_{n}=\boldsymbol{x}_{n}-\hat{\boldsymbol{x}}_{n}

\boldsymbol{C}^{'}_{n}=E\left[{\boldsymbol{e}^{'}_{n}} {\boldsymbol{e}_{n}^{'\mathrm{H}}}\right] =E[(\boldsymbol{x}_{n}-\hat{\boldsymbol{x^{'}}}_{n})(\boldsymbol{x}_{n}-\hat{\boldsymbol{x^{'}}}_{n})^{\mathrm{H}}]

\boldsymbol{C}_{n}=E\left[\boldsymbol{e}_{n} \boldsymbol{e}_{n}^{\mathrm{H}}\right]=E\left[\left(\boldsymbol{x}_{n}-\hat{\boldsymbol{x}}_{n}\right)\left(\boldsymbol{x}_{n}-\hat{\boldsymbol{x}}_{n}\right)^{\mathrm{H}}\right]

        设\boldsymbol{x}_{n}p维的,那么误差\boldsymbol{e}_{n}也是p维的,记作\boldsymbol{e}_{n} = [{e}_{n0},{e}_{n1},...,{e}_{np}]^{H}。 那么要最小化的变量J,也就是所谓的均方误差可以写成:

 \begin{aligned} J &= E\left[\left|\boldsymbol{e}_{n}\right|^{2}\right] \\ &= E\left[\boldsymbol{e}_{n}^{\mathrm{H}} \boldsymbol{e}_{n}\right]\\ &=E[e_{n0}^{2}+e_{n1}^{2}+...+e_{np}^{2}]\\ &=E[e_{n0}^{2}]+E[e_{n1}^{2}]+...+E[e_{np}^{2}] \end{aligned}

       可以发现,矢量的均方误差是每个元素的均方误差之和,而这恰巧又是协方差矩阵\boldsymbol{C}_{n}的对角线元素之和。

{C}_{n}=\begin{pmatrix} E[{e}_{n0}{e}_{n0}] & \cdots & E[{e}_{n0}{e}_{np}] \\ \vdots & \ddots & \vdots \\ E[{e}_{np}{e}_{n0}] & \cdots & E[{e}_{np}{e}_{np}] \end{pmatrix}

        称矩阵对角线元素之和为trace,记协方差矩阵的对角线元素之和为tr( \boldsymbol{C}_{n}),那么有:

J = tr( \boldsymbol{C}_{n})

        这就是我们优化的目标的表达式。

        接下来求\boldsymbol{C}_{n}的表达式,而求\boldsymbol{C}_{n}的表达式,就要知道{\boldsymbol{e}}_{n}的具体的表达式:

\begin{aligned} \boldsymbol{e}_{n} &=\boldsymbol{x}_{n}-\hat{\boldsymbol{x}}_{n} \\ &=\boldsymbol{x}_{n}-\hat{\boldsymbol{x^{'}}}_{n}-\boldsymbol{K}_{n}\boldsymbol{\alpha}_{n} \\ &=\boldsymbol{x}_{n}-\hat{\boldsymbol{x^{'}}}_{n}-\boldsymbol{K}_{n}(\boldsymbol{y}_{n}-\hat{\boldsymbol{y^{'}}}_{n}) \\ &= \boldsymbol{x}_{n}-\hat{\boldsymbol{x^{'}}}_{n}-\boldsymbol{K}_{n}(\boldsymbol{H} \boldsymbol{x}_{n}+\boldsymbol{v}_{n} -\boldsymbol{H} \hat{\boldsymbol{x^{'}}}_{n} ) \\ &=\boldsymbol{e^{'}}_{n}-\boldsymbol{K}_{n} \boldsymbol{H} \boldsymbol{e^{'}}_{n}-\boldsymbol{K}_{n} \boldsymbol{v}_{n} \\ &=\left(\boldsymbol{I}-\boldsymbol{K}_{n} \boldsymbol{H}\right) \boldsymbol{e^{'}}_{n}-\boldsymbol{K}_{n} \boldsymbol{v}_{n} \end{aligned}

        然后求\boldsymbol{e}_{n} \boldsymbol{e}_{n}^{\mathrm{H}}的表达式:

\begin{aligned} \boldsymbol{e}_{n} \boldsymbol{e}_{n}^{\mathrm{H}} &=[\left(\boldsymbol{I}-\boldsymbol{K}_{n} \boldsymbol{H}\right) \boldsymbol{e^{'}}_{n}-\boldsymbol{K}_{n} \boldsymbol{v}_{n}] [\left(\boldsymbol{I}-\boldsymbol{K}_{n} \boldsymbol{H}\right) \boldsymbol{e^{'}}_{n}-\boldsymbol{K}_{n} \boldsymbol{v}_{n}]^{\mathrm{H}}\\ &=\left(\boldsymbol{I}-\boldsymbol{K}_{n} \boldsymbol{H}\right)\boldsymbol{e^{'}}_{n}\boldsymbol{e}_{n}^{\mathrm{'H}} \left(\boldsymbol{I}-\boldsymbol{K}_{n} \boldsymbol{H}\right)^{\mathrm{H}} +\boldsymbol{K}_{n}\boldsymbol{v}_{n}\boldsymbol{v}_{n}^{\mathrm{H}}\boldsymbol{K}_{n}^{\mathrm{H}} \\ &- \left(\boldsymbol{I}-\boldsymbol{K}_{n} \boldsymbol{H}\right)\boldsymbol{e^{'}}_{n}\boldsymbol{v}_{n}^{\mathrm{H}}\boldsymbol{K}_{n}^{\mathrm{H}} - \boldsymbol{K}_{n}\boldsymbol{v}_{n}\boldsymbol{e}_{n}^{\mathrm{'H}} \left(\boldsymbol{I}-\boldsymbol{K}_{n} \boldsymbol{H}\right)^{\mathrm{H}} \end{aligned}

        展开后一共得到四项。对上式求期望就是协方差矩阵\boldsymbol{C}_{n}。取期望后,\boldsymbol{e}_{n} \boldsymbol{e}_{n}^{\mathrm{H}}中带有负号的两项就消失了,这是因为我们认为误差向量和噪声向量是正交的,所以它们构成的互协方差矩阵为零矩阵。先前已定义了

\boldsymbol{C}^{'}_{n}=E\left[{\boldsymbol{e}^{'}_{n}} {\boldsymbol{e}_{n}^{'\mathrm{H}}}\right]

\boldsymbol{R}=E\left[\boldsymbol{v}_{n} \boldsymbol{v}_{n}^{\mathrm{H}}\right]

        所以\boldsymbol{C}_{n}的表达式如下:

\begin{aligned} \boldsymbol{C}_{n} & =E\left[\boldsymbol{e}_{n} \boldsymbol{e}_{n}^{\mathrm{H}}\right] \\ & =\left(\boldsymbol{I}-\boldsymbol{K}_{n} \boldsymbol{H}\right) \boldsymbol{C}_{n}^{'} \left(\boldsymbol{I}-\boldsymbol{K}_{n} \boldsymbol{H}\right)^{\mathrm{H}} +\boldsymbol{K}_{n}\boldsymbol{R}\boldsymbol{K}_{n}^{\mathrm{H}} \\ & = \boldsymbol{C}_{n}^{'} - \boldsymbol{K}_{n} \boldsymbol{H} \boldsymbol{C}_{n}^{'} - \boldsymbol{C}_{n}^{'}(\boldsymbol{K}_{n} \boldsymbol{H})^{\mathrm{H}} + \boldsymbol{K}_{n}(\boldsymbol{H}\boldsymbol{C}_{n}^{'}\boldsymbol{H}^{\boldsymbol{H}}+\boldsymbol{R})\boldsymbol{K}_{n}^{\mathrm{H}} \end{aligned}

        对J = tr( \boldsymbol{C}_{n})求导数:

J =\operatorname{tr}\boldsymbol{(C_{n})}=\operatorname{tr}\boldsymbol{(C^{'}_{n})}-2 \operatorname{tr}\boldsymbol{(K_{n} H C^{'}_{n})}+\operatorname{tr}\boldsymbol{(K_{n}(H C^{'}_{n}) H^{H}+R) K_{n}^{H})}

\frac{\partial \operatorname{tr} \boldsymbol{(C_{n}})}{\partial \boldsymbol{K_{n}}}=-2 \boldsymbol{(H C^{'}_{n})}^{H}+2 \boldsymbol{K_{n}} \boldsymbol{(H C_{n}^{\prime} H^{H}+R)}

        当导数为0时均方误差最小。令导数为0,便得到了卡尔曼增益\boldsymbol{K}_{n}的表达式

\begin{aligned} \boldsymbol{K}_{n} =\boldsymbol{C}^{'}_{n} \boldsymbol{H}^{\mathrm{H}}\left(\boldsymbol{H} \boldsymbol{C}^{'}_{n} \boldsymbol{H}^{\mathrm{H}}+\boldsymbol{R}\right)^{-1} \end{aligned}

        我们试着将卡尔曼增益\boldsymbol{K}_{n}带回\boldsymbol{C}_{n}的表达式,得到\boldsymbol{C}_{n}的一个比较简单的表达式,它可以通过\boldsymbol{C}^{'}_{n}来计算\boldsymbol{C}_{n}

\boldsymbol{C}_{n}=\left(\boldsymbol{I}-\boldsymbol{K}_{n} \boldsymbol{H}\right) \boldsymbol{C^{'}_{n}}

        可是问题又来了,要知道卡尔曼增益\boldsymbol{K}_{n}\boldsymbol{C}_{n},就得知道\boldsymbol{C}^{'}_{n},可是现在\boldsymbol{C}^{'}_{n}还不知道呢,那就来求一下咯。和之前同样的顺序,先写出{\boldsymbol{e}}_{n}^{'}的表达式:

\begin{aligned} \boldsymbol{e^{'}_{n}} & = \boldsymbol{​{x}_{n}-\hat{\boldsymbol{x^{'}}}_{n}}\\ & =\boldsymbol{F} \boldsymbol{x}_{n-1}+\boldsymbol{G} \boldsymbol{u}_{n}+\boldsymbol{w}_{n} -(\boldsymbol{F} \hat{\boldsymbol{x}}_{n-1}+\boldsymbol{G} \boldsymbol{u}_{n})\\ &= \boldsymbol{F} \boldsymbol{e_{n-1}} + \boldsymbol{w}_{n} \end{aligned}

        然后求\boldsymbol{e}_{n}^{'} \boldsymbol{e}_{n}^{'\mathrm{H}},最后求期望得到\boldsymbol{C}^{'}_{n}

\begin{aligned} \boldsymbol{C}^{'}_{n}&=E\left[{\boldsymbol{e}^{'}_{n}} {\boldsymbol{e}_{n}^{'\mathrm{H}}}\right] \\ &=E[(\boldsymbol{F} \boldsymbol{e_{n-1}} + \boldsymbol{w}_{n})(\boldsymbol{F} \boldsymbol{e_{n-1}} + \boldsymbol{w}_{n})^{H}]\\ &=\boldsymbol{F}\boldsymbol{C}_{n-1}\boldsymbol{F}^{H}+ \boldsymbol{Q} \end{aligned}

        嗯,发现\boldsymbol{C}^{'}_{n}可以由\boldsymbol{C}_{n-1}递推得到。

        好了,现在咱们推完全部公式了。

四、总结

        现在将以上的一些结论罗列一下,按两类分,一类是用前一时刻数据推下一时刻数据的,我们叫做预测过程;另一类是用同一时刻的数据优化预测结果的,叫做更新过程。

        预测过程,这里都是带一撇的,表明后面得对它们进行优化更新。这里用前一时刻数据预测下一时刻的系统状态和误差协方差矩阵:

\hat{\boldsymbol{x}^{'}}_{n}=\boldsymbol{F} \hat{\boldsymbol{x}}_{n-1}+\boldsymbol{G} \boldsymbol{u}_{n}

\boldsymbol{C}^{'}_{n} =\boldsymbol{F}\boldsymbol{C}_{n-1}\boldsymbol{F}^{H}+ \boldsymbol{Q}

        更新过程,分别是计算卡尔曼增益、利用卡尔曼增益和新息更新对系统状态的估计、然后更新误差协方差矩阵:

\begin{aligned} \boldsymbol{K}_{n} =\boldsymbol{C}^{'}_{n} \boldsymbol{H}^{\mathrm{H}}\left(\boldsymbol{H} \boldsymbol{C}^{'}_{n} \boldsymbol{H}^{\mathrm{H}}+\boldsymbol{R}\right)^{-1} \end{aligned}

\hat{\boldsymbol{x}}_{n}=\hat{\boldsymbol{x}^{'}}_{n}+\boldsymbol{K}_{n}\boldsymbol{\alpha}_{n} = \hat{\boldsymbol{x}^{'}}_{n}+\boldsymbol{K}_{n}(\boldsymbol{y}_{n}-\boldsymbol{H} \hat{\boldsymbol{x}^{'}}_{n} )

\boldsymbol{C}_{n}=\left(\boldsymbol{I}-\boldsymbol{K}_{n} \boldsymbol{H}\right) \boldsymbol{C^{'}_{n}}

     也就是说,可以用\hat{\boldsymbol{x}}_{n-1}预测得到\hat{\boldsymbol{x}^{'}}_{n},用\boldsymbol{C}_{n-1}来递推得到\boldsymbol{C}^{'}_{n},知道\boldsymbol{C}^{'}_{n}就可以知道卡尔曼增益\boldsymbol{K}_{n},知道\boldsymbol{K}_{n}之后就可以用更新公式得到一个较好的系统状态估计\hat{\boldsymbol{x}}_{n}了,与此同时,我们还要利用\boldsymbol{C}^{'}_{n}来计算一下\boldsymbol{C}_{n}

        等下一次数据来了,用\hat{\boldsymbol{x}}_{n}预测得到\hat{\boldsymbol{x}^{'}}_{n+1},用\boldsymbol{C}_{n}来递推得到\boldsymbol{C}^{'}_{n+1},然后得到\boldsymbol{K}_{n+1},然后得到\hat{\boldsymbol{x}}_{n+1},然后得到\boldsymbol{C}_{n+1}。就这么循环嘛,直到用完全部观测数据为止。

        需要注意的是,因为预测过程需要上一时刻的数据,所以就得定义两个初始值,也就是-1时刻的\hat{\boldsymbol{x}}_{-1}\boldsymbol{C}_{-1}是需要人为定义的,这个要根据先验信息来确定,或者随机初始化应该也可以。

        就这样。

        码公式太累了。

你可能感兴趣的:(算法)