卡爾曼濾波詳解

這篇主要介紹卡爾曼濾波公式詳細推導,使用示例參考卡爾曼濾波示例

Kalman Filter

簡單介紹

主要講解基本的卡爾曼濾波算法,有時候也說是離散或者線性卡爾曼濾波。

首先來看一個數學公式,這部分僅僅是給定一個思路,和最後實際算法無關。目前考慮到要估計當前系統的狀態,而且有兩個已知量,一個上一個狀態的估計值以及當前狀態的測量值,這兩個都有一定的噪聲,需要做的就是把這兩個結合起來,很簡單的思路就是按照比例相加得到當前狀態的估計值:
X^k=KkZk+(1Kk)X^k1 \hat{X}_k = K_k \cdot Z_k + (1 - K_k) \cdot \hat{X}_{k-1}

kk 表示離散的狀態量,可以把它簡單的理解爲離散的時間間隔。k=1 表示1ms,k=2 表示2ms;

X^k\hat{X}_k 是對當前狀態的估計值,希望利用上面的公式對每一個 k 都能得到一個較爲準確的 X 的值;

ZkZ_k 是對當前狀態的測量值,當然這個值並不是絕對準確的,會有一定的誤差噪聲(如果絕對準確,直接用就可以了,也就沒必要搞這個卡爾曼濾波算法了);

X^k1\hat{X}_{k-1} 是對上一狀態的估計值,利用這個以及測量值對當前狀態進行估計;

KkK_k 是卡爾曼增益(kalman gain),在這裏唯一未知的就是這個值,也是需要去求的值。當然可以直接設置值爲0.5,但是這樣比較暴力。最好的方式就是根據每一時刻的狀態求一個當前狀態最好的增益值,這樣的話更好利用以前狀態的估計值以及當前測量值來估計一個最優的當前值。

後面卡爾曼濾波算法就是按照上面思路利用上一狀態以及測量值去估計當前狀態,只不過模型要更加複雜。

基本模型

卡爾曼濾波的狀態方程,利用線性隨機差分方程(Linear Stochastic Difference equation)利用上一個系統狀態估計當前系統狀態(這裏假設上一狀態與下一一狀態有某種線性關係,比如恆溫環境的溫度,勻速運動的速度等,但是因爲現實環境的複雜,這種線性關係不是完全平滑的,也就是會有一些擾動):
xk=Axk1+Buk1+w x_k = Ax_{k-1} + Bu_{k-1}+w
使用時一般忽略 uu 控制輸入,得到:
xk=Axk1+w(1.1) x_k = Ax_{k-1} + w \qquad {(1.1)}
加上對於當前狀態的測量方程(簡單來說就是測量值和狀態值的線性函數):
zk=Hxk+v(1.2) z_k = Hx_k + v \qquad {(1.2)}

k1k-1kk 分別表示上一狀態和當前狀態;

xRnx \in R^n 表示要估計的狀態;

ARn×nA \in R^{n \times n} 表示上一狀態到當前狀態的轉換矩陣;

uRlu \in R^l 表示可選的控制輸入,一般在實際使用中忽略;

BRn×lB \in R^{n \times l} 表示控制輸入到當前狀態的轉換矩陣;

zRmz \in R^m 表示測量值;

HRm×nH \in R^{m \times n} 表示當前狀態到測量的轉換矩陣;

wRnw \in R^n 表示過程噪聲,主要是從上一狀態進入到當前狀態時,會有許多外界因素的干擾;

vRmv \in R^m 表示測量噪聲,主要是任何測量儀器都會有一定的誤差;

在上面轉換矩陣 AA BB HH ww vv 是隨着狀態變化的,在這裏沒有添加下標,假設是不變的。

上面提到的過程噪聲 ww 和測量噪聲 vv 假設是相互獨立的(之間沒有關係,無相互影響),且是高斯白噪聲,意思是這些噪聲在離散的狀態上是沒有關係的(互相獨立的, 每個時刻的噪聲都是獨立的)且 服從高斯分佈:
p(w)N(0,Q)(1.3)p(v)N(0,R)(1.4)Q=wwTR=vvTE(w)=0E(v)=0 \begin{aligned} p(w) & \sim N(0, Q) \qquad {(1.3)} \\ p(v) & \sim N(0, R) \qquad {(1.4)} \\ Q & = ww^T \\ R & = vv^T \\ E(w) & = 0 \\ E(v) & = 0 \end{aligned}

