卡曼滤波推导

主要参考文献:MIT Kalman filter tutorial

ps: 有错误请指出。

1. 卡曼滤波推导的前言

首先,我接下来的推导是基于离散系统的(非连续系统)。

其次,卡曼滤波成立的条件是默认当前研究的离散系统是一个马尔可夫过程,即等同基于这个假设:当前的状态只与上一时刻的状态相关。马尔可夫过程是一类随机过程,它的原始模型是马尔可夫链。马尔可夫过程是研究离散事件动态系统状态空间的重要方法,它的数学基础是随机过程。

1.1. 离散系统状态空间(State Space)

状态空间是控制系统里的一个专业名词。状态空间代表着一个系统可以用矩阵来描述,输入输出可以用向量来描述以及系统状态更新可以用线性代数来描述,这一点在下方会以公式来说明。状态空间使得单输入单输出,多输入单输出或者多输入多输出的系统都可以有一个统一的描述方法。

1.2. 系统描述

如果一个离散系统是马尔可夫过程,那么系统的可以用状态空间来表述:

x_k_+_1 = \Phi x_k + w_k                ... ... (1)

z_k = Hx_k + v_k                    ... ... (2)

这里的x_k_+_1是一个nx1的向量,描述k+1时刻的系统状态量,而x_k描述的是k时刻的,\Phi是一个nxn的矩阵,是状态传递矩阵。状态传递矩阵是要你基于对系统的了解,把x_k_+_1以及x_k每一元素之间的关系描述出来。

w_k是nx1的向量,被称作为k时刻的过程噪声。这个过程噪声是系统与生俱来的,在状态更新时需要加上去(ps:噪声和误差的区别:噪声是指自然存在的,误差或估算误差产生于人类的信息不足或者对系统的理解不足)。这里我们需要假设这个噪声是时间上平稳的,也就是噪声在任何一段时间里都可以以相同的方法描述。例如,多数情况下我们都把这个噪声描述为高斯分布,且这个高斯分布的均值和方差都不随时间而变化。同时,我们通常假设这个噪声是白噪声。至于为什么我也想问。

z_k是一个mx1的向量,是k时刻的观测量,而H矩阵是一个mxn的矩阵,是状态观测转换矩阵。这个转换矩阵是用来描述x_kz_k里每一元素之间的关系。

v_k是mx1的向量,被称作k时刻的观测噪声。同样的,我们假设观测噪声是时间上平稳的,是白噪声。还有,与过程噪声无相关性。

 

2. 卡曼滤波推导

2.1. 卡曼滤波的目标min(T[E(e_ke_k^T)]) 

卡曼滤波其实本质上是一个均方误差减少器(mean squared error minimizer)。

让我们把我们对状态量的估计设为\widehat{x}_k,那么估计的误差:e_k = x_k - \widehat{x}_k (nx1矩阵)。

那么卡曼滤波的任务就是减少估计的误差e_k, 数学上表现为:min(E(e_1_k^2)+E(e_2_k^2)+...+E(e_n_k^2)    ... ... (3)

(1) 也等于min(E(e_1_k^2+e_2_k^2+...+e_n_k^2)) = min(T[E(e_ke_k^T)])   (T[ ]为求矩阵的迹)

让我们把 E(e_ke_k^T) 设为P_k。我们把这个nxn的矩阵P_k称作t时刻的状态估算误差协方差矩阵。

 

2.2. 更新状态量估算\widehat{x}_k

根据对系统的了解,我们获得卡曼滤波器上一帧时刻对目前时刻的状态量的估计\widehat{x}_k' (具体公式为\widehat{x}_k' = \Phi \widehat{x}_k_-_1,详见章节2.5 和3) , 我们也称其为目前时刻的未验估计(prior estimate)。那么状态量的更新公式为:

\widehat{x}_k = \widehat{x}_k' + K_k(z_k - H\widehat{x}_k')             ... ... (4)

此公式是被这样设定的,没有推导。

其中z_k - H\widehat{x}_k我们称为新息i_kK_k称为卡曼增益。整一个卡曼滤波最重要就这个卡曼增益对状态量估算更新的帮助。而卡曼增益怎么算,我们会在下文讨论。

 

2.3. 计算卡曼增益K_k

卡曼增益的设置就是为了完成对P_k的减少。我们可以把P_k的迹对K_k的偏导等于0,即\frac{dT[P_k]}{dK_k} = 0,来求得什么K_k对应着P_k的迹的最小值。

那么P_k的迹和K_k之间的关系式是什么?推导如下:

首先,把(2)带入(4),得到:\widehat{x}_k = \widehat{x}_k' + K_k(Hx_k+v_k - H\widehat{x}_k') 

那么e_k = x_k - \widehat{x_k} = x_k - \widehat{x_k}'- K_kHx_k - K_kv_k+K_kH\widehat{x_k}'

            = (x_k - K_kHx_k) +(K_kH\widehat{x_k}' - \widehat{x_k}')-K_kv_k

            =x_k (I- K_kH) +\widehat{x_k}' (K_kH -I)-K_kv_k

            = (I- K_kH) (x_k -\widehat{x_k}')-K_kv_k

 

那么P_k=E[e_ke_k^T]

             =E[[(I-K_kH)(x_k-\widehat{x}_k')-K_kv_k][(I-K_kH)(x_k-\widehat{x}_k')-K_kv_k]^T]   ... ... (5)

因为e_k'=x_k-\widehat{x}_k'是先验估计的误差,而v_k是是观测噪声,他们是uncorrelated,所以他们乘积的期望值为0。

(5) = P_k = (I-K_kH)E[(x_k-\widehat{x}_k')(x_k-\widehat{x}_k')^T](I-K_kH)^T+K_kE[v_kv_k^T]K_k^T

 

因为当中的E[(x_k-\widehat{x}_k')(x_k-\widehat{x}_k')^T]等于协方差的先验估计P_k',同时把E[v_kv_k^T]设为 R矩阵(nxn矩阵)

那么P_k = (I-K_kH)P_k'(I-K_kH)^T+K_kRK_k^T   ... ... (6)

 

让我们展开上式(6),我们得到 P_k = P_k' - K_kHP_k' - P_k'H^TK_k^T+K_k(HP_k'H^T+R)K_k^T    ... ... (7)

 

