• Stars
    star
    745
  • Rank 60,881 (Top 2 %)
  • Language
    C++
  • License
    Other
  • Created almost 2 years ago
  • Updated 6 months ago

Reviews

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

Repository Details

Point-LIO (If you have problems with the formal commits, please try the newest commit first, several modifications have be made in newest commit for wider adaptivity)

Point-LIO: Robust High-Bandwidth Lidar-Inertial Odometry (Pay attention to modifying the parameters for IMU in .yaml file, according to the IMU you use.)

1. Introduction

The framework and key points of the Point-LIO.

New features:

  1. would not fly under degeneration.
  2. high odometry output frequency, 4k-8kHz.
  3. robust to IMU saturation and severe vibration, and other aggressive motions (75 rad/s in our test).
  4. no motion distortion.
  5. computationally efficient, robust, versatile on public datasets with general motions.
  6. As an odometry, Point-LIO could be used in various autonomous tasks, such as trajectory planning, control, and perception, especially in cases involving very fast ego-motions (e.g., in the presence of severe vibration and high angular or linear velocity) or requiring high-rate odometry output and mapping (e.g., for high-rate feedback control and perception).

Important notes:

A. Please make sure the IMU and LiDAR are Synchronized, that's important.

B. Please obtain the saturation values of your used IMU (i.e., accelerator and gyroscope), and the units of the accelerator of your used IMU, then modify the .yaml file according to those settings, including values of 'satu_acc', 'satu_gyro', 'acc_norm'. That's improtant.

C. The warning message "Failed to find match for field 'time'." means the timestamps of each LiDAR points are missed in the rosbag file. That is important because Point-LIO processes at the sampling time of each LiDAR point.

D. We recommend to set the extrinsic_est_en to false if the extrinsic is given. As for the extrinsic initiallization, please refer to our recent work: Robust and Online LiDAR-inertial Initialization.

E. If a high odometry output frequency without downsample is required, set publish_odometry_without_downsample as true. Then the warning message of tf "TF_REPEATED_DATA" will pop up in the terminal window, because the time interval between two publish odometery is too small. The following command could be used to suppress this warning to a smaller frequency:

in your catkin_ws/src,

git clone --branch throttle-tf-repeated-data-error [email protected]:BadgerTechnologies/geometry2.git

Then rebuild, source setup.bash, run and then it should be reduced down to once every 10 seconds. If 10 seconds is still too much log output then change the ros::Duration(10.0) to 10000 seconds or whatever you like.

F. If you want to use Point-LIO without imu, set the "imu_en" as false, and provide a predefined value of gavity in "gravity_init" as true as possible in the yaml file, and keep the "use_imu_as_input" as 0.

1.1. Developers:

The codes of this repo are contributed by: Dongjiao He (θ΄ΊδΈœε¨‡) and Wei Xu (徐威)

1.2. Related paper

Our paper is published on Advanced Intelligent Systems(AIS). Point-LIO, DOI: 10.1002/aisy.202200459

1.3. Related video

Our accompany video is available on YouTube.

2. What can Point-LIO do?

2.1 Simultaneous LiDAR localization and mapping (SLAM) without motion distortion

2.2 Produce high odometry output frequence and high bandwidth

2.3 SLAM with aggressive motions even the IMU is saturated

3. Prerequisites

3.1 Ubuntu and ROS

We tested our code on Ubuntu20.04 with noetic. Ubuntu18.04 and lower versions have problems of environments to support the Point-LIO, try to avoid using Point-LIO in those systems. Additional ROS package is required:

sudo apt-get install ros-xxx-pcl-conversions

3.2 Eigen

Following the official Eigen installation, or directly install Eigen by:

sudo apt-get install libeigen3-dev

3.3 livox_ros_driver

Follow livox_ros_driver Installation.

Remarks:

  • Since the Point-LIO supports Livox serials LiDAR, so the livox_ros_driver must be installed and sourced before run any Point-LIO luanch file.
  • How to source? The easiest way is add the line source $Licox_ros_driver_dir$/devel/setup.bash to the end of file ~/.bashrc, where $Licox_ros_driver_dir$ is the directory of the livox ros driver workspace (should be the ws_livox directory if you completely followed the livox official document).

