卡爾曼濾波是一種高效率的遞歸濾波器(自回歸濾波器), 它能夠從一系列的不完全包含噪聲的測量(英文:measurement)中,估計動態系統的狀態,然而簡單的卡爾曼濾波必須應用在符合高斯分布的系統中。
百度百科是這樣說的,也就是說卡爾曼濾波第一是遞歸濾波,其次KF用於線性系統。
但經過研究和改進,出現了很多卡爾曼,如EKF(extended kalman filter)擴展卡爾曼,UKF(Unscented Kalman Filter)無跡卡爾曼等等。
而我們就來研究EKF,而EKF的中心思想就是將非線性系統線形化后再做KF處理。
狀態方程
當我們從最簡單的系統開始,我們假定k時刻的系統狀態與k-1時刻有關,於是我們可以得到方程:
其中a為常量,但是當系統內部有噪聲,我們稱為過程噪聲 ,計為w。所以方程可以寫成:
而我們實際觀測的時候會出現觀測噪聲,於是我們將觀測值計為Z,觀測噪聲為v,那我們可以把k時刻的觀測值與系統狀態值寫成方程:
於是最簡單的系統狀態方程就有啦。
卡爾曼濾波算法核心思想在於預測+測量反饋,它由兩部分組成,第一部分是 線性系統狀態預測方程,第二部分是 線性系統觀測方程。
這里系統的預測時候,我們要將通過系統狀態方程計算的預測值作為先驗信息,之后在觀測部分在重新更新這個信息。
回頭說狀態的預測,我們引入一個符號 ^在相應的變量上表示該變量是預計值。再說一個新概念:新息。一個時間序列{X(t)}里,根據歷史數據的預測值,新息是真實值減去預測值。
注:上有波浪線表示新息,也有用字母e表示的;上面尖的是預測值;無標注為真實值
我們給出一個優化過的預測值,新預測值 = 上一輪預測值(先驗) + 權重 × 新息,即:
那下一個問題就是權重g是怎么計算得出的呢?答案是間接的從噪聲里求得的。當我們將估計協方差叫做p,而傳感器的協方差為r,我們通過這兩個值計算權重。
既然獲得了g,我們下一步將先驗信息輸入到上面的兩個方程中獲得后驗預測值,也就是我們的輸出值。
那整個計算步驟和過程就應該是這樣的:
先預測后更新。具體計算過程和曲線生成可以參考levys教程的Part7。
之后我們再說更復雜一點的系統,系統地狀態方程引入了輸入量U。換句話說有一個U會時刻影響系統狀態量。
而觀測到的觀測值為
那我們新的計算方法就需要引入這兩個新的變量,
同樣是預測,更新,預測下一時刻,更新的計算方式。
而當系統用矩陣的方式寫的狀態方程,就需要以矩陣的方式計算。相同的數學公式及計算方法。如P的計算,
又如G,
還有P的更新,
這樣的話,我們的系統方程及計算步驟方式如下
需要注意的是我們使用的R是對測量誤差v的協方差,當我們在引入一個Q代表過程噪聲引起的誤差時,可以使系統表現更好,即使Q很小,
那如果系統是非線性的呢?我們如果將觀測值Z計做X的非線性函數組成的,我們的模型可以改成。
而我們的中心思想是將其線性化,如果我們使用函數一階導為C來計算G和P。
最后系統復雜到這樣的程度,
那我們就引入雅科比矩陣,雅各比矩陣就是方程矩陣對每一個變量的偏導數。
則在向量分析中,雅可比矩陣Jacobian matrix是該函數的所有分量( 個)對向量
的所有分量(
個)的一階偏導數組成的矩陣。
函數有 個分量,於是有
行。向量
有
個分量,於是有
列。
而最終,F為f方程的雅可比,H為h方程的雅可比。最終計算如下:
到這里簡單的EKF就已經完成基本介紹啦。
有興趣的可以去github上看levys的matlab代碼,鏈接在下。
參考資料:
筆記參考:A0402272018
levys教程:
http://home.wlu.edu/~levys/kalman_tutorial/
levys源碼:
https://github.com/simondlevy/SensorFusion
卡爾曼濾波(KF)與擴展卡爾曼濾波(EKF)的一種理解思路及相應推導