• Stars
    star
    497
  • Rank 88,652 (Top 2 %)
  • Language
    C++
  • Created about 4 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

LiDAR-inertial SLAM: Scan Context + LIO-SAM

SC-LIO-SAM

version 2021-06-24

What is SC-LIO-SAM?

Scan Context: A fast and robust place recognition

  • Light-weight: a single header and cpp file named "Scancontext.h" and "Scancontext.cpp"
    • Our module has KDtree and we used nanoflann. nanoflann is an also single-header-program and that file is in our directory.
  • Easy to use: A user just remembers and uses only two API functions; makeAndSaveScancontextAndKeys and detectLoopClosureID.
  • Fast: A single loop detection requires under 30 ms (for 20 x 60 size, 3 candidates)

Examples

We provide example results using MulRan dataset, which provides LiDAR and 9dof IMU data. You can see the parameter file (i.e., params_mulran.yaml) modified for MulRan dataset.

example 1: KAIST02 of MulRan dataset

example 2: Riverside03 of MulRan dataset

  • As seen in the above video, the combination of Scan Context loop detector and LIO-SAM's odometry is robust to highly dynamic and less structured environments (e.g., a wide road on a bridge with many moving objects).

How to use?

  • We provide a tutorial that runs SC-LIO-SAM on MulRan dataset, you can reproduce the above results by following these steps.
  1. You can download the dataset at the MulRan dataset website
  2. Place the directory SC-LIO-SAM under user catkin work space
    For example,
    cd ~/catkin_ws/src
    git clone https://github.com/gisbi-kim/SC-LIO-SAM.git
    cd ..
    catkin_make
    source devel/setup.bash
    roslaunch lio_sam run.launch # or roslaunch lio_sam run_mulran.launch
    
  3. By following this guideline, you can easily publish the MulRan dataset's LiDAR and IMU topics via ROS.

Dependency

  • All dependencies are same as the original LIO-SAM

Notes

About performance

  • We used two types of loop detetions (i.e., radius search (RS)-based as already implemented in the original LIO-SAM and Scan context (SC)-based global revisit detection). See mapOptmization.cpp for details. performSCLoopClosure is good for correcting large drifts and performRSLoopClosure is good for fine-stitching.
  • To prevent the wrong map correction, we used Cauchy (but DCS can be used) kernel for loop factor. See mapOptmization.cpp for details. We found that Cauchy is emprically enough.

Minor

  • We used C++14 to use std::make_unique in Scancontext.cpp but you can use C++11 with slightly modifying only that part.
  • We used a larger value for velocity upper bound (see failureDetection in imuPreintegration.cpp) for fast motions of a MulRan dataset's car platform.
  • The some code lines are adapted for Ouster LiDAR. Thus, if you use an other LiDAR, please refer the original author's guideline and fix some lines.
  • A LiDAR scan of MulRan dataset has no ring information, thus we simply made a hardcoding like int rowIdn = (i % 64) + 1 in imageProjection.cpp to make a ring index information that LIO-SAM requires, and it works. However, if you use an other LiDAR, you need to change this line.

Applications

  • With our save utility accompanied with this repository, we can save a set of keyframe's time, estimated pose, a corresponding point cloud, and Scan Context descriptors. The estimated poses are saved as a file named optimized_poses.txt and its format is equivalent to the famous KITTI odometry dataset's pose.txt file. For example:

  • If you use the above saved files, you can feed these data to Removert and can removing dynamic objects. No GT labels or external sensor data such as RTK-GPS is required. This tutorial guides steps from running SC-LIO-SAM to save data to Removert to remove dynamic objects in a scan. Example results are:

  • For the safe and light-weight map saver, we support off-line scan merging utils for the global map construction within user's ROI (see tools/python/makeMergedMap.py, for the details, see the tutorial video)

Cite SC-LIO-SAM

@INPROCEEDINGS { gkim-2018-iros,
  author = {Kim, Giseop and Kim, Ayoung},
  title = { Scan Context: Egocentric Spatial Descriptor for Place Recognition within {3D} Point Cloud Map },
  booktitle = { Proceedings of the IEEE/RSJ International Conference on Intelligent Robots and Systems },
  year = { 2018 },
  month = { Oct. },
  address = { Madrid }
}

and

@inproceedings{liosam2020shan,
  title={LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping},
  author={Shan, Tixiao and Englot, Brendan and Meyers, Drew and Wang, Wei and Ratti, Carlo and Rus Daniela},
  booktitle={IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},
  pages={5135-5142},
  year={2020},
  organization={IEEE}
}

Contact

Contributors

  • Minwoo Jung: made the original LIO-SAM runs on the MulRan dataset.

Acknowledgement

  • SC-LIO-SAM is based on LIO-SAM (Tixiao Shan et al., IROS 2020). We thank Tixiao Shan and the LIO-SAM authors for providing a great base framework.

Update history

  • 2021.06.23
    • yaml file is reformatted to support the compatible form with the recent original LIO-SAM repository.
    • offline ROI global map construction python util is supported.

