開發者說 | 手把手教你寫卡爾曼濾波器

2021-01-14 Apollo開發者社區




無人駕駛技術入門軟體篇已經介紹了傳感器數據的解析和傳感器信息的坐標轉換。


這兩步完成後,我們就會獲得某一時刻,自車坐標系下的各種傳感器數據


這些數據包括障礙物的位置、速度;


車道線的曲線方程、車道線的類型和有效長度;


自車的GPS坐標等等。


這些信號的組合,表示了無人車當前時刻的環境信息。


由於傳感器本身的特性,任何測量結果都是有誤差的。


以障礙物檢測為例,如果直接使用傳感器的測量結果,在車輛顛簸時,可能會造成障礙物測量結果的突變,這對無人車的感知來說是不可接受的。


因此需要在傳感器測量結果的基礎上,進行跟蹤,以此來保證障礙物的位置、速度等信息不會發生突變。


最經典的跟蹤算法莫過於卡爾曼在1960年提出的卡爾曼濾波器


在無人車領域,卡爾曼濾波器除了應用於障礙物跟蹤外,也在車道線跟蹤、障礙物預測以及定位等領域大展身手。




在介紹卡爾曼濾波器數學原理之前,先從感性上看一下它的工作原理。


簡單來講,卡爾曼濾波器就是根據上一時刻的狀態,預測當前時刻的狀態,將預測的狀態與當前時刻的測量值進行加權,加權後的結果才認為是當前的實際狀態,而不是僅僅聽信當前的測量值。

假設有個小車在道路上向右側勻速運動,我們在左側安裝了一個測量小車距離和速度傳感器,傳感器每1秒測一次小車的位置s和速度v,如下圖所示。



我們用向量xt來表示當前小車的狀態,該向量也是最終的輸出結果,被稱作狀態向量(state vector):



由於測量誤差的存在,傳感器無法直接獲取小車位置的真值,只能獲取在真值附近的一個近似值,可以假設測量值在真值附近服從高斯分布。


如下圖所示,測量值分布在紅色區域的左側或右側,真值則在紅色區域的波峰處。



由於是第一次測量,沒有小車的歷史信息,我們認為小車在1秒時的狀態x與測量值z相等,表示如下:



公式中的1表示第1秒。

預測是卡爾曼濾波器中很重要的一步,這一步相當於使用歷史信息對未來的位置進行推測。


根據第1秒小車的位置和速度,我們可以推測第2秒時,小車所在的位置應該如下圖所示。


會發現,圖中紅色區域的範圍變大了,這是因為預測時加入了速度估計的噪聲,是一個放大不確定性的過程。



根據小車第一秒的狀態進行預測,得到預測的狀態xpre:



其中,Pre是Prediction的簡稱;時間間隔為1秒,所以預測位置為距離+速度*1;由於小車做的是勻速運動,因此速度保持不變。

在第2秒時,傳感器對小車的位置做了一次觀測,我們認為小車在第2秒時觀測值為z2,用向量表示第2秒時的觀測結果為:



很顯然,第二次觀測的結果也是存在誤差的,我們將預測的小車位置與實際觀測到的小車位置放到一個圖上,即可看到:



圖中紅色區域為預測的小車位置,藍色區域為第2秒的觀測結果。


很顯然,這兩個結果都在真值附近。為了得到儘可能接近真值的結果,我們將這兩個區域的結果進行加權,取加權後的值作為第二秒的狀態向量。


為了方便理解,可以將第2秒的狀態向量寫成:



其中,w1為預測結果的權值,w2為觀測結果的權值。


兩個權值的計算是根據預測結果和觀測結果的不確定性來的,這個不確定性就是高斯分布中的方差的大小,方差越大,波形分布越廣,不確定性越高,這樣一來給的權值就會越低。


加權後的狀態向量的分布,可以用下圖中綠色區域表示:



你會發現綠色區域的方差比紅色區域和藍色區域的小。


這是因為進行加權運算時,需要將兩個高斯分布進行乘法運算,得到的新的高斯分布的方差比兩個做乘法的高斯分布都小。


兩個不那麼確定的分布,最終得到了一個相對確定的分布,這是卡爾曼濾波的一直被推崇的原因。

第1秒的初始化以及第2秒的預測、觀測,實現卡爾曼濾波的一個周期。


同樣的,我們根據第2秒的狀態向量做第3秒的預測,再與第3秒的觀測結果進行加權,就得到了第3秒的狀態向量;


