kalman濾波

kalman濾波原理(通俗易懂)

1. 在學習卡爾曼濾波器以前,首先看看爲何叫「卡爾曼」。跟其餘著名的理論(例如傅立葉變換,泰勒級數等等)同樣,卡爾曼也是一我的的名字,而跟他們不一樣的是,他是個現代人!

卡爾曼全名Rudolf Emil Kalman,匈牙利數學家,1930年出生於匈牙利首都布達佩斯。1953,1954年於麻省理工學院分別得到電機工程學士及碩士學位。1957年於哥倫比亞大學得到博士學位。咱們如今要學習的卡爾曼濾波器,正是源於他的博士論文和1960年發表的論文《A New Approach to Linear Filtering and Prediction Problems》(線性濾波與預測問題的新方法)。若是對這編論文有興趣,能夠到這裏的地址下載:http://www.cs.unc.edu/~welch/kalman/media/pdf/Kalman1960.pdf

簡單來講,卡爾曼濾波器是一個「optimal recursive data processing algorithm(最優化自迴歸數據處理算法)」。對於解決很大部分的問題,他是最優,效率最高甚至是最有用的。他的普遍應用已經超過30年,包括機器人導航,控制,傳感器數據融合甚至在軍事方面的雷達系統以及導彈追蹤等等。近年來更被應用於計算機圖像處理,例如頭臉識別,圖像分割,圖像邊緣檢測等等。html

2.卡爾曼濾波器的介紹

(Introduction to the Kalman Filter)

爲了能夠更加容易的理解卡爾曼濾波器,這裏會應用形象的描述方法來說解,而不是像大多數參考書那樣羅列一大堆的數學公式和數學符號。可是,他的5條公式是其核心內容。結合現代的計算機,其實卡爾曼的程序至關的簡單,只要你理解了他的那5條公式。

在介紹他的5條公式以前,先讓咱們來根據下面的例子一步一步的探索。

假設咱們要研究的對象是一個房間的溫度。根據你的經驗判斷,這個房間的溫度是恆定的,也就是下一分鐘的溫度等於如今這一分鐘的溫度(假設咱們用一分鐘來作時間單位)。假設你對你的經驗不是100%的相信,可能會有上下誤差幾度。咱們把這些誤差當作是高斯白噪聲(White Gaussian Noise),也就是這些誤差跟先後時間是沒有關係的並且符合高斯分配(Gaussian Distribution)。另外,咱們在房間裏放一個溫度計,可是這個溫度計也不許確的,測量值會比實際值誤差。咱們也把這些誤差當作是高斯白噪聲。

好了,如今對於某一分鐘咱們有兩個有關於該房間的溫度值:你根據經驗的預測值(系統的預測值)和溫度計的值(測量值)。下面咱們要用這兩個值結合他們各自的噪聲來估算出房間的實際溫度值。

假如咱們要估算k時刻的是實際溫度值。首先你要根據k-1時刻的溫度值,來預測k時刻的溫度。由於你相信溫度是恆定的,因此你會獲得k時刻的溫度預測值是跟k-1時刻同樣的,假設是23度,同時該值的高斯噪聲的誤差是5度(5是這樣獲得的:若是k-1時刻估算出的最優溫度值的誤差是3,你對本身預測的不肯定度是4度,他們平方相加再開方,就是5)。而後,你從溫度計那裏獲得了k時刻的溫度值,假設是25度,同時該值的誤差是4度。

因爲咱們用於估算k時刻的實際溫度有兩個溫度值,分別是23度和25度。究竟實際溫度是多少呢?相信本身仍是相信溫度計呢?究竟相信誰多一點,咱們能夠用他們的covariance來判斷。由於Kg^2=5^2/(5^2+4^2),因此Kg=0.78,咱們能夠估算出k時刻的實際溫度值是:23+0.78*(25-23)=24.56度。能夠看出,由於溫度計的covariance比較小(比較相信溫度計),因此估算出的最優溫度值偏向溫度計的值。