TODO

  • About performance
    • improve better RS loop closing (ICP test sometimes fails in reverse directions)
    • support reverse-closing of SC loops with Scan Context initial yaw
    • support SC augmentation
    • lagged RS loop closing after large drifts solved
  • About funtions for convenience
    • save extended data: nodes' time, 6D pose, node's point cloud, and corresponding SC descriptors
    • make a static map and self-labeled dynamic points by combining SC-LIO-SAM and removert.
  • Minor (not related to the performance)
    • fix the visualization issue: disappearing map points after SC loop closing
    • fix safe-save for map points after closing the program

More Repositories

1

removert

Remove then revert (IROS 2020)
C++
510
star
2

PyICP-SLAM

Full-python LiDAR SLAM using ICP and Scan Context
Python
502
star
3

lt-mapper

A Modular Framework for LiDAR-based Lifelong Mapping
C++
354
star
4

SC-A-LOAM

Robust LiDAR SLAM with a versatile plug-and-play loop closing and pose-graph optimization.
C++
316
star
5

navtech-radar-slam

Radar SLAM: yeti radar odometry + scan context
C++
115
star
6

modern-slam-tutorial-python

learning and feeling SLAM together with hands-on-experiments
Jupyter Notebook
71
star
7

IROS20-SLAM-papers

A personal list-up
HTML
52
star
8

symforce-tutorials

Learn symforce together :)
Jupyter Notebook
22
star
9

multi-robot-isam-example

An example about using anchor node for multi-robot and -session slam
C++
20
star
10

scancontext-pybind

LiDAR place recognition. For fast python support.
C++
19
star
11

mini-kitti-publisher

A very simple KITTI odometry dataset's images and velodyne points publisher
Python
17
star
12

scancontext

backup of irapkaist/scancontext
C++
16
star
13

Daily-Arxiv-Tracking-Automation

Automatically download the all pdfs from a daily rss
Python
15
star
14

semantickitti-matlab

Some useful tools written in Matlab for Semantic KITTI
MATLAB
14
star
15

mini-pyllio

A very minimal but working Python only implementation for loosely-coupled LiDAR-Inertial odometry for education purpose.
Python
14
star
16

toy-robust-backend-slam

Toy DCS
C++
13
star
17

SC-LeGO-LOAM

backup of irapkaist/SC-LeGO-LOAM
C++
12
star
18

ceres-tutorials

personal practice
C++
12
star
19

kitti-global-map-making

global map construction for kitti360 dataset (can be used for the original kitti)
MATLAB
11
star
20

depth-mapping-matlab

Global 3D Map Construction using RTAB-Map iPhone/iPad app data
MATLAB
11
star
21

nano-pgo

For an education purpose, from-scratch, single-file, python-only pose-graph optimization implementation
Python
10
star
22

thrust_examples

Hands-on Learning about cpu vs gpu
Cuda
6
star
23

fit-plane-open3d

example with real world lidar scan
Python
6
star
24

cpp-profiling-practice

for education.
C++
5
star
25

scancontext-cpp

Scan Context C++ for LiDAR Place Recognition
C++
5
star
26

control_toy_practices

for beginners
Python
4
star
27

pytorch-solver-tutorial

pytorch-based optimization examples for traditional problems
Jupyter Notebook
4
star
28

my-interest-cvpr21-paper-listup

4
star
29

gisbi-kim.github.io

blog
CSS
4
star
30

pypose-practice

pypose practices
Python
4
star
31

ComplexUrbanH3DS

To make virtual horizontal 3D scans (so H3DS) from the original Complex Urbans Dataset's point cloud, which was made from 2D push-broom lidars.
MATLAB
4
star
32

cpp-design-pattern

C++
4
star
33

numerical_programming_lectures

tbb, gpu things for robotics
C++
4
star
34

mulran-evaluation

MATLAB
3
star
35

scan_saver

input: rosbag (topics), output: custom .bin file per scan
C++
3
star
36

kitti_making_lidar_gt_pose

head to tail based lidar gt pose making code
MATLAB
3
star
37

nla_study

A study on numerical linear algebra (NLA)
Python
2
star
38

laptop-slam

Goal: 1. using laptop's default camera, 2. using python-only, 3. do v-SLAM
Python
2
star
39

OusterRangeImageMatlab

OusterRangeImageMatlab
MATLAB
2
star
40

scancontext_tro

scancontext++ (TRO 2022) codes
MATLAB
1
star
41

my-leet-codes

C++
1
star
42

ipad_data_processsing

some utils
Python
1
star
43

preprocessing-pointnetvlad

Python
1
star
44

yeti_odom_drawer

MATLAB
1
star
45

iccv23-title-abstracts-db

to easily skim iccv23
1
star
46

iros23-paper-title-and-abstracts

parser pythonc code and sqlite db file
HTML
1
star
47

cv-gskim

1 page cv
TeX
1
star
48

ce545-taxi

course
Jupyter Notebook
1
star
49

mixRobust_distributed_mapper

MATLAB
1
star
50

cpp_study

A personal study backup
C++
1
star
51

hands_on_numerical_opt

for practice
1
star
52

arxiv_gpt_korean_translator

using openai api
Python
1
star