4. Build

Clone the repository and catkin_make:

    cd ~/$A_ROS_DIR$/src
    git clone https://github.com/hku-mars/Point-LIO.git
    cd Point-LIO
    git submodule update --init
    cd ../..
    catkin_make
    source devel/setup.bash
  • Remember to source the livox_ros_driver before build (follow 3.3 livox_ros_driver)
  • If you want to use a custom build of PCL, add the following line to ~/.bashrc export PCL_ROOT={CUSTOM_PCL_PATH}

5. Directly run

5.1 For Avia

Connect to your PC to Livox Avia LiDAR by following Livox-ros-driver installation, then

    cd ~/$Point_LIO_ROS_DIR$
    source devel/setup.bash
    roslaunch point_lio mapping_avia.launch
    roslaunch livox_ros_driver livox_lidar_msg.launch
  • For livox serials, Point-LIO only support the data collected by the livox_lidar_msg.launch since only its livox_ros_driver/CustomMsg data structure produces the timestamp of each LiDAR point which is very important for Point-LIO. livox_lidar.launch can not produce it right now.
  • If you want to change the frame rate, please modify the publish_freq parameter in the livox_lidar_msg.launch of Livox-ros-driver before make the livox_ros_driver pakage.

5.2 For Livox serials with external IMU

mapping_avia.launch theratically supports mid-70, mid-40 or other livox serial LiDAR, but need to setup some parameters befor run:

Edit config/avia.yaml to set the below parameters:

  1. LiDAR point cloud topic name: lid_topic
  2. IMU topic name: imu_topic
  3. Translational extrinsic: extrinsic_T
  4. Rotational extrinsic: extrinsic_R (only support rotation matrix)
  • The extrinsic parameters in Point-LIO is defined as the LiDAR's pose (position and rotation matrix) in IMU body frame (i.e. the IMU is the base frame). They can be found in the official manual.
  1. Saturation value of IMU's accelerator and gyroscope: satu_acc, satu_gyro
  2. The norm of IMU's acceleration according to unit of acceleration messages: acc_norm

5.3 For Velodyne or Ouster (Velodyne as an example)

Step A: Setup before run

Edit config/velodyne.yaml to set the below parameters:

  1. LiDAR point cloud topic name: lid_topic
  2. IMU topic name: imu_topic (both internal and external, 6-aixes or 9-axies are fine)
  3. Set the parameter timestamp_unit based on the unit of time (Velodyne) or t (Ouster) field in PoindCloud2 rostopic
  4. Line number (we tested 16, 32 and 64 line, but not tested 128 or above): scan_line
  5. Translational extrinsic: extrinsic_T
  6. Rotational extrinsic: extrinsic_R (only support rotation matrix)
  • The extrinsic parameters in Point-LIO is defined as the LiDAR's pose (position and rotation matrix) in IMU body frame (i.e. the IMU is the base frame).
  1. Saturation value of IMU's accelerator and gyroscope: satu_acc, satu_gyro
  2. The norm of IMU's acceleration according to unit of acceleration messages: acc_norm

Step B: Run below

    cd ~/$Point_LIO_ROS_DIR$
    source devel/setup.bash
    roslaunch point_lio mapping_velody16.launch

Step C: Run LiDAR's ros driver or play rosbag.

5.4 PCD file save

Set pcd_save_enable in launchfile to 1. All the scans (in global frame) will be accumulated and saved to the file Point-LIO/PCD/scans.pcd after the Point-LIO is terminated. pcl_viewer scans.pcd can visualize the point clouds.

Tips for pcl_viewer:

  • change what to visualize/color by pressing keyboard 1,2,3,4,5 when pcl_viewer is running.
    1 is all random
    2 is X values
    3 is Y values
    4 is Z values
    5 is intensity

6. Examples

