卡爾曼濾波器演算法 基本原理

2021-07-24 11:37:36 字數 4822 閱讀 7775

卡爾曼濾波器

–kalman filter

在學習卡爾曼濾波器之前,首先看看為什麼叫「卡爾曼」。跟其他著名的理論(例如傅利葉變換,泰勒級數等等)一樣,卡爾曼也是乙個人的名字,而跟他們不同的是,他是個現代人!

卡爾曼全名

rudolf emil kalman

,匈牙利數學家,

1930

年出生於匈牙利首都布達佩斯。

1953

,1954

年於麻省理工學院分別獲得電機工程學士及碩士學位。

1957

年於哥倫比亞大學獲得博士學位。我們現在要學習的卡爾曼濾波器,正是源於他的博士**和

1960

年發表的**《

簡單來說,卡爾曼濾波器是乙個「

optimal recursive data processing algorithm

(最優化自回歸資料處理演算法)」。對於解決很大部分的問題,他是最優,效率最高甚至是最有用的。他的廣泛應用已經超過

30年,包括機械人導航,控制,感測器資料融合甚至在軍事方面的雷達系統以及飛彈追蹤等等。近年來更被應用於計算機影象處理,例如頭臉識別,影象分割,影象邊緣檢測等等。

為了可以更加容易的理解卡爾曼濾波器,這裡會應用形象的描述方法來講解,而不是像大多數參考書那樣羅列一大堆的數學公式和數學符號。但是,他的

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

)。他可以隨不同的時刻而改變他自己的值,是不是很神奇!

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

**值**偏差度

測量值測量偏差度

備註k - 1233

k23525

4kg*25 + (1 - kg)*23 = 24.56

((1-kg)*5^2)^0.5=2.35

k + 1

24.56

2.35

在這一部分,我們就來描述源於

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個公式,可以很容易的實現計算機的程式

卡爾曼濾波器

協方差 用於表示兩個變數的總體誤差,如果兩個變化趨勢一致則協方差為正值,變化趨勢不一致則為負值。從直觀上來看,協方差表示的是兩個變數總體誤差的期望。由k 1時刻的最優值和系統輸入計算k時刻的系統 值。根據k 1時刻的系統協方差 k時刻系統協方差。根據 k時刻 協方差矩陣的 值計算卡爾曼增益。根據狀態...

rl濾波器原理 濾波電路基本原理

濾波電路基本原理 整流電路的輸出電壓不是純粹的直流,從示波器觀察整流電路的輸出,與直流相差很大,波形中含有較 大的脈動成分,稱為紋波。為獲得比較理想的直流電壓,需要利用具有儲能作用的電抗性元件 如電容 電感 組成的濾波電路來濾除整流電路輸出電壓中的脈動成分以獲得直流電壓。常用的濾波電路有無源濾波和有...

卡爾曼濾波器 Python Numpy基本函式

import numpy as np 匯入numpy庫 defone tenth x 將輸入轉化成矩陣,dtype指定陣列的資料型別 x np.asarray x,dtype np.float32 return x 10 x np.array 1,2 申請一浮點矩陣 3,4 dtype float ...