ROS2でLiDAR Inertial SLAM


はじめに

最近、LiDAR Inertial SLAMであるLIO-SAMが発表されて、私の中でLiDAR Inertial SLAMが熱いです。

下記はLIO-SAMの論文から比較を引用しました。LIO-SAMではとても綺麗に地図ができていることがわかります。
https://github.com/TixiaoShan/LIO-SAM/blob/master/config/doc/paper.pdf

LIO-SAMのキモはIMUによる点群歪み補正とスキャンマッチングの初期位置推定なのですが、このキモとなる部分がモジュール化されていて、簡単に自作SLAMに移植できそうだったのでしてみました!
(SLAMを自作した話は「ROS2で3D LiDARを用いたGraph SLAMによる三次元地図作成」をご覧ください。)

Github

作ったSLAMで出来た地図

LiDAR Inertial SLAMとは

LiDAR Inertial SLAMはその名の通り、IMUを複合したLidar SLAMで、高周波なIMUでSLAMを補間するものです。

LiDAR Inertial SLAMを解説している日本語記事・スライドはないのですが、複合部分に着目すれば基本Visual Inertial SLAMと同じなので、Visual Inertial SLAMの解説スライドを載せておきます。

20190307 visualslam summary
Visual Inertial SLAM
https://www.slideshare.net/takmin/20190307-visualslam-summary#64

第126回 RSJロボット工学セミナー「 Visual SLAMと深層学習を用いた3Dモデリング」(2020/5/22)
5.Visual-inertial SLAM(VI-SLAM)の概要
https://www.slideshare.net/KenSakurada/126-rsj2020522#74

作ったパッケージの説明

今回作ったLiDAR Inertial SLAMはndt/gicpによる逐次SLAMとグラフベースSLAMを組み合わせています。
LiDAR Inertial SLAMを作るにあたって、元のパッケージから改造したのは逐次SLAMの部分なので、逐次SLAMの実装について解説します。
以下がグラフベースSLAMを起動していない逐次SLAMだけのrosgraphです。imu_preintegrationノードでIMUによるスキャンマッチングのための初期位置推定を行い、image_projectionノードで点群歪み補正を行って、scanmatcherノードでスキャンマッチングをします。

rosgraph

デモ

デモデータはLIO-SAMのcasual_walk.bag(ROS1のrosbagを変換しています)を使います。
このデータではVelodyne VLP-16と数百Hzで10万円程度の9軸IMUが使われています。
https://github.com/TixiaoShan/LIO-SAM

以下コマンドです。

rviz2 -d src/li_slam_ros2/scanmatcher/rviz/lio.rviz 
ros2 launch scanmatcher lio.launch.py
ros2 bag play -s rosbag_v2 casual_walk.bag 

出来た三次元地図が以下となります。


黄色のパス:ループが閉じていないパス、緑のパス:修正されたパス、赤:マップ

LIOMよりは性能が良く、LIO-SAMと比べても大丈夫そうですね!

以上、お読みいただきありがとうございました!