Notes for Kalman Filter and Extended KF



Udacity term2 (Sensor Fusion, Localization, and Control) 的第一個 Project 就是用 KF and EKF 將 Lidar and Radar 的資訊做 fusion 並且可以 tracking。由於 KF/EKF 的數學符號很多,因此想筆記一下方便日後回想,所以主要以我自己看的角度,可能有些地方會沒有明確說明。本篇的筆記來源是

  1. 這裡,這篇真的講的超棒的,清楚易懂! 非常建議直接去看!
  2. Udacity 課程內容

若要實作所有的計算流程不管理論的話,可直接跳到 “7. 總結 Lidar and Radar Fusion”。

State Space Model

這是整個 KF/EKF 的模型假設,寫出來如下:

$$\begin{align} x_k = F_kx_{k-1}+\nu_k \\ z_k = H_kx_k+\omega_k \end{align}$$

\(x_k\) 是在時間點 \(t\) 的 states,也是我們希望能夠估計出來的(但是無法直接觀察到)。而 states 滿足 線性的一次遞迴 關係,也就是式子(1)。 \(\nu_k\sim\mathcal{N}(0,Q_k)\) 是 state nose。
\(z_k\) 是在時間點 \(t\) 的 observations,透過 \(H_k\) 將 states 轉換到 observations。 \(\omega_k\sim\mathcal{N}(0,R_k)\) 是 sensor noise,而 \(R_k\) 基本上會由製造廠商提供。基本上兩個 noises 都跟所有人都 independent。


Prediction Stage

整個 KF/EKF 都是基於 Gaussian distribution。因此假設我們有 \(k-1\) 時間點的 state 估計,所以我們知道 \(x_{k}\sim\mathcal{N}(\hat{x}_k,P_k)\) 會變成如下的一個 Gaussian:

$$\begin{align} \hat{x}_{k}=F_k\hat{x}_{k-1} \\ P_k = F_kP_{k-1}F_k^T+Q_k \end{align}$$

式(3)and(4)即為 Prediction Stage
又因為我們知道 observation 跟 state 之間的關係為透過 \(H_k\) 轉換,在完全沒有 sensor noise 情況下,所以可以得知 prediction 的觀察值為:

$$\begin{align} z_{expected}\sim\mathcal{N}(\mu_{expected},\Sigma_{expected}) \\ \mathcal{N}\left( \begin{array}{c} \vec{\mu}_{expected}=H_k\hat{x}_{k}, & \Sigma_{expected} = H_kP_kH_k^T \end{array} \right) \end{align}$$


Update Stage

我們令實際上的觀察值為 \(z_k\sim\mathcal{N}(\vec{z}_k,R_k)\),將觀察值的 Gaussian 和 predict 的 Gaussian 畫出如下:

而將兩個 Gaussian pdfs 相乘的話:
$$\begin{align} \mathcal{N}(x,\mu_0,\Sigma_0)\cdot\mathcal{N}(x,\mu_1,\Sigma_1)=\mathcal{N}(x,\mu',\Sigma') \\ \end{align}$$
仍然會得到另一個 Gaussian:
$$\begin{align} K=\Sigma_0(\Sigma_0+\Sigma_1)^{-1} \\ \mu'=\mu_0+K(\mu_1-\mu_0) \\ \Sigma'=\Sigma_0-K\Sigma_0 \end{align}$$

\(K\) 稱為 Kalman Gain。由式(10)可知,update 後的 covariance matrix 會愈來愈小,表示我們對於 prediction 的觀察值會愈來愈確定。另外由(9)可知,Kalman Gain 控制著要相信哪邊多一點。
把估測的觀察值 pdf 和實際觀察值的 pdf,即 \(z_k\sim\mathcal{N}(\vec{z}_k,R_k)\) 和式(5)兩個 pdfs 代入到式 (8)~(10) 得到如下:

$$\begin{align} H_k\hat{x}_k'=H_k\hat{x}_k+K(\vec{z}_k-H_k\hat{x}_k) \\ H_kP_k'H_k^T=H_kP_kH_k^T-KH_kP_kH_k^T \\ K=H_kP_kH_k^T(H_kP_kH_k^T+R_k)^{-1} \end{align}$$

把 (11)~(13) 開頭的 \(H_k\) 去掉,並且把 (12) and (13) 結尾的 \(H_k^T\) 去掉變成
$$\begin{align} \hat{x}_k'=\hat{x}_k+K(\vec{z}_k-H_k\hat{x}_k) \\ P_k'=P_k-KH_kP_k \\ K=P_kH_k^T(H_kP_kH_k^T+R_k)^{-1} \end{align}$$