如今咱們已經獲得k時刻的最優溫度值了,下一步就是要進入k+1時刻,進行新的最優估算。到如今爲止,好像還沒看到什麼自迴歸的東西出現。對了,在進入k+1時刻以前,咱們還要算出k時刻那個最優值(24.56度)的誤差。算法以下:((1-Kg)*5^2)^0.5=2.35。這裏的5就是上面的k時刻你預測的那個23度溫度值的誤差,得出的2.35就是進入k+1時刻之後k時刻估算出的最優溫度值的誤差(對應於上面的3)。

就是這樣,卡爾曼濾波器就不斷的把covariance遞歸,從而估算出最優的溫度值。他運行的很快,並且它只保留了上一時刻的covariance。上面的Kg,就是卡爾曼增益(Kalman Gain)。他能夠隨不一樣的時刻而改變他本身的值,是否是很神奇!

下面就要言歸正傳,討論真正工程系統上的卡爾曼。

算法

3. 卡爾曼濾波器算法

(The Kalman Filter Algorithm)

在這一部分,咱們就來描述源於Dr Kalman 的卡爾曼濾波器。下面的描述,會涉及一些基本的概念知識,包括機率(Probability),隨即變量(Random Variable),高斯或正態分配(Gaussian Distribution)還有State-space Model等等。但對於卡爾曼濾波器的詳細證實,這裏不能一一描述。

首先,咱們先要引入一個離散控制過程的系統。該系統可用一個線性隨機微分方程(Linear Stochastic Difference equation)來描述:
X(k)=A X(k-1)+B U(k)+W(k)
再加上系統的測量值:
Z(k)=H X(k)+V(k)
上兩式子中,X(k)是k時刻的系統狀態,U(k)是k時刻對系統的控制量。A和B是系統參數,對於多模型系統,他們爲矩陣。Z(k)是k時刻的測量值,H是測量系統的參數,對於多測量系統,H爲矩陣。W(k)和V(k)分別表示過程和測量的噪聲。他們被假設成高斯白噪聲(White Gaussian Noise),他們的covariance 分別是Q,R(這裏咱們假設他們不隨系統狀態變化而變化)。

對於知足上面的條件(線性隨機微分系統,過程和測量都是高斯白噪聲),卡爾曼濾波器是最優的信息處理器。下面咱們來用他們結合他們的covariances 來估算系統的最優化輸出(相似上一節那個溫度的例子)。

首先咱們要利用系統的過程模型,來預測下一狀態的系統。假設如今的系統狀態是k,根據系統的模型,能夠基於系統的上一狀態而預測出如今狀態:
X(k|k-1)=A X(k-1|k-1)+B U(k) ……….. (1)
式(1)中,X(k|k-1)是利用上一狀態預測的結果,X(k-1|k-1)是上一狀態最優的結果,U(k)爲如今狀態的控制量,若是沒有控制量,它能夠爲0。

到如今爲止,咱們的系統結果已經更新了,但是,對應於X(k|k-1)的covariance還沒更新。咱們用P表示covariance:
P(k|k-1)=A P(k-1|k-1) A’+Q ……… (2)
式(2)中,P(k|k-1)是X(k|k-1)對應的covariance,P(k-1|k-1)是X(k-1|k-1)對應的covariance,A’表示A的轉置矩陣,Q是系統過程的covariance。式子1,2就是卡爾曼濾波器5個公式當中的前兩個,也就是對系統的預測。

如今咱們有了如今狀態的預測結果,而後咱們再收集如今狀態的測量值。結合預測值和測量值,咱們能夠獲得如今狀態(k)的最優化估算值X(k|k):
X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1)) ……… (3)
其中Kg爲卡爾曼增益(Kalman Gain):
Kg(k)= P(k|k-1) H’ / (H P(k|k-1) H’ + R) ……… (4)

到如今爲止,咱們已經獲得了k狀態下最優的估算值X(k|k)。可是爲了要另卡爾曼濾波器不斷的運行下去直到系統過程結束,咱們還要更新k狀態下X(k|k)的covariance:
P(k|k)=(I-Kg(k) H)P(k|k-1) ……… (5)
其中I 爲1的矩陣,對於單模型單測量,I=1。當系統進入k+1狀態時,P(k|k)就是式子(2)的P(k-1|k-1)。這樣,算法就能夠自迴歸的運算下去。