QRn×nQ \in R^{n \times n} 表示過程噪聲 ww 的協方差矩陣,表示 ww 向量元素之間的相關關係;

RRm×mR \in R^{m \times m} 表示測量噪聲 vv 的協方差矩陣,表示 vv 向量元素之間的相關關係;

在上面協方差矩陣 QQ RR 是隨着狀態變化的,在這裏假設是不變的。

推導過程

上面是給出了卡爾曼濾波的整體思路和基本模型,在這裏一步步分解來看卡爾曼濾波的推導過程。首先確定了卡爾曼濾波的基本模型,那麼下一步是怎樣根據這個模型來不斷求取後面的狀態。

首先定義幾個變量:

x^kˉ\bar{\hat{x}_k} 加了一個負號上標,表示僅僅利用過程先驗知識求出的當前狀態的先驗狀態估計(a priori state estimate),不考慮過程噪聲的情況下;

x^k\hat{x}_k 表示利用測量值 zkz_k 求出的當前狀態的後驗狀態估計(a posteriori state estimate),也是最終求得的狀態;

需要注意的是,卡爾曼濾波的最終目標是求 x^k\hat{x}_k ,這是對當前狀態的最優估計。

根據上面的定義忽略過程噪聲可以得到:
x^kˉ=Ax^k1+Buk1 \bar{\hat{x}_k} = A\hat{x}_{k-1} + Bu_{k-1}
通常都是忽略 uu 這個可選的控制輸入(以後加入該變量的話也是非常方便的):
x^kˉ=Ax^k1(2.1) \bar{\hat{x}_k} = A\hat{x}_{k-1} \qquad {(2.1)}
然後同理忽略測量噪聲可以得到:
zkˉ=Hx^kˉ \begin{aligned} \bar{z_k} & = H\bar{\hat{x}_k} \end{aligned}

zkˉ\bar{z_k} 表示忽略測量噪聲根據當前先驗狀態得到的無噪聲測量值。

那麼很簡單的可以用實際得到的測量值減去無噪聲由上一狀態預測的測量值:
zk˙=zkzkˉ=zkHx^kˉ \begin{aligned} \dot{z_k} & = z_k - \bar{z_k} \\ & = z_k - H\bar{\hat{x}_k} \end{aligned}

zk˙\dot{z_k} 表示實際測量值(包含了上面提到的各種干擾即過程噪聲以及測量噪聲)減去無噪聲測量值,一般被叫做measurement innovation 或者是 residual,表示預測的測量值和實際測量值的差異。實際得到是過程噪聲和測量噪聲對當前測量值的影響(當然也會影響當前狀態),也就是包含了 wwvv 的情況。

現在得到了一個無噪聲的狀態的估計 x^kˉ\bar{\hat{x}_k},以及一個噪聲變量 zk˙\dot{z_k}。根據經驗來說把這兩個值按照一定的方式整合起來就可以得到後驗狀態估計。卡爾曼濾波中採用按照比例組合的方式(其實對於下面的公式在數學上有嚴格的證明過程,但是僅僅是使用卡爾曼濾波就不去深究了):
x^k=x^kˉ+Kkzk˙=x^kˉ+Kk(zkHx^kˉ)(2.2) \begin{aligned} \hat{x}_k & = \bar{\hat{x}_k} + K_k\dot{z_k} \\ & = \bar{\hat{x}_k} + K_k(z_k - H\bar{\hat{x}_k}) \qquad {(2.2)} \end{aligned}

KkRn×mK_k \in R^{n \times m} 表示卡爾曼增益(gain)或者均化係數(blending factor)。

到這裏,有了上面的公式(2.2),爲了得到 x^k\hat{x}_k,其他參數都是已知的,目前需要把每個狀態的 KkK_k 求出來,這裏定義先驗和後驗估計誤差:
ekˉxkx^kˉekxkx^k \bar{e_k} \equiv x_k - \bar{\hat{x}_k} \\ e_k \equiv x_k - \hat{x}_k
對應的誤差協方差矩陣爲:
Pkˉ=E[ekˉeˉkT]Pk=E[ekekT] \bar{P_k} = E[\bar{e_k}\bar{e}_{k}^T] \\ P_k = E[e_ke_{k}^T]
然後爲了使後驗狀態估計 x^k\hat{x}_k 最優,那麼目標就是最小化後驗狀態估計的誤差協方差矩陣 PkP_k 值。

後驗誤差

