基于LOAM框架的激光SLAM開源程序匯總
1 前言
LOAM, 即Lidar Odometry and Mapping,是 Ji Zhang 博士于2014年提出的使用激光雷達(dá)完成定位與三維建圖的算法。其算法流程如下:
LOAM算法中主要包含兩個模塊,一個是Lidar Odometry:基于輸入點云提取出角點與平面點作為特征點進(jìn)行關(guān)聯(lián)匹配,計算出兩次掃描之間的位姿變換,計算頻率為10HZ;
為了減緩單幀點云位姿變換產(chǎn)生的累計誤差,設(shè)計了Lidar Mapping 的部分。即將與前一幀配準(zhǔn)后的點云與生成的地圖進(jìn)行二次配準(zhǔn),消除漂移。
由于作者編寫的LOAM代碼已經(jīng)閉源,目前網(wǎng)上存在著一些代碼的復(fù)現(xiàn)版本,本文對這些復(fù)現(xiàn)版本進(jìn)行了匯總,并概括說明了各個版本代碼的特點,供正在學(xué)習(xí)LOAM相關(guān)算法的同學(xué)進(jìn)行參考。
2 基于LOAM框架的開源激光SLAM算法
(1) loam_velodyne
代碼鏈接如下:
laboshinl/loam_velodyne: Laser Odometry and Mapping (Loam) is a realtime method for state estimation and mapping using a 3D lidar. (github.com):https://github.com/laboshinl/loam_velodyne
該代碼程序為按照LOAM論文復(fù)現(xiàn)的原生代碼,特點是 基于ROS框架,可直接適用于velodyne-16線激光雷達(dá)的建圖。對于想學(xué)習(xí)ROS使用的同學(xué),可以從中了解到如何利用ROS進(jìn)行消息的接收與發(fā)布,如何通過ROS中的tf完成坐標(biāo)系之間的轉(zhuǎn)換。
算法中涉及到的數(shù)學(xué)公式如非線性優(yōu)化,并未采用已有的開源庫,而是手工一步步推導(dǎo),需要一定數(shù)學(xué)基礎(chǔ)理解代碼。,但通過代碼的學(xué)習(xí)可以加深對公式的理解。
對于上述代碼,網(wǎng)上也存在含有中文注釋的版本,代碼鏈接如下:
cuitaixiang/LOAM_NOTED: loam code noted in Chinese(loam中文注解版) (github.com):https://github.com/cuitaixiang/LOAM_NOTED
(2) A-LOAM
代碼鏈接如下:
HKUST-Aerial-Robotics/A-LOAM: Advanced implementation of LOAM (github.com):https://github.com/HKUST-Aerial-Robotics/A-LOAM
利用了Ceres庫提供的非線性優(yōu)化函數(shù),完成了L-M算法中雅克比的推導(dǎo),去除了IMU數(shù)據(jù)的引入。整體代碼更加規(guī)范整潔,非常適合學(xué)習(xí)LOAM思想,也適合新手入門3D激光SLAM。
(3)oh_my_loam
代碼鏈接如下:
feixyz10/oh_my_loam: ROS-free implementation of LOAM (github.com):https://github.com/feixyz10/oh_my_loam
脫離了ROS環(huán)境實現(xiàn)了LOAM,數(shù)據(jù)通過函數(shù)參數(shù)進(jìn)行傳入傳出,整體代碼設(shè)計十分整潔,適合想要搭建屬于自己的激光SLAM程序的同學(xué)進(jìn)行借鑒。
(4) loam_livox
代碼鏈接如下:
hku-mars/loam_livox: A robust LiDAR Odometry and Mapping (LOAM) package for Livox-LiDAR (github.com):https://github.com/hku-mars/loam_livox
利用livox固態(tài)激光雷達(dá),基于LOAM的思想,設(shè)計出的算法。因此同樣地,基于livox數(shù)據(jù)進(jìn)行了特征點提取,特征點的匹配和殘差計算與LOAM一致。同時利用Ceres庫優(yōu)化了殘差。
(5) LEGO-LOAM
代碼鏈接如下:
irapkaist/SC-LeGO-LOAM: LiDAR SLAM: Scan Context + LeGO-LOAM (github.com):https://github.com/irapkaist/SC-LeGO-LOAM
在LOAM的基礎(chǔ)上,做了很大的優(yōu)化。其算法流程為:
整個算法分為五個模塊。首先對單幀點云進(jìn)行Segmentation:將其投影為一副1800*16的圖像上,每一個收到的點代表一個像素。提取出地面點聚類,并將非地面點分組為多個聚類,每個聚類的點云具有一致的標(biāo)簽。
與LOAM近似的方式提取出角點和平面點。在Lidar Odometry的環(huán)節(jié)中,選取具有一致標(biāo)簽的點云進(jìn)行匹配。例如平面點只考慮標(biāo)記為地面點的點,邊緣點只考慮其他標(biāo)記大物體的點,以此提升匹配速度。采用兩步L-M優(yōu)化得到前后幀點云的位姿變換。通過配準(zhǔn)平面點得到[tz, roll, pitch], 通過配準(zhǔn)角點來估計[tx, ty, yaw]。在Lidar Mapping 環(huán)節(jié),將特征點與周圍點云圖配準(zhǔn),同時增添了圖優(yōu)化和回環(huán)檢測,進(jìn)一步優(yōu)化位姿變換,減少漂移。
相應(yīng)的,網(wǎng)上也存在著其中文注釋版本
wykxwyc/LeGO-LOAM_NOTED: LeGO-LOAM代碼注釋與學(xué)習(xí) (github.com):https://github.com/wykxwyc/LeGO-LOAM_NOTED
(6) SC-LEGO-LOAM
代碼鏈接如下:
irapkaist/SC-LeGO-LOAM: LiDAR SLAM: Scan Context + LeGO-LOAM (github.com):https://github.com/irapkaist/SC-LeGO-LOAM
SC-LEGO-LOAM 融合了ScanContext 與 LEGO-LOAM,其中ScanContext是一種點云數(shù)據(jù)的全局描述符,其提取方法如下:
由于回環(huán)檢測(場景識別)= 場景描述 + 搜索, Scan context 的作用是作為描述符來描述點云數(shù)據(jù),其搜索算法可以保證回環(huán)能夠被快速檢測出來。因此將ScanContext應(yīng)用到LEGO-LOAM的回環(huán)檢測部分,提高回環(huán)的速度和準(zhǔn)確性。
3 一些學(xué)習(xí)建議
對于初學(xué)者而言,為了掌握LOAM的框架算法,可以在閱讀論文了解原理后,優(yōu)先對A-LOAM代碼進(jìn)行閱讀和理解,快速掌握算法實現(xiàn)的流程。在熟悉LOAM算法框架后,工程實踐中,LEGO-LOAM在自動駕駛領(lǐng)域的建圖中應(yīng)用較多,因此可以重點對LEGO-LOAM進(jìn)行學(xué)習(xí),并再此基礎(chǔ)上提出自己的改進(jìn)并進(jìn)行實驗。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。