卡爾曼濾波器的原理基本描述了,式子1,2,3,4和5就是他的5 個基本公式。根據這5個公式,能夠很容易的實現計算機的程序。

下面,我會用程序舉一個實際運行的例子。。。
編程

4. 簡單例子

(A Simple Example)

這裏咱們結合第二第三節,舉一個很是簡單的例子來講明卡爾曼濾波器的工做過程。所舉的例子是進一步描述第二節的例子,並且還會配以程序模擬結果。

根據第二節的描述,把房間當作一個系統,而後對這個系統建模。固然,咱們見的模型不須要很是地精確。咱們所知道的這個房間的溫度是跟前一時刻的溫度相同的,因此A=1。沒有控制量,因此U(k)=0。所以得出:
X(k|k-1)=X(k-1|k-1) ……….. (6)
式子(2)能夠改爲:
P(k|k-1)=P(k-1|k-1) +Q ……… (7)

由於測量的值是溫度計的,跟溫度直接對應,因此H=1。式子3,4,5能夠改爲如下:
X(k|k)= X(k|k-1)+Kg(k) (Z(k)-X(k|k-1)) ……… (8)
Kg(k)= P(k|k-1) / (P(k|k-1) + R) ……… (9)
P(k|k)=(1-Kg(k))P(k|k-1) ……… (10)

如今咱們模擬一組測量值做爲輸入。假設房間的真實溫度爲25度,我模擬了200個測量值,這些測量值的平均值爲25度,可是加入了標準誤差爲幾度的高斯白噪聲(在圖中爲藍線)。

爲了令卡爾曼濾波器開始工做,咱們須要告訴卡爾曼兩個零時刻的初始值,是X(0|0)和P(0|0)。他們的值不用太在乎,隨便給一個就能夠了,由於隨着卡爾曼的工做,X會逐漸的收斂。可是對於P,通常不要取0,由於這樣可能會令卡爾曼徹底相信你給定的X(0|0)是系統最優的,從而使算法不能收斂。我選了X(0|0)=1度,P(0|0)=10。

該系統的真實溫度爲25度,圖中用黑線表示。圖中紅線是卡爾曼濾波器輸出的最優化結果(該結果在算法中設置了Q=1e-6,R=1e-1)。dom

××××××××××××××××××

附matlab下面的kalman濾波程序:

clear
N=200;
w(1)=0;
w=randn(1,N)
x(1)=0;
a=1;
for k=2:N;
x(k)=a*x(k-1)+w(k-1);
end


V=randn(1,N);
q1=std(V);
Rvv=q1.^2;
q2=std(x);
Rxx=q2.^2;
q3=std(w);
Rww=q3.^2;
c=0.2;
Y=c*x+V;

p(1)=0;
s(1)=0;
for t=2:N;
p1(t)=a.^2*p(t-1)+Rww;
b(t)=c*p1(t)/(c.^2*p1(t)+Rvv);
s(t)=a*s(t-1)+b(t)*(Y(t)-a*c*s(t-1));
p(t)=p1(t)-c*b(t)*p1(t);
end

t=1:N;
plot(t,s,'r',t,Y,'g',t,x,'b');ide

 

 

 

 

卡爾曼濾波 -- 從推導到應用(一)

前言svg

          卡爾曼濾波器是在估計線性系統狀態的過程當中,以最小均方偏差爲目的而推導出的幾個遞推數學等式,也能夠從貝葉斯推斷的角度來推導。函數

          本文將分爲兩部分:學習

第一部分,結合例子,從最小均方偏差的角度,直觀地介紹卡爾曼濾波的原理,並給出較爲詳細的數學推導。優化

第二部分,經過兩個例子給出卡爾曼濾波的實際應用。其中將詳細介紹一個勻加速模型,並直觀的對比系統狀態模型的創建對濾波的影響。ui

 

第一部分

先看一個對理解卡爾曼濾波能起到做用的的笑話:

一片綠油油的草地上有一條曲折的小徑,通向一棵大樹.一個要求被提出:從起點沿着小徑走到樹下.

「很簡單.」 A說,因而他絲絕不差地沿着小徑走到了樹下.

如今,難度被增長了:蒙上眼。

