1. 程式人生 > >卡爾曼濾波

卡爾曼濾波

nbsp 應用 一周 log -1 現在 richtext http 一是

假設我養了一只豬:

技術分享

一周前,這只豬的體重是46±0.5kg。註意,在這裏我用了±0.5,表示其實我對這只豬一周前的體重並不是那麽確定的,也就是說,46kg這個體重有0.5kg的誤差。
現在,我又養了這只豬一個星期。那麽我想要知道它一個星期之後多重,又大概有多少的誤差?
技術分享

為了得到一周後的體重,我有兩種方法:一是根據我多年的養豬經驗得到的豬體重公式推求出一個大概的值,另一個就是直接去稱它的體重。當然,兩種方法都有一定的誤差。假設經驗公式得到的體重是48kg,誤差2kg;直接稱體重得到的是49kg,誤差1kg:

技術分享

可是,我是一個處女座的人,不管是經驗公式得到的值,還是直接稱量得到的值,我都覺得不夠準。我希望有一種方法,可以同時結合這只豬一周前的體重、用經驗公式估計的值以及直接稱量得到的值,綜合考慮,得出一個最接近豬真實體重的,誤差最小的值。這就是卡爾曼濾波要完成的任務。
現在我們來把養豬的模型抽象成數學公式:
技術分享

上圖的左邊,上一周的豬的體重,可以抽象為也k-1時刻的狀態值,用k-1時刻的最優估計值加上一個誤差項來表示,右邊同理。其中,

技術分享

這一項表示的是估計值的協方差。這裏要說明兩點:1,上圖中所有的變量都是用粗體,表示這是一個向量或者一個矩陣;2,之所以用(列)向量而非一個數來表示狀態值,是因為,雖然一只豬的體重可以用一個值來表示,但是在實際的應用中很多狀態並不是一個數就能表示的(比如導彈在空間中的位置,同時有x、y、z三個坐標)。
上圖中右邊表示k時刻的狀態值,這個值可以通過預測模塊(也就是根據經驗公式估計豬的體重)和糾錯模塊(也就是直接去稱量豬的體重值)來估計。同樣,預測模塊和糾錯模塊都有著對應的誤差和誤差協方差矩陣。卡爾曼濾波要做的,就是根據貝葉斯估計的相關理論,同時考慮預測模塊和糾錯模塊的協方差,對誤差小的項賦予較大的權重,對誤差大的項賦予較小的權重,並使預測的誤差最小。

技術分享

具體的實現過程如下:

技術分享

至於具體的這個過程是怎麽推求的,每個參數的詳細解釋又是怎麽樣的,這個在所有介紹卡爾曼的濾波的書上都有講述,也並不是一個帖子就能說清楚的,這裏就不展開講了~
謝謝各位看官~

卡爾曼濾波