# Kalman Filter 是如何運作的 ###### tags: `Kalman filter` `Interest` `Tracking` `uncertainty` 資料來源:[How a Kalman filter works, in pictures](http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/) ## 什麼是卡爾曼濾波器? 當遇到任何在動態環境有不確定訊號的時候皆可使用,他將以有邏輯的方法去猜測真實的狀態值。 ## Kalman filter 是如何看待問題的 當我們要追蹤的是位置和速度的狀態時,我們假設其變數皆為高斯機率分布。 $\vec{x} = \begin{bmatrix} p\\ v \end{bmatrix}$ 當位置和速度為無相關性的高斯機率分布: ![當位置和速度為無相關性的高斯機率分布](https://i.imgur.com/A2GU38u.png) 當位置和速度有正相關性時: ![](https://i.imgur.com/daENHjQ.png) ## 將問題轉換成數學模型 $\mathbf{\hat{x}_k}$為最有可能的狀態(高斯機率的平均數),$\mathbf{P}_k$則為便異數矩陣。 \begin{equation} \begin{aligned} \mathbf{\hat{x}}_k &= \begin{bmatrix} \text{position}\\ \text{velocity} \end{bmatrix}\\ \mathbf{P}_k &= \begin{bmatrix} \Sigma_{pp} & \Sigma_{pv} \\ \Sigma_{vp} & \Sigma_{vv} \\ \end{bmatrix} \end{aligned} \end{equation} 再者,我們需要從現在的狀態($x_{k-1}$)預測未來(時間點$x_k$)的值,因此我們定義預測的矩陣$\mathbf{F_k}$。 ![狀態預測示意圖](https://i.imgur.com/BEtoFc9.png =300x300) 從直觀的角度出發,我們會用基礎的物體運動學去預測物體的移動。 而基本的卡氏運動模型如下: \begin{split} \color{deeppink}{p_k} &= \color{royalblue}{p_{k-1}} + \Delta t &\color{royalblue}{v_{k-1}} \\ \color{deeppink}{v_k} &= &\color{royalblue}{v_{k-1}} \end{split} 從上述方程式可推得: \begin{align} \color{deeppink}{\mathbf{\hat{x}}_k} &= \begin{bmatrix} 1 & \Delta t \\ 0 & 1 \end{bmatrix} \color{royalblue}{\mathbf{\hat{x}}_{k-1}} \\ &= \mathbf{F}_k \color{royalblue}{\mathbf{\hat{x}}_{k-1}} \end{align} 我們便得到了預測矩陣 $\mathbf{F}_k$ 若我們每個狀態的值乘上矩陣$\mathbf{A}$,那我們的變異數矩陣會產生以下的變化: \begin{equation} \begin{split} Cov(x) &= \Sigma\\ Cov(\color{firebrick}{\mathbf{A}}x) &= \color{firebrick}{\mathbf{A}} \Sigma \color{firebrick}{\mathbf{A}}^T \end{split} \end{equation} > 證明$Cov(\mathbf{A}x)=\mathbf{A} \Sigma \mathbf{A}^T$ > ![](https://i.imgur.com/StD2ANh.png) 結合上面推導的式子可得: \begin{equation} \begin{split} \color{deeppink}{\mathbf{\hat{x}}_k} &= \mathbf{F}_k \color{royalblue}{\mathbf{\hat{x}}_{k-1}} \\ \color{deeppink}{\mathbf{P}_k} &= \mathbf{F_k} \color{royalblue}{\mathbf{P}_{k-1}} \mathbf{F}_k^T \end{split} \end{equation} ## 外界施力的影響 雖然我們推導出了下個時間點的預測模型,但我們尚未考慮到其他變化是跟物體狀態無關的外界力量,例如,當我今天需要煞停自走車,那我必要對其施力(可能是剎車器或馬達)。我們假設施力為$\color{darkorange}{\vec{\mathbf{u}_k}}$,此施力所對應到的加速度$\color{darkorange}{a}$對於我們的卡式座標狀態的影響如下: \begin{split} \color{deeppink}{p_k} &= \color{royalblue}{p_{k-1}} + {\Delta t} &\color{royalblue}{v_{k-1}} + &\frac{1}{2} \color{darkorange}{a} {\Delta t}^2 \\ \color{deeppink}{v_k} &= &\color{royalblue}{v_{k-1}} + & \color{darkorange}{a} {\Delta t} \end{split} 轉換成矩陣型式: \begin{equation} \begin{split} \color{deeppink}{\mathbf{\hat{x}}_k} &= \mathbf{F}_k \color{royalblue}{\mathbf{\hat{x}}_{k-1}} + \begin{bmatrix} \frac{\Delta t^2}{2} \\ \Delta t \end{bmatrix} \color{darkorange}{a} \\ &= \mathbf{F}_k \color{royalblue}{\mathbf{\hat{x}}_{k-1}} + \mathbf{B}_k \color{darkorange}{\vec{\mathbf{u}_k}} \end{split} \end{equation} ## 外界的不確定性(**uncertainty**) 狀態是可以被預期的,當它只受到可預期的變化(例如本身的狀態變化或是已知的外界施力)。但如果有我們所不知道的力在影響我們的系統時,我們要如何預測物體的狀態呢? * 將不確定性加入模型 我們會在每個預測的步驟加入不確定性,並以此來描述不確定性的模型,如下圖所示 ![](https://i.imgur.com/uEOhIOs.png) * 定義不確定性 因為高斯分布是多麼的厲害,我們將會假設每個點$\mathbf{\hat{x}}_{k-1}$會依據變異數$\mathbf{Q}_k$的高斯分布隨機移動。 ![](https://i.imgur.com/MMOvzda.png) 這些點這些點所形成的區域,這些區域的變異數雖然不同,但平均值是相同的。 ![](https://i.imgur.com/5DDeXAr.png) * 加入不確定性的矩陣型式 我們將原本的變異數矩陣擴展(加入$\mathbf{Q}_k$),得到以下的方程式 \begin{equation} \begin{split} \color{deeppink}{\mathbf{\hat{x}}_k} &= \mathbf{F}_k \color{royalblue}{\mathbf{\hat{x}}_{k-1}} + \mathbf{B}_k \color{darkorange}{\vec{\mathbf{u}_k}} \\ \color{deeppink}{\mathbf{P}_k} &= \mathbf{F_k} \color{royalblue}{\mathbf{P}_{k-1}} \mathbf{F}_k^T + \color{mediumaquamarine}{\mathbf{Q}_k} \end{split} \end{equation} 最後會得到以下的結論(*文字顏色與前面方程式有所呼應*): **<font color="deeppink">最有可能的狀態</font>為<font color ="royalblue">上一次狀態</font>加上<font color="darkorange">已知外力的修正項</font>** **<font color="deeppink">新的變異矩陣(uncertainty)</font>為<font color ="royalblue">舊的變異矩陣</font>的預測項加上<font color="mediumaquamarine">外界的變異數矩陣</font>** ## 從測量值估算出狀態 當我們估計狀態,會需要一個或多的感測器。 而我們感測到的值和我們需要的狀態通常需要一個轉換矩陣$\mathbf{H}_k$。 例如一般IMU只提供加送度的感測值,但我們會需要估算位置和速度的值。 如下圖所示: ![](https://i.imgur.com/L9GCjgM.png) 因此我們可以定義感測的模型: \begin{equation} \begin{aligned} \vec{\mu}_{\text{expected}} &= \mathbf{H}_k \color{deeppink}{\mathbf{\hat{x}}_k} \\ \mathbf{\Sigma}_{\text{expected}} &= \mathbf{H}_k \color{deeppink}{\mathbf{P}_k} \mathbf{H}_k^T \end{aligned} \end{equation} 但是這個世界就是充滿著雜訊,偵測器之間的轉換也是。好險Kalman filter 能處理好雜訊的濾波。 因此當我們感測器的轉換矩陣轉換狀態(我們前面所預測"應該是準確"的狀態值)所得到的值和我們觀測到的值不一樣時(如下圖所示) ![](https://i.imgur.com/kdRP6iz.png) 我們會定義這些不確定性的變異數為$\color{mediumaquamarine}{\mathbf{R}_k}$,觀測分布的平均值為$\color{yellowgreen}{\vec{\mathbf{z}_k}}$。 這樣我們會擁有兩個高斯分布,一個是**事前觀測後所預測之狀態**的高斯分布(<font color ="pink">粉紅色</font>),另一個則是**感測值**的高斯分布(<font color= "green">綠色</font>)。如下圖所示: ![](https://i.imgur.com/CWk6G0d.png) 交集兩個高斯分布的值則為現在最有可能的狀態值分布。 ![](https://i.imgur.com/eI1Nnpt.png =300x300) => ![](https://i.imgur.com/5irjAaz.png =300x300) ## 高斯分布的集合 變異數為$\sigma^2$平均為$\mu$的一維高斯分布定義如下: \begin{equation} \mathcal{N}(x, \mu,\sigma) = \frac{1}{ \sigma \sqrt{ 2\pi } } e^{ -\frac{ (x – \mu)^2 }{ 2\sigma^2 } } \end{equation} 而當我們要交集兩個高斯分布時(如下圖所示), ![](https://i.imgur.com/QDuUcD3.png) 我們需要知道如何轉換為交集的高斯分,我們需要將兩個高斯分布相乘。 \begin{equation} \mathcal{N}(x, \color{fuchsia}{\mu_0}, \color{deeppink}{\sigma_0}) \cdot \mathcal{N}(x, \color{yellowgreen}{\mu_1}, \color{mediumaquamarine}{\sigma_1}) \stackrel{?}{=} \mathcal{N}(x, \color{royalblue}{\mu’}, \color{mediumblue}{\sigma’}) \end{equation} 經過證明 > from[證明出處](http://www.ams.sunysb.edu/~zhu/ams570/Bayesian_Normal.pdf) > 預測的機率為事前機率和感測值的結合,應用到貝式定理(bayesian theorem) > 得證 我們可以知道 \begin{equation} \begin{aligned} \color{royalblue}{\mu’} &= \mu_0 + \frac{\sigma_0^2 (\mu_1 – \mu_0)} {\sigma_0^2 + \sigma_1^2}\\ \color{mediumblue}{\sigma’}^2 &= \sigma_0^2 – \frac{\sigma_0^4} {\sigma_0^2 + \sigma_1^2} \end{aligned} \end{equation} 我們定義\begin{equation} \color{purple}{\mathbf{k}} = \frac{\sigma_0^2}{\sigma_0^2 + \sigma_1^2} \end{equation} 則可簡化上式為 \begin{equation} \begin{split} \color{royalblue}{\mu’} &= \mu_0 + &\color{purple}{\mathbf{k}} (\mu_1 – \mu_0)\\ \color{mediumblue}{\sigma’}^2 &= \sigma_0^2 – &\color{purple}{\mathbf{k}} \sigma_0^2 \end{split} \end{equation} 我們將上面一維的證明擴展到二維:若$\Sigma$為高斯分布的變異數矩陣,則可推得\begin{equation} \color{purple}{\mathbf{K}} = \Sigma_0 (\Sigma_0 + \Sigma_1)^{-1} \end{equation} 且 \begin{equation} \begin{split} \color{royalblue}{\vec{\mu}’} &= \vec{\mu_0} + &\color{purple}{\mathbf{K}} (\vec{\mu_1} – \vec{\mu_0})\\ \color{mediumblue}{\Sigma’} &= \Sigma_0 – &\color{purple}{\mathbf{K}} \Sigma_0 \end{split} \end{equation} <font color ="purple">$\mathbf{K}$</font>就是(大名鼎鼎的)卡爾曼權重值(Kalman gain)。 ## 將所有的推論結合 第一,我們擁有兩個分布,預測的分布$(\color{fuchsia}{\mu_0}, \color{deeppink}{\Sigma_0}) = (\color{fuchsia}{\mathbf{H}_k \mathbf{\hat{x}}_k}, \color{deeppink}{\mathbf{H}_k \mathbf{P}_k \mathbf{H}_k^T})$以及觀測的分布$(\color{yellowgreen}{\mu_1}, \color{mediumaquamarine}{\Sigma_1}) = (\color{yellowgreen}{\vec{\mathbf{z}_k}}, \color{mediumaquamarine}{\mathbf{R}_k})$,從上面的推導我們可以得知 \begin{equation} \begin{aligned} \mathbf{H}_k \color{royalblue}{\mathbf{\hat{x}}_k’} &= \color{fuchsia}{\mathbf{H}_k \mathbf{\hat{x}}_k} & + & \color{purple}{\mathbf{K}} ( \color{yellowgreen}{\vec{\mathbf{z}_k}} – \color{fuchsia}{\mathbf{H}_k \mathbf{\hat{x}}_k} ) \\ \mathbf{H}_k \color{royalblue}{\mathbf{P}_k’} \mathbf{H}_k^T &= \color{deeppink}{\mathbf{H}_k \mathbf{P}_k \mathbf{H}_k^T} & – & \color{purple}{\mathbf{K}} \color{deeppink}{\mathbf{H}_k \mathbf{P}_k \mathbf{H}_k^T} \end{aligned} \end{equation}其中 \begin{equation} \color{purple}{\mathbf{K}} = \color{deeppink}{\mathbf{H}_k \mathbf{P}_k \mathbf{H}_k^T} ( \color{deeppink}{\mathbf{H}_k \mathbf{P}_k \mathbf{H}_k^T} + \color{mediumaquamarine}{\mathbf{R}_k})^{-1} \end{equation} 簡化過後,我們可以得到最有可能的預估值 $\color{royalblue}{\mathbf{\hat{x}}_k’}$和其變異數 $\color{royalblue}{\mathbf{P}_k’}$: \begin{equation} \begin{split} \color{royalblue}{\mathbf{\hat{x}}_k’} &= \color{fuchsia}{\mathbf{\hat{x}}_k} & + & \color{purple}{\mathbf{K}’} ( \color{yellowgreen}{\vec{\mathbf{z}_k}} – \color{fuchsia}{\mathbf{H}_k \mathbf{\hat{x}}_k} ) \\ \color{royalblue}{\mathbf{P}_k’} &= \color{deeppink}{\mathbf{P}_k} & – & \color{purple}{\mathbf{K}’} \color{deeppink}{\mathbf{H}_k \mathbf{P}_k} \end{split} \end{equation} 其中的 $\color{purple}{\mathbf{K}} = \color{deeppink}{\mathbf{H}_k \mathbf{P}_k \mathbf{H}_k^T} ( \color{deeppink}{\mathbf{H}_k \mathbf{P}_k \mathbf{H}_k^T} + \color{mediumaquamarine}{\mathbf{R}_k})^{-1}$。 這邊Kalman filter 就差不多推導完了。 但...人生就是這個**BUT** 上述的推導都是基於線性系統,一但我們遇到非線性系統,我們將會採用 extended Kalman filter(怎麼開了新坑阿= =,未來有<font color=red>機會</font>再寫吧XD~)