「也不難,我當過特種兵。」 B說,因而他歪歪扭扭地走到了樹旁。「唉,很久不練,生疏了。」 (只憑本身的預測能力)

「看個人,我有 DIY 的 GPS!」 C說,因而他像個醉漢似地歪歪扭扭的走到了樹旁。「唉,這個 GPS 沒作好,漂移太大。」(只依靠外界有很大噪聲的測量)

「我來試試。」 旁邊一也當過特種兵的拿過 GPS, 蒙上眼,竟然沿着小徑很順滑的走到了樹下。(本身能預測+測量結果的反饋)

「這麼厲害!你是什麼人?」
「卡爾曼 ! 」
「卡爾曼?!你就是卡爾曼?」衆人大吃一驚。
「我是說這個 GPS 卡而慢。」

此段引用自 highgear 的 《授之以漁:卡爾曼濾波器...大泄蜜...》 (點擊可跳轉到該網頁)

這個小笑話頗有意思的指出了卡爾曼濾波的核心,預測+測量反饋,記住這種思想。

-----------------------------------------------------------分割線-----------------------------------------------------------------------

在介紹卡爾曼濾波前,簡單說明幾個在學卡爾曼過程當中要用到的概念。即什麼是協方差,它有什麼含義,以及什麼叫最小均方偏差估計,什麼是多元高斯分佈。若是對這些有了瞭解,能夠跳過,直接到下面的分割線。

   均方偏差:它是"偏差"的平方的指望值偏差就是每一個估計值與真實值的差),也就是多個樣本的時候,均方偏差等於每一個樣本的偏差平方再乘以該樣本出現的機率的和。

   方差:方差是描述隨機變量的離散程度,是變量離指望值的距離。

注意二者概念上稍有差異,當你的樣本指望值就是真實值時,二者又徹底相同。最小均方偏差估計就是指估計參數時要使得估計出來的模型和真實值之間的偏差平方指望值最小。

      兩個實變量之間的協方差:

                                             

 

它表示的兩個變量之間的整體偏差,當Y=X的時候就是方差。下面說說我對協方差的通俗理解,先拋去公式中的指望不談,即假設樣本X,Y發生的機率就是1,那麼協方差的公式就變成了:

                                                              

這就是兩個東西相乘,立刻聯想到數值圖像裏的相關計算。若是兩個變量的變化趨勢一致,也就是說若是其中一個大於自身的指望值,另一個也大於自身的指望值,那麼兩個變量之間的協方差就是正值。若是兩個變量的變化趨勢相反,即其中一個大於自身的指望值,另一個卻小於自身的指望值,那麼兩個變量之間的協方差就是負值。協方差矩陣只不過就是元素多了組成了矩陣,其中協方差矩陣的對角線就是方差,具體公式形式請見wiki。

   其實,這種相乘的形式也有點相似於向量投影,即兩個向量的內積。再遠一點,聯想到傅里葉變換裏頻譜系數的肯定,要肯定一個函數f(x)在某個頻率w上的頻譜,就是<f(x),cos(wt)>,< ,>表示向量內積,通俗的講是將f(x)投影到cos(wt)上,要講清傅里葉的本質須要另寫一篇博文,這裏提到這些只是以爲有益於對知識的相互理解。 

高斯分佈:機率密度函數圖像以下圖,四條曲線的方差各不相同,方差決定了曲線的胖瘦高矮。(圖片來源:維基百科)

 

多元高斯分佈:就是高斯分佈的低維向高維的擴展,圖像以下。


對應多元高斯分佈的公式也請自行谷歌,之前高斯公式中的方差也變成了協方差,對應上面三張圖的協方差矩陣分別以下:

             

注意協方差矩陣的主對角線就是方差,反對角線上的就是兩個變量間的協方差。就上面的二元高斯分佈而言,協方差越大,圖像越扁,也就是說兩個維度之間越有聯繫。

-----------------------------------------------------------分割線---------------------------------------------------------------------

       這部分每講一個數學性的東西,接着就會有相應的例子和直觀的分析幫助理解。

       首先假設咱們知道一個線性系統的狀態差分方程爲

                                                   

