最新のROS実装のあるLidarSLAMオープンソースソフトウェアまとめ

# したこと
ROS実装がある最近の有名なLidarベースのSLAMオープンソースソフトウェアとその解説記事・スライドをまとめました。

# まとめ表
|名前|2D/3D|ループクローズ|オドメトリ|IMU|ライセンス|補足|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|gmapping|2D|有るが非明示的|必須|必須(対向二輪の場合は無くても可)|BSD, Apache-2.0(2019年7月CCから変更)|ベイスフィルタによるSLAM。|
|slam_toolbox|2D|有り|必須|可|LGPL-2.1|ceres-solverによるicpスキャンマッチングとGraphSLAM。手動で地図補正も可。|
|iris_lama_ros|2D|無し/有るが非明示的|必須|可|BSD-3|スキャンマッチングによるSLAMとパーティクルフィルターによるSLAMの二種類あり。他と比べて、CPU使用率等が低く、効率的。|
|LOAM|3D|無し|不可|可(9軸)|BSD|リアルタイム性がウリ。|
|Cartographer|2D/3D|有り|可|2D可。3Dは必須(6軸)。|Apatch-2.0|分岐限定法によるループ閉じ込みがウリ。ceres-solverによるGraphSLAM。グリッドベースドなスキャンマッチング。|
|Autoware ndt-mapping|3D|無し|可|可(9軸)|Apatch-2.0|ndtの非PCL実装やCUDA実装あり。|
|hdl_graph_slam|3D|有り|可|可(加速度と地磁気センサ)|BSD-2|OpenMPによるndt/gicpスキャンマッチングの高速化。g2oによるGraphSLAM。GPSもグラフ制約として可。|
|blam|3D|有り|不可|不可|GPL-2.0|gicpによるスキャンマッチング。gtsamによるGraphSLAM。|
|LeGO-LOAM|3D|有り|不可|可(9軸)|BSD-3|LOAMにgtsamによるGraphSLAMを加えたもの。|
|LIO-mapping|3D|無し|不可|可(6軸)|GPL-3.0(VINS-MONOがGPL-3.0のため)|LOAMにVINS-MONO(Visual Inersial SLAM)のIMU補正手法等を取り入れたもの。|
|LIO-SAM|3D|有り|不可|必須(9軸)|BSD-3|LeGO-LOAMにgtsamによるIMU補正手法等を取り入れたもの。|
|interactive_slam|3D||||GPL-3.0|GUIでGraphSLAMを行うツール。|

ライセンスに関してLidar SLAMによく使われるライブラリを言及すると,
点群処理ライブラリであるpclはBSD-3,グラフ最適化を解くためのソルバーであるg2oはBSD(極一部LGPL-3 +,LGPL-3、以前は全てLGPL)、gtsamはBSD、ceres-solverはBSDです。

## navigationスタックのgmapping
Rao-Blackwellised Particle FilterによるSLAM。
2D。ループ閉じ込みはあるが非明示的。  
https://github.com/ros-planning/navigation  