再根據第3秒的狀態向量做第4秒的預測,再與第4秒的觀測結果進行加權,就得到了第4秒的狀態向量。以此往復,就實現了一個真正意義上的卡爾曼濾波器。


以上就是卡爾曼濾波器的感性分析過程,下面我們回歸理性,談談如何將以上過程寫成代碼。

前文用了一個簡答的例子對卡爾曼濾波器的整個流程進行了介紹,下面我們根據卡爾曼濾波器的原理,編寫代碼,跟蹤連續的雷射雷達點。


在這裡就要祭出卡爾曼老先生給我們留下的寶貴財富了,下面7個公式就是卡爾曼濾波器的理性描述,使用下面7個公式,就能夠實現一個完整的卡爾曼濾波器。


現在看不懂這7個公式沒關係,繼續往下看,我會一個一個做解釋。



寫代碼(C++)的過程,實際上就是結合上面的公式,一步步完成初始化、預測、觀測的過程。


由於公式中涉及大量的矩陣轉置和求逆運算,我們使用開源的矩陣運算庫——Eigen庫。

在Initialization這一步,需要將各個變量初始化,對於不同的運動模型,其狀態向量肯定是不一樣的,


比如前文小車的例子,只需要一個距離s和一個速度v就可以表示小車的狀態;


再比如在一個2維空間中的點,需要x方向上的距離和速度以及y方向上的距離和速度才能表示,這樣的狀態方程就有4個變量。


因此我們使用Eigen庫中非定長的數據結構,下圖中的VerctorXd表示X維的列矩陣,其中的元素數據類型為double。



在這裡,我們新建了一個KalmanFilter類,其中定義了一個叫做x_的變量,表示這個卡爾曼濾波器的狀態向量。

完成初始化後,我們開始寫Prediction部分的代碼。首先是公式



這裡的x為狀態向量,通過左乘一個矩陣F,再加上外部的影響u,得到預測的狀態向量x'。這裡的F成為狀態轉移矩陣(state transistion matrix)。


以2維的勻速運動為例,這裡的x為



對於勻速運動模型,根據中學物理課本中的公式s1 = s0 + vt,經過時間△t後的預測狀態向量應該是



由於假設當前運動為勻速運動,加速度為0,加速度不會對預測造成影響,即



如果換成加速或減速運動模型,就可以引入加速度a_x和a_y,根據s1 = s0 + vt + at^2/2這裡的u會變成:



作為入門課程,這裡不討論太複雜的模型,因此公式



最終將寫成



由於每次做預測時,△t的大小不固定,因此我們專門寫一個函數SetF()



再看預測模塊的第二個公式



該公式中P表示系統的不確定程度,這個不確定程度,在卡爾曼濾波器初始化時會很大,隨著越來越多的數據注入濾波器中,不確定程度會變小,P的專業術語叫狀態協方差矩陣(state covariance matrix);


這裡的Q表示過程噪聲(process covariance matrix),即無法用x'=Fx+u表示的噪聲,比如車輛運動時突然到了上坡,這個影響是無法用之前的狀態轉移估計的。


以雷射雷達為例。雷射雷達只能測量點的位置,無法測量點的速度,因此對於雷射雷達的協方差矩陣來說,對於位置信息,其測量位置較準,不確定度較低;


對於速度信息,不確定度較高。因此可以認為這裡的P為:



由於Q對整個系統存在影響,但又不能太確定對系統的影響有多大。工程上,我們一般將Q設置為單位矩陣參與運算,即



根據以上內容和公式



我們就可以寫出預測模塊的代碼了



實際編程時x'及P'不需要申請新的內存去存儲,使用原有的x和P代替即可。

觀測的第一個公式是



這個公式計算的是實際觀測到的測量值z與預測值x'之間差值y。


不同傳感器的測量值一般不同,比如雷射雷達測量的位置信號為x方向和y方向上的距離,毫米波雷達測量的是位置和角度信息。


因此需要將狀態向量左乘一個矩陣H,才能與測量值進行相應的運算,這個H被稱為測量矩陣(Measurement Matrix)。


雷射雷達的測量值為



其中xm和ym分別表示x方向上的測量(measurement)值。


由於x'是一個4*1的列向量,如果要與一個2*1的列向量z進行減運算,需要左乘一個2*4的矩陣才行,因此整個公式最終要寫成:



