【程序人生】Kalman Filter卡尔曼滤波器

【程序人生】Kalman Filter卡尔曼滤波器

Kalman Filter的原理和推导过程

本文将以二维图像中的object track任务为例,说明Kalman Filter的原理和推导过程

假设在二维图像的像素坐标系下,被跟踪的目标用一个宽高分别平行于像素坐标系 u v uv 的box表示,且目标做匀速运动
系统的状态变量可以用一个八维列向量表示: [ c e n t e r x , c e n t e r y , w i d t h h e i g h t , h e i g h t , v c e n t e r x , v c e n t e r y , v w i d t h h e i g h t , v h e i g h t ] T [center_x, center_y, \dfrac{width}{height}, height, v_{center_x}, v_{center_y}, v_{\dfrac{width}{height}}, v_{height}]^T v v 代表速度。

注意假设是在真实的情况下,比如通过在某一个固定的位置的摄像头,tarck马路上的车辆,这时匀速运动车辆的box的size也是匀速变化的。

首先,上第一个方程,预测状态方程
c e n t e r x ^ = c e n t e r x + v c e n t e r x \hat{center_x} = center_x + v_{center_x}

c e n t e r y ^ = c e n t e r y + v c e n t e r y \hat{center_y} = center_y + v_{center_y}

w i d t h h e i g h t ^ = w i d t h h e i g h t + v w i d t h h e i g h t \hat{\dfrac{width}{height}} = \dfrac{width}{height} + v_{\dfrac{width}{height}}

h e i g h t ^ = h e i g h t + v h e i g h t \hat{height} = height + v_{height}

v c e n t e r x ^ = v c e n t e r x \hat{v_{center_x}} = v_{center_x}

v c e n t e r y ^ = v c e n t e r y \hat{v_{center_y}} = v_{center_y}

v w i d t h h e i g h t ^ = v w i d t h h e i g h t \hat{v_{\dfrac{width}{height}}} = v_{\dfrac{width}{height}}

v h e i g h t ^ = v h e i g h t \hat{v_{height}} = v_{height}

上述八个等式写成矩阵形式就是:
[ c e n t e r x ^ c e n t e r y ^ w i d t h h e i g h t ^ h e i g h t ^ v c e n t e r x ^ v c e n t e r y ^ v w i d t h h e i g h t ^ v h e i g h t ^ ] = [ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 ] [ c e n t e r x c e n t e r y w i d t h h e i g h t h e i g h t v c e n t e r x v c e n t e r y v w i d t h h e i g h t v h e i g h t ] \begin{bmatrix}{\hat{center_x}}\\{\hat{center_y}}\\{\hat{\dfrac{width}{height}}}\\{\hat{height}}\\{\hat{v_{center_x}}}\\{\hat{v_{center_y}}}\\{\hat{v_{\dfrac{width}{height}}}}\\{\hat{v_{height}}}\end{bmatrix} = \begin{bmatrix}1&0&0&0&1&0&0&0\\0&1&0&0&0&1&0&0\\0&0&1&0&0&0&1&0\\0&0&0&1&0&0&0&1\\0&0&0&0&1&0&0&0\\0&0&0&0&0&1&0&0\\0&0&0&0&0&0&1&0\\0&0&0&0&0&0&0&1\end{bmatrix} * \begin{bmatrix}{center_x}\\{center_y}\\{\dfrac{width}{height}}\\{height}\\{v_{center_x}}\\{v_{center_y}}\\{v_{\dfrac{width}{height}}}\\{v_{height}}\end{bmatrix}

也就是:
X k k 1 = F X k 1 k 1 预测状态方程:X_{k|k-1} = FX_{k-1|k-1}

X k 1 k 1 X_{k-1|k-1} k 1 k-1 时刻的最优状态变量 X k k 1 X_{k|k-1} k 1 k-1 时刻, k k 时刻的状态变量预测值 F F 我们暂时称之为 m o t i o n motion 矩阵,在当前假设情景下是固定不变的我们想求得 X k k X_{k|k} ,也就是 k k 时刻的最优状态变量

