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

image-20201112010718161

标定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)运动,尽量让这四个维度的进度条都为绿色。此过程要保证标定板上有彩色的条纹才为有效。这个过程中控制台也会打印出标定个数的日志。此过程也可以将标定板固定,然后移动相机。

image-20201112114247630

3、 当右侧的CALIBRATE圆形按钮由灰色转为绿色时,说明数据采集完毕,此时点击CALIBRATE按钮,才开始读取之前保存的图片并真正执行标定计算。

image-20201112114357456

4、等待SAVE圆形按钮由灰转绿,按下即可,此时控制台会输出标定的结果,并将文件及标定结果数据打包保存,我们可以在控制台看到保存的路径。

image-20201112114614560

控制台输出结果:

image-20201112114803073

这里可以看到数据写出的路径:

('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')

然后此时按下Ctrl+c退出控制台即可。

5、找到 /tmp/calibrationdata.tar.gz 压缩包,将之解压,其中的 ost.yaml就是我们想要的标定结果。

image-20201112115009717

打开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下却可以正常查看。

image-20201112120647507

原因是由于默认的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相机,以结构光为深度成像原理的相机,其投射的红外光线为特殊的无序光斑,导致红外接收设备无法收到清晰完整的画面内容。

image-20201112144031215

此时我们可以有几种特殊的处理方法:

  1. 强行找各种角度,尽可能的让相机找到角点(精度较差)
  2. 通过在红发发射器前贴一些磨砂的半透明纸,将红外光斑晕开(精度适中,较方便)
  3. 将红外投影摄像头遮挡,使用外置的红外相机进行补光(精度高,需要额外设备)

最后再进行标定:

image-20201112143659146