关于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
2021Optimising 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,按照官网的方法需要修改部分代码和命令。下面是安装步骤:

  1. 安装依赖

    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
    
  2. 下载代码编译安装

    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>

  3. 测试:在源码中,作者该出了测试的标定数据集,输入命令进行测试标定:

    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
    
  4. 运行标定自己的camera和lidar的外参数。

    • 制作标定板:标定板要尽量做得大些,标定文件PDF下载,有设置好的尺寸,作者采用的是A1 - 95mm squares - 7x5 verticies, 8x6 squares。将棋盘纸张固定在一个板上,使他们的中心尽量对齐,边缘保持平行,在后面需要设置参数。下图为A1大小的7*5内部顶点和95mm正方形。
      在这里插入图片描述

    • 设置参数:主要修改cam_lidar_calibration/cfg/camera_info.yamlparams.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
        

基于上述代码,我改了一下,在这个里面的激光雷达相机联合标定会更加准确一些https://github.com/Xujianhong123Allen/sensor_calibration/tree/master/cam_lidar_calibration


Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