基於LOAM框架的鐳射SLAM開源程式彙總

1 前言

LOAM, 即Lidar Odometry and Mapping,是 Ji Zhang 博士於2014年提出的使用鐳射雷達完成定位與三維建圖的演算法。其演算法流程如下:

基於LOAM框架的鐳射SLAM開源程式彙總

LOAM演算法中主要包含兩個模組,一個是Lidar Odometry:基於輸入點雲提取出角點與平面點作為特徵點進行關聯匹配,計算出兩次掃描之間的位姿變換,計算頻率為10HZ;

為了減緩單幀點雲位姿變換產生的累計誤差,設計了Lidar Mapping 的部分。即將與前一幀配準後的點雲與生成的地圖進行二次配準,消除漂移。

由於作者編寫的LOAM程式碼已經閉源,目前網上存在著一些程式碼的復現版本,本文對這些復現版本進行了彙總,並概括說明了各個版本程式碼的特點,供正在學習LOAM相關演算法的同學進行參考。

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論文復現的原生程式碼,特點是 基於ROS框架,可直接適用於velodyne-16線鐳射雷達的建圖。對於想學習ROS使用的同學,可以從中瞭解到如何利用ROS進行訊息的接收與釋出,如何透過ROS中的tf完成座標系之間的轉換。

演算法中涉及到的數學公式如非線性最佳化,並未採用已有的開源庫,而是手工一步步推導,需要一定數學基礎理解程式碼。,但透過程式碼的學習可以加深對公式的理解。

對於上述程式碼,網上也存在含有中文註釋的版本,程式碼連結如下:

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庫提供的非線性最佳化函式,完成了L-M演算法中雅克比的推導,去除了IMU資料的引入。整體程式碼更加規範整潔,非常適合學習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環境實現了LOAM,資料透過函式引數進行傳入傳出,整體程式碼設計十分整潔,適合想要搭建屬於自己的鐳射SLAM程式的同學進行借鑑。

(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固態鐳射雷達,基於LOAM的思想,設計出的演算法。因此同樣地,基於livox資料進行了特徵點提取,特徵點的匹配和殘差計算與LOAM一致。同時利用Ceres庫優化了殘差。

(5) LEGO-LOAM

程式碼連結如下:

irapkaist/SC-LeGO-LOAM: LiDAR SLAM: Scan Context + LeGO-LOAM (github。com):https://github。com/irapkaist/SC-LeGO-LOAM

在LOAM的基礎上,做了很大的最佳化。其演算法流程為:

基於LOAM框架的鐳射SLAM開源程式彙總

整個演算法分為五個模組。首先對單幀點雲進行Segmentation:將其投影為一副1800*16的影象上,每一個收到的點代表一個畫素。提取出地面點聚類,並將非地面點分組為多個聚類,每個聚類的點雲具有一致的標籤。

與LOAM近似的方式提取出角點和平面點。在Lidar Odometry的環節中,選取具有一致標籤的點雲進行匹配。例如平面點只考慮標記為地面點的點,邊緣點只考慮其他標記大物體的點,以此提升匹配速度。採用兩步L-M最佳化得到前後幀點雲的位姿變換。透過配準平面點得到[tz, roll, pitch], 透過配準角點來估計[tx, ty, yaw]。在Lidar Mapping 環節,將特徵點與周圍點雲圖配準,同時增添了圖最佳化和迴環檢測,進一步最佳化位姿變換,減少漂移。

相應的,網上也存在著其中文註釋版本

wykxwyc/LeGO-LOAM_NOTED: LeGO-LOAM程式碼註釋與學習 (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是一種點雲資料的全域性描述符,其提取方法如下:

基於LOAM框架的鐳射SLAM開源程式彙總

由於迴環檢測(場景識別)= 場景描述 + 搜尋, Scan context 的作用是作為描述符來描述點雲資料,其搜尋演算法可以保證迴環能夠被快速檢測出來。因此將ScanContext應用到LEGO-LOAM的迴環檢測部分,提高迴環的速度和準確性。

3 一些學習建議

對於初學者而言,為了掌握LOAM的框架演算法,可以在閱讀論文了解原理後,優先對A-LOAM程式碼進行閱讀和理解,快速掌握演算法實現的流程。在熟悉LOAM演算法框架後,工程實踐中,LEGO-LOAM在自動駕駛領域的建圖中應用較多,因此可以重點對LEGO-LOAM進行學習,並再此基礎上提出自己的改進並進行實驗。

編者注:

這裡也推薦下本文作者精心籌備的

徹底搞懂基於LOAM框架的3D鐳射SLAM: 原始碼剖析到演算法最佳化

影片課程:

https://app0s6nfqrg6303。h5。xiaoeknow。com/v1/course/column/p_60be2648e4b0f120ffc51662?type=3