其中x是系統的狀態向量,大小爲n*1列。A爲轉換矩陣,大小爲n*n。u爲系統輸入,大小爲k*1。B是將輸入轉換爲狀態的矩陣,大小爲n*k。隨機變量w爲系統噪聲。注意這些矩陣的大小,它們與你實際編程密切相關。

       看一個具體的勻加速運動的實例。

       有一個勻加速運動的小車,它受到的協力爲 ft , 由勻加速運動的位移和速度公式,能獲得由 t-1 到 t 時刻的位移和速度變化公式:

                                                 

該系統系統的狀態向量包括位移和速度,分別用 xt 和 xt的導數 表示。控制輸入變量爲u,也就是加速度,因而有以下形式:

                                           

因此這個系統的狀態的方程爲:

                                         

這裏對應的的矩陣A大小爲 2*2 ,矩陣B大小爲 2*1。 

      貌似有了這個模型就能徹底估計系統狀態了,速度能計算出,位移也能計算出。那還要卡爾曼幹嗎,問題是不少實際系統複雜到根本就建不了模。而且,即便你創建了較爲準確的模型,只要你在某一步有偏差,由遞推公式,極可能不斷將你的偏差放大A倍(A就是那個狀態轉換矩陣),以致於最後獲得的估計結果徹底不能用了。回到最開始的那個笑話,若是那個徹底憑預測的特種兵在某一步偏離了正確的路徑,當他站在錯誤的路徑上(而他本身覺得是正確的)作下一步預測時,確定走的路徑也會錯了,到最後越走越偏。

     既然如此,咱們就引進反饋。從機率論貝葉斯模型的觀點來看前面預測的結果就是先驗,測量出的結果就是後驗。

     測量值固然是由系統狀態變量映射出來的,方程形式以下:

                                       

注意Z是測量值,大小爲m*1(不是n*1,也不是1*1,後面將說明),H也是狀態變量到測量的轉換矩陣。大小爲m*n。隨機變量v是測量噪聲。

     同時對於勻加速模型,假設下車是勻加速遠離咱們,咱們站在原點用超聲波儀器測量小車離咱們的距離。

                                            

也就是測量值直接等於位移。可能又會問,爲何不直接用測量值呢?測量值噪聲太大了,根本不能直接用它來進行計算。試想一個原本是朝着一個方向作勻加速運動的小車,你測出來的位移確是先後移動(噪聲影響),只根據測量的結果,你就覺得車子一會往前開一會日後開。

對於狀態方程中的系統噪聲w和測量噪聲v,假設服從以下多元高斯分佈,而且w,v是相互獨立的。其中Q,R爲噪聲變量的協方差矩陣。

                               

看到這裏天然要提個問題,爲何噪聲模型就得服從高斯分佈呢?請繼續往下看。

      對於小車勻加速運動的的模型,假設系統的噪聲向量只存在速度份量上,且速度噪聲的方差是一個常量0.01,位移份量上的系統噪聲爲0。測量值只有位移,它的協方差矩陣大小是1*1,就是測量噪聲的方差自己。

那麼:

                                         

Q中,疊加在速度上系統噪聲方差爲0.01,位移上的爲0,它們間協方差爲0,即噪聲間沒有關聯。

     

      理論預測(先驗)有了,測量值(後驗)也有了,那怎麼根據這二者獲得最優的估計值呢?首先想到的就是加權,或者稱之爲反饋。

      咱們認定是預測(先驗)值,是估計值,爲測量值的預測,在下面的推導中,請注意估計和預測二者的區別,不混爲一談。由通常的反饋思想咱們獲得估計值:

                                       

                                                                 

其中,稱之爲殘差,也就是預測的和你實際測量值之間的差距。若是這項等於0,說明預測和測量出的徹底吻合。這種反饋遞推的形式又讓我聯想到數值分析裏用來求解線性方程組時的一種迭代方法,Gauss-Seidel迭代法,有興趣的能夠看看。

      如今的關鍵就是求取這個K。這時最小均方偏差就起到了做用,順便在這裏回答爲何噪聲必須服從高斯分佈,在進行參數估計的時候,估計的一種標準叫最大似然估計,它的核心思想就是你手裏的這些相互間獨立的樣本既然出現了,那就說明這些樣本機率的乘積應該最大(機率大才出現嘛)。若是樣本服從機率高斯分佈,對他們的機率乘積取對數ln後,你會發現函數形式將會變成一個常數加上樣本最小均方偏差的形式。所以,看似直觀上很容易理解的最小均方偏差理論上來源就出於那裏(詳細過程還請自行谷歌,請原諒,什麼都講的話就顯得這邊文章沒有主次了)。

     先看估計值和真實值間偏差的協方差矩陣,提醒一下協方差矩陣的對角線元素就是方差,求這個協方差矩陣,就是爲了利用他的對角線元素的和計算獲得均方差.    

                             

