天天看點

無人駕駛定位地圖排程

      我們知道,目前對于無人駕駛的定位而言,還需要将線上的地圖組織成一定的形式,然後和離線地圖進行比對,确定相對于目前初始位置的更加精确的相對位置。拿3D雷射作為傳感器建圖來說,一種方式是用2D - 2D的比對。

  • 2D - 2D的比對

可以将slam後的雷射點雲處理成二維的圖檔格式,圖檔像素值大小對應目前grid内的強度值。然後将線上的3D點雲處理成圖檔格式,可能會遇到線上點雲過于稀疏導緻線上生成的2D圖檔資料過于稀疏,這時可以将連續幾幀的點雲合并,一起來生成目前幀的2D圖檔。然後用目前幀的pose調用離線的2D地圖,将線上地圖和離線地圖比對。可以采用SSD或者NCC的方法,求出線上相對于離線的相對位置,進而給出由雷射點雲比對得出的一個定位量,将來用于參與計算多傳感器的融合定位。

  • 3D - 3D的比對

這裡以NDT比對為例。首先還是slam。這裡的地圖可以有兩種形式,一種是直接儲存離線相對應位置的3D點雲,然後利用線上的3D點雲和離線的3D點雲進行對齊,可以直接利用PCL的庫函數 pcl::NormalDistributionsTransform<pcl::PointXYZ, pcl::PointXYZ>  進行對齊操作。

還有一種方式是,提前計算好離線點雲的NDT資訊,将其按照三維voxel存儲起來作為離線地圖。然後線上做NDT比對時候,隻需要計算線上的NDT就行了,這樣可以加快計算。當然,我們得實作自己的NDT比對計算了。

      不管怎麼說,随着場景的增大,我們不可能一次性把幾百公裡的地圖都加載到記憶體中。而更可行的做法是将地圖根據實際實體尺寸分割成塊,例如我在做定位地圖時将地圖分成200 m * 200m 一塊(暫時不考慮立交橋),然後用經緯度作為每塊地圖的絕對索引。在程式運作時,車跑到哪個位置,就加載那個位置附近的地圖。但是這就有一個問題,由于地圖都是二進制檔案存放在硬碟裡,一次性加載多塊地圖會很耗時,而對于定位這種實時運算來說,不能實時及時做的再精确也沒有任何用處。那麼我們就想到一個辦法就是,用另一個或者多個線程進行地圖的預加載,加載之後可能會用到的地圖。還有一個問題就是,加載地圖的標明。下面就來說地圖的二級排程。

無人駕駛定位地圖排程
無人駕駛定位地圖排程

圖中每個方塊代表一塊地圖。其中預加載地圖的個數,應該根據最大車速調整。

加載地圖分為兩步,

  1. 第一步為加載目前pose所在的地圖和其周圍的地圖到cache1,這個俗稱九宮格地圖;
  2. 第二步為預加載下一次可能會用到的地圖到cache2。

這裡的兩個cache是典型的 LRU(Least recently used,最近最少使用)類型的。如果查找目前地圖塊在cache内,則應該把該快提到cache的最前段。如果cache大于一定的size,則自動删除最後的不經常使用的地圖塊。

下面給出流程圖   

無人駕駛定位地圖排程

上圖為實時加載離線地圖并與線上地圖比對,輸出相對位姿的流程圖。                                                                               

無人駕駛定位地圖排程

上面這張圖給出的就是二級cache排程的邏輯關系。多線程從硬碟加載,可以提前設定一個線程池。

繼續閱讀