1. 程式人生 > 實用技巧 >3D鐳射SLAM的迴環檢測方法

3D鐳射SLAM的迴環檢測方法

一、Scan-to-Scan

1、格地圖或者說是概率佔據柵格地圖初步

在Matlab中建立一個1000*1000大小的二維陣列,如果陣列中每個元素取值為0到255的整數(灰度圖),再把這個陣列用Matlab中的圖片轉換函式把陣列轉化為BMP圖片(也可以其它你自己覺得合適的格式),這樣我們就手動構建了一張地圖了。直接用Windows自帶的畫圖軟體開啟,可以在圖上自己手動修改,這樣就是手動地圖修改,儲存後在用Matlab讀取這張BMP圖片,轉換為1000*1000的二維陣列,這樣就是地圖的讀取。說明:你也可以生成500*500,或者10000*10000大小,根據實際需求設定。圖片中每個畫素點代表一個單位距離,假如一個畫素點代表0.05m,那麼1000*1000大小的圖片代表50m*50m大小的地圖,以此類推,一個畫素點也可以代表1m單位距離(距離解析度小了)或者0.01m單位距離(距離解析度大了)。在灰度圖中0值為黑色,255為白色,可以假定0值為障礙物和255值為空(也可以反過來,隨自己喜好),其它值代表這個位置是障礙物的概率或者是空的概率的大小,比如128代表既不是空也不是障礙物或者說兩者的情形概率相等,比如200代表是空的概率大點,比如50代表是障礙物的概率大點。

下圖為全是0值的1000*1000畫素大小的地圖,這裡假定0值為空。

下圖為自己隨意畫的幾條線代表障礙物,假定255白色為障礙物

下兩幅圖為實際利用鐳射雷達SLAM方法生成一個大的房間的地圖,兩幅地圖本質一樣,只是表達方式取值不一樣,第二幅只顯示了障礙物和空地(沒探索到的地方也表示空了)

對柵格地圖的進一步說明

柵格地圖理論可以從概率機器人這本書中或者網上很方便的搜尋到,我這邊在仔細說明一下,以我自己實際應用的方式班門弄斧。

二、Scan to map

1、Scan to map ,即鐳射雷達掃描資料直接與地圖進行匹配,得到實際位置座標[x,y,theta]。這種方式一邊計算位置,一邊把新掃描到的資料及時加入到先前地圖中。我這邊主要參考論文:A Flexible and Scalable SLAM System with Full 3D Motion Estimation。這裡我關心的只是二維鐳射雷達資料定位和建圖,文獻中的3D姿態估計等不涉及,只關心二維的。其實這篇文獻就是Hector的理論基礎。Google的Cartographer中前半部分submap建立就是用的這個方法,唯一區別就是原文獻的雙線性插值變成了Google的雙三次插值,這麼做應該是讓資料更加smooth,插值方式可以隨自己喜好,也可以選用其它數值計算相關書籍中的方法,這個主要是為了讓數值計算更加穩定,避免出現計算崩潰,資料越smooth,計算可靠性越好。本篇講訴比較簡短,因為實現太簡單了,程式設計很容易實現,這個前提是你要掌握非線性優化理論相關知識,因為文獻中用了高斯牛頓迭代法求解。這裡又出現了優化迭代方法,我在第二篇中也提出了一種高斯牛頓法簡化原文獻的計算思路。

2、第二篇中的Scan to scan 主要用於精確的相對位置求解,那麼scan to map用來做什麼呢。因為Scan to map 對於地圖表示要求較高,一旦地圖建錯,後面將越來越錯,就算地圖不建錯,它也是有誤差在的。但是假如一張精確的地圖已知,我們可以用Scan to map 給個大致定位,這個才是主要目標。而且它的定位計算量較小,因此在車速較高時也是可以達到實時的。下圖就是我在十幾米長寬的房間實現的一張小地圖,一邊Scan to map,一邊把新的鐳射雷達資料加入地圖中。地圖50m*50m。

在SLAM中相關方法沒有太大的區別,而且Scan to map 在slam中不是特別有主導地位,比如說用來建圖還是有誤差,後端還是主要圖優化來建圖;它主要還是在前端作用,用來即時定位,這就是它的存在吧,因為計算量還是比較小的相比Scan to Scan。以後開始我要著重講訴圖優化原理方法,把圖優化理論用到鐳射雷達slam中可以說是鐳射雷達slam到了成熟期,理論上基本已經可以不需要再去研究了,最多隻是計算效率怎麼提升下,因為它把地圖誤差消除處理的非常好,迴環誤差或者閉環誤差在圖優化理論下根本無處可躲。現在主流slam都轉向了視覺,更是由於神經網路,深度學習等等這幾年的再一次火熱,視覺slam成為了最新研究熱點,我目前不會講訴相關視覺slam,主要還是以鐳射雷達為主

​​​​​​​