The example datasets could be downloaded through onedrive. Pay attention that if you want to test on racing_drone.bag, [0.0, 9.810, 0.0] should be input in 'mapping/gravity_init' in avia.yaml, and set the 'start_in_aggressive_motion' as true in the yaml. Because this bag start from a high speed motion. And for PULSAR.bag, we change the measuring range of the gyroscope of the built-in IMU to 17.5 rad/s. Therefore, when you test on this bag, please change 'satu_gyro' to 17.5 in avia.yaml.

6.1. Example-1: SLAM on datasets with aggressive motions where IMU is saturated

6.2. Example-2: Application on FPV and PULSAR

PULSAR is a self-rotating UAV actuated by only one motor, PULSAR

7. Contact us

If you have any questions about this work, please feel free to contact me <hdj65822ATconnect.hku.hk> and Dr. Fu Zhang <fuzhangAThku.hk> via email.

More Repositories

1

FAST_LIO

A computationally efficient and robust LiDAR-inertial odometry (LIO) package
C++
2,549
star
2

r3live

A Robust, Real-time, RGB-colored, LiDAR-Inertial-Visual tightly-coupled state Estimation and mapping package
C++
1,958
star
3

loam_livox

A robust LiDAR Odometry and Mapping (LOAM) package for Livox-LiDAR
C++
1,435
star
4

FAST-LIVO

A Fast and Tightly-coupled Sparse-Direct LiDAR-Inertial-Visual Odometry (LIVO).
C++
1,086
star
5

livox_camera_calib

This repository is used for automatic calibration between high resolution LiDAR and camera in targetless scenes.
C++
863
star
6

LiDAR_IMU_Init

[IROS2022] Robust Real-time LiDAR-inertial Initialization Method.
C++
834
star
7

r2live

R2LIVE: A Robust, Real-time, LiDAR-Inertial-Visual tightly-coupled state Estimator and mapping package
C++
721
star
8

BALM

An efficient and consistent bundle adjustment for lidar mapping
C++
700
star
9

ikd-Tree

This repository provides implementation of an incremental k-d tree for robotic applications.
C++
607
star
10

ImMesh

ImMesh: An Immediate LiDAR Localization and Meshing Framework
C++
590
star
11

STD

A 3D point cloud descriptor for place recognition
C++
548
star
12

VoxelMap

[RA-L 2022] An efficient and probabilistic adaptive voxel mapping method for LiDAR odometry
C++
479
star
13

mlcc

Fast and Accurate Extrinsic Calibration for Multiple LiDARs and Cameras
C++
479
star
14

FAST-LIVO2

FAST-LIVO2: Fast, Direct LiDAR-Inertial-Visual Odometry
471
star
15

HBA

[RAL 2023] A globally consistent LiDAR map optimization module
C++
437
star
16

IKFoM

A computationally efficient and convenient toolkit of iterated Kalman filter.
C++
420
star
17

M-detector

C++
362
star
18

LTAOM

C++
325
star
19

ROG-Map

C++
294
star
20

MARSIM

MARSIM: A light-weight point-realistic simulator for LiDAR-based UAVs
C++
283
star
21

D-Map

D-Map provides an efficient occupancy mapping approach for high-resolution LiDAR sensors.
C++
280
star
22

decentralized_loam

207
star
23

joint-lidar-camera-calib

Joint intrinsic and extrinsic LiDAR-camera calibration.
C++
194
star
24

SLAM-HKU-MaRS-LAB

In this repository, we present our research works of HKU-MaRS lab that related to SLAM
191
star
25

Voxel-SLAM

C++
185
star
26

Swarm-LIO2

Swarm-LIO2: Decentralized, Efficient LiDAR-inertial Odometry for UAV Swarms
158
star
27

dyn_small_obs_avoidance

C++
154
star
28

IPC

Integrated Planning and Control for Quadrotor Navigation in Presence of Sudden Crossing Objects and Disturbances
C++
147
star
29

btc_descriptor

137
star
30

PULSAR

C++
102
star
31

lidar_car_platfrom

48
star
32

iBTC

39
star
33

crossgap_il_rl

Python
38
star
34

multi_lidar_calib

28
star
35

Livox_handheld

25
star
36

mapping_eval

2
star