解説記事。
[Navigation Stack を理解する - 4.3 gmapping(格子ベースFast SLAM): 原理をみる(応用編)](https://qiita.com/MoriKen/items/0f2550a2adbdcd3da04e)

## slam_toolbox
大規模でlifelongなマップを構築するために作られたツール群。
2D。ceres-solverによるicpスキャンマッチングとGraphSLAM。手動でポーズグラフの調整も可。 
ROS2 Eloquent(2019年リリース)でのnavigation2スタックの標準のSLAMになっている。
Github
https://github.com/SteveMacenski/slam_toolbox
実装者本人による解説動画
https://vimeo.com/378682207
実装者本人による解説スライド
https://roscon.ros.org/2019/talks/roscon2019_slamtoolbox.pdf

## iris_lama_ros
2D。スキャンマッチングによるSLAMとパーティクルフィルターによるSLAMの二種類あり。動作が軽い。
スキャンマッチングによるSLAMはループ閉じ込み無し。

Github
https://github.com/iris-ua/iris_lama_ros

ROSコミュニティの掲示板で実装者が建てたスレッド
Announcing LaMa: An alternative localization and mapping package
https://discourse.ros.org/t/announcing-lama-an-alternative-localization-and-mapping-package/10916

iris_lama_rosを試した方のブログ。slam_toolboxとの比較あり。
Giving LaMA a shot
https://msadowski.github.io/iris-lama-slam-with-ros/

## LOAM(Laser Odometry and Mapping)
レーザーオドメトリとマッピングを分割したことによるリアルタイム性をウリにしたSLAM。
最近のROS実装のLiDAR SLAMのOSSはこのLOAMを基にしたものが多いです。
エッジ点と平面上の点を使った特徴点マッチング。
3D。リアルタイム性が売り。ループ閉じ込み無し。
オドメトリ・IMU必要なし。IMU複合可。
IMUを入れると、スキャン歪みを補正してくれます。
Github
https://github.com/laboshinl/loam_velodyne

解説スライド。
https://www.slideshare.net/pflab/journalcloubaritoshi20170720
![image.png](https://qiita-image-store.s3.amazonaws.com/0/229952/f85cfe2d-3ae9-f00f-3226-2b73a17fc52b.png)

loamの派生はたくさんあるので、この記事で詳しく取り上げていないのも下記に載せておきます。
https://github.com/HKUST-Aerial-Robotics/A-LOAM
https://github.com/wh200720041/floam
https://github.com/wh200720041/iscloam
https://github.com/Livox-SDK/livox_horizon_loam
https://github.com/gogojjh/M-LOAM

## Google Cartographer
2D/3D。ループとじ込み有り。
2Dはオドメトリ・IMU必要なし（どちらも複合可）。3DはIMU必須。
逐次SLAMがいまいち。

Github
https://github.com/googlecartographer/cartographer_ros/tree/master/cartographer_ros
![image.png](https://qiita-image-store.s3.amazonaws.com/0/229952/f074d42f-5e95-c7e7-c230-5c32737a7885.png)
日本語で詳しく解説したものは見当たりませんでしたが、概要は以下のブログ記事にあります。
余談ですが、下記の記事ではHector SLAMの概要もあります。
http://daily-tech.hatenablog.com/entry/2018/11/27/064724


## Autowareのndt mapping
NDT(Normal Distributions Transform)マッチングによるSLAM。
3D。ループとじ込み無し。オドメトリ・IMU必要なし（どちらも複合可）。
pcl実装のndt以外にもndtの独自実装(ndt_tku)やcuda実装があります。
Github
https://github.com/CPFL/Autoware

実装者本人による解説スライド。ダウンロードしないと正常に見れないようです。
[NDTスキャンマッチング 第1回3D勉強会@PFN 2018年5月27日](https://www.slideshare.net/YukiKitsukawa/ndt-13dpfn-2018527)
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/229952/de92f8d0-c75e-4b76-212d-10808769399f.png)

## hdl_graph_slam
豊橋技術科学大学の博士だった方の成果。
3D．ループ閉じ込み有り．
OpenMPによるndt/gicpスキャンマッチングの高速化をしていて、GraphSLAMにはg2oを使用しています。GPSもグラフ制約として複合可。
Github
https://github.com/koide3/hdl_graph_slam
![image.png](https://qiita-image-store.s3.amazonaws.com/0/229952/3faa3179-d528-8315-66a6-45245562bab6.png)

## BLAM
Berkeley Localization And Mapping．2016年から更新がありません。
3D．ループとじ込み有り。gicpによるスキャンマッチングとgtsamによるGraphSLAM。
Github
https://github.com/erik-nelson/blam

## LeGO-LOAM
3D．ループ閉じ込み有り．LOAMにgtsamによるGraphSLAMを加えたもの。
スキャンマッチングもセグメンテーションを基にしたラベルマッチングやz,roll,pitch->x,y,yawの二段階に分けたLevenberg-Marquardt 法等の改善あり。

論文はIROS2018採択。
Github
https://github.com/RobustFieldAutonomyLab/LeGO-LOAM

LeGO-LOAMのループ探索をグローバル記述子のScanContextで改良した下記もおすすめです。（このScan Contextを開発したgisbi-kimさんは様々なSLAMにScanContextを複合してるので、彼のレポジトリは要チェックです。）
https://github.com/irapkaist/SC-LeGO-LOAM

## LIO-mapping
3D．LOAMにVINS-MONO(Visual Inersial SLAM)のIMU補正手法等を取り入れたもの。
論文の『A Tightly Coupled 3D Lidar and Inertial Odometry and Mapping Approach』はICRA 2019採択。

プロジェクトページ
https://sites.google.com/view/lio-mapping

Github
https://github.com/hyye/lio-mapping

LIO-mappingの解説記事はありませんが、VINS-MONOには以下のスライドがあります。

20190825 vins mono
https://www.slideshare.net/takmin/20190825-vins-mono

## LIO-SAM
3D．LeGO-LOAMにgtsamによるIMU補正手法等を取り入れたもの。作者はLeGO-LOAMの人と同じ。
論文の『LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping』はIROS 2020採択。

Github
https://github.com/TixiaoShan/LIO-SAM

LIO-SAMのループ探索を改良した下記もおすすめです。
https://github.com/gisbi-kim/SC-LIO-SAM

## interactive_slam

hdl_graph_slamの作者によるGUIでGraph SLAMを修正(ループ箇所を手動or自動で指定して最適化/ Plane-basedで地図の歪みを補正/複数地図の合成)するOSSです。他のOSSと少し毛色が違いますが便利なので紹介しておきます。
Github
https://github.com/koide3/interactive_slam

## その他(随時更新)
随時更新します。（~~そのうち上のまとめにも反映したいんですが、気力が~~)

### LiDAR Inertial SLAM

LINS(ICRA2020)

https://github.com/ChaoqinRobotics/LINS---LiDAR-inertial-SLAM

FAST_LIO 2(IROS2022)(最近の3D Lidar Inertial SLAMはこれが人気な気がします。Livox MID-360でも動作実績が有るのも良い点。）

https://github.com/hku-mars/FAST_LIO

https://github.com/gaoxiang12/faster-lio

https://github.com/jiaying001/SE2LIO

https://github.com/Huguet57/LIMO-Velo

LIO-PPF(IROS 2023)

https://github.com/xingyuuchen/LIO-PPF

LIO-SEGMOT(ICRA 2023)

https://github.com/StephLin/LIO-SEGMOT

direct_lidar_inertial_odometry(ICRA 2023)

https://github.com/vectr-ucla/direct_lidar_inertial_odometry

slict(RA-L 2023)

https://github.com/brytsknguyen/slict

https://github.com/gisbi-kim/mini-pyllio

https://github.com/peterWon/D-LIOM

https://github.com/ZikangYuan/liw_oam

https://github.com/koide3/glim

### LiDAR Inertial Visual SLAM

LVI-SAM(ICRA2021)

https://github.com/TixiaoShan/LVI-SAM

FAST-LIVO(IROS2022)

https://github.com/hku-mars/FAST-LIVO

https://github.com/hku-mars/r2live

https://github.com/ZikangYuan/SDV-LOAM

https://github.com/hku-mars/r3live

FAST-LIVO2(TRO2024)

https://github.com/hku-mars/FAST-LIVO2

R3LIVE++(TPAMI2024)

https://github.com/hku-mars/r3live

### その他

- A collection of docker environments for 3D SLAM packages

様々なLiDAR SLAMのOSSをdockerで提供しています。大変便利。

https://github.com/koide3/slam_docker_collection

- Bundle Adjustment on Lidar Point Clouds

Pose Graph Optimazationでは無くBundle Adjustmentを使っているSLAMです。
https://github.com/hku-mars/BALM

- Continuous-Time LiDAR Odometry

https://github.com/jedeschaud/ct_icp

- KISS-ICP

パラメータを調整せず色々なシステムで動くことをウリにしているICPです。人気。

https://github.com/PRBonn/kiss-icp