对上式(7),我们左右取矩阵的迹:T[P_k] = T[P_k' - K_kHP_k' - P_k'H^TK_k^T+K_k(HP_k'H^T+R)K_k^T]

=> T[P_k] = T[P_k' - K_kHP_k' - P_k'H^TK_k^T+K_k(HP_k'H^T+R)K_k^T]

=> T[P_k] = T[P_k'] - T[K_kHP_k'] - T[P_k'H^TK_k^T]+T[K_k(HP_k'H^T+R)K_k^T]

因为K_kHP_k'都是nxn矩阵,同时又因,如果A和B都是正方形矩阵,T[AB] = T[BA] = T[A^TB]=T[B^TA]点击查看维基百科说的,所以T[(K_kH)P_k'] = T[P_k'(K_kH)^T] =T[P_k'H^TK_k^T] 。

=> T[P_k] = T[P_k'] - 2T[K_kHP_k']+T[K_k(HP_k'H^T+R)K_k^T]     ... ... (8)

 

我们在这一章节开头就说到我们推导的目标:把P_k的迹对K_k的偏导等于0,即\frac{dT[P_k]}{dK_k} = 0,来求得什么K_k对应着P_k的迹的最小值。

所以,我们对式子(8)求对K_k的偏导:

\frac{dT[P_k]}{dK_k} = \frac{dT[P_k]'}{dK_k} - 2\frac{dT[K_kHP_k']}{dK_k} +\frac{dT[K_k(HP_k'H^T+R)K_k^T]}{dK_k}     ... ... (9)

根据维基百科我们知道:\frac{dT[AB]}{dA}=\frac{dT[BA]}{dA}=B^T以及\frac{dT[ABA^T]}{dA}=2AB

所以 \frac{dT[K_kHP_k']}{dK_k} = (HP_k')^T以及\frac{dT[K_k(HP_k'H^T+R)K_k^T]}{dK_k}=2K_k(HP_k'H^T+R)

那么(9)=> \frac{dT[P_k]}{dK_k} = -2(HP_k')^T+2K_k(HP_k'H^T+R)=0

=> -2(HP_k')^T+2K_k(HP_k'H^T+R)=0

=> (HP_k')^T=K_k(HP_k'H^T+R)

=> K_k =\frac{ (HP_k')^T}{(HP_k'H^T+R)}    ... ... (10)

所以卡曼增益可利用公式(10)求得。

通过公式我们知道卡曼增益与协方差的先验估计P_k',状态观测转换矩阵H以及观测噪声v_k有关。

 

2.4 用卡曼增益来更新状态估算误差矩阵

我们把公式(10)代入到公式(6),得到状态估算误差矩阵

P_k = P_k'-P_k'H^T(HP_k'H^T+R)^-^1HP_k' 

      = P'_k - K_kHP'_k

      = (I -K_kH)P'_k   ... ... (11)

 

2.5 用新的状态估算误差矩阵预测(投影)下一帧的状态估算误差矩阵的先验估计P_k_+_1'

下一帧的状态的先验估计等于当前状态投影 \widehat{x}'_k_+_1 = \Phi \widehat{x}_k

那么下一帧误差的先验估计为:e'_k_+_1=x_k_+_1-\widehat{x}'_k_+_1

                                                           = \Phi x_k+w_k-\Phi \widehat{x}_k

                                                           = \Phi e_k + w_k

就像章节2.1里面,我们把 E(e_ke_k^T) 设为P_k。这里,下一帧的状态估算误差矩阵的先验估计

P_k_+_1' =  E(e'_k_+_1e'_k_+_1^T) =  E((\Phi e_k + w_k)(\Phi e_k + w_k)^T

同时,e_k为从开始到现在累积的误差,而w_k为k时刻与k+1时刻间的过程噪声,它们之间无相关性,E(\Phi e_k w_k) = 0.

那么P_k_+_1' = E[\Phi e_k (\Phi e_k)^T] + E[w_k w_k^T]+2E[e_k w_k] 

                = \Phi P_k \Phi^T + Q+0   ... ... (12)

 

 

3. 总结 

一个完整的迭代卡曼滤波器包含四个步骤:

a. 计算当前帧卡曼增益:K_k =\frac{ (HP_k')^T}{(HP_k'H^T+R)}     (公式10)

b. 更新当前帧状态估计:\widehat{x}_k = \widehat{x}_k' + K_k(z_k - H\widehat{x}_k')

c. 更新当前状态估算误差矩阵: P_k = (I -K_kH)P'_k   (公式11)

d. 投影出下一帧的状态的先验估计(用于下次步骤b): \widehat{x}'_k_+_1 = \Phi \widehat{x}_k

    投影出下一帧的估算误差矩阵的先验估计(用于下次步骤a,c): P_k_+_1' = \Phi P_k \Phi^T + Q   (公式12)

 

你可能感兴趣的:(SLAM)