RGBD相机标定
RGBD相机标定¶
环境准备¶
1、RGBD相机一台
可以到此链接购买(性价比极高)
2、标定板一个
可直接下载此文件并打印(原尺寸居中)出来:棋盘格标定板
3、安装了ROS的操作系统
4、Ubuntu系统安装ROS自带的相机标定包
sudo apt install ros-$ROS_DISTRO-camera-calibration
启动相机节点¶
这里的RGBD深度相机以奥比中光的Astra(乐视体感定制版)为例。
源码及相机初始化参见:https://gitee.com/tangyang/ros_astra_camera
启动相机
roslaunch astra_camera astrapro.launch
如果Astra相机环境没有搭建,不能正常显示彩色图、深度图、红外图。可以参照此教程先初始化Astra的ROS环境:http://robot.czxy.com/car/orbslam/astra_ros/
确认话题数据
我们通过rviz可以添加rgb图和ir图,以确认数据确实获取到了,这是后边能够正常标定的基础。这里使用rqt_image_view
查看ir红外数据,由于数据比例问题结果会是一片黑,所以这里用rviz。
rgb话题:/camera/rgb/image_raw
ir话题:/camera/ir/image
标定rgb彩色相机¶
1、打开相机标定节点并指定话题
rosrun camera_calibration cameracalibrator.py --size 9x6 --square 0.02 image:=/camera/rgb/image_raw
--size 9x6 表示棋盘格按照角点(两个黑色块相接的地方)为9列6行
--square 0.02 表示每个黑白块的边长为2cm
image:=/camera/rgb/image_raw 设置接收的rgb图像话题
2、在弹出的窗口相机视野中手持标定板,不断分别进行左右(X),上下(Y),远近(Size),倾斜(Skew)运动,尽量让这四个维度的进度条都为绿色。此过程要保证标定板上有彩色的条纹才为有效。这个过程中控制台也会打印出标定个数的日志。此过程也可以将标定板固定,然后移动相机。
3、 当右侧的CALIBRATE圆形按钮由灰色转为绿色时,说明数据采集完毕,此时点击CALIBRATE按钮,才开始读取之前保存的图片并真正执行标定计算。
4、等待SAVE圆形按钮由灰转绿,按下即可,此时控制台会输出标定的结果,并将文件及标定结果数据打包保存,我们可以在控制台看到保存的路径。
控制台输出结果:
这里可以看到数据写出的路径:
('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')
然后此时按下Ctrl+c退出控制台即可。
5、找到 /tmp/calibrationdata.tar.gz
压缩包,将之解压,其中的 ost.yaml
就是我们想要的标定结果。
打开ost.yaml
image_width: 640
image_height: 480
camera_name: narrow_stereo
camera_matrix:
rows: 3
cols: 3
data: [585.01125, 0. , 312.05298,
0. , 584.56806, 239.13816,
0. , 0. , 1. ]
camera_model: plumb_bob
distortion_coefficients:
rows: 1
cols: 5
data: [0.120805, -0.229062, 0.003060, -0.005485, 0.000000]
rectification_matrix:
rows: 3
cols: 3
data: [1., 0., 0.,
0., 1., 0.,
0., 0., 1.]
projection_matrix:
rows: 3
cols: 4
data: [593.30353, 0. , 308.56659, 0. ,
0. , 594.79834, 239.77951, 0. ,
0. , 0. , 1. , 0. ]
标定ir红外相机¶
标定ir红外相机与标定rgb彩色相机相比,除了第一步的image参数不同,其他都一样。
由于其深度数据的成像即为红外相机的投影光斑分析得到的,ir红外的相机标定结果即是深度相机的标定结果。
运行相机标定节点:
rosrun camera_calibration cameracalibrator.py --size 9x6 --square 0.02 image:=/camera/ir/image
目前测试,在Ubuntu18.04下melodic预览图像内容是黑色的,如下图。但是在rviz下却可以正常查看。
原因是由于默认的IR图像数据是16-bit的,如果想清晰的显示出来,我们需要将之归一化成一个数值范围为0-255范围的8-bit图片。而rviz已经帮我们做了这样的归一化操作,参考此issues:https://github.com/orbbec/ros_astra_camera/issues/94#issuecomment-542254886
cv::normalize(image,image,0.,255.,cv::NORM_MINMAX, cv::CV_8U);
根据这个思想,我们实现一个图像类型转换节点,即订阅 /camera/ir/image
话题,将得到的16-bit的图片转换成8-bit,然后输出到 /camera/ir/image_mono8
转换节点代码:https://gitee.com/tangyang/image_transformer
处理好数据归一化问题后,还会出现的问题,由于RGBD相机,以结构光为深度成像原理的相机,其投射的红外光线为特殊的无序光斑,导致红外接收设备无法收到清晰完整的画面内容。
此时我们可以有几种特殊的处理方法:
- 强行找各种角度,尽可能的让相机找到角点(精度较差)
- 通过在红发发射器前贴一些磨砂的半透明纸,将红外光斑晕开(精度适中,较方便)
- 将红外投影摄像头遮挡,使用外置的红外相机进行补光(精度高,需要额外设备)
最后再进行标定: