多传感器中,我们在使用前需要给出设备的标定,首先我们先对单个设备进行标定(后面使用需要进行联合标定)
联合标定工具诸如Apollo、Autoware等自动标注工具,以及一些开源的方法等,可以参考一些经典的论文(目录见下面链接)。
imu相机标定_多传感器融合标定方法汇总_Gamer42的博客-CSDN博客点击上方“新机器视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达作者丨Tom Hardy@知乎来源丨https://zhuanlan.zhihu.com/p/268908000编辑丨3D视觉工坊本文汇总了常见的一些单传感器、多传感器的标定融合paper、工程代码,应用于自动驾驶、3D视觉、SLAM等领域,供大家学习参考~1、相机标定Online Calibration of Ext...https://blog.csdn.net/weixin_31831459/article/details/112066574首先我们对相机进行标定,相机的标定方法大多都是建立于“张氏”标定法之上,采用棋盘格的方式。主要标定的方法有使用ros的标定工具,可以参考下文(操作方法和标定板下载见第二个链接):
camera_calibration - ROS Wikihttps://wiki.ros.org/camera_calibrationcamera_calibration/Tutorials/MonocularCalibration - ROS Wiki
https://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration标定板采用A0打印(ROS官方给出的无法放到A0纸张中,需要裁剪),这里提供一个裁剪后的标定板方便打印,链接:
裁剪后的标定板(108) 提取码:g14u
当然大家根据自己相机的需求(焦距的大小的那个)来设计标定板(下方可以生成所需规格的标定板pdf):
Camera Calibration Pattern Generator – calib.iohttps://calib.io/pages/camera-calibration-pattern-generator这里介绍一种使用MATLAB来标定相机的方法(版本R2021b)
打开MATLAB的APP->图像处理和计算机视觉->Camera Calibration
这个工具我们只需要将采集的图片扔进去即可。图片的采集可以使用固定相机移动标定板(推荐)的方法或者标定板不动移动相机(20~30张就足够了)。
添加你采集的图片(图中为测试,并不是前面所提的规格的标定板)
MATLAB会自动剔除不符合规定的图像,接下来是选择相机类型和输出。
普通相机在1处,保持基本设置,保留为standard即可,鱼眼相机选择fish eye;点击option选择径向畸变,一般选择两个参数即可,两个或三个代表去畸参数的个数(k1,k2,是否有k3),skew一般情况下我们不去选择,设置完毕后点击calibration生成,会生成上图右侧蓝色的图,我们吧outlier的直线拖入0.8以内(或者根据需求,若相片量大且变化几种可以根据需求调整),会在左侧自动选出outlier的图像,右键删除,会再次自动运行,此时点击上方绿色的的Export camera calibration完成标定;点击左上角的save session会生成一个.mat文件保存你的输出结果。
在命令行窗口将显示(输出)我们的标定结果,值得注意的是,camera intrinsics即相机内参,在这个版本并不显示为一个3*3的matrix,而是显示为一个1*1的cameraIntrinsics,而该参数内容更为丰富了。
我们可以使用在命令窗口使用 pylon_01.xx(你输出的参数名.项目)来调用,或者在右侧直接双击该参数查看结果:
其自上而下的内容为:图像的尺寸、径向畸变参数(对应两参数或三参数)、切向即畸变参数(两参数)、世界的坐标点、世界单位、skew、径向畸变参数的个数、是否计算切向畸变(bool)、... 、内参、焦距、cx,cy(Principepoint)等等。
其余调用方法和理解可以参考mathworks官网:
Camera projection matrix - MATLAB cameraMatrix- MathWorks 中国
其中cameraIntrinsics包括:
当得到这个结果后我们需要编写配置文件:
根据:
camera_calibration_parsers - ROS Wikihttps://wiki.ros.org/camera_calibration_parsers#File_formats需要编写.ini文件或者.yaml文件格式:
This is the INI format used by Videre cameras to store calibration parameters internally. We are using it as our preferred format for storing calibration on camera flash memory (not only Videre cameras). 下面是INI格式
例子:
# Basler camera intrinsics
[image]
width
1920
height
1200
[Basler_01]
camera matrix
2780.34662 0.00000 941.549872
0.00000 2776.46900 651.074403
0.00000 0.00000 1.00000
distortion
-0.15400 1.70770 -11.77580 0.00620 -0.00010
rectification
1.00000 0.00000 0.00000
0.00000 1.00000 0.00000
0.00000 0.00000 1.00000
projection
2780.34662 0.00000 941.549872 0.00000
0.00000 2776.46900 651.074403 0.00000
0.00000 0.00000 1.00000 0.00000
The YAML output is based on that used by the OpenCV calibration program.
例子:
image_width: 1920
image_height: 1200
camera_name: Basler
camera_matrix:
rows: 3
cols: 3
data: [2780.34662, 0.00000, 941.549872,0.00000, 2776.46900, 651.074403, 0.00000, 0.00000 ,1.00000]
distortion_model: plumb_bob
distortion_coefficients:
rows: 1
cols: 5
data: [-0.15400, 1.70770, -11.77580, 0.00620, -0.00010]
rectification_matrix:
rows: 3
cols: 3
data: [1, 0, 0, 0, 1, 0, 0, 0, 1]
projection_matrix:
rows: 3
cols: 4
data: [2780.34662, 0.00000, 941.549872, 0.00000, 0.00000, 2776.46900, 651.074403, 0.00000, 0.00000, 0.00000, 1.00000, 0.00000]
两个格式“Basler”为相机的名字可以根据你的命名调整;值得一提的是最后一项投影矩阵,直接根据相机内参矩阵加一列0即可。
将上述文本保存为.ini或.yaml文件。我们来为相机导入参数(一般在相机的配置文件中)或者在代码中手动导入,如直接给出。(通过ros工具标定该文本会自动给出)
对于Basler相机,在config中,如此添加内参:
注意格式,url这里是 “ini文件的全局路径 ” 写法见:
如图显示为已标定:
在Rviz或image_view中输出图像(左下):
结束。后续还将继续编写其他传感器的标定实战!