本文在參考文獻的基礎上添加了自己的理解,若有不當之處,敬請指正
卡爾曼濾波以前接觸過,但是沒有仔細推導,這次參考文獻仔細推導實現,也是第一次完全的通過vscode+markdown來完成寫作。
卡爾曼濾波,也被稱爲線性二次估計(Liner Quadratic Estimation, LQE),可以作爲平滑數據、預測數據、濾波器;本人理解:是一個觀察→預測的過程,我接觸到的卡爾曼濾波主要有KF(卡爾曼濾波,線性),EKF(擴展卡爾曼濾波,非線性),UKF(無跡卡爾曼濾波,強非線性)。此處,只研究基本的KF。
圖1 來自老爺子的親切凝視
1. 導論
1960年, R.E. Kalman發表了他使用迭代方法解決離散線性濾波問題的文章(《A New Approach to Linear Filtering and Prediction Problems》),揭開了卡爾曼濾波的歷史篇章,得益於數字計算能力的發展,卡爾曼濾波方法在得到了廣泛應用,尤其是在自主/輔助導航方面。 現在該方法在計算機圖像處理,多數據融合方面也得到廣泛應用。
1)第一個問題:什麼是卡爾曼濾波
卡爾曼濾波是一種最優化自迴歸數據處理算法。其中最優化體現在:1)動態使用系統和測量設備的信息;2)該理論包含了系統噪聲、測量誤差、動態模型的不確定性;3)和感興趣變量初始狀態相關的各種可用信息。其中的自迴歸表現在:卡爾曼濾波器不需要使用/儲存過去所有時刻的數據,使得卡爾曼濾波器計算性能好。
2)第二個問題:爲什麼用卡爾曼濾波
卡爾曼濾波最初是爲了解決控制問題。通常在做系統分析或者控制系統設計的時候,研究人員都會期望從變量的內在聯繫來建立一個理論模型,通過對理論模型的研究來研究問題。但是,理論模型並不完美,而且模型的結果也只是近似罷了,而觀測到的數據也不是完整和完美的。基於這些存在的問題,所以研究人員探索能夠解決這些問題的方法,也就有了卡爾曼濾波。
2. 卡爾曼濾波方法推導
本方法注重思路,詳細過程請參考文章開始列出的文獻。
2.1 lossfunction
前邊提到,卡爾曼是一種線性二次估計,相當於一種優化算法,優化算法的目標就是針對損失函數,並使得損失函數最大或者最小。首先考慮一個最簡單的線性模型:
y k = a k x k + n k y_k = a_kx_k + n_k y k = a k x k + n k
其中x k x_k x k 是系統的狀態量,但是這個狀態量一般我們建模不準確,會存在一個誤差,量化這個誤差就使用如下形式:
e k = x k − x k ^ e_k = x_k - \hat{x_k} e k = x k − x k ^ --這個誤差越小,建模狀態量越準確,得到的輸出值也就越準確
但是e k e_k e k 有正有負不好優化,所以引入均方差(mean squared error, MSE) , 可以只向一個方向優化:
l o s s f u n c i t o n = E ( e k 2 ) lossfunciton = E(e_k^2) l o s s f u n c i t o n = E ( e k 2 )
2.2. 極大似然估計
原理:從已知結果出發,反推參數值,這個參數值將使得結果出現的概率最大。
抽象一下問題:已知觀測結果y,需要反推狀態參數x k ^ \hat{x_k} x k ^ 。所以最大似然估計的目標就是使得y的條件概率最大:
m a x ( P [ y ∣ x ^ ] ) max(P[y|\hat x]) m a x ( P [ y ∣ x ^ ] )
假設的隨機噪聲是符合標準偏差爲$\sigma _k $的高斯分佈(正態分佈),那麼條件概率可以寫爲:
P ( y k ∣ x ^ k ) = K k e x p − ( ( y k − a k x ^ k ) 2 2 σ k 2 ) P(y_k|\hat x_k) = K_kexp-(\frac{(y_k -a_k\hat x_k)^2}{2\sigma _k^2}) P ( y k ∣ x ^ k ) = K k e x p − ( 2 σ k 2 ( y k − a k x ^ k ) 2 )
那麼極大似然概率就是取得乘積:
P ( y k ∣ x ^ k ) = Π k K k e x p − ( ( y k − a k x ^ k ) 2 2 σ k 2 ) P(y_k|\hat x_k) =\mathop{\Pi} \limits_{k} K_kexp-(\frac{(y_k -a_k\hat x_k)^2}{2\sigma _k^2}) P ( y k ∣ x ^ k ) = k Π K k e x p − ( 2 σ k 2 ( y k − a k x ^ k ) 2 )
有exp, 可以通過取對數,將乘積轉換爲加和運算:
l o g P ( y k ∣ x ^ k ) = − 1 2 ∑ k ( ( y k − a k x ^ k ) 2 2 σ k 2 ) + c o n s t a n t logP(y_k|\hat x_k) = -\frac{1}{2}\sum \limits_{k} (\frac{(y_k -a_k\hat x_k)^2}{2\sigma _k^2}) + constant l o g P ( y k ∣ x ^ k ) = − 2 1 k ∑ ( 2 σ k 2 ( y k − a k x ^ k ) 2 ) + c o n s t a n t
所以目標就是,找到x ^ k \hat x_k x ^ k 使得l o g P ( y k ∣ x ^ k ) logP(y_k|\hat x_k) l o g P ( y k ∣ x ^ k ) 最大,那麼x ^ k \hat x_k x ^ k 就是最有可能的狀態值。可以看到l o g P ( y k ∣ x ^ k ) logP(y_k|\hat x_k) l o g P ( y k ∣ x ^ k ) 的表達式其實就是2.1中描述的均方差的形式。我們可以通過最小化均方誤差來求x ^ k \hat x_k x ^ k 。
2.3 狀態方程推導
總體思路還是比較簡單:由狀態構建一個誤差表達式,並將該表達式構建爲MSE形式,根據已知條件推導,將MES改寫稱爲一個包含已知量的表達式,求導,令導數等於零求得極小點,將該點回代至表達式,結束!整個推導過程的步驟也比較簡單,只是涉及的量比較多,以及矩陣表達的形式,看起來比較繁雜而已。
已知條件,6個
一般情況下,我們將一個系統描述爲狀態方程和觀測方程:
狀態方程: x k + 1 = Φ x k + w k x_{k+1} = \Phi x_k + w_k x k + 1 = Φ x k + w k
觀測方程: z k = H x k + v k z_k = Hx_k + v_k z k = H x k + v k
w k w_k w k 爲已知協方差的過程白噪聲,v k v_k v k 爲已知協方差的測量白噪聲,且二者不相關。
所以,以下兩個值已知:
Q = E ( w k w k T ) Q = E(w_kw_k^T) Q = E ( w k w k T )
R = E ( v k v k T ) R = E(v_kv_k^T) R = E ( v k v k T )
e k = x k − x ^ k e_k = x_k - \hat x_k e k = x k − x ^ k
x ^ k = x ^ k ′ + K k ( z k − H x ^ k ′ ) \hat x_k =\hat x_k^{'} + K_k(z_k - H\hat x_k^{'}) x ^ k = x ^ k ′ + K k ( z k − H x ^ k ′ ) … x ^ k ′ \ldots \hat x_k^{'} … x ^ k ′ 表示直接估計的值,該式將在下一節的極大似然估計中推導 。
求解問題
優化的目標根據2.1就是:
l o s s f u n c i t o n = E ( e k 2 ) = E ( e k e k T ) = P k lossfunciton = E(e_k^2) = E(e_ke_k^T) = P_k l o s s f u n c i t o n = E ( e k 2 ) = E ( e k e k T ) = P k 一切都是從這個方程出發
推導過程
先處理已知條件:
z k z_k z k 代入表達式:x ^ k = x ^ k ′ + K k ( z k − H x ^ k ) = x ^ k ′ + K k ( H x k + v k − H x ^ k ′ ) = K k H x k + ( I − K k H ) x k ′ + K k v k \hat x_k =\hat x_k^{'} + K_k(z_k - H\hat x_k) = \hat x_k^{'} + K_k(Hx_k + v_k - H\hat x_k^{'}) =K_kHx_k + (I - K_kH)x_k^{'} +K_kv_k x ^ k = x ^ k ′ + K k ( z k − H x ^ k ) = x ^ k ′ + K k ( H x k + v k − H x ^ k ′ ) = K k H x k + ( I − K k H ) x k ′ + K k v k
x ^ k \hat x_k x ^ k 代入表達式:e k = x k − x ^ k = x k − ( K k H x k + ( I − K k H ) x k ′ + K k v k ) = ( I − K k H ) ( x k − x k ′ ) − K k v k e_k = x_k - \hat x_k =x_k -(K_kHx_k + (I - K_kH)x_k^{'} +K_kv_k) = (I - K_kH)(x_k - x_k^{'}) - K_kv_k e k = x k − x ^ k = x k − ( K k H x k + ( I − K k H ) x k ′ + K k v k ) = ( I − K k H ) ( x k − x k ′ ) − K k v k
將e k e_k e k 代入
P k = E ( e k e k T ) = E [ [ ( I − K k H ) ( x k − x k ′ ) − K k v k ] [ ( I − K k H ) ( x k − x k ′ ) − K k v k ] T ] = ( I − K k H ) E [ ( x k − x k ′ ) ( x k − x k ′ ) T ] ( I − K k H ) T − K k E [ v k v k T ] K k T \begin{array}{l}
P_k = E(e_ke_k^T) \\
= E[[(I - K_kH)(x_k - x_k^{'}) - K_kv_k][(I - K_kH)(x_k - x_k^{'}) - K_kv_k]^T] \\
=(I - K_kH)E[(x_k - x_k^{'})(x_k - x_k^{'})^T](I - K_kH)^T - K_kE[v_kv_k^T]K_k^T
\end{array} P k = E ( e k e k T ) = E [ [ ( I − K k H ) ( x k − x k ′ ) − K k v k ] [ ( I − K k H ) ( x k − x k ′ ) − K k v k ] T ] = ( I − K k H ) E [ ( x k − x k ′ ) ( x k − x k ′ ) T ] ( I − K k H ) T − K k E [ v k v k T ] K k T
根據e k , P k e_k, P_k e k , P k 的定義,可以將上式中與期望有關的項改寫成新的形式,可以得到:
P k = ( I − K k H ) P k ′ ( I − K k H ) T − K k R K k T P_k =(I - K_kH)P_k^{'}(I - K_kH)^T - K_kRK_k^T P k = ( I − K k H ) P k ′ ( I − K k H ) T − K k R K k T
P k ′ P_k^{'} P k ′ 稱爲先驗估計,這裏就得到協方差關係式,由於直接處理矩陣不好處理,所以,通過展開,再求跡(tr)然後求導,令導數等於零,求得極小值點,再回代入原方程。
展開:
P k = ( I − K k H ) P k ′ ( I − K k H ) T − K k R K k T = P k ′ − K k H P k ′ − P k ′ H T K k T + K k ( H P k ′ H T + R ) K k T \begin{array}{l}
P_k =(I - K_kH)P_k^{'}(I - K_kH)^T - K_kRK_k^T \\
=P_k^{'}-K_kHP_k^{'}-P_k^{'}H^TK_k^T+K_k(HP_k^{'}H^T+R)K_k^{T}
\end{array} P k = ( I − K k H ) P k ′ ( I − K k H ) T − K k R K k T = P k ′ − K k H P k ′ − P k ′ H T K k T + K k ( H P k ′ H T + R ) K k T
求跡:
T [ P k ] = T [ P k ′ ] − 2 T [ K k H P k ′ ] + T [ K k ( H P K ′ H T + R ) K k T ] T[P_k] = T[P_k^{'}] - 2T[K_kHP_k^{'}] + T[K_k(HP_K^{'}H^T+R)K_k^{T}] T [ P k ] = T [ P k ′ ] − 2 T [ K k H P k ′ ] + T [ K k ( H P K ′ H T + R ) K k T ]
求導:
d T [ P k ] d K k = − 2 ( H P k ′ ) T + 2 K k ( H P k ′ H T + R ) = 0 \frac{dT[P_k]}{dK_k} = - 2(HP_k^{'})^T + 2K_k(HP_k^{'}H^T+R) = 0 d K k d T [ P k ] = − 2 ( H P k ′ ) T + 2 K k ( H P k ′ H T + R ) = 0
⇒ 2 K k ( H P K ′ H T + R ) = 2 H P k ′ \Rightarrow 2K_k(HP_K^{'}H^T+R) = 2HP_k^{'} ⇒ 2 K k ( H P K ′ H T + R ) = 2 H P k ′
⇒ K k = ( H P k ′ ) T ( H P k ′ H T + R ) − 1 \Rightarrow K_k = (HP_k^{'})^T(HP_k^{'}H^T+R)^{-1} ⇒ K k = ( H P k ′ ) T ( H P k ′ H T + R ) − 1 {方程.1,卡爾曼增益方程}
將K k K_k K k 回代到P k P_k P k 展開的關係式中,替換掉最後一項中的第一個K k K_k K k :
⇒ P k = P k ′ − K k H P k ′ − 2 ( H P k ′ ) T K k T \Rightarrow P_k = P_k^{'}-K_kHP_k^{'}-2(HP_k^{'})^TK_k^{T} ⇒ P k = P k ′ − K k H P k ′ − 2 ( H P k ′ ) T K k T
⇒ P k = ( I − K k H ) P k ′ \Rightarrow P_k = (I -K_kH )P_k^{'} ⇒ P k = ( I − K k H ) P k ′ {方程.2,協方差更新方程}
推到這裏,我們已經得到卡爾曼濾波方程中的兩個關係式,但是P k ′ P_k^{'} P k ′ 還是未知的
∵ \because ∵ 直接的估計值沒有辦法估計噪聲,用上個狀態的最優值根據模型來直接估計:
∴ \therefore ∴ x k + 1 ′ = Φ x ^ k x_{k+1}^{'} =\Phi \hat x_k x k + 1 ′ = Φ x ^ k {方程3.狀態估計方程}
∵ P k + 1 ′ = E [ e k + 1 ′ e k + 1 T ′ ] \because P_{k+1}^{'} = E[e_{k+1}^{'}e_{k+1}^{T'}] ∵ P k + 1 ′ = E [ e k + 1 ′ e k + 1 T ′ ]
又,
∵ e k + 1 ′ = x k + 1 − x k + 1 ′ = Φ x k + w k − Φ x ^ k = Φ e k + w k \because e_{k+1}^{'} = x_{k+1} - x_{k+1}^{'} = \Phi x_k + w_k - \Phi \hat x_k = \Phi e_k + w_k ∵ e k + 1 ′ = x k + 1 − x k + 1 ′ = Φ x k + w k − Φ x ^ k = Φ e k + w k
∴ P k + 1 ′ = E [ ( Φ e k + w k ) ( Φ e k + w k ) T ] = Φ E [ e k e k T ] Φ T + E ( w k w k T ) = Φ P k Φ T + Q \begin{array}{l}
\therefore P_{k+1}^{'} = E[(\Phi e_k + w_k )(\Phi e_k + w_k )^T] \\
= \Phi E[e_ke_k^T]\Phi ^T + E(w_kw_k^T) \\
= \Phi P_k \Phi ^T + Q
\end{array} ∴ P k + 1 ′ = E [ ( Φ e k + w k ) ( Φ e k + w k ) T ] = Φ E [ e k e k T ] Φ T + E ( w k w k T ) = Φ P k Φ T + Q
⇒ P k + 1 ′ = Φ P k Φ T + Q \Rightarrow P_{k+1}^{'} = \Phi P_k \Phi ^T + Q ⇒ P k + 1 ′ = Φ P k Φ T + Q {方程4.協方差估方程}
P k ′ P_k^{'} P k ′ 採用該關係式,由上一步數據計算得到。
至此,推導出了卡爾曼濾波方程當中的四個 ,還缺少一個最優估計方程,也就是已知條件的最後一個。
2.4 極大似然估計的推導
爲什麼有這部分?已知條件的最後一個是直接給出的,這裏解釋關係式是怎麼來的。
從2.2知道,極大似然估計就是在觀測值
卡爾曼濾波尋求最小化均方差的目標和卡方分佈(chi-square)有很多相似之處,卡方分佈的觀察頻數與期望頻數越接近,兩者之間的差異越小,也就是觀測值會更加接近真實值。這裏直接推導chi-square,最後從結論得到最優估計。
拋開前邊推導的一切,重新開始,假設一個卡方分佈:
χ 2 = ∑ i = 1 k ( ( z k − h ( a , x ) 2 σ i 2 ) \chi^2 = \sum \limits_{i=1}^{k} (\frac{(z_k -h(a,x)^2}{\sigma _i^2}) χ 2 = i = 1 ∑ k ( σ i 2 ( z k − h ( a , x ) 2 )
z i 測 量 值 ( 相 當 於 z k ) , h ( a , x ) 表 示 參 數 爲 x 的 模 型 h ( 相 當 於 觀 測 方 程 模 型 ) , 在 σ i 是 和 測 量 值 有 關 的 誤 差 ( 相 當 於 v k ) z_i 測量值(相當於z_k),h(a, x) 表示參數爲x的模型h(相當於觀測方程模型),在\sigma _i是和測量值有關的誤差(相當於v_k) z i 測 量 值 ( 相 當 於 z k ) , h ( a , x ) 表 示 參 數 爲 x 的 模 型 h ( 相 當 於 觀 測 方 程 模 型 ) , 在 σ i 是 和 測 量 值 有 關 的 誤 差 ( 相 當 於 v k )
通過改寫形式:
χ 2 = ∑ i = 1 k ( 1 σ i σ i ( z k − h ( a i , x ) 2 ) \chi^2 = \sum \limits_{i=1}^{k} (\frac{1}{\sigma _i\sigma _i}(z_k -h(a_i,x)^2) χ 2 = i = 1 ∑ k ( σ i σ i 1 ( z k − h ( a i , x ) 2 )
將標量形式轉化爲向量形式:(注此處的R R R 與前邊的R R R 沒有直接聯繫,但是含義相似)
χ k 2 = [ z k − h ( a , x k ) ] R − 1 [ z k − h ( a i , x ] T \chi_k^2 = [z_k -h(a,x_k)]R^{-1}[z_k -h(a_i,x]^T χ k 2 = [ z k − h ( a , x k ) ] R − 1 [ z k − h ( a i , x ] T
上式只使用了k時刻的測量值,爲了能夠前邊所有的測量值,需要:
χ k − 1 2 = ∑ k κ ( z k − h ( a , x ) R − 1 ( z k − h ( a , x ) T ≈ χ m i n 2 + ( x k − 1 − x ^ k − 1 ) R − 1 ( x k − 1 − x ^ k − 1 ) T \begin{array}{cc}
\chi_{k-1}^2 = \sum \limits_{k}^{\kappa} (z_k -h(a,x)R^{-1}(z_k -h(a,x)^T \\
\approx \chi_{min}^2 + (x_{k-1} -\hat x_{k-1})R^{-1}(x_{k-1} -\hat x_{k-1})^T
\end{array} χ k − 1 2 = k ∑ κ ( z k − h ( a , x ) R − 1 ( z k − h ( a , x ) T ≈ χ m i n 2 + ( x k − 1 − x ^ k − 1 ) R − 1 ( x k − 1 − x ^ k − 1 ) T
考慮前邊的所有數據:
χ 2 = χ k 2 + χ k − 1 2 = [ z k − h ( a , x k ) ] R − 1 [ z k − h ( a i , x ) ] T + χ m i n 2 + ( x k − 1 − x ^ k − 1 ) R − 1 ( x k − 1 − x ^ k − 1 ) T \begin{array}{cc}
\chi^2 = \chi_k^2 + \chi_{k-1}^2
=[z_k -h(a,x_k)]R^{-1}[z_k -h(a_i,x)]^T + \chi_{min}^2 + (x_{k-1} -\hat x_{k-1})R^{-1}(x_{k-1} -\hat x_{k-1})^T
\end{array} χ 2 = χ k 2 + χ k − 1 2 = [ z k − h ( a , x k ) ] R − 1 [ z k − h ( a i , x ) ] T + χ m i n 2 + ( x k − 1 − x ^ k − 1 ) R − 1 ( x k − 1 − x ^ k − 1 ) T
考慮
h ( a , x k ) = h ( a , ( x ^ k + Δ x ) ) w h e r e x k = x ^ k + Δ x h(a,x_k) = h(a,(\hat x_k + \Delta x)) where x_k = \hat x_k + \Delta x h ( a , x k ) = h ( a , ( x ^ k + Δ x ) ) w h e r e x k = x ^ k + Δ x
使用泰勒展開:
⇒ h ( a , ( x ^ k + Δ x ) ) = h ( x ^ ) + Δ x ∇ x h ( x ^ ) \Rightarrow h(a,(\hat x_k + \Delta x)) = h(\hat x) + \Delta x \nabla _x h(\hat x) ⇒ h ( a , ( x ^ k + Δ x ) ) = h ( x ^ ) + Δ x ∇ x h ( x ^ )
對卡方求導,並將h 和 Δ x k h和\Delta x_k h 和 Δ x k 的表達式是代入:
d ( χ 2 ) d x = 2 P k − 1 ′ − 1 ( x k − 1 − x ^ k − 1 ) − 2 ∇ x h ( a , x k ) T R − 1 [ z k − h ( a , x k ) ] = 2 P k − 1 ′ − 1 ( x k − 1 − x ^ k − 1 ) − 2 ∇ x h ( a , x k ) T R − 1 [ z k − h ( a , x ^ ) + ( x k − x ^ k ) ∇ x h ( a , x ^ k ) ] \begin{array}{cc}
\frac {d(\chi ^2)}{dx} = 2P_{k-1}^{'-1}(x_{k-1}-\hat x_{k-1}) - 2\nabla _xh(a,x_k)^TR^{-1}[z_k-h(a,x_k) ] \\
=2P_{k-1}^{'-1}(x_{k-1}-\hat x_{k-1}) - 2\nabla xh(a,x_k)^TR^{-1}[z_k-h(a,\hat x) + (x_k- \hat x_k) \nabla _x h(a,\hat x_k) ]
\end{array} d x d ( χ 2 ) = 2 P k − 1 ′ − 1 ( x k − 1 − x ^ k − 1 ) − 2 ∇ x h ( a , x k ) T R − 1 [ z k − h ( a , x k ) ] = 2 P k − 1 ′ − 1 ( x k − 1 − x ^ k − 1 ) − 2 ∇ x h ( a , x k ) T R − 1 [ z k − h ( a , x ^ ) + ( x k − x ^ k ) ∇ x h ( a , x ^ k ) ]
假設估計模型的參數和實際模型的參數十分接近,那麼他們的梯度相等:
∇ x h ( a , x k ) = ∇ x h ( a , x ^ k ) = H \nabla _x h(a,x_k) = \nabla _x h(a,\hat x_k) = H ∇ x h ( a , x k ) = ∇ x h ( a , x ^ k ) = H
代入求導後的等式,並令該導數等於零,求得極值點:
d ( χ 2 ) d x = 0 = 2 P k − 1 ′ − 1 ( x k − 1 − x ^ k − 1 ) − 2 H T R − 1 [ z k − h ( a , x ^ ) + ( x k − x ^ k ) H ] = 2 ( P k − 1 ′ − 1 − H T R − 1 H ) ( x k − x ^ k ) − 2 H T R − 1 [ z k − h ( a , x ^ ) ] \begin{array}{cc}
\frac {d(\chi ^2)}{dx} =0 = 2P_{k-1}^{'-1}(x_{k-1}-\hat x_{k-1}) - 2H^TR^{-1}[z_k-h(a,\hat x) + (x_k- \hat x_k) H ] \\
=2(P_{k-1}^{'-1} - H^TR^{-1}H)(x_k- \hat x_k) - 2H^TR^{-1}[z_k-h(a,\hat x)]
\end{array} d x d ( χ 2 ) = 0 = 2 P k − 1 ′ − 1 ( x k − 1 − x ^ k − 1 ) − 2 H T R − 1 [ z k − h ( a , x ^ ) + ( x k − x ^ k ) H ] = 2 ( P k − 1 ′ − 1 − H T R − 1 H ) ( x k − x ^ k ) − 2 H T R − 1 [ z k − h ( a , x ^ ) ]
求解方程:
( x k − x ^ k ) = ∇ x = ( P k − 1 ′ − 1 − H T R − 1 H ) ( x k − x ^ k ) − 1 H T R − 1 [ z k − h ( a , x ^ ) ] (x_k- \hat x_k) = \nabla x =(P_{k-1}^{'-1} - H^TR^{-1}H)(x_k- \hat x_k)^{-1}H^TR^{-1}[z_k-h(a,\hat x)] ( x k − x ^ k ) = ∇ x = ( P k − 1 ′ − 1 − H T R − 1 H ) ( x k − x ^ k ) − 1 H T R − 1 [ z k − h ( a , x ^ ) ]
令:K k = ( P k − 1 ′ − 1 − H T R − 1 H ) H T R − 1 K_k =(P_{k-1}^{'-1} - H^TR^{-1}H)H^TR^{-1} K k = ( P k − 1 ′ − 1 − H T R − 1 H ) H T R − 1
所以:
x k = x ^ k + ∇ x = x ^ k + K k [ z k − h ( a , x ^ ) ] x_k = \hat x_k + \nabla x = \hat x_k + K_k[z_k-h(a,\hat x)] x k = x ^ k + ∇ x = x ^ k + K k [ z k − h ( a , x ^ ) ]
已知,我們推出了一個線性問題可以表達爲y = a x + b y = ax + b y = a x + b ,那麼我們遇到一個問題,判斷爲線性問題,就可以直接假設其方程爲y = a x + b y = ax + b y = a x + b ,再求解其參數。同樣的道理,我們已經推導出卡方問題的形式可以表示爲x k = x ^ k + K k [ z k − h ( a , x ^ ) ] x_k = \hat x_k + K_k[z_k-h(a,\hat x)] x k = x ^ k + K k [ z k − h ( a , x ^ ) ] ,那麼對於卡方問題的卡爾曼濾波形式,我們可以直接假設:
x ^ k = x ^ k ′ + K k ( z k − H x ^ k ′ ) \hat x_k =\hat x_k^{'} + K_k(z_k - H\hat x_k^{'}) x ^ k = x ^ k ′ + K k ( z k − H x ^ k ′ )
再通過已知的其他條件來求解對應參數。 注意:這裏的K k K_k K k 只是使用了卡方的形式,並不是卡方推導公式裏的K k 值 K_k值 K k 值 ,這裏K k K_k K k 的值由2.3中的推導求出的。
3.卡爾曼濾波的基本計算過程
卡爾曼濾波的核心點就是狀態、協方差,一共分爲5步,反覆迭代進行。
1. 由上一步最優狀態估計當前狀態;
2. 由上一步最優協方差估計當前協方差;
3. 計算卡爾曼增益;
4. 由狀態測量值和狀態估計值,預測當前狀態最優值;
5. 由卡爾曼增益、估計協方差計算當前協方差最優值;
五步方程:
(1) X ^ k ∣ k − 1 = F k − 1 X ^ k − 1 + G k − 1 u k − 1 \hat{X}_{k|k-1} = F_{k-1}\hat{X}_{k-1} + G_{k-1}u_{k-1} X ^ k ∣ k − 1 = F k − 1 X ^ k − 1 + G k − 1 u k − 1
(2) P k ∣ k − 1 = F k − 1 P k − 1 F k − 1 T + G k − 1 u k − 1 P_{k|k-1} = F_{k-1}P_{k-1}F_{k-1}^T + G_{k-1}u_{k-1} P k ∣ k − 1 = F k − 1 P k − 1 F k − 1 T + G k − 1 u k − 1
(3) K k = P k ∣ k − 1 H k T ( H k P k ∣ k − 1 H k T + R k ) − 1 K_k = P_{k|k-1}H_{k}^T(H_{k}P_{k|k-1}H_{k}^T+R_{k})^{-1} K k = P k ∣ k − 1 H k T ( H k P k ∣ k − 1 H k T + R k ) − 1
(4) X ^ k = X ^ x ∣ k − 1 + K k ( z k − H k X ^ x ∣ k − 1 ) \hat{X}_{k} = \hat{X}_{x|k-1} + K_{k}(z_{k}-H_{k}\hat{X}_{x|k-1}) X ^ k = X ^ x ∣ k − 1 + K k ( z k − H k X ^ x ∣ k − 1 )
(5) P k = ( I − K k H k ) P k ∣ k − 1 P_{k} = (I-K_kH_k) P_{k|k-1} P k = ( I − K k H k ) P k ∣ k − 1
4.卡爾曼濾波方法的實例
爲了更好地理解卡爾曼濾波,下面引入一個簡單的實例來進行說明,牛頓力學模型:
假設:小球 做自由落體運動,忽略阻力,
目標:濾波器KF由初始位置的不確定性來估計小球的位置
符號說明:
符號
h h h
g g g
t t t
Δ t \Delta t Δ t
k k k
k − 1 k-1 k − 1
說明
高度
重力加速度
時刻
微小時間長度
當前計數
上一個計數
根據基本的牛頓力學定律,經過Δ t \Delta t Δ t 時間後:
* 速度關係:h ˙ ( t ) = h ˙ ( t − Δ t ) − g Δ t \dot h(t) = \dot h(t - \Delta t)-g\Delta t h ˙ ( t ) = h ˙ ( t − Δ t ) − g Δ t
* 距離關係:h ( t ) = h ( t − Δ t ) + h ˙ ( t − Δ t ) Δ t − 1 2 g ( Δ t ) 2 h(t)=h(t-\Delta t)+\dot h(t-\Delta t)\Delta t-\frac{1}{2}g(\Delta t)^2 h ( t ) = h ( t − Δ t ) + h ˙ ( t − Δ t ) Δ t − 2 1 g ( Δ t ) 2
以上是該問題的連續性表述,將該問題離散化(這個離散化的思路有點意思),假設t = k Δ t t=k\Delta t t = k Δ t ,將上述公式重寫爲:
* 速度關係:h ˙ ( k Δ t ) = h ˙ ( k Δ t − Δ t ) − g Δ t \dot h(k\Delta t) = \dot h(k\Delta t - \Delta t)-g\Delta t h ˙ ( k Δ t ) = h ˙ ( k Δ t − Δ t ) − g Δ t
* 距離關係:h ( k Δ t ) = h ( k Δ t − Δ t ) + h ˙ ( k Δ t − Δ t ) Δ t − 1 2 g ( Δ t ) 2 h(k\Delta t)=h(k\Delta t-\Delta t)+\dot h(k\Delta t-\Delta t)\Delta t-\frac{1}{2}g(\Delta t)^2 h ( k Δ t ) = h ( k Δ t − Δ t ) + h ˙ ( k Δ t − Δ t ) Δ t − 2 1 g ( Δ t ) 2
變量形式的替換不一一說明,按照位置對應即可。
更改一下表述形式:
* 速度關係:h ˙ k = h ˙ k − 1 − g Δ t \dot h_k = \dot h_{k-1}-g\Delta t h ˙ k = h ˙ k − 1 − g Δ t
* 距離關係:h k = h k − 1 + h ˙ k − 1 Δ t − 1 2 g ( Δ t ) 2 h_k=h_{k-1}+\dot h_{k-1}\Delta t-\frac{1}{2}g(\Delta t)^2 h k = h k − 1 + h ˙ k − 1 Δ t − 2 1 g ( Δ t ) 2
轉換成矩陣表示:
[ h k h ˙ k ] = [ 1 Δ t 0 1 ] [ h k h ˙ k ] + [ − 1 2 ( Δ t ) 2 − Δ t ] g \left[\begin{matrix}h_k \\\dot h_k \\\end{matrix} \right]= \left[\begin{matrix}1 & \Delta t \\0 &1 \\\end{matrix} \right]\left[\begin{matrix}h_k \\\dot h_k \\\end{matrix} \right] + \left[\begin{matrix} -\frac{1}{2}(\Delta t)^2 \\ -\Delta t \\\end{matrix} \right]g [ h k h ˙ k ] = [ 1 0 Δ t 1 ] [ h k h ˙ k ] + [ − 2 1 ( Δ t ) 2 − Δ t ] g
將對應位置的變量換一種表達形式:
X k = F k − 1 X k 1 + G k − 1 u k − 1 ( 狀 態 方 程 ) X_k = F_{k-1}X_{k_1} + G_{k-1}u_{k-1}(狀態方程) X k = F k − 1 X k 1 + G k − 1 u k − 1 ( 狀 態 方 程 )
此外,還需建立一個觀測方程: 觀測值爲輸出狀態值加上觀測噪聲
y k = [ 1 0 ] h k + v k y_k = \left[\begin{matrix}1 & 0 \\\end{matrix}\right] h_k + v_k y k = [ 1 0 ] h k + v k
寫成矩陣的形式:
y k = H k X k + v k y_k = H_kX_k + v_k y k = H k X k + v k
這個時候,回到卡爾曼濾波問題,思考一下想要使用卡爾曼濾波需要哪些變量?
5.卡爾曼濾波方法的Python實現
圖1是估計值與真實值之間的差值變化情況,隨着時間推移,估計值越來越接近真實值,最終在真實值附近波動。圖2是測量值、真實值、估計值的一個情況對比。Python代碼部分將4中的實例執行了一次。
import numpy as np
import matplotlib. pyplot as plt
iterations = 1000
delta_t = 0.001
time = np. linspace( 0 , 1 , iterations)
time = np. mat( time)
g = 9.80665
z = [ 100 - 0.5 * g* ( delta_t* i) ** 2 for i in range ( iterations) ]
z_watch = np. mat( z)
noise = np. round ( np. random. normal( 0 , 1 , iterations) , 2 )
noise_mat = np. mat( noise)
z_mat = z_watch + noise_mat
y = [ ]
x_mat = np. mat( [ [ 105 , ] , [ 0 , ] ] )
p_mat = np. mat( [ [ 10 , 0 ] , [ 0 , 0.01 ] ] )
f_mat = np. mat( [ [ 1 , delta_t] , [ 0 , 1 ] ] )
g_mat = np. mat( [ [ - 0.5 * delta_t** 2 ] , [ - delta_t] ] )
q_mat = np. mat( [ [ 0.0 , 0 ] , [ 0 , 0.0 ] ] )
h_mat = np. mat( [ 1 , 0 ] )
r_mat = np. mat( [ 4 ] )
for i in range ( iterations) :
x_predict = f_mat * x_mat + g_mat * g
p_predict = f_mat * p_mat * f_mat. T + q_mat
kalman = p_predict * h_mat. T / ( h_mat * p_predict * h_mat. T + r_mat)
x_mat = x_predict + kalman * ( z_mat[ 0 , i] - h_mat * x_predict)
p_mat = ( np. eye( 2 ) - kalman * h_mat) * p_predict
y. append( x_mat[ 0 ] . tolist( ) [ 0 ] [ 0 ] )
y = np. mat( y)
error = y - z_watch
y = y. A
error = error. A
time = time. A
z_mat = z_mat. A
z_watch = z_watch. A
plt. plot( time[ 0 , : ] , z_mat[ 0 , : ] , label = 'Measured' )
plt. plot( time[ 0 , : ] , z_watch[ 0 , : ] , 'g' , label= 'True' )
plt. plot( time[ 0 , : ] , y[ 0 , : ] , 'r' , label = 'Estimated' )
plt. xlabel( 'h(m)' )
plt. ylabel( 'time(s)' )
plt. legend( loc= 'lower right' )
plt. figure( 2 )
plt. plot( time[ 0 , : ] , error[ 0 , : ] , label = 'Errors' )
plt. ylabel( 'error(m)' )
plt. xlabel( 'time(s)' )
plt. legend( loc= 'lower right' )
plt. show( )