這裏請注意ek是向量,它由各個系統狀態變量的偏差組成。如勻加速運動模型裏,ek即是由位移偏差和速度偏差,他們組成的協方差矩陣。表示以下:

                                 

其中,Serr表明位移偏差,Verr表明速度偏差,對角線上就是各自的方差。

把前面獲得的估計值代入這裏可以化簡得:

                                                       (1)式

同理,可以獲得預測值和真實值之間偏差的協方差矩陣:

                                   

注意到系統狀態x變量和測量噪聲之間是相互獨立的。因而展開(1)式可得:

                                    

最後獲得:

                             

繼續展開:

                     

接下來最小均方差開始正式登場了,回憶以前提到的,協方差矩陣的對角線元素就是方差。這樣一來,把矩陣P的對角線元素求和,用字母T來表示這種算子,他的學名叫矩陣的跡。

                                  

最小均方差就是使得上式最小,對未知量K求導,令導函數等於0,就能找到K的值。

                         

                         

注意這個計算式K,轉換矩陣H式常數,測量噪聲協方差R也是常數。所以K的大小將與預測值的偏差協方差有關。不妨進一步假設,上面式子中的矩陣維數都是1*1大小的,並假設H=1,不等於0。那麼K能夠寫成以下:

                          

因此越大,那麼K就越大,權重將更加劇視反饋,若是等於0,也就是預測值和真實值相等,那麼K=0,估計值就等於預測值(先驗)。

將計算出的這個K反代入Pk中,就能簡化Pk,估計協方差矩陣Pk的:

                                 

所以遞推公式中每一步的K就計算出來了,同時每一步的估計協方差也能計算出來。但K的公式中好像又多了一個咱們還不曾計算出來的東西,他稱之爲預測值和真實值之間偏差的協方差矩陣。它的遞推計算以下:

 請先注意到預測值的遞推形式是:     

 

        

        

因爲系統狀態變量和噪聲之間是獨立,故能夠寫成:

     

                                             

由此也獲得了的遞推公式。所以咱們只需設定最初的,就能不斷遞推下去。

這裏總結下遞推的過程,理一下思路:

首先要計算預測值、預測值和真實值之間偏差協方差矩陣。

                    

有了這兩個就能計算卡爾曼增益K,再而後獲得估計值,

                     

最後還要計算估計值和真實值之間的偏差協方差矩陣,爲下次遞推作準備。

                     

至此,卡爾曼濾波的理論推導到此結束。還有一些如實際應用中狀態方程創建不正確,預測結果會怎樣等這樣的細節問題,以及一些總結留到第二部分討論。

 

 

