1. 程式人生 > >無人駕駛汽車系統入門(一)——卡爾曼濾波與目標追蹤

無人駕駛汽車系統入門(一)——卡爾曼濾波與目標追蹤

前言:隨著深度學習近幾年來的突破性進展,無人駕駛汽車也在這些年開始不斷向商用化推進。很顯然,無人駕駛汽車已經不是遙不可及的“未來技術”了,未來10年必將成為一個巨大的市場。本系列部落格將圍繞當前使用的最先進的無人駕駛汽車相關技術,一步一步地帶領大家學習並且掌握無人駕駛系統的每一個模組的理論基礎和實現細節。由於無人駕駛汽車系統構成及其複雜,本系列部落格僅討論軟體部分的內容,關於汽車,感測器和底層的硬體,不是我們關注的重點。至於連載的順序和技術路線,本人其實是同時開始的,先完成哪一節就先發那一節。

我一直反感國內的一些中文水書,這些書的產生的根源就是國內浮躁的技術氛圍,我希望能夠系統詳細的以中文總結無人駕駛汽車的整個技術基礎,本系列部落格將詳細展開無人汽車的基礎理論和和這些理論的實現的小例子,編寫不易,轉載請附來源:

http://blog.csdn.net/AdamShan/article/details/78248421

首先我將帶大家瞭解無人駕駛汽車系統感知模組的重要技術——卡爾曼濾波,卡爾曼濾波部分我打算分三節(三次部落格的內容):

  • 卡爾曼濾波與行人狀態估計
  • 擴充套件卡爾曼濾波(EKF)與感測器融合
  • 處理模型,無損卡爾曼濾波(UKF)與車輛狀態軌跡

本節為卡爾曼濾波,主要講解卡爾曼濾波的具體推導,卡爾曼濾波在行人狀態估計中的一個小例子。

為什麼要學卡爾曼濾波?

卡爾曼濾波以及其擴充套件演算法能夠應用於目標狀態估計,如果這個目標是行人,那麼就是行人狀態估計(或者說行人追蹤),如果這個目標是自身,那麼就是車輛自身的追蹤(結合一些地圖的先驗,GPS等資料的話就是自身的定位)。在很多的無人駕駛汽車專案中,都能找到卡爾曼濾波的擴充套件演算法的身影(比如說EKF,UKF等等)。本節我們從最簡單的卡爾曼濾波出發,完整的理解一遍卡爾曼濾波的推導過程,並實現一個簡單的狀態估計Python程式。

卡爾曼濾波是什麼?

我們通常要對一些事物的狀態去做估計,為什麼要做估計呢?因為我們通常無法精確的知道物體當前的狀態。為了估計一個事物的狀態,我們往往會去測量它,但是我們不能完全相信我們的測量,因為我們的測量是不精準的,它往往會存在一定的噪聲,這個時候我們就要去估計我們的狀態。卡爾曼濾波就是一種結合預測(先驗分佈)和測量更新(似然)的狀態估計演算法。

一些概率論的知識基礎

下面是一些概率論的基礎知識,如果之前有這方面的知識儲備那當然是最好的,很有利於我們理解整個部落格內容,如果沒有這方面的基礎而且也看不懂下面的內容也沒關係,我會以一個相對直觀的方式來展現整個理論部分。

  • 先驗概率 P
    (X)
    P(X)
    :已知結果區推測固有性質的可能性

貝葉斯公式:

P(A|B)=P(A)×P(B|A)P(B)P(A|B)=P(A)×P(B|A)P(B)

後驗分佈正比於先驗分佈乘以似然。

卡爾曼濾波完整推導

一個簡單的例子

若干年後,我們的可回收火箭要降落到地球,我們比較關心的狀態就是我們的飛行器的高度了,飛行器的高度就是我們想要估計的狀態,我們會通過一些感測器去測量我們當前的高度資訊,比如說使用氣壓計。假如我們每一次測量,當前高度都變成上一次測量的 95%95% 我們可以使用遞迴來表示這樣的公式——為了計算我們當前的高度,我們必須知道我們上一個測量的高度,以此遞推,我們就會推到我們的飛行器的初始高度。

但是,由於我們的測量往往來自於一些感測器(比如說GPS,氣壓計),所以測量的結果總是帶有噪聲的,這個噪聲是有感測器本身引起的,那麼我們的表示式就變成了:

Measurement(t)=Height(t)+Noise(t)Measurement(t)=Height(t)+Noise(t)

思考一下,在這裡我們用一個簡單的比例(常數)來描述“可回收火箭”的運動規律,會存在什麼問題?

很顯然,現實中的運動不會像我們這個簡單的處理模型一樣高度按比例縮小。在這裡為了簡化,我們先假設我們的模型挺好的,能夠大致描述出這顆“神奇火箭”的運動規律,只是偶爾會存在一定的偏差(比如所空氣湍流的影響),那麼我們在計算xkxk 為了簡化,後面的分析我們會先忽略處理噪聲,但是我們在感測器融合的部分會將處理噪聲重新考慮進來。

