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算法進行下說明:
就這樣,算法就可以自回歸的運算下去。
看到這聰明的同學可能已經看出來了,問道卡爾曼增益為什麼會是第三步中那樣求,現在隻大緻說一下原理,具體推到比較複雜,有興趣的同學可以參考這文獻去推一推。
還記得前面我們說的誤差協方差矩陣$P_k$麼,即求第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);
t=1:N;
plot(t,s,'r',t,Y,'g',t,x,'b');
更為詳細的過程可參考有關的資料。
本文轉自莫水千流部落格園部落格,原文連結:http://www.cnblogs.com/zhoug2020/p/7623568.html,如需轉載請自行聯系原作者