根據公式(1.1),(2.2),(1.2),(2.1)可以得到:
ek=xkx^k=xk(x^kˉ+Kk(zkHx^kˉ))=xk(x^kˉ+Kk((Hxk+v)Hx^kˉ))=xkx^kˉKkHxkKkv+KkHx^kˉ=(IKkH)(xkx^kˉ)Kkv=(IKkH)ekˉKkv \begin{aligned} e_k & = x_k - \hat{x}_k \\ & = x_k - (\bar{\hat{x}_k} + K_k(z_k - H\bar{\hat{x}_k})) \\ & = x_k - (\bar{\hat{x}_k} + K_k((Hx_k + v) - H\bar{\hat{x}_k})) \\ & = x_k - \bar{\hat{x}_k} - K_kHx_k - K_kv + K_kH\bar{\hat{x}_k} \\ & = (I - K_kH)(x_k-\bar{\hat{x}_k}) - K_kv \\ & = (I - K_kH)\bar{e_k} - K_kv \end{aligned}
所以帶入展開可得:
ekekT=[(IKkH)ekˉKkv][(IKkH)ekˉKkv]T=(IKkH)ekˉekˉT(IKkH)TKkvekˉT(IKkH)T(IKkH)ekˉvTKkT+KkvvTKkT \begin{aligned} e_ke_{k}^T & = \left[ (I - K_kH)\bar{e_k} - K_kv \right]\left[ (I - K_kH)\bar{e_k} - K_kv \right]^T \\ & = (I - K_kH)\bar{e_k}\bar{e_k}^T(I - K_kH)^T - K_kv\bar{e_k}^T(I - K_kH)^T - (I - K_kH)\bar{e_k}v^TK_k^T + K_kvv^TK_k^T \end{aligned}
ekˉ\bar{e_k}z1, ,zk1z_{1} , \cdots , z_{k - 1} 的線性函數,和當前 zkz_k 無關,所以:

E(ekˉvT)=0E(vekˉT)=0 E(\bar{e_k}v^T) = 0 \\ E(v\bar{e_k}^T) = 0

帶入整理得到:
Pk=E[ekekT]=(IKkH)Pkˉ(IKkH)T+KkRKkT=PkˉKkHPkˉPkˉHTKkT+KkHPkˉHTKkT+KkRKkT \begin{aligned} P_k = E[e_ke_{k}^T] & = (I-K_kH)\bar{P_k}(I - K_kH)^T + K_kRK_k^T \\ & = \bar{P_k} - K_kH\bar{P_k} - \bar{P_k}H^TK_k^T + K_kH\bar{P_k}H^TK_k^T + K_kRK_k^T \end{aligned}
合併 KkK_k 項目:
Pk=PkˉPkˉHT(HPkˉHT+R)1HPkˉ+[KkPkˉHT(HPkˉHT+R)1](HPkˉHT+R)[KkPkˉHT(HPkˉHT+R)1]T \begin{aligned} P_k & = \bar{P_k} - \bar{P_k}H^T(H\bar{P_k}H^T + R)^{-1}H\bar{P_k} \\ & + \left[ K_k - \bar{P_k}H^T(H\bar{P_k}H^T + R)^{-1}\right ](H\bar{P_k}H^T + R)\left[K_k - \bar{P_k}H^T(H\bar{P_k}H^T + R)^{-1} \right ]^T \end{aligned}
上面的式子中前兩項不包含 KkK_k 因子,所以如果要最小化 PkP_k,只需:
KkPkˉHT(HPkˉHT+R)1=0 K_k - \bar{P_k}H^T(H\bar{P_k}H^T + R)^{-1} = 0
所以得到:
Kk=PkˉHT(HPkˉHT+R)1(2.5) K_k = \bar{P_k}H^T(H\bar{P_k}H^T + R)^{-1} \qquad {(2.5)}
然後可以得到:
Pk=(IKkH)Pkˉ(2.4) P_k = (I-K_kH)\bar{P_k} \qquad {(2.4)}

先驗誤差

帶入上面的公式(1.1),(2.1)可以得到:
ekˉ=xkx^kˉ=(Axk1+w)(Ax^k1)=A(xk1xk1^)+w=Aek1+w \begin{aligned} \bar{e_k} & = x_k - \bar{\hat{x}_k} \\ & = (Ax_{k-1} + w) - (A\hat{x}_{k-1}) \\ & = A(x_{k-1} - \hat{x_{k-1}}) + w \\ & = Ae_{k-1} + w \end{aligned}
所以帶入展開可得:
ekˉeˉkT=(Aek1+w)(Aek1+w)T=Aek1ek1TAT+wwT+wek1TAT+Aek1wT \begin{aligned} \bar{e_k}\bar{e}_{k}^T & = (Ae_{k-1} + w)(Ae_{k-1} + w)^T \\ & = Ae_{k-1}e_{k-1}^TA^T + ww^T + we_{k-1}^TA^T + Ae_{k-1}w^T \end{aligned}

