• Stars
    star
    147
  • Rank 251,347 (Top 5 %)
  • Language
    C++
  • License
    BSD 2-Clause "Sim...
  • Created over 5 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

3D-Lidar Camera Calibration using planar Point to to camera Plane Constraint

cam_lidar_calib: A ROS package to determine External Calibration b/w a Camera and a 3D-LIDAR

alt text The package is used to calibrate a Velodyne VLP-32 LiDAR with a Basler Camera. The methods used are fairly basic and sould work for any kind of 3D LiDARs and cameras. This software is an implementation of the work presented in the paper titled Extrinsic calibration of a 3d laser scanner and an omnidirectional camera. Here is a Dataset.

Contents

  1. Setup
  2. Calibration
  3. Cross Projection

Setup

It is necessary to have atleast the following installed:

  • ROS
  • Ceres
  • OpenCV (This ships with ROS, but standalone versions can be used)
  • PCL
  • Drivers for camera and LiDAR

ROS is used because it is easy to log data in a nearly synchronized way and visualize it under this framework. For Non-Linear optimization the popular Ceres library is used.

Experimental Setup

alt-text The image above show the sensors used, a Velodyne VLP-32 and a Basler acA2500, A checkerboard with known square dimension is also needed. I have used the checkerboard pattern available here. The default size is too small for our purpose so I used Adobe Photoshop to generate a bigger image with each squares checker pattern sized 0.075 m (7.5 cm). In my experience the bigger the pattern the better but the size must satisfy practical constraints like the field of view of the camera, etc.

Calibration

First, the camera intrinsics needs to be calibrated. I used the ros camera calibrator for the same using the checkboard I mentioned about in the previous section.

For external calibration, the checkboard is moved in the mutual fov of both the camera and the LiDAR. It is worth noting that rotational motion of the checkboard along off normal axes adds more constraints to the optimization procedure than rotation along normal to the checkerboard plane or translations along any direction. Each view, which has significant rotation wrt the previous view adds a unique constraint. As mentioned in the paper linked above, for the given setup, we need atleast 3 non coplanar views of the checkerboard to obtain a unique transformation matrix between the camera and the lidar.

I used functions available in OpenCV to find the checkerboard in the image and to determine the relative transformation between the camera and the checkerboard, this transformation matrix gives us information about the surface normal of the checkerboard plane.

Next, I used PCL to cluster the points lying in the checkerboard plane in the LiDAR frame.

For each view that can add to the constraint, we have one vector normal to the checkerboard plane expressed in the camera frame and several points lying on the checkerboard in the lidar frame. This data is used to form a objective function, the details of which can be found in the aforementioned paper. The Ceres library is used to search for the relative transformation between the camera and the lidar which minimizes this objective function. A demo is shown in the video below. First, we collect data from multiple views and then once we have sufficient information(ambigous) we run the optimization. As mentioned earlier, we need atleast 3 non coplanar views to zero in on a unique solution. Alt text

Cross Projection

Alt text To check the veracity of the external calibration parameter estimation procedure, I use the parameters to project the lidar points on the image and color the point cloud. The results are shown in the video above.

More Repositories

1

lidar_camera_calib

3D-Lidar Camera Calibration using edge Point to Backprojected Plane Constraint
C++
12
star
2

gtsam_tutorial

C++
7
star
3

lidar_image_projection

C++
6
star
4

lidar_ground_segmentation

Segmenting ground plane from LIDAR data
C++
5
star
5

movo

Monocular Visual Odometry using 3D-2D correspondences
C++
4
star
6

EKF-SLAM

MATLAB
2
star
7

Quadrotor_Control

Very basic models to get one's feet wet in the field of Aerial Robotics
MATLAB
2
star
8

VisionForMobileRobotics

Matlab code for assignments of the course on "Vision Algorithms for Mobile Robotics" : http://rpg.ifi.uzh.ch/teaching.html
MATLAB
2
star
9

skyviper_ros

ROS files related to work with the skyviper drone
C++
2
star
10

Control_of_Wheeled_Mobile_Robots

Various methodologies for control of Wheeled Mobile Robots
MATLAB
2
star
11

lidarodom

Lidar based Odometry
C++
1
star
12

AERO_626_Project

MATLAB
1
star
13

ply2bag

Convert ply files in a folder to rosbag file
CMake
1
star
14

visodom_vslam_documents

Important documents and papers on visual odometry and visual slam
1
star
15

ford_av_motion_compensation

ford_av_motion_compensation
C++
1
star
16

DogCatClassifier

Python
1
star
17

stereo-vo

Stereo Visual Odometry
C++
1
star
18

pcd_to_linescan

Convert PointCloud data to LaserScan
C++
1
star
19

optitrack_body_twist_gen

node to convert LAAS specific mocap data to nav_msg::Odometry
CMake
1
star
20

probabilistic_robotics

Some problems from Probablisitic Robotics Book
MATLAB
1
star
21

add_ring

ROS node which adds ring field to point cloud data from KITTI dataset
C++
1
star
22

3RRR_Parallel_Robot_Design

3RRR design in Catia and Animation in MATLAB
MATLAB
1
star
23

drone_controller

Simple ROS node to publish position setpoint to control a drone running in Gazebo(SITL)
CMake
1
star