自動(dòng)駕駛基礎(chǔ)之——如何寫卡爾曼濾波器?
卡爾曼濾波器的理論
前文用了一個(gè)簡答的例子對卡爾曼濾波器的整個(gè)流程進(jìn)行了介紹,下面我們根據(jù)卡爾曼濾波器的原理,編寫代碼,跟蹤連續(xù)的激光雷達(dá)點(diǎn)。
在這里就要祭出卡爾曼老先生給我們留下的寶貴財(cái)富了,下面7個(gè)公式就是卡爾曼濾波器的理性描述,使用下面7個(gè)公式,就能夠?qū)崿F(xiàn)一個(gè)完整的卡爾曼濾波器?,F(xiàn)在看不懂這7個(gè)公式?jīng)]關(guān)系,繼續(xù)往下看,我會(huì)一個(gè)一個(gè)做解釋。

寫代碼(C++)的過程,實(shí)際上就是結(jié)合上面的公式,一步步完成初始化、預(yù)測、觀測的過程。由于公式中涉及大量的矩陣轉(zhuǎn)置和求逆運(yùn)算,我們使用開源的矩陣運(yùn)算庫——Eigen庫。
代碼:初始化(Initialization)
在Initialization這一步,需要將各個(gè)變量初始化,對于不同的運(yùn)動(dòng)模型,其狀態(tài)向量肯定是不一樣的,比如前文小車的例子,只需要一個(gè)距離s和一個(gè)速度v就可以表示小車的狀態(tài);再比如在一個(gè)2維空間中的點(diǎn),需要x方向上的距離和速度以及y方向上的距離和速度才能表示,這樣的狀態(tài)方程就有4個(gè)變量。
因此我們使用Eigen庫中非定長的數(shù)據(jù)結(jié)構(gòu),下圖中的VerctorXd表示X維的列矩陣,其中的元素?cái)?shù)據(jù)類型為double。

在這里,我們新建了一個(gè)KalmanFilter類,其中定義了一個(gè)叫做x_的變量,表示這個(gè)卡爾曼濾波器的狀態(tài)向量。
代碼:預(yù)測(Prediction)
完成初始化后,我們開始寫Prediction部分的代碼。首先是公式

這里的x為狀態(tài)向量,通過左乘一個(gè)矩陣F,再加上外部的影響u,得到預(yù)測的狀態(tài)向量x'。這里的F成為狀態(tài)轉(zhuǎn)移矩陣(state transistion matrix)。以2維的勻速運(yùn)動(dòng)為例,這里的x為

對于勻速運(yùn)動(dòng)模型,根據(jù)中學(xué)物理課本中的公式s1 = s0 + vt,經(jīng)過時(shí)間△t后的預(yù)測狀態(tài)向量應(yīng)該是

由于假設(shè)當(dāng)前運(yùn)動(dòng)為勻速運(yùn)動(dòng),加速度為0,加速度不會(huì)對預(yù)測造成影響,即

如果換成加速或減速運(yùn)動(dòng)模型,就可以引入加速度a_x和a_y,根據(jù)s1 = s0 + vt + at^2/2這里的u會(huì)變成:

作為入門課程,這里不討論太復(fù)雜的模型,因此公式

最終將寫成

由于每次做預(yù)測時(shí),△t的大小不固定,因此我們專門寫一個(gè)函數(shù)SetF()。

再看預(yù)測模塊的第二個(gè)公式

該公式中P表示系統(tǒng)的不確定程度,這個(gè)不確定程度,在卡爾曼濾波器初始化時(shí)會(huì)很大,隨著越來越多的數(shù)據(jù)注入濾波器中,不確定程度會(huì)變小,P的專業(yè)術(shù)語叫狀態(tài)協(xié)方差矩陣(state covariance matrix);這里的Q表示過程噪聲(process covariance matrix),即無法用x'=Fx+u表示的噪聲,比如車輛運(yùn)動(dòng)時(shí)突然到了上坡,這個(gè)影響是無法用之前的狀態(tài)轉(zhuǎn)移估計(jì)的。
以激光雷達(dá)為例。激光雷達(dá)只能測量點(diǎn)的位置,無法測量點(diǎn)的速度,因此對于激光雷達(dá)的協(xié)方差矩陣來說,對于位置信息,其測量位置較準(zhǔn),不確定度較低;對于速度信息,不確定度較高。因此可以認(rèn)為這里的P為:

