本文仅用于个人纪录。
激光雷达与相机标定
基本原理即寻找雷达和相机的对应点,然后求解外参RT问题。
难点在于,如何进行数据关联,即雷达和普通相机的电如何确定对参数的约束方程?
手工标定法
一类方法手工标定对应点,即从点云中和图像中人工点击对应的点,然后进行计算。例如:https://github.com/zhenzhenxiang/autoware_camera_lidar_calibrator
自动法(特征提取与配准)
一类典型的方法是从LiDAR和普通相机中提取特征点,然后做3D和2D的标定,但这种方法精度不高。因此出现了一些3D和3D的对准。
另一类自动提取采用简单的特征,进行精确关联,然后3D配准,例如:
LiDAR-Camera Calibration using 3D-3D Point correspondences
官方公布的代码:https://github.com/ankitdhall/lidar_camera_calibration
或利用棋盘格角点检测,进行精确的关联,例如棋盘格不同的反射率找角点:
Reflectance Intensity Assisted Automatic and Accurate Extrinsic Calibration of 3D LiDAR and Panoramic Camera Using a Printed Chessboard
https://github.com/mfxox/ILCC
或者利用棋盘提取边缘特征,然后进行直线/平面的约束配准,例如:
Automatic Extrinsic Calibration of a Camera and a 3D LiDAR using Line and Plane
其他人复现的代码:https://github.com/farhad-dalirani/extrinsic_calibration-of_a_camera_and_a_3d_lidar_using_line_and_plane_correspondences
或者更加自然的场景,例如纸箱:
Accurate Calibration of LiDAR-Camera Systems Using Ordinary Boxes
或者其他更加自然的场景。略掉了一堆基于learning的配准。
Zhou18IROS的方法
- 提取棋盘格边界和平面在LiDAR系下的参数:
首先用ransac提取出平面参数,然后寻找平面的大致边界点,可以区分出棋盘格的左右,再通过两边界点之间的方向确定一侧的点对应的两条边;
为避免噪声,将实测的点投影到平面后再投影到对应的一行水平扫描线,从而确定精确的边界线。四条边记为 L i j L L_ij^L LijL,即第i个位姿的第j条边,在L系下的坐标,以及平面法向量 n i L n_i^L niL - 提取棋盘格边界和平面在Camera系下的参数:
首先棋盘格参数已知,可以计算棋盘格空间平面;再根据棋盘格边界在图像中的直线,投影到三维空间与棋盘格平面求交线,确定三维参数,四条边与法向量记作 L i j C , n i L L_ij^C, n_i^L LijC,niL - 求解外参
求解外参是基于约束,计算从LiDAR到Camera的旋转 R L C R_L^C RLC 和平移 t L C t_L^C tLC;
基于边的约束: R L C d i j L = d i j C R_L^C d_{ij}^L=d_{ij}^C RLCdijL=dijC ( I − d i j C ( d i j C ) T ) ( R L C Q i j k L + t L C − P i j C ) = 0 3 × 3 (I-d_{ij}^C(d_{ij}^C)^T) (R_L^C Q_{ijk}^L+t_L^C-P_{ij}^C)=0_{3\times3} (I−dijC(dijC)T)(RLCQijkL+tLC−PijC)=03×3 其中d为空间直线上的法向量。第一个式子就是法向量的旋转,二式中Q_ijk是LiDAR下边界上一点,经过平移旋转后做差应该是Camera下棋盘格的边界线,与左侧相乘是另一个约束(但没搞清楚具体的约束含义是啥)。
同理,可以计算法向量的约束
作者后续给出证明,平行的两条线的约束本质上是一样的,且一个pose给出的约束足够计算Rt参数。但还给出了多个pose的基于SVD分解的求解方法,能够实现更高的精度。
Dhall17Arxiv的方法
直接利用3D点进行类似ICP的配准。其中camera的3D点是通过aruco计算出来,LiDAR的是寻找卡片的角点,以实现DA。具体过程略。