# LeGO-LOAM
This repository contains code for a lightweight and ground optimized lidar odometry and mapping (LeGO-LOAM) system for ROS compatible UGVs. The system takes in point cloud from a Velodyne VLP-16 Lidar (palced horizontally) and optional IMU data as inputs. It outputs 6D pose estimation in real-time. A demonstration of the system can be found here -> https://www.youtube.com/watch?v=O3tz_ftHV48
<!--
[![Watch the video](/LeGO-LOAM/launch/demo.gif)](https://www.youtube.com/watch?v=O3tz_ftHV48)
-->
<p align='center'>
<img src="/LeGO-LOAM/launch/demo.gif" alt="drawing" width="800"/>
</p>
## Lidar-inertial Odometry
An updated lidar-initial odometry package, [LIO-SAM](https://github.com/TixiaoShan/LIO-SAM), has been open-sourced and available for testing.
## Dependency
- [ROS](http://wiki.ros.org/ROS/Installation) (tested with indigo, kinetic, and melodic)
- [gtsam](https://github.com/borglab/gtsam/releases) (Georgia Tech Smoothing and Mapping library, 4.0.0-alpha2)
```
wget -O ~/Downloads/gtsam.zip https://github.com/borglab/gtsam/archive/4.0.0-alpha2.zip
cd ~/Downloads/ && unzip gtsam.zip -d ~/Downloads/
cd ~/Downloads/gtsam-4.0.0-alpha2/
mkdir build && cd build
cmake ..
sudo make install
```
## Compile
You can use the following commands to download and compile the package.
```
cd ~/catkin_ws/src
git clone https://github.com/RobustFieldAutonomyLab/LeGO-LOAM.git
cd ..
catkin_make -j1
```
When you compile the code for the first time, you need to add "-j1" behind "catkin_make" for generating some message types. "-j1" is not needed for future compiling.
## The system
LeGO-LOAM is speficifally optimized for a horizontally placed VLP-16 on a ground vehicle. It assumes there is always a ground plane in the scan. The UGV we are using is Clearpath Jackal. It has a built-in IMU.
<p align='center'>
<img src="/LeGO-LOAM/launch/jackal-label.jpg" alt="drawing" width="400"/>
</p>
The package performs segmentation before feature extraction.
<p align='center'>
<img src="/LeGO-LOAM/launch/seg-total.jpg" alt="drawing" width="400"/>
</p>
Lidar odometry performs two-step Levenberg Marquardt optimization to get 6D transformation.
<p align='center'>
<img src="/LeGO-LOAM/launch/odometry.jpg" alt="drawing" width="400"/>
</p>
## New Lidar
The key thing to adapt the code to a new sensor is making sure the point cloud can be properly projected to an range image and ground can be correctly detected. For example, VLP-16 has a angular resolution of 0.2° and 2° along two directions. It has 16 beams. The angle of the bottom beam is -15°. Thus, the parameters in "utility.h" are listed as below. When you implement new sensor, make sure that the ground_cloud has enough points for matching. Before you post any issues, please read this.
```
extern const int N_SCAN = 16;
extern const int Horizon_SCAN = 1800;
extern const float ang_res_x = 0.2;
extern const float ang_res_y = 2.0;
extern const float ang_bottom = 15.0;
extern const int groundScanInd = 7;
```
Another example for Velodyne HDL-32e range image projection:
```
extern const int N_SCAN = 32;
extern const int Horizon_SCAN = 1800;
extern const float ang_res_x = 360.0/Horizon_SCAN;
extern const float ang_res_y = 41.333/float(N_Scan-1);
extern const float ang_bottom = 30.666666;
extern const int groundScanInd = 20;
```
**New**: a new **useCloudRing** flag has been added to help with point cloud projection (i.e., VLP-32C, VLS-128). Velodyne point cloud has "ring" channel that directly gives the point row id in a range image. Other lidars may have a same type of channel, i.e., "r" in Ouster. If you are using a non-Velodyne lidar but it has a similar "ring" channel, you can change the PointXYZIR definition in utility.h and the corresponding code in imageProjection.cpp.
For **KITTI** users, if you want to use our algorithm with **HDL-64e**, you need to write your own implementation for such projection. If the point cloud is not projected properly, you will lose many points and performance.
If you are using your lidar with an IMU, make sure your IMU is aligned properly with the lidar. The algorithm uses IMU data to correct the point cloud distortion that is cause by sensor motion. If the IMU is not aligned properly, the usage of IMU data will deteriorate the result. Ouster lidar IMU is not supported in the package as LeGO-LOAM needs a 9-DOF IMU.
## Run the package
1. Run the launch file:
```
roslaunch lego_loam run.launch
```
Notes: The parameter "/use_sim_time" is set to "true" for simulation, "false" to real robot usage.
2. Play existing bag files:
```
rosbag play *.bag --clock --topic /velodyne_points /imu/data
```
Notes: Though /imu/data is optinal, it can improve estimation accuracy greatly if provided. Some sample bags can be downloaded from [here](https://github.com/RobustFieldAutonomyLab/jackal_dataset_20170608).
## New data-set
This dataset, [Stevens data-set](https://github.com/TixiaoShan/Stevens-VLP16-Dataset), is captured using a Velodyne VLP-16, which is mounted on an UGV - Clearpath Jackal, on Stevens Institute of Technology campus. The VLP-16 rotation rate is set to 10Hz. This data-set features over 20K scans and many loop-closures.
<p align='center'>
<img src="/LeGO-LOAM/launch/dataset-demo.gif" alt="drawing" width="600"/>
</p>
<p align='center'>
<img src="/LeGO-LOAM/launch/google-earth.png" alt="drawing" width="600"/>
</p>
## Cite *LeGO-LOAM*
Thank you for citing [our *LeGO-LOAM* paper](./Shan_Englot_IROS_2018_Preprint.pdf) if you use any of this code:
```
@inproceedings{legoloam2018,
title={LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain},
author={Shan, Tixiao and Englot, Brendan},
booktitle={IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},
pages={4758-4765},
year={2018},
organization={IEEE}
}
```
## Loop Closure
The loop-closure method implemented in this package is a naive ICP-based method. It often fails when the odometry drift is too large. For more advanced loop-closure methods, there is a package called [SC-LeGO-LOAM](https://github.com/irapkaist/SC-LeGO-LOAM), which features utilizing point cloud descriptor.
## Speed Optimization
An optimized version of LeGO-LOAM can be found [here](https://github.com/facontidavide/LeGO-LOAM/tree/speed_optimization). All credits go to @facontidavide. Improvements in this directory include but not limited to:
+ To improve the quality of the code, making it more readable, consistent and easier to understand and modify.
+ To remove hard-coded values and use proper configuration files to describe the hardware.
+ To improve performance, in terms of amount of CPU used to calculate the same result.
+ To convert a multi-process application into a single-process / multi-threading one; this makes the algorithm more deterministic and slightly faster.
+ To make it easier and faster to work with rosbags: processing a rosbag should be done at maximum speed allowed by the CPU and in a deterministic way.
+ As a consequence of the previous point, creating unit and regression tests will be easier.
![avatar](https://profile-avatar.csdnimg.cn/d5b8e16cddf148da83293d5bb68d9224_admin_maxin.jpg!1)
博士僧小星
- 粉丝: 2462
- 资源: 5998
最新资源
- 认知方式与空间智能.docx
- 计算机等级考试二级WPSOffice练习系统V1.5
- PHP开发IDE工具PHPStorm配置文件-2025年版
- 基于Resnet与多头自注意力机制的信号识别技术研究:RadioML2018数据集的分类与性能分析,基于Resnet与多头自注意力机制的信号识别系统:性能优化与实验分析报告,多头自注意力机制识别信号
- H3C-S5130-E整本手册.zip
- FPGA运动目标检测仿真代码-基于正点原子达芬奇硬件与Vivado quartus软件的ov5640配置及HDMI仿真实现,FPGA运动目标检测仿真代码-基于正点原子达芬奇硬件与Vivado qu
- 信噪比估计算法与特征值、奇异值分解技术的融合应用及Matlab实现方法,基于特征值与奇异值分解的信噪比估计算法研究及Matlab实现方法,不同信号的信噪比估计算法 特征值分解、奇异值分解算法 MDL最
- CATIA DMU转向系统运动仿真:麦弗逊悬架下的独立车轮转向机制探究,CATIA DMU转向系统运动仿真:麦弗逊悬架下的独立车轮转向功能探究,CATIA DMU转向系统运动仿真(可编辑,无参数) 悬
- 数字音频接口光电转换模块
- 星禾AI-DeepSeek新手必看!DeepSeek个人应用全攻略|最全的 DeepSeek 使用指南(建议收藏)
- 数字音频光电转换模块文档
- c++小病毒(时间类型): 会从2025/2/17为起点一直增加时间到8007年
- 2025年及以后的主要战略技术趋势和重大战略预测报告
- 内存池的设计与实现代码之边界标识法
- 基于FVC2002数据集的MATLAB指纹识别系统研究与应用,基于MATLAB的FVC2002指纹数据集识别系统研究与应用,基于MATLAB的指纹识别系统 数据集为FVC2002指纹数据集 ,基于MA
- 配电网光伏储能双层优化配置模型:基于粒子群算法求解选址定容与运行调度联合优化,配电网光伏储能双层优化配置模型:基于粒子群算法的运行-规划联合求解,IEEE33节点案例分析,配电网光伏储能双层优化配置模
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)