• Stars
    star
    290
  • Rank 142,981 (Top 3 %)
  • Language
    C++
  • License
    BSD 2-Clause "Sim...
  • Created over 3 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

Target-free Extrinsic Calibration of a 3D Lidar and an IMU

imu_lidar_calibration

Target-free Extrinsic Calibration of a 3D Lidar and an IMU

Overview

This repository is a toolkit for calibrating the 6-DoF rigid transformation between a 3D LIDAR and an IMU. It's based on an Extended Kalman Filter based algorithm which exploits the motion based calibration constraint for state update. This algorithm does not depend on any calibration target or special environmental features, like planes, for determining the extrinsic calibration between a 3D-Lidar and an IMU.

Presentation Video

Paper

Prerequisites

This code base was tested and implemented in a Ubuntu 16.04 system.

  • ROS (tested with Kinetic)
  • GTSAM - 4.0.3 (This is used only to initialize the rotation between the sensors)
  • Ceres - 1.14.0
  • ndt_omp [Caution: This has been found to be unstable in newer ubuntu/pcl, you can use the package that already exists in this particular repository, I made it work in Ubuntu 20.04 with PCL 1.12]

Still, I realize that it may be difficult to build this on newer Ubuntu, hence docker. Although I have provided the script to run this, basic knowledge of docker is necessary.

Install

  • Clone the source code for ndt_omp and build it in your catkin workspace
  • Clone this code-base and build it in your catkin workspace

Sensor suite

As far the 3D Lidar is considered, currently this code-base supports Ouster-128 but it is easy to expand for other 3D Lidars. We have tested this code-base by downsampling our Ouster 128 lidar to 64, 32, 16 channel modes. The important pre-requisite is that the points in lidar pointcloud must come with a measurement/firing timestamp. We use a Vectornav VN 300 IMU. In our setup the Lidar outputs scans at 10 Hz and the IMU outputs measurements at 400 Hz, however, we have also tested our algorithm with IMU running at 50 Hz, 100 Hz & 200 Hz.

alt text

Procedure

Intrinsic Calibration of IMU

First of all, we need to determine the noise characterisitcs of the IMU biases. Several toolboxes are available online to determine this. We used https://github.com/rpng/kalibr_allan . This requires MATLAB. Other alternatives are: https://github.com/mintar/imu_utils , https://github.com/ori-drs/allan_variance_ros

Data collection for extrinsic calibration

We need to excite all degrees of freedom during collecting data required for extrinsic calibration. An example video can be found here: Data collection procedure

Please find a sample dataset here to try out the algorithm yourself: https://drive.google.com/file/d/1o20lcmXU1HxOP4KsLXrXbjT2jTfjeaJh/view?usp=sharing

Inter-sensor rotation estimation

alt text

roslaunch linkalibr ros_calib_init.launch

I am working on making this code more generic, until then please take care to change the file path names.

Inter-sensor translation estimation

alt text

roslaunch linkalibr linkalibr_ouster_vectornav.launch

I am working on making this code more generic, until then please take care to change the file path names.

The results are stored in folder linkalibr/data as a homogenous transformation matrix in text file I_T_L_final.txt

Plots

We can plot the results of the EKF based estimation process by using the MATLAB plot files available in folder linkalibr/data.

The plot for calibration parameters is shown below:

Estimated inter-sensor translation parameter

alt text

Estimated Inter-sensor rotation parameter

alt text

Some more figures...

Estimated IMU Trajectory

alt text

Estimated IMU Velocity

alt text

Result of scan matching using motion compensated scans

alt text

Acknowledgement

This codebase was developed under the OpenVINS framework.