即,對於雷射雷達來說,這裡的測量矩陣H為



求得y值後,對y值乘以一個加權量,再加到原來的預測量上去,就可以得到一個既考慮了測量值,又考慮了預測模型的位置的狀態向量了。


那麼y的這個權值該如何取呢?


再看接下裡的兩個公式



這兩個公式求的是卡爾曼濾波器中一個很重要的量——卡爾曼增益K(Kalman Gain),用人話講就是求y值的權值。


第一個公式中的R是測量噪聲矩陣(measurement covariance matrix),這個表示的是測量值與真值之間的差值。一般情況下,傳感器的廠家會提供該值。


S只是為了簡化公式,寫的一個臨時變量,不要太在意。


看最後兩個公式



這兩個公式,實際上完成了卡爾曼濾波器的閉環,第一個公式是完成了當前狀態向量x的更新,不僅考慮了上一時刻的預測值,也考慮了測量值,和整個系統的噪聲,


第二個公式根據卡爾曼增益,更新了系統的不確定度P,用於下一個周期的運算,該公式中的I為與狀態向量同維度的單位矩陣。


將以上五個公式寫成代碼如下:



至此,一個卡爾曼濾波器的雛形就出來了。



包含的變量有:



以雷射雷達數據為例,使用以上濾波器,代碼如下:



其中GetLidarData函數除了獲取點的位置信息m_x和m_y外,還獲取了當前時刻的時間戳,用於計算前後兩幀的時間差delta_t。


以上就是卡爾曼濾波器對於勻速運動物體跟蹤的例子。


在這個基礎上,業內還有擴展卡爾曼濾波器和無跡卡爾曼濾波器,它們與經典卡爾曼濾波器的最大區別是狀態轉移矩陣F和測量矩陣H的不同,剩下的跟蹤過程依然需要使用前面介紹的7個公式。


只要你能夠寫出某個模型的F、P、Q、H、R矩陣,任何狀態跟蹤的問題都將迎刃而解。




以上就是卡爾曼濾波器從感性分析到理性分析的過程。


你會發現真正進行工程開發時,除了具備基本的寫代碼能力外,利用大學所學的線性代數知識推導公式的能力也是必不可少的。





龍舌蘭日出:


請問,雷射雷達只能測量距離而不能測量速度,那麼速度的測量值該怎麼獲取呢?距離差除以時間差嗎?


陳光: 


速度沒有測量值,觀測矩陣裡面只有位置。速度是根據狀態矩陣計算得到的。






自Apollo平臺開放已來,我們收到了大量開發者的諮詢和反饋,越來越多開發者基於Apollo擦出更多的火花,並願意將自己的成果貢獻出來。這充分體現了Apollo『貢獻越多,獲得越多』的開源精神。為此我們開設了『開發者說』板塊,希望開發者們能夠踴躍投稿,更好地為廣大自動駕駛開發者營造一個共享交流的平臺!


* 以上內容為開發者原創,不代表百度官方言論。

  本文來源為『知乎專欄-無人駕駛乾貨鋪』:《無人駕駛技術入門(十三)| 手把手教你寫卡爾曼濾波器》

  已獲開發者授權,原文地址請戳閱讀原文。