除了预测值,还有测量值可以参考。
因为凭借图像信息,只有位置信息可以统计测量值,所以有等式如下:
[ c e n t e r x ^ / c e n t e r y ^ / w i d t h h e i g h t ^ / h e i g h t ^ / ] = [ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 ] [ c e n t e r x ^ c e n t e r y ^ w i d t h h e i g h t ^ h e i g h t ^ v c e n t e r x ^ v c e n t e r y ^ v w i d t h h e i g h t ^ v h e i g h t ^ ] \begin{bmatrix}{\hat{center_x}}^/\\{\hat{center_y}}^/\\{\hat{\dfrac{width}{height}}}^/\\{\hat{height}}^/\end{bmatrix} = \begin{bmatrix}1&0&0&0&0&0&0&0\\0&1&0&0&0&0&0&0\\0&0&1&0&0&0&0&0\\0&0&0&1&0&0&0&0\end{bmatrix} * \begin{bmatrix}{\hat{center_x}}\\{\hat{center_y}}\\{\hat{\dfrac{width}{height}}}\\{\hat{height}}\\{\hat{v_{center_x}}}\\{\hat{v_{center_y}}}\\{\hat{v_{\dfrac{width}{height}}}}\\{\hat{v_{height}}}\end{bmatrix}
这个等式是通过状态变量的预测值,得到测量值的预测值
也就是:
Z k ^ = H X k k 1 \hat{Z_k} = HX_{k|k-1} ,通过 k 1 k-1 时刻, k k 时刻的状态变量预测值,得到 k k 时刻测量值的预测值。 H H 我们暂时称之为 u p d a t e update 矩阵,在当前假设情景下是固定不变的 k k 时刻的测量值记为 Z k Z_k ,这个值是图像中实际测量得到的

k k 时刻状态变量的真实值为 X k X_k 测量的噪声为 V k V_k ,有:
Z k = H X k + V k Z_k = HX_k + V_k

如何通过预测值和测量值,得到最优值呢?由一般的反馈思想,有:
X k k = X k k 1 + K k ( Z k Z k ^ ) = X k k 1 + K k ( Z k H X k k 1 ) 更新最优值方程:X_{k|k} = X_{k|k-1} + K_k(Z_k - \hat{Z_k}) = X_{k|k-1} + K_k(Z_k - HX_{k|k-1})
k k 时刻状态变量的最优值,等于 k 1 k-1 时刻对 k k 时刻状态变量的预测值,加一个增益系数乘测量值和测量值的预测值的差。这个公式是卡尔曼滤波器的第二个方程, 更新最优值方程,它也正是卡尔曼滤波器的输出, K k K_k 被称为卡尔曼增益。

如和求卡尔曼增益 K k K_k 呢?这里使用最小均方误差的思想

k k 时刻,状态变量最优估计值,和,真实值,之间误差的协方差矩阵设为 P k k = E ( ( X k X k k ) ( X k X k k ) T ) P_{k|k} = E((X_k - X_{k|k})(X_k - X_{k|k})^T)
k k 时刻,系统变量预测值,和,真实值,之间误差的协方差矩阵设为 P k k 1 = E ( ( X k X k k 1 ) ( X k X k k 1 ) T ) P_{k|k-1} = E((X_k - X_{k|k-1})(X_k - X_{k|k-1})^T)

X k k = X k k 1 + K k ( Z k Z k ^ ) = X k k 1 + K k ( Z k H X k k 1 ) X_{k|k} = X_{k|k-1} + K_k(Z_k - \hat{Z_k}) = X_{k|k-1} + K_k(Z_k - HX_{k|k-1}) 代入 P k k P_{k|k}

P k k = E ( [ X k X k k 1 K k ( Z k H X k k 1 ) ] [ X k X k k 1 K k ( Z k H X k k 1 ) ] T ) P_{k|k} = E([X_k - X_{k|k-1} - K_k(Z_k - HX_{k|k-1})][X_k - X_{k|k-1} - K_k(Z_k - HX_{k|k-1})]^T)

P k k = E ( [ X k X k k 1 K k ( H X k + V k H X k k 1 ) ] [ X k X k k 1 K k ( H X k + V k H X k k 1 ) ] T ) P_{k|k} = E([X_k-X_{k|k-1}-K_k(HX_k+V_k-HX_{k|k-1})][X_k-X_{k|k-1}-K_k(HX_k+V_k-HX_{k|k-1})]^T)

P k k = E ( [ ( I K k H ) ( X k X k k 1 ) K k V k ] [ ( I K k H ) ( X k X k k 1 ) K k V k ] T ) P_{k|k} = E([(I-K_kH)(X_k-X_{k|k-1})-K_kV_k][(I-K_kH)(X_k-X_{k|k-1})-K_kV_k]^T)

P k k = E ( [ ( I K k H ) ( X k X k k 1 ) K k V k ] [ ( ( I K k H ) ( X k X k k 1 ) ) T ( K k V k ) T ] ) P_{k|k}= E([(I-K_kH)(X_k-X_{k|k-1})-K_kV_k][((I-K_kH)(X_k-X_{k|k-1}))^T-(K_kV_k)^T])