(轉載請註明做者和出處:http://blog.csdn.net/heyijia0327 未經容許請勿用於商業用途)

 

reference:

1.Greg Welch & Gary Bishop. << An Introduction to the Kalman Filter >>
2.Tony Lacey. << Tutorial:The Kalman Filter >>.

3.Ramsey Faragher. << Understanding the Basis of the Kalman Filter Via a Simple and Intuitive Derivation >>

4.highgear . 《授之以漁:卡爾曼濾波器...大泄蜜...》 

5.不少概念定義來自維基百科

 

 

 

卡爾曼濾波 -- 從推導到應用(二)

這部分主要是經過對第一部分中提到的勻加速小車模型進行位移預測。

先來看看狀態方程能創建準確的時候,狀態方程見第一部分分割線之後內容,小車作勻加速運動的位移的預測仿真以下。

 

[plain]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. clc  
  2. clear all  
  3. close all  
  4.   
  5. % 初始化參數  
  6. delta_t=0.1;   %採樣時間  
  7. t=0:delta_t:5;  
  8. N = length(t); % 序列的長度  
  9. sz = [2,N];    % 信號需開闢的內存空間大小  2行*N列  2:爲狀態向量的維數n  
  10. g=10;          %加速度值  
  11. x=1/2*g*t.^2;      %實際真實位置  
  12. z = x + sqrt(10).*randn(1,N); % 測量時加入測量白噪聲  
  13.   
  14. Q =[0 0;0 9e-1]; %假設創建的模型  噪聲方差疊加在速度上 大小爲n*n方陣 n=狀態向量的維數  
  15. R = 10;    % 位置測量方差估計,能夠改變它來看不一樣效果  m*m      m=z(i)的維數  
  16.   
  17. A=[1 delta_t;0 1];  % n*n  
  18. B=[1/2*delta_t^2;delta_t];  
  19. H=[1,0];            % m*n  
  20.   
  21. n=size(Q);  %n爲一個1*2的向量  Q爲方陣  
  22. m=size(R);  
  23.   
  24. % 分配空間  
  25. xhat=zeros(sz);       % x的後驗估計  
  26. P=zeros(n);           % 後驗方差估計  n*n  
  27. xhatminus=zeros(sz);  % x的先驗估計  
  28. Pminus=zeros(n);      % n*n  
  29. K=zeros(n(1),m(1));   % Kalman增益  n*m  
  30. I=eye(n);  
  31.   
  32. % 估計的初始值都爲默認的0,即P=[0 0;0 0],xhat=0  
  33. for k = 9:N           %假設車子已經運動9個delta_T了,咱們纔開始估計  
  34.     % 時間更新過程  
  35.     xhatminus(:,k) = A*xhat(:,k-1)+B*g;  
  36.     Pminus= A*P*A'+Q;  
  37.       
  38.     % 測量更新過程  
  39.     K = Pminus*H'*inv( H*Pminus*H'+R );  
  40.     xhat(:,k) = xhatminus(:,k)+K*(z(k)-H*xhatminus(:,k));  
  41.     P = (I-K*H)*Pminus;  
  42. end  
  43.    
  44. figure  
  45. plot(t,z);  
  46. hold on  
  47. plot(t,xhat(1,:),'r-')  
  48. plot(t,x(1,:),'g-');  
  49. legend('含有噪聲的測量', '後驗估計', '真值');  
  50. xlabel('Iteration');  

獲得的仿真圖像:

 

綠線爲真實值,藍色的爲噪聲很大的測量值,紅線爲估計值。由此能夠看出卡爾曼濾波確實至關犀利,提供了一個順滑的最優的估計。並請注意代碼中,特意使得估計是從第9個纔開始預測,就像雷達跟蹤同樣,假設一開始咱們沒有發現這個東西,它已經運行了一段時間,咱們在雷達測量和本身預測後獲得估計結果,從圖中可看出效果確實很好。

但這裏請注意圖像中畫紅圈部分,因爲一開始你預測值爲0,而實際上不是(它已經運動9個時間間隔了),因此估計出的效果很差。在這裏回憶前面討論過的K值大小和估計的關係,既然預測不許,那麼一開始我就先相信測量唄。這就涉及估計值偏差協方差初值的選取。在第一部分中咱們知道卡爾曼增益K與預測偏差協方差矩陣正相關,由第一部分推導知道預測偏差協方差陣

                   

它又和估計偏差協方差矩陣有關,在Q,A肯定的狀況下,成正比。因此若是咱們給的初值大的話,那麼遞推第一步中計算出的卡爾曼增益K就大。K大意味着更相信測量值。

修改初值P=[2 0;0 2],估計圖像以下,能夠看到初始估計明顯改進了。(兩幅圖中,測量值相同,只改變了P)。這幅圖中紅色水平線那部分是前9個時間段,你還沒開始雷達追蹤,因此是水平的爲0。


好了,到第二個問題,當狀態方程創建不正確的又會怎樣呢?實際應用中不少時候咱們不能創建正確的狀態方程。

咱們假設創建的狀態方程以下:

                     

轉換矩陣A,B,H都等於1.這個模型明顯是不正確的。

