# MULLS
**Repository Path**: wang_tian_ni/MULLS
## Basic Information
- **Project Name**: MULLS
- **Description**: MULLS: Versatile LiDAR SLAM via Multi-metric Linear Least Square
- **Primary Language**: Unknown
- **License**: GPL-3.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-12-30
- **Last Updated**: 2020-12-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## MULLS: Versatile LiDAR SLAM via Multi-metric Linear Least Square
MULLS is an efficient, low-drift, and versatile LiDAR-only SLAM system with both the front-end and back-end. It's an overall updated version of [LLS-LOAM](https://github.com/YuePanEdward/LLS-LOAM).
[[Demo Video](https://www.youtube.com/watch?v=85bGD55e3-0&feature=youtu.be)], [[KITTI Leaderboard](http://www.cvlibs.net/datasets/kitti/eval_odometry.php)], [Preprint Paper], [[Project Wiki](https://github.com/YuePanEdward/MULLS/wiki)]
#### Version 1.0 (passed on Ubuntu 16.04 / 18.04)
Codes are currently under reproducing for better readability and performance.
____________________________________________________________________________________

____________________________________________________________________________________
## Instruction
### 1. Install dependent 3rd libraries
For a compiler that supports OpenMP
Compulsory:
- [PCL(>=1.7)](https://github.com/PointCloudLibrary/pcl)
- [Glog](https://github.com/google/glog)
- [Gflags](https://github.com/gflags/gflags)
- [Eigen 3](https://eigen.tuxfamily.org/dox/)
Optional:
- For *.las data IO: [LibLas](https://github.com/libLAS/libLAS)
- For *.h5 data IO: [HDF5](https://support.hdfgroup.org/HDF5/release/obtainsrc.html)
- For geo-coordinate projection for global mapping: [Proj4](https://proj.org/)
- For Lie-Group and Lie-Algebra related functions (only used in baseline registration method vgicp): [Sophus](https://github.com/strasdat/Sophus)
- For 2D map, scan range image and BEV image generation: [OpenCV](https://github.com/opencv/opencv)
- For pose graph optimization: [g2o(<=2016version)](https://github.com/RainerKuemmerle/g2o/releases/tag/20160424_git)
- or [ceres](http://ceres-solver.org/)
- or [gtsam](https://bitbucket.org/gtborg/gtsam/src/develop/)
- For global registration using truncated least square: [TEASER++](https://github.com/MIT-SPARK/TEASER-plusplus)
You may run the following shell file to install all the dependent libs (tested on Ubuntu 16.04):
```
sh script/tools/install_dep_lib.sh
```
Note: ceres, g2o and gtsam are all used for pose graph optimization. You only need to install one of them (ceres is recommended).
### 2. Compile
```
# cd to the base folder of MULLS
mkdir build
cd build
cmake ..
make
cd ..
```
If you'd like to configure the optional dependent libs needed by your task, you can directly switch the options in ```CMakeLists.txt``` and then rebuild or use ```ccmake ..``` in ```build``` folder instead. (If it does not work, you nned to delete the ```build``` folder and do ```2.Compile``` again).
### 3. Minimum example
By using the example data (10 adjacent scans) in ```./demo_data```, you can have a quick test of MULLS-SLAM and MULLS-Registration.
Without editing anything, directly run
```
sh script/run_mulls_slam.sh
```
and
```
sh script/run_mulls_reg.sh
```
to check the results (in the real-time viewer and the ```result``` folder in ```demo_data```).
### 4. Prepare data
The input of MULLS should be a sequence of point cloud. Each point cloud is corresponding to a frame of the transaction.
##### Test on KITTI
Download the [KITTI Odometry Dataset](http://www.cvlibs.net/datasets/kitti/eval_odometry.php) to test the project.
To test the semantic mask aided solution, please download the [Semantic KITTI Odometry Dataset](http://semantic-kitti.org/).
The complete data folder structure should be as following:
```
Base Folder
_____00
|___velodyne [raw data *.bin]
|___pcd [*.pcd] (can be generated from *.bin by run_kittibin2pcd.sh)
|___labels [raw semantic label *.label] (optional for semantic aided lidar odometry)
|___label_pcd [*.pcd] (optional for semantic aided lidar odometry, can be generated from *.label and *.bin by run_semantic_kitti_labelbin2pcd.sh)
|___00.txt [ground truth (gnssins) pose] (optional for evaluation)
|___calib.txt [extrinsic transformation matrix (from body to lidar coordinate system)] (optional for evaluation)
|___result [output of MULLS: generated map, pose and evaluation] (would be generated automatically after the transaction)
_____01
|___velodyne
|___pcd
|___labels
|...
_____...
```
Scripts for converting the data format are available in ```./script/tool/``` folder.
You can use ```script/tools/run_kittibin2pcd.sh ``` to convert ```*.bin``` to ```*.pcd``` to get the ```pcd``` folder.
Similarly, you can use ```script/tools/run_semantic_kitti_labelbin2pcd.sh ``` to convert ```*.label``` to ```*.pcd``` to get the ```label_pcd``` folder.
##### Test on your own data
If you'd like to use your own data, the data format should be one of the following: ```*.pcd```, ```*.ply```, ```*.txt```, ```*.las```, ```*.csv```, ```*.h5```.
You can simply specify the data format in ```script/run_mulls_slam.sh```.
The data foler structure can be as simple as follows:
```
Base Folder
|___dummy_framewise_point_cloud
. |___00001.pcd (las,txt,ply,h5,csv...)
. |___00002.pcd (las,txt,ply,h5,csv...)
. |___...
|___dummy_ground_truth_trajectory.txt (optional)
|___dummy_calibration_file.txt (optional)
```
To feed your data into MULLS in order, your point clouds' filename should also in the same order. You can use ```script/tools/batch_rename.sh ``` to rename filenames from something like ```1.pcd``` to ```00001.pcd``` in batch.
Links to more open datasets are available [here](https://github.com/YuePanEdward/MULLS/wiki/Open-datasets).
### 5. Run
#### MULLS-SLAM
If you'd like to test the LiDAR SLAM module (MULLS-SLAM), please edit the ```script/run_mulls_slam.sh``` file, specify the data path and then run:
```
sh script/run_mulls_slam.sh
```
If the visualization is enabled, then you can configure the visualization GUI by following the instructions [here](https://github.com/YuePanEdward/MULLS/wiki/GUI-instruction).
For better performance on a specific dataset, you are suggested to play with the parameters in ```script/config/lo_gflag_list_[xxx].txt``` (tips on parameter tuning are available [here](https://github.com/YuePanEdward/MULLS/wiki/MULLS-SLAM-Parameter-List)), and then you need to change the config file path in ```script/run_mulls_slam.sh``` as follows:
```
config_file=./script/config/lo_gflag_list_[xxx].txt
```
To disable or enable the back-end (loop closure detection and pose graph optimization), you can edit the ```--loop_closure_detection_on=true/false``` in the config file.
After the transaction, you are expected to find the results (plots, poses, evaluation results, generated 3D and 2D map ...) in the ```result``` folder under the data path. You can configure the output preference according to [here](https://github.com/YuePanEdward/MULLS/wiki/MULLS-Visualization-Parameter-List).
#### MULLS-Registration
You can use ```script/run_mulls_reg.sh``` to test the pairwise point cloud registration using MULLS-ICP with TEASER++ simply by configuring the data path in it. Then you can run it by:
```
sh script/run_mulls_reg.sh
```
An example on TLS point cloud registration can be found [here](https://github.com/YuePanEdward/MULLS/wiki/Case-study:-example-on-TLS-point-cloud-registration).
----------
### Demo
#### On KITTI dataset
----------------------------
### Contact
If you have any questions, please let me know:
**Yue Pan** {yuepan@ethz.ch}
---------
### TODO List
- [ ] Code reproducing
- [ ] Add preprint paper
- [x] Add Wiki
- [ ] Add ROS support
- [ ] Add cross-platform support (run on windows)
- [ ] Add sensor fusion module
- [ ] Test on more dataset