P k k = E ( [ ( I K k H ) ( X k X k k 1 ) K k V k ] [ ( X k X k k 1 ) T ( I K k H ) T V k T K k T ] ) P_{k|k}= E([(I-K_kH)(X_k-X_{k|k-1})-K_kV_k][(X_k-X_{k|k-1})^T(I-K_kH)^T-{V_k}^T{K_k}^T])

注意到系统状态变量和测量噪声之间是相互独立的,所以有:

P k k = E ( [ I K k H ] [ X k X k k 1 ] [ X k X k k 1 ] T [ I K k H ] T + K k V k V k T K k T ) P_{k|k}= E([I-K_kH][X_k-X_{k|k-1}][X_k-X_{k|k-1}]^T[I-K_kH]^T + K_kV_k{V_k}^T{K_k}^T)

P k k = ( I K k H ) E ( ( X k X k k 1 ) ( X k X k k 1 ) T ) ( I K k H ) T + K k E ( V k V k T ) K k T P_{k|k}=(I-K_kH)E((X_k - X_{k|k-1})(X_k - X_{k|k-1})^T)(I-K_kH)^T+K_kE(V_k{V_k}^T){K_k}^T

E ( V k V k T ) E(V_k{V_k}^T) R R 是系统测量噪声的协方差矩阵,有:

P k k = ( I K k H ) P k k 1 ( I K k H ) T + K k R K k T P_{k|k}=(I-K_kH)P_{k|k-1}(I-K_kH)^T+K_kR{K_k}^T

P k k = P k k 1 P k k 1 H T K k T K k H P k k 1 + K k ( H P k k 1 H T + R ) K k T P_{k|k}=P_{k|k-1}-P_{k|k-1}H^T{K_k}^T-K_kHP_{k|k-1}+K_k(HP_{k|k-1}H^T+R){K_k}^T

因为协方差矩阵对角线的值的和就是方差的和,所以对 P k k P_{k|k} 求矩阵的迹:

一个 n n n*n 的矩阵 A A 的迹,是指 A A 主对角线上各元素的总和,记做 t r ( A ) tr(A)
有定理 t r ( A B ) = t r ( B A ) tr(AB) = tr(BA)

有定理 d ( t r ( X B ) ) d ( X ) = d ( t r ( B X ) ) d ( X ) = B T \dfrac{d(tr(XB))}{d(X)}=\dfrac{d(tr(BX))}{d(X)}=B^T

有定理 d ( t r ( A X B X T ) ) d ( X ) = A X B + A T X B T \dfrac{d(tr(AXBX^T))}{d(X)}=AXB + A^TXB^T

所以:

t r ( P k k ) = t r ( P k k 1 ) 2 t r ( K k H P k k 1 ) + t r ( K k ( H P k k 1 H T + R ) K k T ) tr(P_{k|k}) =tr(P_{k|k-1})-2*tr(K_kHP_{k|k-1})+tr(K_k(HP_{k|k-1}H^T+R){K_k}^T)

因为要求 K k K_k 的值,使得 t r ( P k k ) tr(P_{k|k}) 最小,所以对 t r ( P k k ) tr(P_{k|k}) 关于 K k K_k 求导,令其导数为零,有:

d ( t r ( P k k ) ) d ( K k ) = 2 P k k 1 H T + K k ( H P k k 1 H T + R ) + K k ( H P k k 1 H T + R ) T = 0 \dfrac{d(tr(P_{k|k}))}{d(K_k)}=-2{P_{k|k-1}}H^T +K_k(HP_{k|k-1}H^T+R)+K_k(HP_{k|k-1}H^T+R)^T=0

K k = P k k 1 H T H P k k 1 H T + R 卡尔曼增益方程:K_k=\dfrac{{P_{k|k-1}}H^T}{HP_{k|k-1}H^T+R} ,这是卡尔曼滤波器的第三个方程,卡尔曼增益方程

注意, P k k 1 P_{k|k-1} 越大, K k K_k 就越大,权重将更加重视反馈,如果 P k k 1 P_{k|k-1} 等于0,也就是预测值和真实值相等,那么 K k K_k 等于0,最优估计值等于预测值。

K k K_k 反代入 P k k P_{k|k} 中,有:
P k k = P k k 1 P k k 1 H T K k T K k H P k k 1 + K k ( H P k k 1 H T + R ) K k T P_{k|k}=P_{k|k-1}-P_{k|k-1}H^T{K_k}^T-K_kHP_{k|k-1}+K_k(HP_{k|k-1}H^T+R){K_k}^T

