一. 背景介绍
联合标定是做多传感器融合的基础工作,也是一个没有最好只有更好的研究方向,相关论文也是层出不穷,网上也有许多开源的工作,包括Autoware的工具箱我也试过,感觉标定效果不是特别好,标定效果不稳定,有时候好,有时候不好(也可能当时经验有限,好多点没注意),后来Matlab2020b推出了激光雷达和相机的联合标定教程,简单试了一下,效果不错,2020b中有个bug, 2021a中已经修复了,并且把demo做成了像相机标定一样的工具箱,后来多次标定也总结了一些标定过程中的经验,简单分享一下.
当然如果你有标定间,就不要看了,没标定间的标定精度高的...
二. 标定教程
所有的博客资料都有时效性,官方文档是一直在更新的,参考官方教程,仔细看一遍,可避免一些低级问题.
官方链接:Lidar and Camera Calibration- MATLAB & Simulink- MathWorks 中国
What Is Lidar-Camera Calibration?- MATLAB & Simulink- MathWorks 中国
标定操作视频:帮助中心 - MATLAB & Simulink
标定原理可参考论文:
[1] Zhou, Lipu, Zimo Li, and Michael Kaess. “Automatic Extrinsic Calibration of a Camera and a 3D LiDAR Using Line and Plane Correspondences.” In 2018 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), 5562–69. Madrid: IEEE, 2018. https://doi.org/10.1109/IROS.2018.8593660.
三. 标定流程:
1. 使用Matlab Camera Calibrator标定相机内参
注意事项:
(1)首先标定板一定要平整,不能轻易因为外力发生弯曲或者随时间发生形变,棋盘格表面选用哑光材料覆盖,确保边缘清晰。
(2)标定板一定要覆盖全整个相机视野,可以将相机视野范围划分为九宫格,确保标定板主体出现在每个格子中,每个位置前后左右倾斜采图。
(3)倾斜标定板幅度不要过大,标定板和相机平面尽量保持在45度以内。
(4)在标定后可以观察重投影误差,可以删除误差大的图片重新标定,删除图片时需要保证样本的均衡性,图像视场的每个区域保留数目应差不多,不能标定板位于图像边缘或角落的全部删除, 最好mean error 在0.25下。
(5)多采图片,标定板一定要出现在图像边缘和四个角,能更好的估计畸变系数。
(6)参考Evaluating the Accuracy of Single Camera Calibration文中所提到一些提高精度的tips:主要针对宽视场的相机,可以计算3个径向畸变系数,切向畸变和skew参数。
How to Improve Calibration Accuracy
Whether or not a particular reprojection or estimation error is acceptable depends on the precision requirements of your particular application. However, if you have determined that your calibration accuracy is unacceptable, there are several ways to improve it:
Modify calibration settings. Try using 3 radial distortion coefficients, estimating tangential distortion, or the skew.
Take more calibration images. The pattern in the images must be in different 3D orientations, and it should be positioned such that you have keypoints in all parts of the field of view. In particular, it is very important to have keypoints close to the edges and the corners of the image in order to get a better estimate of the distortion coefficients.
Exclude images that have high reprojection errors and re-calibrate.
(7)相机内参的标定最好在装车之前完成,这样可以保证采图均匀有效,标定内参效果更好。
(8)如果相机装在车内玻璃下面,应尽可能靠近玻璃,四周用外壳挡住,避免玻璃反光影响图像。内参建议隔着玻璃重新标定。
2. 采集联合标定数据
注意事项:
(1)采集数据前确保传感器刚性连接,不会被随意移动位置,或者震动导致姿态变化.
(2)没有特殊要求,激光雷达和相机原点越近越好,视差小,有利于后期融合算法的开发.
(3)最好做完硬件时间同步再采数据,尽可能保证后期点云和图像是为同一时刻, 这里可以采用市场上一些成熟的时间同步盒,图像采集卡,或者一些成熟的域控制器产品,在保证相机和激光雷达时钟源一致情况下,最好可以读取相机拍摄触发时刻.或者激光雷达触发相机拍照,配置激光雷达相位锁定(旋转式机械雷达)位于相机朝向中心.
(4)传感器驱动:激光雷达点云和图像数据借助ROS发布出来,注意驱动中时间戳获取形式。
(5)离线程序订阅话题根据时间戳,将激光雷达和相机同步数据保存成0001.pcd和0001.jpg文件,名称一致。
(6)标定板最好无白边,黑白格为8*9奇数和偶数,不要完全对称,表面哑光材料覆盖.
(7)标定场地最好水平空旷,标定板附近不要太多杂物,更有利于点云平面的拟合.
(8)标定板参考教程中,要45度摆放,可以更准确拟合角点,不要随意转动.
(9)最好标定板固定采集同步数据,如果人拿着标定板,每个位置保持一秒,不要快速移动.
(10)采集联合数据参考相机标定,标定板要完整覆盖图像视野,可前后移动3-5米采集两组数据.
3. 联合标定
参考官方教程,将输入改为自己生成的点云和图像即可.
注意事项:
(1)拟合点云的ROI不要设置太大,可借助rviz网格找到有标定板在点云中最大最小的边界.
(2)在脚本中detectRectangularPlanePoints函数,可适当调大一下阈值,不然可能无法拟合出平面,得不到有效数据.
(3)对于筛选出来的点云和图像数据对,可先用CameraCalibrator检测一下,检查标定板角点能否正确检出,删除背景和边缘误检的数据对.
(4)在运行过程中观察图像标定板四个边的颜色顺序是否保持一直,如果发生切换,可能导致标定失败,找到对应数据,删除重新标定.
4. 重投影验证效果
将标定得到的tform矩阵保存即可.将点投影到图像观察效果,检查墙体和杆子的边缘拟合程度.
(1)图1 是车辆在50km/h速度下软同步投影效果,可见150m左右车辆点匹配良好.
图1
(2)图2是也在50km/h左右,软同步,未作点云运动畸变补偿,可见图像右侧匹配良好,左侧未能完全匹配,运动补偿可提升匹配效果.
关于运动补偿请参考另外两篇博客
apollo7.0------浅谈激光雷达运动补偿(一)_龙性的腾飞的博客-CSDN博客_apollo运动补偿
apollo7.0------浅谈激光雷达运动补偿(二)--计算解析_龙性的腾飞的博客-CSDN博客_apollo 运动补偿
图2
以上为个人经验总结,认识有限,错误难免,欢迎交流指正。
感觉标定还比较好用,就是matlab太大了,要是能将matlab工具箱用C++写一个单独的工具就好了,有时间得尝试一下,还有自标定的方法还可以研究研究。