LTA-OM is an efficient, robust, and accurate SLAM system. It integrates LIO, loop detection, loop optimization, LTA modules. It also supports multi-session mode.
Our paper is available on https://onlinelibrary.wiley.com/doi/10.1002/rob.22337 (open access).
Our demo video is available on https://youtu.be/DVwppEKlKps or https://www.bilibili.com/video/BV1rT42197Mg/?spm_id_from=333.999.0.0.
Our operation system is Ubuntu 18.
Following this ROS Installation to install ROS and its additional pacakge. Our ROS version is Melodic.
Our gtsam version is gtsam-4.0.3. Note that: you need to add some functions to original gtsam code before compiling, please see the note at the end of this Readme.
Our ceres version is ceres-solver-1.14.0.
Our pcl version is pcl-1.9.
Our gcc/g++ version is gcc/g++ -7.
Our tbb: Threading Building Blocks 2019 Update 9
Download it from github and build it in a folder. Link it using hard directory in STD Cmakelist.txt.
Clone this repository and catkin_make:
cd ~/ws_LTAOM/src/
git clone https://github.com/hku-mars/LTAOM.git
cd ../
catkin_make
source ~/ws_LTAOM/devel/setup.bash
In : LiDAR & IMU messages (multisession mode: prior map, prior key poses, prior STD database) Out: cloud_result.pcd & optimized_poses.txt
Please make sure the output directory in the launch file is set. Otherwise, you may see that the program is not running.
Download dataset from https://sites.google.com/view/mulran-pr/download. Run
cd ~/ws_LTAOM/src/LTAOM
./run_nodelet_ouster.sh
./run_loop_optimization.sh
// When LTAOM execution is done, run the following to save corrected map
rosparam set /save_map true
Download dataset from http://robots.engin.umich.edu/nclt/index.html#download. Run
cd ~/ws_LTAOM/src/LTAOM
./run_nodelet_velodyne.sh
./run_loop_optimization.sh
// When LTAOM execution is done, run the following to save corrected map
rosparam set /save_map true
Download dataset from my one drive: https://connecthkuhk-my.sharepoint.com/:f:/g/personal/u3008067_connect_hku_hk/EmhWsq8qR7ZAiVIf4joHetUBdQ-71rHTK1rZD9h2kBX5lg?e=JtDHdh (password: LTAOM-HKUMARS). Run
cd ~/ws_LTAOM/src/LTAOM
./run_nodelet_avia.sh
./run_loop_optimization.sh
// When LTAOM execution is done, run the following to save corrected map
rosparam set /save_map true
First open loop_optimization/run_all_mulran_multisession.launch, and set multisession_mode = 2 in launch file to allow you save LTAOM result.
Run
cd ~/ws_LTAOM/src/LTAOM
./run_nodelet_ouster_multisession.sh
./run_loop_optimization.sh
When you have executed LTAOM with one bag, you can save the LTAOM result for future session:
rosparam set /save_prior_info true
Then, set multisession_mode = 1 in launch file to allow you load previous LTAOM result. After that, you can run
cd ~/ws_LTAOM/src/LTAOM
./run_nodelet_mulran_multisession.sh
./run_loop_optimization.sh
// When LTAOM execution is done, run the following to save corrected map
rosparam set /save_map true
with a new bag as the second session.
Uncomment the line "//#define save_for_mapconsistency_eva" in laserMapping.cpp.
Execute LTAOM like step 4.1-4.3.
When loop optimization is done, you will get scanposes_corrected.txt. In addition, undistorted scans will be recorded as undistoted_scans.bag .
Note, when LTAOM execution is done, type the following command in the terminal to make sure that scanposes_corrected.txt is complete.
rosparam set /pub_pgopath true
Finally, follow FAST_LIO/map_eva/ReadMe.txt to do evaluation.
Nclt 20120202 map agianst statellite image
Comparison on Mulran Riverside02
Comparison on Mulran DCC02
Multilevel building (structurally-similar scene) map
Multisession map stitching reuslt
We know our packages might not completely stable at this stage, and we are working on improving the performance and reliability of our codes. So, if you have met any bug or problem, please feel free to draw an issue and I will respond ASAP.
In the development of LTAOM, we stand on the shoulders of the following repositories: FASTLIO2, ikdtree, STD, gtsam.
The source code is released under GPLv2 license.
If you use any code of this repo in your academic research, please cite at least one of our papers:
[1] Zou, Zuhao, et al. "LTA-OM: Long-Term Association LiDAR-Inertial
Odometry and Mapping"
[2] Yuan, Chongjian, et al. "Std: Stable triangle descriptor for 3d place recognition"
[3] Xu, Wei, et al. "Fast-lio2: Fast direct lidar-inertial odometry."
[4] Xu, Wei, and Fu Zhang. "Fast-lio: A fast, robust lidar-inertial odometry
package by tightly-coupled iterated kalman filter."
[5] Cai, Yixi, Wei Xu, and Fu Zhang. "ikd-Tree: An Incremental KD Tree for
Robotic Applications."
[6] Lin, Jiarong, and Fu Zhang. "Loam-livox: A fast, robust, high-precision
LiDAR odometry and mapping package for LiDARs of small FoV."
For commercial use, please contact me < zuhaozouATyahoo.com > and Dr. Fu Zhang < fuzhangAThku.hk >.
- Loop optimization node cannot be correctly triggered as nodelet.
- Problem when saving large output pcd in loop optimization node.
// to the place between lines 97 ~ 99 of ISAM2.h
Values theta_bkq_;
VariableIndex variableIndex_bkq_;
mutable VectorValues delta_bkq_;
mutable VectorValues deltaNewton_bkq_;
mutable VectorValues RgProd_bkq_;
mutable KeySet deltaReplacedMask_bkq_;
NonlinearFactorGraph nonlinearFactors_bkq_;
mutable GaussianFactorGraph linearFactors_bkq_;
ISAM2Params params_bkq_;
mutable boost::optional<double> doglegDelta_bkq_;
KeySet fixedVariables_bkq_;
int update_count_bkq_;
// to the place between lines 97 ~ 99 of ISAM2.h
void backup(); // to line 199 of ISAM2.h
void recover(); // to line 200 of ISAM2.h
// from line 395 of ISAM2.cpp
void ISAM2::backup(){
variableIndex_bkq_ = variableIndex_;
theta_bkq_ = theta_;
delta_bkq_ = delta_;
deltaNewton_bkq_ = deltaNewton_;
RgProd_bkq_ = RgProd_;
nonlinearFactors_bkq_ = nonlinearFactors_;
fixedVariables_bkq_ = fixedVariables_;
update_count_bkq_ = update_count_;
deltaReplacedMask_bkq_ = deltaReplacedMask_;
linearFactors_bkq_ = linearFactors_;
doglegDelta_bkq_ = doglegDelta_;
params_bkq_ = params_;
// nodes_bkq_ = nodes_;
// roots_bkq_ = roots_;
}
void ISAM2::recover(){
variableIndex_ = variableIndex_bkq_;
theta_ = theta_bkq_;
delta_ = delta_bkq_;
deltaNewton_ = deltaNewton_bkq_;
RgProd_ = RgProd_bkq_;
nonlinearFactors_ = nonlinearFactors_bkq_;
fixedVariables_ = fixedVariables_bkq_;
update_count_ = update_count_bkq_;
deltaReplacedMask_ = deltaReplacedMask_bkq_;
linearFactors_ = linearFactors_bkq_;
doglegDelta_ = doglegDelta_bkq_;
params_ = params_bkq_;
// nodes_ = nodes_bkq_;
// roots_ = roots_bkq_;
}
// to line 427 of ISAM2.cpp