文章目录
- 1.rgb、depth相机标定矫正
- 1.1.标定rgb相机
- 1.2.标定depth相机
- 1.3.rgb、depth相机一起标定(效果重复了)
- 1.4.取得标定结果
- 1.4.1.得到的标定结果的意义:
- 1.5.IR、RGB相机分别应用标定结果
- 1.5.1.openCV应用标定结果
- 1.5.2.ros2工程应用标定结果
- 2.rgb、depth相机配准
- 2.1.求外参(R、T矩阵)
- 3.题外话
1.rgb、depth相机标定矫正
在下载来的sdk,里面没有标定的文件:ost.yaml.
需要自己进行标定、生成。
我所使用的相机型号是Astra_pro,它是一个单目结构光相机,有一个RGB摄像头+一个IR摄像头。实际上算是一个双目相机(rgb+ir)。【奥比中光Astra深度传感器工作原理】
在ros2(humble)中,需要先安装相机标定套件:
sudo apt install ros-humble-camera-*
sudo apt install ros-humble-launch-testing-ament-cmake
在我的系统中,可以分别对这两个进行相机进行标定
在标定时,具体的参数(相机、话题、格子数等等)要根据你实际的情况进行填写。
1.1.标定rgb相机
执行以下命令
ros2 run camera_calibration cameracalibrator --size 6x7 --square 0.015 --no-service-check image:=/camera/color/image_raw camera:=/camera/color
1.2.标定depth相机
深度摄像头看起来和RGB摄像头差别很大,实际上有很多相似之处。就Kinect而言,其通过一个红外散斑发射器发射红外光束,光束碰到障碍物后反射回深度摄像头,然后通过返回散斑之间的几何关系计算距离。其实,Kinect的深度摄像头就是一个装了滤波片的普通摄像头,只对红外光成像的摄像头(可以这么认为)。因此要对其标定,只需用红外光源照射物体即可,LED红外光源在淘宝上就20元一个。还有一点必须注意,在拍摄红外照片时,要用黑胶带(或其他东西)将Kinect的红外发射器完全挡住,否则其发出的散斑会在红外照片中产生很多亮点,不利于棋盘角点的检测。
————————————————
原文链接:https://blog.csdn.net/aichipmunk/article/details/9264703
我这里就偷懒了,直接用自带的红外散斑发射器来标定。追求准确的同学,最好还是按照上面说的遮住红外发射器+买一个红外光源。
ros2 run camera_calibration cameracalibrator --size 6x7 --square 0.015 --no-service-check image:=/camera/ir/image_raw camera:=/camera/ir
1.3.rgb、depth相机一起标定(效果重复了)
假如已经进行了上面rgb、depth相机的分别标定,这一步其实没必要进行,效果是一样的。
【ROS下采用camera_calibration进行双目相机标定】
ros2 run camera_calibration cameracalibrator --size 6x7 --square 0.015 --approximate 0.1 --no-service-check left:=/camera/ir/image_raw left_camera:=/camera/ir right:=/camera/color/image_raw right_camera:=/camera/color
1.4.取得标定结果
参考上面提到的文章进行操作后,分别可以在/tmp目录下得到标定后的数据。
上面的单目标定和双目标定,貌似没有本质的区别,都是分别得到两个相机的内参。
1.4.1.得到的标定结果的意义:
各标定参数的意义:
image_width、image_height代表图片的长宽
camera_name为摄像头名
camera_matrix规定了摄像头的内部参数矩阵
distortion_model指定了畸变模型
distortion_coefficients指定畸变模型的系数
rectification_matrix为矫正矩阵,一般为单位阵
projection_matrix为外部世界坐标到像平面的投影矩阵
也可以看看这个
【相机内参标定究竟标了什么?相机内参外参保姆级教程】
1.5.IR、RGB相机分别应用标定结果
得到标定结果后,有两种方法应用标定结果。
1.5.1.openCV应用标定结果
假如需要自己进行相机的画面矫正,可以使用opencv来进行。opencv只用到上面的camera_matrix、distortion_coefficients这两组数据
【opencv畸变校正的两种方法】
1.5.2.ros2工程应用标定结果
我这里可以直接修改卖家提供的源码里面的launch.xml文件的内容,让其加载标定结果。
设置好文件路径之后,出现 “Invalid camera calibration URL”的解决办法
要加上file://前缀,格式如下:
假如出现 does not match narrow_stereo in时
将ost.yaml里面相机的名字改成和报错的一致:
由于AstraPro的rgb、ir镜头的畸变不明显,标定校准后,畸变的校准效果也不明显,这里就不贴对比图上来了。
2.rgb、depth相机配准
两个相机都标定完之后,就需要进行配准,也就是要得到从ir图到rgb图的映射(旋转矩阵R、平移矩阵T),从而得到对应深度点的颜色值。
【视觉SLAM十四讲(第二版)第5讲习题解答】
根据【Kinect深度图与RGB摄像头的标定与配准】里面分析到的,要求RT,就需要先求出外参。
2.1.求外参(R、T矩阵)
3.题外话
由于我们用的点云来源自ir相机,所以手眼标定时,要用ir相机去参与标定,而不是rgb相机。
参考:
【1.Astra相机标定】
【【Nav2中文网】ROS2单目相机标定教程】
【深度图与彩色图的配准与对齐】
【Kinect深度图与RGB摄像头的标定与配准】