关于cam_lidar_calibration(2021)安装使用
一.简介
在众多的lidar和camera标定的开源程序中,效果相对不错的就是cam_lidar_calibration了,其余开源要么标定过程复杂、要么误差太大,该开源包经过一些改版。下列是cam_lidar_calibration系列的开源算法
时间 | 对应的论文 | 算法解析 | 开源算法地址 |
---|---|---|---|
2019(最原始版本) | Automatic extrinsic calibration between a camera and a 3D Lidar using 3D point and plane correspondences | 利用棋盘格作为定目标,通过利用标定板的几何形状,计算lidar点云中的中线点和法向量,并求得其在camera下的中线点和法向量,优化后完成标定。 | https://gitlab.acfr.usyd.edu.au/sverma/cam_lidar_calibration |
2020 | 同上 | 同上(根据2019的代码做了一点修改,但是说明文档在CSDN中需要付费) | https://github.com/AbangLZU/cam_lidar_calibration |
2021 |
Optimising the selection of samples for robust lidar camera calibration 中文 |
同为悉尼大学ACFR实验室,基于2019年的改进版,采用质量变异性(VOQ)来减少用户选择数据的错误,克服了过度拟合的问题,比2019年版本的标定过程更为稳健。 | https://github.com/acfr/cam_lidar_calibration |
二.代码安装测试
官方说明文档介绍的挺详细,提供了本地安装和Docker的安装。
只测试了本地Ubuntu20.04安装,以本地安装为例。
在Github的代码的作者为Ubuntu18.04,按照官网的方法需要修改部分代码和命令。下面是安装步骤:
-
安装依赖
sudo apt update && sudo apt-get install -y ros-noetic-pcl-conversions ros-noetic-pcl-ros ros-noetic-tf2-sensor-msgs # Ubuntu20.04默认为python3 sudo apt install python3-pip pip3 install pandas scipy
-
下载代码编译安装
mkdir -p cam_lidar_calibration_ws/src cd cam_lidar_calibration_ws/src git clone https://github.com/acfr/cam_lidar_calibration.git cd .. catkin build source devel/setup.bash
编译时如果遇到关于optimise.h报错#include <opencv/cv.hpp>不存在时,修改为#include <opencv2/opencv.hpp>
-
测试:在源码中,作者该出了测试的标定数据集,输入命令进行测试标定:
roslaunch cam_lidar_calibration run_optimiser.launch import_samples:=true
该程序根据am_lidar_calibration_ws/src/cam_lidar_calibration/data/vlp/文件夹下的pose.csv标定,在该文件夹生成一个标定camera和lidar外参文件,每一行则是迭代后的结果。
接着获取评估校准结果
roslaunch cam_lidar_calibration assess_results.launch csv:="$(rospack find cam_lidar_calibration)/data/vlp/calibration_quickstart.csv" visualise:=true
-
运行标定自己的camera和lidar的外参数。
-
制作标定板:标定板要尽量做得大些,标定文件PDF下载,有设置好的尺寸,作者采用的是A1 - 95mm squares - 7x5 verticies, 8x6 squares。将棋盘纸张固定在一个板上,使他们的中心尽量对齐,边缘保持平行,在后面需要设置参数。下图为A1大小的7*5内部顶点和95mm正方形。
-
设置参数:主要修改
cam_lidar_calibration/cfg/camera_info.yaml
和params.yaml
-
camera_info.yaml
:设置是否为鱼眼相机、像素宽和高、内参矩阵和失真系数。相机参数自行标定,ROS官方标定教程distortion_model: "non-fisheye" width: 640 height: 480 D: [0,0,0,0] K: [617.68,0.0,325.963,0.0,617.875,242.513,0.0,0.0,1]
-
params.yaml
# Topics camera_topic: "/camera/color/image_raw" camera_info: "/camera/color/camera_info" lidar_topic: "/velodyne_points" #Dynamic rqt_reconfigure default bounds,点云的选取范围 feature_extraction: x_min: -10.0 x_max: 10.0 y_min: -8.0 y_max: 8.0 z_min: -5.0 z_max: 5.0 # Properties of chessboard calibration target chessboard: pattern_size: #棋盘的内部顶点7*5 height: 7 width: 5 square_length: 95 #棋盘格的长度mm board_dimension: # 安装棋盘打印的背板的宽度和高度。 width: 594 height: 897 translation_error: #棋盘中心与背板中心的偏移量(见下图)。 x: 0 y: 0
棋盘中心与背板中心的偏移量
-
-
正式开始标定:
-
开启程序采集表定数据,运行命令:
roslaunch cam_lidar_calibration run_optimiser.launch import_samples:=false
会出现RVIZ和rqt_reconfigure窗口,在RVIZ中panels->display修改相机的话题和激光雷达点云对应的frame_id。
-
采集数据:分割出标定板的点云
调整rqt_reconfigure /feature_extraction的xyz最大值最小值以使得标定板的点云和周围环境分开,使其仅显示棋盘。如果棋盘没有完全隔离,可能会影响棋盘的平面拟合,还会导致棋盘尺寸误差较大。下图是过滤点云前后效果:
在过滤周围环境点云后,在rviz中点击Capture sample采集样本,会出线绿色框代表根据点云拟合出来的标定板平面,如图:
若未出现绿色拟合的矩形,则需要重新调整点云的XYZ范围,再进行capture sample采集样本。激光点云打在标定板上至少需要7个环形。 -
标定:
采集样本至少3个才能运行标定,样本越多越好,最好采集10个样本以上,再点击rviz中的optimise进行标定,在优化过程中将会在cam_lidar_calibration/data生成当前时间日期的文件夹,存放采集的图像、点云pcd、位姿,标定后camer和lidar外参文件。 -
评估参数和重投影误差:
roslaunch cam_lidar_calibration assess_results.launch csv:="$(rospack find cam_lidar_calibration)/data/2022-02-10_13-48-12/calibration_2022-02-10_14-13-41.csv" visualise:=true
出现重投影效果图像:
终端出现标定参数和重投影误差:---- Calculating average reprojection error on 12 samples ---- 1/ 12 | dist= 4.069m, dimerr= 39.768mm | error: 2.948pix --> 20.033mm 2/ 12 | dist= 3.759m, dimerr= 43.992mm | error: 2.358pix --> 14.689mm 3/ 12 | dist= 3.038m, dimerr= 61.650mm | error: 0.240pix --> 1.213mm 4/ 12 | dist= 2.951m, dimerr= 52.597mm | error: 0.129pix --> 0.628mm 5/ 12 | dist= 2.913m, dimerr= 120.838mm | error: 0.782pix --> 3.798mm 6/ 12 | dist= 2.665m, dimerr= 76.147mm | error: 3.219pix --> 14.106mm 7/ 12 | dist= 2.482m, dimerr= 69.678mm | error: 2.728pix --> 11.332mm 8/ 12 | dist= 2.307m, dimerr= 36.923mm | error: 2.659pix --> 10.284mm 9/ 12 | dist= 2.118m, dimerr= 110.454mm | error: 6.066pix --> 21.332mm 10/ 12 | dist= 2.504m, dimerr= 66.145mm | error: 1.402pix --> 5.853mm 11/ 12 | dist= 2.845m, dimerr= 11.296mm | error: 1.408pix --> 6.616mm 12/ 12 | dist= 2.828m, dimerr= 98.653mm | error: 0.719pix --> 3.536mm Calibration params (roll,pitch,yaw,x,y,z): -1.5416,-0.0047,-1.4423,0.0059,-0.0062,0.0149 Mean reprojection error across 12 samples - Error (pix) = 2.055 pix, stdev = 1.663 - Error (mm) = 9.452 mm , stdev = 7.007
-
-