又因爲:
E(ek1wT)=0E(wek1T)=0 E(e_{k-1}w^T) = 0 \\ E(we_{k-1}^T) = 0

然後可以得到:
Pkˉ=E[ekˉeˉkT]=APk1AT+Q(2.3) \bar{P_k} = E[\bar{e_k}\bar{e}_{k}^T] = AP_{k-1}A^T + Q \qquad {(2.3)}

基本分析

從上面的公式可以看出來,如果過程誤差 Pkˉ=0\bar{P_k} = 0 ,那麼 Kk=0K_k = 0 ,可以 得到 x^k=x^kˉ=Ax^k1\hat{x}_k = \bar{\hat{x}_k} = A\hat{x}_{k-1} ,完全相信以前估計的值,這樣就是爲啥不能設置 P0=0P_0 = 0 。當然給 QQ 賦值可能能解決這個問題,而且不能設置太小,這樣手動引入較大的過程誤差,估計結果很不平滑,後面示例3也會講解。對於RR 的變化對結果的作用後面的示例會介紹,同理 RR 設置太大也會導致這樣的結果。在這種情況下,如果初始時設置的不正確,整個估計都是錯誤的。

基本公式

最後得到了上面的上面(2.1)-(2.5)五個方程式,是經典的卡爾曼濾波的五個基本公式,利用這五個公式就可以完成卡爾曼濾波的求解過程。根據迭代過程分成兩個方程集合,一個是time update方程,一個是measurement update方程,如下:

Time Update Measurement Update
x^kˉ=Ax^k1\bar{\hat{x}_k} = A\hat{x}_{k-1} Kk=PkˉHT(HPkˉHT+R)1K_k = \bar{P_k}H^T(H\bar{P_k}H^T + R)^{-1}
Pkˉ=APk1AT+Q\bar{P_k} = AP_{k-1}A^T + Q x^k=x^kˉ+Kk(zkHx^kˉ)\hat{x}_k = \bar{\hat{x}_k} + K_k(z_k - H\bar{\hat{x}_k})
Pk=(IKkH)PkˉP_k = (I - K_kH)\bar{P_k}

迭代過程

得到上面的基本公式以後,就可以計算計算後面的狀態,但是公式中有一些參數是未知的,需要定義,如下:

uu 變量一般來說是被忽略的;

AABBHH 上面提到對於每個狀態 kk 都是相同的,同時大部分情況下都是單位矩陣(複雜的計算這裏不考慮,由具體應用決定);

RR 一般來說是相對簡單可以求到的,就是儀器的噪聲協方差;

QQ 就很難直接的獲得,也沒有特定的方法,一般是系統過程比較穩定,也就是沒有過程噪聲;

zz 所有狀態的的測量值都是由儀器測量得到的是已知的;

對於RRQQ 的取值來說不是特別重要,雖然可能這兩個參數估計的不是很準確(不可能符合純粹的高斯或者正太分佈),但是實際情況中卡爾曼濾波算法也可以得到整的比較準確態估計,但是需要記住的是:

The better you estimate the noise parameters, the better estimates you get.

那麼這樣只需要傳入基本的 x^0\hat{x}_0P0P_0 就可以了,一般來說需要進行指定。對於 x^0\hat{x}_0 來說不需要什麼技巧,因爲隨着卡爾曼濾波算法的運行,xx 會逐漸的收斂。但是對於 P0P_0 ,一般不要取0,因爲這樣可能會令卡爾曼完全相信你給定的 x^0\hat{x}_0 是系統最優的,從而使算法不能收斂。

算法迭代過程如下圖(其中 uu 控制輸入一般是忽略的):

Kalman Filter Operation

參考

  1. Kalman Filter For Dummies
  2. Greg Welch, Gary Bishop, “An Introduction to the Kalman Filter”, University of North Carolina at Chapel Hill Department of Computer Science, 2001
  3. 一個應用實例詳解卡爾曼濾波及其算法實現
  4. 卡爾曼濾波算法–核心公式推導導論
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章