最近两个月做了很多跟标定相关的工作,也学习了一些教学视频。学而不思则罔,只学习,而不去思考事物与事物之间的关联性,自己的知识就是一座座孤岛,知识体系就无法建立起来,没法从更高的维度看待问题,就会容易迷惑,技能无法跟着年龄的增长而成长。因为我主要做的是相机与激光雷达的标定,所以下文主要梳理相机与激光雷达之间的标定。
什么叫标定
汽车领域最早这么定义标定:为了满足如发动机、整车的性能要求,修改调整或者优化控制器内部算法相关参数的过程。在自动驾驶领域的标定分为两个部分,一个是传感器内部的映射关系,另外一个是各个传感器之间的位姿关系,标定技术是多传感器融合的基础技术。
车载传感器主要有激光雷达、环视相机、广角相机、毫米波雷达、超声波雷达、IMU、GNSS、GPS等等。激光雷达输出结果是三维点云和反映物体材质的强度值,相机输出图像,毫米波雷达输出(距离,速度,角度,反射强度),超声波雷达输出(3m~5m距离), IMU输出(加速度数据、角速度数据、磁场数据)。
标定按照场景分为在线标定、离线标定,售后标定、产线标定,研发标定、数采标定、真值标定。
按照标定方法分类:有目标、无目标
精度验证
通过可视化进行判断: 雷达和相机的标定可以查看图像和点云是否对齐来进行判断 雷达和雷达的标定可以通过看雷达和雷达之间的配准来进行判断 相机和相机的标定可以通过看环视拼接效果进行可视化判断
通过设计验证标准 可以根据某个标定的预期效果来设计定量评估标准。例如,相机畸变标定之后的 ”直线特征”
通过下游算法进行评估 测距算法,测距是否准确来判断相机内外参是否标定准确。感知算法,不同传感器感知融合的误差是否过大来判断外参标定是否准确。规控算法,车辆行驶是否正常,标定参数不对导致的规控异常
直接测量进行判断 测量传感器之间的位移,判断标定的位移量和测量之间差别是否过大。
产线标定(EOL标定)
下面两张图是某些厂家的产线标定间。可以实现激光雷达和相机的标定。地面的标定板实现环视相机的标定,墙体的图案实现激光雷达或者前视、周视相机标定。
标定流程与算法:首先地面的车辆摆正器可以保证每次车辆都在同样的位置。标定间的每个图案的角点在车体坐标系的位置都是已知的,相机内参已知,图案角点在图像坐标系已知,可以采用2d-3d的求解算法(pnp)计算出相机与车体坐标系的关系。激光雷达点云可以检测到图案角点在激光雷达坐标系位置,该点在车体坐标系已知,利用3D-3D求解算法(ICP)可以求出激光雷达和车体的位姿关系。
标定间
下图的标定间属于很多自动驾驶公司的方法。
标定流程与算法:采用多组3D和2D匹配点实现相机与激光雷达的外参标定。通过激光雷达作为中转,实现所有相机之间的位姿标定,另外也可以采用相机与相机共享区域的标定板来实现所有相机之间的外参标定。激光雷达与激光雷达之间的标定,首先通过主雷达实现建图与轨迹记录,采用初始外参将副雷达转换到主雷达坐标系,估算出副雷达的每个点云对应的主雷达的位置和姿态,然后采用最近邻点云配匹配,利用点云配准算法初始化外参,多次配准,获得最后的标定结果。
在空旷房间的墙面贴满不同的二维码,然后在标定间中间放置一个基于激光雷达的毫米级高精度Rigel激光扫描仪,通过对墙上二维码的多次扫描,完成3D建模,获得了标定间任何一个点的3D位置。根据建模结果输出一个查找表,查找表由两栏组成,第一栏是Tag_ID,表示各个二维码的ID编号,第二栏是二维码四个角的3D位置信息。之后即可在标定间进行不同传感器的参数标定。最后依然采用PNP和ICP算法实现相机与激光雷达之间的标定。
离线标定
激光雷达与相机标定 常规的标定都是先标定相机内参,然后在标定外参,但是如果相机内参不准,那么最后的结果都会不准,所以需要联合标定。
手动标定
opencalib 工具提供了手动标定的算法。该工具通过将激光雷达点云反投影到图片上查看,手动按钮可以调整相机内参和外参。实际使用经验来看只能微调,而且必须三个以上场景都调整对齐才可以。
基于目标物的联合标定(target-free)
opencalib 工具箱提供两种算法。整体思路就是,将图像进行分割,把车道线和路灯作为正交性质利用起来,将点云投影到分割图像上,落在车道线和路灯上最多,则说明标定结束。实际上是一种优化算法,暴力采用多个外参进行投影,然后选择投影点数量最多的外参。
基于标定板的联合标定(target)
参考论文:Joint camera intrinsic and lidar-camera extrinsic calibration
思路:校准摄像头初始内参和摄像头初始外参;然后,根据这些参数和标定板尺寸计算图像的2D圆中心点。通过提取圆心在激光雷达的位置,利用激光雷达-摄像头的标定参数将圆心3D点投影到图像平面上。计算的2D点和投影的2D点形成多个2D点对。用这些点对之间的欧氏距离来细化标定参数。同时,在优化过程中加入棋盘角点的3D-2D点重投影约束条件。
采用matlab 工具箱
参考链接:https://ww2.mathworks.cn/help/lidar/ug/lidar-and-camera-calibration.html
主要接口函数
主要调用了matlab 底层工具箱的方法
1、获得棋盘格在相机坐标系下面的坐标
[imageCorners3d,checkerboardDimension,dataUsed] = estimateCheckerboardCorners3d(imageFileNames,intrinsic.cameraParams,squareSize);
2、检测获得点云的棋盘格表面
[lidarCheckerboardPlanes,framesUsed,indices] = detectRectangularPlanePoints(ptCloudFileNames,checkerboardDimension,ROI=roi);
3、这个函数接口可以获得相机与激光雷达的位姿
[tform,errors] = estimateLidarCameraTransform(lidarCheckerboardPlanes, imageCorners3d,intrinsic.cameraParams);
4、通过可视化进行直观验证
点云投影到相机projectLidarPointsOnImage 与 相机投影到点云fuseCameraToLidar 和 可视化二者helperFuseLidarCamera
5、可视化 旋转误差、平移误差和反投影误差
helperShowError(errors)
注意事项
1、点云平板面不好检测,我这里通过手动meshlable 清理了多余的点云,提高检测率。实际采集时候可以通过在空旷地面采集数据。
2、相机内参标定,采用针孔相机+8畸变系数时候,应该采集足够多的图片才可以,而且效果不太行。
3、整个过程采用了去畸变之后的图像实现。
深度学习的方法
LCCNet:LIDAR and camera Self-Calibration using Cost Volume NetWork
损失函数:1、外参的回归损失,2、点云距离损失
激光雷达与激光雷达
手动标定
opencalib 也是提供了一个工具。类似相机与激光雷达界面。
自动标定
基于ICP算法。两种约束,1、先粗匹配,2、计算法向量(例如50个点组成面的法向量)。
空间占用格,1、空间分为很多小格子; 2、统计点云占用格子的数量; 3、优化得到空间占用最少的外参
深度学习方法,opencalib:https://github.com/OpenCalib/LiDAR2LiDAR
在线标定
在车辆行驶过程中,由于地面不平导致震动等原因,会导致传感器位置与原位置产生偏离,因此有必要每隔一定的时间对传感器进行校准。
在线标定不标定位移,用测量值和CAD值,因此,对位移加一个限制以免影响整体优化。
相机自标定
相机自标定:在车行驶过程中,通过车自身每一帧的位姿变换,与估计的相机每一帧的位姿变换,获取相机与车中心的位姿关系,得到相机到车中心的旋转矩阵R,大概20分钟。该过程实际就是手眼标定(AX=XB)。已知两个时刻,车体与车体之间的位姿A,相机与相机之间的位姿B,求解两个传感器之间的姿态X。A和B的求解方法有里程计和光流法。
激光雷达自标定
激光雷达自标定:在车行驶过程中,通过车自身每一帧的位姿变换,与估计的激光雷达每一帧的位姿变换,获取激光雷达与车中心的位姿关系。运用手眼标定法,得到激光雷达到车中心的旋转矩阵,整个过程耗时7到15分钟。A求解采用点云特征(边缘点和平面点)匹配求解。
lidar2lidar与lidar2camera
离线标定里面提到的深度学习方法也是在线标定。
在线标定自检
通过二分类网络进行自检。https://github.com/OpenCalib/LiDAR2camera_self-check
camera2car
相机中消失点是指当一个物体在物体空间里沿着一条直线移动,而这条直线在投影到相机视图中时,其端点会被重叠在同一个点上,这个点就称为相机中消失点
消失点标定最早定义:B. Caprile and V. Torre, “Using vanishing points for camera calibration,” International journal of computer vision, vol. 4, no. 2, pp.127–139, 1990
基于深度学习的方法:https://github.com/jwlee-vcl/CTRL-C
lidar2car
1、得到点云地面平面(ax+by+cz+d=0)->利用车垂直于地面获得约束->yaw、pitch、roll
2、要求走直线 H. Wang, C. Wang, C.-L. Chen, and L. Xie, “F-loam: Fast lidar odometry and mapping,” in 2021 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS). IEEE, 2021, pp. 4390–4396
环视相机标定
环视相机主要用于环视拼接、障碍物检测和车位检测。
手动标定
opencalib也提供了手动标定的工具。可以用于最后的微调。
产线标定
跟上面产线标定提到的算法一致,车辆和棋盘格的坐标都是严格已知的,然后pnp算法来计算外参。
在线标定
SLAM按误差函数的形式可以分为两类:最小化光度误差;最小化重投影误差。最小化光度误差也称直接法,误差函数的形式是两个像素的灰度值相减;
最小化重投影误差也称特征点法,误差函数的形式是像素的坐标值相减。
利用上述内容获得关键点(纹理点),opencalib采用的策略是随机搜索方法。将初始外参6个参数按照设定步长进行调整,用特征点的匹配作为损失函数。
开源标定工具
OpenCV与Matlab
OpenCalib和Matlab标定工具箱,用于标定相机内参,双目相机标定,matlab 新版本支持lidar2camera
autoware
Autoware.ai 一个开源的自动驾驶系统 lidar2camera, lidar2lidar标定 代码链接: https://github.com/Autoware-AI/autoware.ai
结论:手动选择平面, 没法反投影,使用起来麻烦
kalibr
Kalibr 一个专门用于slam多传感器标定的功能包,可以实现单目相机标定、双目标定以及单、双目相机系统与IMU的联合标定 代码链接:https://github.com/ethz-asl/kalibr
Teri4Calib
https://github.com/tier4/CalibrationTools
深蓝学院标定开源代码
https://www.shenlanxueyuan.com/page/129
https://github.com/calibtoolkit/calibration_kit/tree/main/calibration_algorithm
相比较opencalib方法,他们的传感器要少很多,建议docker。
opencalib
论文地址:https://arxiv.org/pdf/2205.14087 代码地址:https://github.com/PJLab-ADG/SensorsCalibration
数据集采用的是仿真数据集,只考虑理想情况,只能作为参考使用。论文要落后于代码
相机与激光雷达联合标定
https://github.com/TurtleZhong/camera_lidar_calibration
参考资料