狀態估計

因為我們是要估計飛行器的狀態(高度),所以我們把測量的公式變換成:

xk=zkvkxk=zk−vk,則表示對兩者的權重分配。

計算卡爾曼增益

那麼如何計算卡爾曼增益呢?我們使用一種間接的方法,我們雖然不知道測量噪聲 vkvk 呢?

那麼假設前一次的預測誤差 pk1=0pk−1=0 是個很小的數值,所以增益為1,所以完全接受這一次的測量作為我們的估計(因為上一次的的預測誤差太大了,為1,所以一旦拿到了新的測量,如獲至寶,就乾脆把不準確的上次的估計捨棄掉了)

對於下面的公式的分析是一樣的,我們考慮極端的例子,當增益為 00

預測和更新

那麼現在我們有關於當前的火箭高度狀態的兩個公式了,它們分別是:

xk=axk1xk=axk−1。 結合這寫我們就可以得到卡爾曼濾波預測和更新過程了:

預測

x^k=ax^k1+bukx^k=ax^k−1+buk

使用線性代數的方法來表示預測和更新

預測

x^k=Ax^k1+Bukx^k=Ax^k−1+Buk

至此,卡爾曼濾波的完整推導就結束了。下面,我們來看看卡爾曼濾波在無人汽車的感知模組的應用。

卡爾曼濾波演算法為什麼會叫濾波演算法? 以一維卡爾曼濾波為例,如果我們單純的相信測量的訊號,那麼這個訊號是包含噪聲的,是很毛糙的,但是當我們執行卡爾曼濾波演算法去做估計,我們估計的訊號會很光滑,看起來似乎濾掉了噪聲的影響,所以稱之為濾波演算法。實際上,卡爾曼濾波不僅僅過濾掉了測量訊號的噪聲,它同時也結合了以往的估計,卡爾曼濾波線上性問題中被證明是最優估計。

卡爾曼濾波在無人駕駛汽車感知模組的應用

無人車感知模組的感測器

無人駕駛汽車要安全的在道路上行駛,需要“耳聽六路,眼觀八方”。那麼無人車的耳朵和眼睛是什麼呢?那就是安裝在無人車上的各種各樣的感測器了。無人車上的感測器能夠多達幾十個,而且是不同種類的,比如:

  • 立體攝像機
  • 交通標誌攝像機
  • 雷達(RADAR)
  • 鐳射雷達(LIDAR)

立體攝像機往往用於獲取影象和距離資訊;交通標誌攝像機用於交通標誌的識別;雷達一般安裝在車輛的前保險桿裡面,用於測量相對於車輛座標系下的物體,可以用來定位,測距,測速等等,容易受強反射物體的干擾,通常不用於靜止物體的檢測;鐳射雷達往往安裝在車頂,使用紅外鐳射束來獲得物體的距離和位置,但是空間解析度高,但是笨重,容易被天氣影響。

由此可知,各種感測器都有其優點和缺點,在實際的無人駕駛汽車裡,我們往往結合多種感測器的資料去感知我們的車輛周邊的環境。這種結合各種感測器的測量資料的過程我們稱之為感測器融合(Sensor Fusion)。本系列部落格後面的章節我將詳細給大家介紹基於擴充套件卡爾曼濾波和無損卡爾曼濾波在感測器融合中的應用。在本節中,我們主要考慮卡爾曼濾波基於單一的感測器資料來估算行人位置的方法。

基於卡爾曼濾波的行人位置估算

卡爾曼濾波雖然簡單,確實無人駕駛汽車的技術樹中非常重要的一部分,當然,在真實的無人駕駛汽車專案中使用到的技術是相對更加複雜的,但是其基本原理仍然是本部落格介紹的這些內容。在無人駕駛中,卡爾曼濾波主要可以用於一些狀態的估計,主要應用於行人,自行車以及其他汽車的狀態估計。下面,我們以行人的狀態估計為例展開。

當我們要估計一個行人的狀態時,首先就是要建立起腰估計的狀態的表示。這裡,行人的狀態大致可以表示為x=(p,v)x=(p,v) 則是行人此時的速度。我們用一個向量來表示一個狀態:

x=(px,py,vx,vy)Tx=(px,py,vx,vy)T

在確定了我們要估計的狀態以後,我們需要確定一個處理模型,如前文所說,處理模型用於預測階段來產生一個對當前估計的先驗。在本文中,我們先以一個最簡單的處理模型來描述行人的運動——恆定速度模型

xk+1=Axk+νxk+1=Axk+ν

即: 這裡寫圖片描述

之所以稱之為恆定速度模型,是因為我們將上面這個行列式展開可以得到:

pk+1x=p