[轉]通俗理解卡爾曼濾波及其演算法實現(例項解析)
1.簡介(Brief Introduction)
在學習卡爾曼濾波器之前,首先看看為什麼叫“卡爾曼”。跟其他著名的理論(例如傅立葉變換,泰勒級數等等)一樣,卡爾曼也是一個人的名字,而跟他們不同的是,他是個現代人!
卡爾曼全名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
卡爾曼濾波器到底是幹嘛的?我們來看下wiki上的解釋:
卡爾曼濾波的一個典型例項是從一組有限的,包含噪聲的,對物體位置的觀察序列(可能有偏差)預測出物體的位置的座標及速度。在很多工程應用(如雷達、計算機視覺)中都可以找到它的身影。同時,卡爾曼濾波也是控制理論以及控制系統工程中的一個重要課題。例如,對於雷達來說,人們感興趣的是其能夠跟蹤目標。但目標的位置、速度、加速度的測量值往往在任何時候都有噪聲。卡爾曼濾波利用目標的動態資訊,設法去掉噪聲的影響,得到一個關於目標位置的好的估計。這個估計可以是對當前目標位置的估計(濾波),也可以是對於將來位置的估計(預測),也可以是對過去位置的估計(插值或平滑)。
斯坦利.施密特(Stanley Schmidt)首次實現了卡爾曼濾波器。卡爾曼在NASA埃姆斯研究中心訪問時,發現他的方法對於解決阿波羅計劃的軌道預測很有用,後來阿波羅飛船的導航電腦便使用了這種濾波器。 關於這種濾波器的論文由Swerling (1958)、Kalman (1960)與 Kalman and Bucy (1961)發表。
目前,卡爾曼濾波已經有很多不同的實現.卡爾曼最初提出的形式現在一般稱為簡單卡爾曼濾波器。除此以外,還有施密特擴充套件濾波器、資訊濾波器以及很多Bierman, Thornton 開發的平方根濾波器的變種。也許最常見的卡爾曼濾波器是鎖相環,它在收音機、計算機和幾乎任何視訊或通訊裝置中廣泛存在。
簡單來說,卡爾曼濾波器是一個“optimal recursive data processing algorithm(最優化自迴歸資料處理演算法)”。對於解決很大部分的問題,他是最優,效率最高甚至是最有用的。他的廣泛應用已經超過30年,包括機器人導航,控制,感測器資料融合甚至在軍事方面的雷達系統以及導彈追蹤等等。近年來更被應用於計算機影象處理,例如頭臉識別,影象分割,影象邊緣檢測等等。
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)來描述,我們結合下面PPT截圖進行說明:
上兩式子中,x(k)是k時刻的系統狀態,u(k)是k時刻對系統的控制量。A和B是系統引數,對於多模型系統,他們為矩陣。y(k)是k時刻的測量值,H是測量系統的引數,對於多測量系統,H為矩陣。q(k)和r(k)分別表示過程和測量的噪聲。他們被假設成高斯白噪聲(White Gaussian Noise),他們的covariance分別是Q,R(這裡我們假設他們不隨系統狀態變化而變化)。
對於滿足上面的條件(線性隨機微分系統,過程和測量都是高斯白噪聲),卡爾曼濾波器是最優的資訊處理器。先給出KF演算法的流程和五個核心更新方程如下:
KF演算法
五個更新方程為:
編寫公式不方便,所以寫成了PDF然後做了截圖粘在了下面,下面就上面的例子和五個核心的公式對Kalman演算法進行下說明:
就這樣,演算法就可以自迴歸的運算下去。
看到這聰明的同學可能已經看出來了,問道卡爾曼增益為什麼會是第三步中那樣求,現在只大致說一下原理,具體推到比較複雜,有興趣的同學可以參考這文獻去推一推。
還記得前面我們說的誤差協方差矩陣麼,即求第k次最優溫度的誤差協方差矩陣,對應於上例中的3和2.35….這些值。看下面PPT,我們最小化P即可得到卡爾曼增益K,對應上例求解K只最小化最優溫度值的偏差,即最小化P(K):
我們由第四步可以看出,k時刻系統的最優溫度值=k-1時刻狀態估計值(由上一狀態的最優溫度值加上過程誤差)+帶卡爾曼增益權值項的偏差。如果觀測誤差遠遠大於估計誤差,那麼K就很小,k時刻的預測值約等於k時刻的狀態估計值,如果對i時刻的狀態估計值誤差遠遠大於觀測誤差,此時相應的q較大,K較大,i時刻的狀態估計值更傾向於觀察的資料。
卡爾曼濾波器的原理基本描述就完成了,希望能幫助大家理解這這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)。
附matlab下面的kalman濾波程式:
- clear
- N=200;
- w(1)=0; %w為過程噪聲
- w=randn(1,N)
- x(1)=25;
- a=1; %a為方程中A(k)
- for k=2:N;
- x(k)=a*x(k-1)+w(k-1);
- end
- V=randn(1,N); %V為觀察噪聲
- q1=std(V);
- Rvv=q1.^2;
- q2=std(x);
- Rxx=q2.^2;
- q3=std(w);
- Rww=q3.^2;
- c=0.2; %c為方程中H(k)
- Y=c*x+V; %Y為觀察值
- p(1)=0;
- s(1)=0;
- for t=2:N;
- p1(t)=a.^2*p(t-1)+Rww; %p1為方程中p’
- 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’);
更為詳細的過程可參考有關的資料。
文章參考了:
1 博文http://hi.baidu.com/irvkqscjezbrtwq/item/4ad3bb018b8c7e37a3332a07
2 自動化所董秋雷上課課件
3 《學習Opencv》 於仕琪 P384 kalman濾波器部分
4 如果做視訊跟蹤具體引數選擇可參考《數字視訊處理》黎洪鬆 P102-106
5 如果想探索其具體推導過程可參考《現代訊號處理》 張賢達 P177-188