相關焦點

  • 使用卡爾曼濾波器和路標實現機器人定位
    Robby(紅色大圓圈)和2個地標(紅色小圓圈) 這個文章的目的是教你用地標檢測和擴展卡爾曼濾波器一步一步實現機器人定位。這就是卡爾曼濾波器發揮作用的場合。 卡爾曼濾波器允許我們結合當前狀態的不確定和它的傳感器測量的不確定來理想地降低機器人的總體不確定程度。這兩類不確定通常用高斯概率分布或正態分布來描述。高斯分布有2個參數:均值和方差。均值表示最高概率的值,方差表示我們認為這個均值有多大的不確定性。 卡爾曼濾波器運行2個步驟。在預測步驟,卡爾曼濾波器以當前狀態變量值生成預測和不確定度。
  • 為什麼叫「卡爾曼」,卡爾曼濾波器算法介紹
    2、卡爾曼濾波器的介紹(Introduction to the Kalman Filter)  為了可以更加容易的理解卡爾曼濾波器,這裡會應用形象的描述方法來講解,而不是像大多數參考書那樣羅列一大堆的數學公式和數學符號。但是,他的5條公式是其核心內容。結合現代的計算機,其實卡爾曼的程序相當的簡單,只要你理解了他的那5條公式。
  • 為什麼叫「卡爾曼」?卡爾曼濾波器算法介紹
    我們現在要學習的卡爾曼濾波器,正是源於他的博士論文和1960年發表的論文《A New Approach to Linear Filtering and Prediction Problems》(線性濾波與預測問題的新方法)。簡單來說,卡爾曼濾波器是一個「最優化自回歸數據處理算法」。
  • 卡爾曼濾波器的工作原理(一)
    可以說,卡爾曼濾波器是非常神奇的,因為它是一個在不確定性的情況下組合信息的通用且強大的工具。有時它提取準確信息的能力幾乎是驚人的。
  • 【強基固本】卡爾曼濾波器
    轉載來源:https://longaspire.github.io/blog/卡爾曼濾波/Kalman Filter (KF) 是一個高效的遞歸濾波器,它可以實現從一系列的噪聲觀測中,估計動態系統的狀態。01卡爾曼濾波器以它的發明者Rudolf. Emil. Kalman先生(2016年去世,向這位傳奇的科學家致敬)而命名。
  • 面向軟體工程師的卡爾曼濾波器
    與我的朋友交談時,我經常聽到:「哦,卡爾曼(Kalman)濾波器……我經常學它,然後我什麼都忘了」。好吧,考慮到卡爾曼濾波器(KF)是世界上應用最廣泛的算法之一(如果環顧四周,你80%的技術可能已經在內部運行某種KF),讓我們嘗試將其弄清楚。
  • 視頻教程 | 理解卡爾曼濾波器(英語中字)
    卡爾曼濾波器是一種優化估算算法,用於在不確定和間接測量的情況下估算系統狀態。本視頻教程由7個小節組成,系統介紹了卡爾曼濾波器,言簡意賅,適合入門。各個小節的主要內容為:第一節:通過幾個案例了解使用卡爾曼濾波器的常見場景。了解卡爾曼濾波器背後的工作原理。第二節:介紹了解狀態觀測器的工作原理,並解釋其背後的數學原理。在無法直接測量時,使用狀態觀測器估算系統的內部狀態。
  • 擴展卡爾曼濾波器在同步電機無速度矢量控制系統中的應用
    因為它其會利用反饋對估計的狀態變量進行修正,使估計的誤差方差減小,所以卡爾曼濾波器是一種最優估計算法。卡爾曼濾波器是一種線性估計,即要求估計的狀態和觀測序列與狀態是線性關係。卡爾曼濾波器方程為:3 擴展卡爾曼濾波器同步電機矢量控制中的應用  卡爾曼濾波器只能對離散線性模型進行狀態估計
  • 卡爾曼與卡爾曼濾波
    斯坦利·施密特(Stanley Schmidt)首次實現了卡爾曼濾波器。卡爾曼在NASA埃姆斯研究中心訪問時,發現他的方法對於解決阿波羅計劃的軌道預測很有用,後來阿波羅飛船的導航電腦使用了這種濾波器。 關於這種濾波器的論文由Swerling (1958), Kalman (1960)與 Kalman and Bucy (1961)發表。
  • 一代宗師卡爾曼
    你想想,一個系統的所有狀態都被牢牢地瞄住,所有狀態都乖乖地聽從調遣,那是何等的專業?臺商的大奶們的最高境界呀。卡爾曼濾波器基本原理卡爾曼濾波器基本原理圖儘管學控制的人都要學現代控制理論,但大多數人記得卡爾曼還是因為那個卡爾曼濾波器(Kalman Filter),這種濾波方法以它的發明者魯道夫·卡爾曼的名字命名
  • 基於卡爾曼濾波器和CAN智能從站技術實現開關磁阻電機調速系統設計
    卡爾曼濾算法是一種遞推算法,對於系統存在過程及測量噪聲,狀態變量受到汙染,可以利用卡爾曼濾波技術進行處理。本文將卡爾曼濾波器與傳統的PID控制相結合,使SRD控制效果得到明顯改善。 1、系統設計方案 基於CAN總線的開關磁阻電機遠程控制系統如圖1所示。系統主要包括PC(上位機)、RS-485與CAN結合的通信網絡、CAN智能節點與開關組電機四大部分。
  • 卡爾曼濾波的原理
    2.卡爾曼濾波器的介紹(Introduction to the Kalman Filter)為了可以更加容易的理解卡爾曼濾波器,這裡會應用形象的描述方法來講解,而不是像大多數參考書那樣羅列一大堆的數學公式和數學符號。但是,他的5條公式是其核心內容。結合現代的計算機,其實卡爾曼的程序相當的簡單,只要你理解了他的那5條公式。
  • 卡爾曼濾波應用於自動駕駛
    自主車輛的組成部分卡爾曼濾波器使用的數據來自LIDAR和RADAR 。所以現在只關注這兩個方面。為何使用卡爾曼濾波器?我們可以使用卡爾曼濾波器進行有根據的猜測,在我們對某些動態系統有不確定信息的任何地方,系統將要做什麼。在自主車輛的情況下,卡爾曼濾波器可用於根據我們的車輛接收的數據預測我們的自動駕駛車輛前方的車輛將採取的下一組動作。這是一個使用兩步預測和更新的迭代過程。
  • 卡爾曼濾波是怎麼回事?
    維納濾波就是一個典型的降噪濾波器。卡爾曼濾波Kalman Filter 算法,是一種遞推預測濾波算法。Kalman Filter 提供了一種高效可計算的方法來估計過程的狀態,並使估計均方誤差最小。卡爾曼濾波器應用廣泛且功能強大:它可以估計信號的過去和當前狀態,甚至能估計將來的狀態,即使並不知道模型的確切性質。
  • 深入淺出講解卡爾曼濾波(附Matlab程序)
    為了給大家能講解清楚卡爾曼濾波器,我們找到兩篇關於卡爾曼濾波器非常好的文章:第一篇來源於CSDN博客,為大家詳細的講解了卡爾曼的原理及應用,算作「深入」第二篇來源於知乎,用一個簡單的例子,通俗易懂的講解了卡爾曼濾波,算作「淺出」此外,關於卡爾曼濾波的仿真程序在EETOP論壇裡有很多,大家可以登錄論壇後搜索「卡爾曼」來查找。
  • 透徹理解擴展卡爾曼濾波
    卡爾曼濾波是貝葉斯濾波的一種特例,是在線性濾波的前提下,以最小均方誤差為最佳準則的。估計線性高斯模型,是對線性模型和高斯分布的優化方法。邊緣分布和條件分布的模型:卡爾曼濾波器的主要參數卡爾曼濾波器假設x(paths), z(observations)都為線性高斯的:主要參數:A是在沒有命令的情況下,由於環境因素造成的機器人的位置移動。
  • 卡爾曼濾波器及多傳感狀態融合估計算法
    1 卡爾曼濾波器  多傳感信息融合的主要任務之一就是利用多傳感器信息進行目標的狀態估計。目前, 進行狀態估計的方法很多,Kalman 濾波器是一種常用方法。Kalman 濾波器在機動目標跟蹤中具有良好的性能, 它是最佳估計並能夠進行遞推計算, 即它只需要當前的一個測量值和前一個採樣周期的預測值就能進行狀態估計。
  • SketchAR用AR技術「手把手」教你成為優秀的畫家
    文章相關引用及參考:映維網這個工具旨在令你成為一名更優秀的藝術家(無論你的水平如何)(映維網 2018年03月03日)某些人天生就是畫家,但如果你像我一樣完全缺乏畫畫的天賦,不妨嘗試一下這款基於這個工具旨在令你成為一名更優秀的藝術家(無論你的水平如何)。應用的原理相當簡單:在紙片,牆壁或熟睡的朋友臉上畫上幾個加號,然後把智慧型手機攝像頭對準它們。然後,你可以循環逐點學習,系統將指導你如何將自由空間與繪圖的下一層相關聯。這非常直觀,覆蓋層讓人感覺你是在素描圖紙上創作,當然,工具是增強現實。
  • 車載毫米波雷達之大話卡爾曼濾波
    所以,卡爾曼濾波在毫米波雷達的應用上,就扮演著至關重要的角色。卡爾曼&卡爾曼濾波什麼是卡爾曼濾波?卡爾曼濾波和傅立葉變換、泰勒級數一樣,都是以其發明人命名。稍微不同的是,卡爾曼是個現代人!卡爾曼是匈牙利數學家,1930年出生於匈牙利首都布達佩斯。
  • 手把手教你按照孩子體重換算退燒藥的用量
    手把手教你按照孩子體重換算退燒藥的用量 2020-12-27 08:00 來源:澎湃新聞·澎湃號·湃客