P k k = P k k 1 P k k 1 H T H P k k 1 H P k k 1 H T + R P_{k|k}=P_{k|k-1}-\dfrac{P_{k|k-1}H^THP_{k|k-1}}{HP_{k|k-1}H^T+R}

P k k = P k k 1 K k H P k k 1 P_{k|k}=P_{k|k-1}-K_kHP_{k|k-1}

P k k = ( I K k H ) P k k 1 更新协方差方程:P_{k|k}=(I-K_kH)P_{k|k-1} ,这是卡尔曼滤波器的第四个方程,更新协方差方程

要计算卡尔曼增益, H H R R 都是已知或是固定的,那么如何求 P k k 1 P_{k|k-1} 呢?和 X k k X k k 1 X_{k|k}、X_{k|k-1} 一样,也是一个迭代的过程

P k k 1 = E ( ( X k X k k 1 ) ( X k X k k 1 ) T ) P_{k|k-1} = E((X_k - X_{k|k-1})(X_k - X_{k|k-1})^T)

X k k 1 = F X k 1 k 1 X_{k|k-1} = FX_{k-1|k-1}

另外,有:

X k = F X k 1 + W X_k=FX_{k-1} + W W W 是系统过程的噪声

P k k 1 = E ( ( F X k 1 + W F X k 1 k 1 ) ( F X k 1 + W F X k 1 k 1 ) T ) P_{k|k-1}=E((FX_{k-1} + W-FX_{k-1|k-1})(FX_{k-1} + W-FX_{k-1|k-1})^T)

P k k 1 = E ( [ F ( X k 1 X k 1 k 1 ) + W ] [ F ( X k 1 X k 1 k 1 ) + W ] T ) P_{k|k-1}=E([F(X_{k-1}-X_{k-1|k-1})+W][F(X_{k-1}-X_{k-1|k-1})+W]^T)

注意到系统状态变量和噪声之间是独立的,所以有:

P k k 1 = E ( [ F ( X k 1 X k 1 k 1 ) ] [ F ( X k 1 X k 1 k 1 ) ] T ) + E ( W W T ) P_{k|k-1}=E([F(X_{k-1}-X_{k-1|k-1})][F(X_{k-1}-X_{k-1|k-1})]^T)+E(WW^T)

E ( W W T ) E(WW^T) Q Q 是系统过程噪声的协方差矩阵

P k k 1 = F P k 1 k 1 F T + Q 预测协方差方程:P_{k|k-1}=FP_{k-1|k-1}F^T+Q ,这是卡尔曼滤波器的第五个方程,预测协方差方程

到这里,卡尔曼滤波器的五个方程全部给出,推导完毕。

总结

卡尔曼滤波器的五个方程:

  1. X k k 1 = F X k 1 k 1 预测状态方程:X_{k|k-1} = FX_{k-1|k-1}
  2. P k k 1 = F P k 1 k 1 F T + Q 预测协方差方程:P_{k|k-1}=FP_{k-1|k-1}F^T+Q
  3. K k = P k k 1 H T H P k k 1 H T + R 卡尔曼增益方程:K_k=\dfrac{{P_{k|k-1}}H^T}{HP_{k|k-1}H^T+R}
  4. X k k = X k k 1 + K k ( Z k Z k ^ ) = X k k 1 + K k ( Z k H X k k 1 ) 更新最优值方程:X_{k|k} = X_{k|k-1} + K_k(Z_k - \hat{Z_k}) = X_{k|k-1} + K_k(Z_k - HX_{k|k-1})
  5. P k k = ( I K k H ) P k k 1 更新协方差方程:P_{k|k}=(I-K_kH)P_{k|k-1}

其中 m o t i o n motion 矩阵 F F u p d a t e update 矩阵 H H ,根据实际问题情景给出。系统测量噪声的协方差矩阵 R R 和系统过程噪声的协方差矩阵 Q Q ,也作为已知条件设置为定值。

所以,确定了最早的系统变量的协方差矩阵 P 0 P_0 ,可以得到预测协方差,然后得到卡尔曼增益,然后通过系统变量的预测值和测量值得到最优的估计值,并通过卡尔曼增益计算出下面的协方差矩阵。这是一个递推的过程。

结语

如果您有修改意见或问题,欢迎留言或者通过邮箱和我联系。
手打很辛苦,如果我的文章对您有帮助,转载请注明出处。

发布了57 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Zhang_Chen_/article/details/103641345