由于Q對整個(gè)系統(tǒng)存在影響,但又不能太確定對系統(tǒng)的影響有多大。工程上,我們一般將Q設(shè)置為單位矩陣參與運(yùn)算,即

根據(jù)以上內(nèi)容和公式

我們就可以寫出預(yù)測模塊的代碼了

際編程時(shí)x'及P'不需要申請新的內(nèi)存去存儲(chǔ),使用原有的x和P代替即可。
代碼:觀測(Measurement)
觀測的第一個(gè)公式是

這個(gè)公式計(jì)算的是實(shí)際觀測到的測量值z與預(yù)測值x'之間差值y。不同傳感器的測量值一般不同,比如激光雷達(dá)測量的位置信號為x方向和y方向上的距離,毫米波雷達(dá)測量的是位置和角度信息。因此需要將狀態(tài)向量左乘一個(gè)矩陣H,才能與測量值進(jìn)行相應(yīng)的運(yùn)算,這個(gè)H被稱為測量矩陣(Measurement Matrix)。
激光雷達(dá)的測量值為

其中xm和ym分別表示x方向上的測量(measurement)值。
由于x'是一個(gè)4*1的列向量,如果要與一個(gè)2*1的列向量z進(jìn)行減運(yùn)算,需要左乘一個(gè)2*4的矩陣才行,因此整個(gè)公式最終要寫成:

即,對于激光雷達(dá)來說,這里的測量矩陣H為:

求得y值后,對y值乘以一個(gè)加權(quán)量,再加到原來的預(yù)測量上去,就可以得到一個(gè)既考慮了測量值,又考慮了預(yù)測模型的位置的狀態(tài)向量了。
那么y的這個(gè)權(quán)值該如何取呢?
再看接下里的兩個(gè)公式


這兩個(gè)公式求的是卡爾曼濾波器中一個(gè)很重要的量——卡爾曼增益K(Kalman Gain),用人話講就是求y值的權(quán)值。
公式中的R是測量噪聲矩陣(measurement covariance matrix),這個(gè)表示的是測量值與真值之間的差值。一般情況下,傳感器的廠家會(huì)提供該值。S只是為了簡化公式,寫的一個(gè)臨時(shí)變量,不要太在意。
看最后兩個(gè)公式


這兩個(gè)公式,實(shí)際上完成了卡爾曼濾波器的閉環(huán),第一個(gè)公式是完成了當(dāng)前狀態(tài)向量x的更新,不僅考慮了上一時(shí)刻的預(yù)測值,也考慮了測量值,和整個(gè)系統(tǒng)的噪聲,第二個(gè)公式根據(jù)卡爾曼增益,更新了系統(tǒng)的不確定度P,用于下一個(gè)周期的運(yùn)算,該公式中的I為與狀態(tài)向量同維度的單位矩陣。
廣告 編輯推薦
最新資訊
-
標(biāo)準(zhǔn)立項(xiàng)|《汽車異種材料鉚接接頭拉伸性能
2026-03-04 11:40
-
“汽車大角度座椅 第1部分:通用要求”將有
2026-03-04 11:39
-
“汽車大角度座椅 第2部分:可靠性要求”將
2026-03-04 11:39
-
電池耐久評價(jià)開始從“電池單體性能指標(biāo)”轉(zhuǎn)
2026-03-04 11:38
-
把脈消費(fèi)趨勢,賦能產(chǎn)業(yè)升級:商務(wù)部副部長
2026-03-04 11:02





廣告


























