(14)~(16)就是 KF 的 Update Stage! 新的 states 估計值就被我們得到,然後這個值就可以被當成下一次 loop 的初始值。


KF Flow

擷取網站上的圖片:


Lidar/Radar 的一些設定

state 定義為 \(x=(p_x,p_y,v_x,v_y)\) 分別是 (x 的位置, y 的位置, x 的速度, y 的速度)。

  • \(F_k\) 會根據兩次 sensor data 之間的時間間隔 \(\vartriangle t\) 來表示:
  • 另外我們將 加速度考慮為一個 mean = 0, covariance matrix = Q 的一個 random noise 的話,式 (1) and (4) 必須做修改。


    其中 \(Q_v\) 使用者自己設定調整,所以 state noise 的 covariance matrix 為
  • Lidar 只會觀察到位置,因此 Lidar 的 \(H\) 為:$$H_{lidar}= \left( \begin{array}{clr} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \end{array} \right)$$ Radar 就比較特別了,它觀察到的是以 polar coordinate 來表示。

    所以它的 states 和 observation 之間的關係無法用一個 matrix \(H\) 來代表,是如下的 non-linear 式子:$$\begin{align} h(x)= \left( \begin{array}{clr} \rho \\ \phi \\ \dot{\rho} \end{array} \right) = \left( \begin{array}{clr} \sqrt{p_x^2+p_y^2} \\ \arctan(p_y/p_x) \\ \frac{p_xv_x+p_yv_y}{\sqrt{p_x^2+p_y^2}} \end{array} \right) \end{align}$$ 為了讓它符合 state-space model 的線性式子,只好使用 Taylor 展開式,只使用 Jaccobian matrix 針對 \(h\) 去展開,而這個就是 Extended KF

EKF

稍微改寫一下 Update Stage:
$$\begin{align} y=(\vec{z}_k-H_k\hat{x}_k) \\ S=H_kP_kH_k^T+R_k \\ \hat{x}_k'=\hat{x}_k+Ky \\ P_k'=P_k-KH_kP_k \\ K=P_kH_k^TS^{-1} \end{align}$$
在 EKF 中,由於我們使用 Taylor 展開式去逼近 \(h\),因此上述的 \(H_k\) 必須使用如下式子計算:

但是,這邊還有一個 tricky 的地方! 就是 式(18)直接使用式(17) \(h\) 的 non-linear function 計算!
回想一下我們將 \(h\) 做 linearlization 的目的: 就是式(5),(6)下的那張圖的轉換。如果 Gaussian pdf 經過 nonlinear 轉換後會變成 “非Gaussian”,因此只好做線性逼近。
既然線性轉換的 pdf 都已經是逼近了,不如就將 mean 使用最精確的值,因此 \(y\) 就直接使用式(17)計算。所以式(18)要改成:
$$\begin{align} y=(\vec{z}_k-h(\hat{x}_k)) \end{align}$$


總結 Lidar and Radar Fusion

  • [Predict]$$\hat{x}_{k}=F_k\hat{x}_{k-1} \\ P_k = F_kP_{k-1}F_k^T+Q$$ where
  • [Lidar Update]$$y=(\vec{z}_k-H_{lidar}\hat{x}_k) \\ S=H_{lidar}P_kH_{lidar}^T+R_k \\ \hat{x}_k'=\hat{x}_k+Ky \\ P_k'=P_k-KH_{lidar}P_k \\ K=P_kH_{lidar}^TS^{-1}$$ where \(R_k\) sensor noise covariance matrix 由廠商提供, and $$H_{lidar}= \left( \begin{array}{clr} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \end{array} \right)$$
  • [Radar Update]$$y=(\vec{z}_k-h(\hat{x}_k)) \\ S=H_kP_kH_k^T+R_k \\ \hat{x}_k'=\hat{x}_k+Ky \\ P_k'=P_k-KH_kP_k \\ K=P_kH_k^TS^{-1}$$ where \(R_k\) sensor noise covariance matrix 由廠商提供, and $$h(x)= \left( \begin{array}{clr} \rho \\ \phi \\ \dot{\rho} \end{array} \right) = \left( \begin{array}{clr} \sqrt{p_x^2+p_y^2} \\ \arctan(p_y/p_x) \\ \frac{p_xv_x+p_yv_y}{\sqrt{p_x^2+p_y^2}} \end{array} \right)$$

Reference

  1. How a Kalman filter works, in pictures
  2. Udacity Term2 Lecture