Official Implementation of the paper Targetless Lidar-camera Calibration via Cross-modality Structure Consistency
| 00 | 02 | 03 |
|---|---|---|
![]() |
![]() |
![]() |
| 04 | 05 | 07 |
|---|---|---|
![]() |
![]() |
![]() |
These trajectories are not suitable for hand-eye calibration because of lack of adequent rotations around at least two directions (only in yaw). Other hybrid methods may also suffer from the bad initial extrinsic estimation from hand-eye calibration. We believe this proposed method offers a valuable tool to resolve this problem.
rotation units: degreetranslation units: cm- Accuracy reserved to
0.01
| Sequence | Roll | Pitch | Yaw | tX | tY | tZ | Rotation RMSE | Translation RMSE |
|---|---|---|---|---|---|---|---|---|
| 00 | -0.12 | -0.22 | -0.07 | 2.93 | 1.59 | 0.18 | 0.26 | 3.33 |
| 02 | -0.01 | -0.25 | -0.16 | -2.80 | 1.63 | 1.18 | 0.29 | 3.45 |
| 03 | -0.08 | -0.10 | -0.09 | -3.25 | 3.23 | 1.22 | 0.15 | 4.74 |
| 04 | 0.01 | -0.09 | 0.05 | 1.03 | -0.19 | 1.10 | 0.11 | 1.52 |
| 05 | 0.01 | -0.19 | -0.15 | 1.95 | 1.56 | -0.54 | 0.24 | 2.56 |
| 07 | -0.05 | -0.00 | -0.20 | 1.07 | 2.07 | 0.14 | 0.21 | 2.34 |
- Examples of Quanlitative Results
| Seq | Predicted | Ground-truth |
|---|---|---|
| 00 | ![]() |
![]() |
| 02 | ![]() |
![]() |
| 03 | ![]() |
![]() |
| 04 | ![]() |
![]() |
| 05 | ![]() |
![]() |
| 07 | ![]() |
![]() |
| C++ | CMake | g++ | python | System |
|---|---|---|---|---|
| C++ 17 | CMake 3.25 | 9.4.0 | 3.8 | Ubuntu 20.00 |
More recent version would be OK.
- Eigen 3 (
libeigen3-dev) - OpenMP (
libomp-dev) - OpenCV 4.x
- Pangolin (visual tools for ORB_SLAM2)
- g2o 2023 (
-DG2O_USE_OPENMP=ON) - Open3D (Point Cloud IO, ICP)
- Nomad (Global Optimization Algorithm)
- Copy Thirdparty and Vocabulary directories to src/orb_slam/
Troubleshooting
Note that the implementation of ORB_SLAM2 in our repo is different from the original one, so DO NOT copy the whole ORB_SLAM2 repo to replace our directory - Build and Compile:
cd build && cmake .. -Wno-dev && make -jTroubleShooting
If you have installed g2o through ROS (if you have ROS packages like `base_local_planner`/`teb_local_planner`/`mpc_local_planner`), please exclude it from LD_LIBRARY_PATH environment variable, or `source config/settings.sh`. - Argparse Support (Acknowledge argparse ) : use
-hor--helpfor each executable cpp file to view help.
Our algorithm requires 3D visual map (scaleless), 3D pointcloud map, 2D feature points for each frame, relative poses of cameras and LiDAR.
An example command for KITTI 00 Sequence:
./orb_store ../data/00/ ../config/orb_ori/KITTI00-02.yaml ../data/Vocabulary/ORBvoc.txt ../KITTI-00/slam_res/Twc.txt ../KITTI-00/KeyFrames/ ../KITTI-00/Map.yml --slow_rate 1.5
../data/00/: sequence directory of KITTI Sequence 00../config/orb_ori/KITTI00-02.yaml: yaml file for ORB_SLAM../data/Vocabulary/ORBvoc.txt: DBoW2 Vocabulary txt file for ORB_SLAM../KITTI-00/slam_res/Twc.txt: KeyFrame poses saved by ORB_SLAM, in KITTI format../KITTI-00/KeyFrames/: KeyFrame information saved by ORB_SLAM, can be restored during runtime../KITTI-00/Map.yml: Map saved by ORB_SLAM, can be restored during runtime--slow_rate 1.5 [Optional]: Slow Rate of ORB_SLAM2. Duration between Frames: computation + wait_time >= 1.5 * real timestamp. Largerslow_rateis needed for a less powerful CPU.1.5is recommended for a I9-12900KF CPU.
an example command for KITTI 00 Sequence:
./floam_run ../data/00/velodyne/ ../KITTI-00/slam_res/floam_raw_00.txt
../data/00/velodyne/: directory containing the Lidar PointClouds, whose filenames must be sorted by timestamp.../KITTI-00/slam_res/floam_raw_00.txt: Lidar Poses Estimated by F-LOAM.
Note
Note that the number of Lidar Poses and Camera poses are different because ORB_SLAM only saved KeyFrame Poses. However, the File Id (FrameId) of these KeyFrames are saved to 'FrameId.yml' in the same directory of 'Map.yml'An example command for KITTI 00 Sequence:
./floam_backend ../config/loam/backend.yml ../KITTI-00/slam_res/floam_raw_00.txt ../data/00/velodyne/
../config/loam/backend.yml: config file of backend optimzation../KITTI-00/slam_res/floam_raw_00.txt: Lidar poses estimated by F-LOAM../data/00/velodyne/: directory containing the Lidar PointClouds, whose filenames must be sorted by timestamp.
../KITTI-00/KeyFrames: KeyFrame directory includes information of KeyFrames../KITTI-00/Map.yml: Visual Map built by ORB_SLAM../KITTI-00/FrameId.yml: Yaml file that contains Frame indicces of KeyFrames (will saved in the same directory of "Map.yml"../KITTI-00/slam_res/Twc.txt: KeyFrame Poses estimated by ORB_SLAM../KITTI-00/slam_res/floam_raw_00.txt: Lidar Poses estimated by F-LOAM (the number of itmes in this file is not equal to that inTwc.txt)../KITTI-00/slam_res/floam_isam_00.txt: Lidar Poses Optimized by iSAM ((the number of itmes in this file is not equal to that inTwc.txtbut equal tofloam_raw_00.txt
An example command for KITTI 00 Sequence:
./he_calib ../config/calib/00/he_calib.yml
- A file with 13 entries will be saved to
../KITTI/calib_res/he_rb_calib_00.txt. - The calibration result of the orindary hand-eye calibration is also saved for checking:
../KITTI/calib_res/he_calib_00.txt.
Nomad library must be correctly installed before this step.
An example command for KITTI 00 Sequence:
./iba_global ../config/calib/00/iba_calib_global.yml
The final calibration result will be saved to ../KITTI-00/calib_res/iba_global_pl_00.txt
Two parameters in ../config/calib/00/iba_calib_global.yml are used to create variants for ablation experiments:
runtime:
err_weight: [1.0, 1.0]
use_plane: true- set
use_planetotrueanderr_weightto[1.0,1.0]to applyCBA+CA (PT+PL)method in Table 1 of our paper (proposed). - set
use_planetofalseanderr_weightto[1.0,1.0]to applyCBA+CA (PT)method in Table 1 of our paper. - set
use_planetofalseanderr_weightto[1.0,0.0]to applyCBAmethod in Table 1 of our paper.
Remember to set different
io:
ResFile: calib_res/iba_global_baonly_00.txtfor different methods, or the prior files will be overwritten.
../data/00/->../data/xx/for theorb_storeprogram;../config/orb_ori/KITTI00-02.yaml->../config/orb_ori/KITTIxx-xx.yaml;KITTI-00->KITTI-xxfor all aurgments;../data/00/velodyne/->../data/xx/velodyne/;floam_raw_00.txt->floam_raw_xx.txt;floam_isam_00.txt->floam_isam_xx.txt;


