注意這個時候的系統噪聲,就不僅僅只是系統內部產生的,還包括你創建狀態方程的不正確性。你創建的越不正確,根據你模型進行的預測就不正確,從這個角度來講,至關於你的噪聲增大了。因此這個時候系統噪聲W的方差應該增大。理解這一點,對改進實際估計效果有好處。接下來經過對比不一樣的W方差值設定給出對比,貼出這部分仿真以下。

 

[plain]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. clc  
  2. clear  
  3. close all  
  4.   
  5. % 初始化參數  
  6. delta_t=0.1;  
  7. t=0:delta_t:5;  
  8. g=10;%加速度值  
  9. n_iter = length(t); % 序列的長度  
  10. sz = [n_iter, 1]; % 信號需開闢的內存空間大小  
  11. x=1/2*g*t.^2;  
  12. x=x';  
  13. z = x + sqrt(10).*randn(sz); % 測量時加入測量白噪聲  
  14.   
  15. Q = 0.9; % 過程激勵噪聲方差     
  16.          %注意Q值得改變  待會增大到2,看看效果。對比看效果時,修改代碼不要改變z的值  
  17. R = 10; % 測量方差估計,能夠改變它來看不一樣效果  
  18.    
  19. % 分配空間  
  20. xhat=zeros(sz);      % x的後驗估計  
  21. P=zeros(sz);         % 後驗方差估計  
  22. xhatminus=zeros(sz); % x的先驗估計  
  23. Pminus=zeros(sz);    % 先驗方差估計  
  24. K=zeros(sz);         % Kalman增益  
  25.    
  26. % 估計的初始值  
  27. xhat(1) = 0.0;  
  28. P = 1.0;  
  29. for k = 2:n_iter   %  
  30.     % 時間更新過程  
  31.     xhatminus(k) = xhat(k-1);  
  32.     Pminus(k) = P(k-1)+Q;  
  33.       
  34.     % 測量更新過程  
  35.     K(k) = Pminus(k)/( Pminus(k)+R );  
  36.     xhat(k) = xhatminus(k)+K(k)*(z(k)-xhatminus(k));  
  37.     P(k) = (1-K(k))*Pminus(k);  
  38. end  
  39.    
  40. figure  
  41. plot(t,z);  
  42. hold on  
  43. plot(t,xhat,'r-')  
  44. plot(t,x,'g-');  
  45. legend('含有噪聲的測量', '後驗估計', '真值');  
  46. xlabel('Iteration');  

最開始假設系統噪聲方差和前面狀態創建正確的時候同樣爲0.9,估計圖像如圖(a)。效果不理想,咱們知道狀態方程創建錯誤了,系統噪聲方差應該比以前大。因而增大系統噪聲方差再預測,如圖(b)

 

                                                       圖(a)

                                                       圖(b)

兩個圖中測量值是同樣的,只是第二圖中將系統噪聲方差Q增大到2。對比能夠看出,特別是圖像後半段,圖(b)比圖(a)效果更接近真實值。

至此,從推導到應用接近尾聲了,但我在這裏還有一個問題就是,你隨便給的x的預測初值,模型創建也不正確,kalman filter 居然依然這麼犀利,那麼他收斂性怎麼證實呢?寫這文章的時候,筆者沒有看詳細的數學證實,可是由前面說到的kalman filter和數值分析裏遞推求解方程組時用的Gauss-Seidel 迭代法,二者真的很相近,因而我直觀的認爲卡爾曼的收斂性和Gauss-Seidel 同樣。Gauss-Seidel迭代法裏權重的選取能使得遞推收斂真實值,所以卡爾曼濾波里增益K的每次計算就是卡爾曼收斂的重要保證。

最後再說一句我的可能不正確觀點,拋磚迎玉,卡爾曼濾波最後收斂獲得的方程就是維納濾波,卡爾曼濾波是一步一步遞推而後收斂到真實值,維納濾波是直接計算出估計值,不是一步一步的結果,但二者都是最小均方差的思想在裏面。所以,我在學卡爾曼的時候,想到數字圖像裏的維納濾波,直觀的想到,維納濾波能作到的,卡爾曼應該也能作到。但這我也沒去驗證,卻是確實有這方面的論文。

相關文章
相關標籤/搜索