利用ROS的Camera Calibration工具进行相机标定(USB相机与D435i)

Feb 2,2021   2425 words   9 min

Tags: SLAM

0.背景

在之前其实介绍过一些相机标定的内容,比如利用OpenCV进行相机标定利用Kalibr进行相机标定等。今天再介绍一个标定工具,就是ROS的Camera Calibration工具,使用起来也十分方便。

1.简介

Camera Calibration是ROS提供的一个用于单目或者双目相机标定的包,可以十分方便地使用。使用的标定板是棋盘格(Chessboard),而非AprilTag。官网见这里。其实在官网上写了,这个包基于OpenCV实现,原理是一样的。在官网给出了利用它标定单目双目相机的例子,感兴趣可以参考。

2.安装

(1) ROS Camera Calibration

工具的安装也非常简单,在终端中输入rosdep install camera_calibration即可安装,十分简单,如下。

(2) usb_cam

需要注意的是,由于是ROS的节点,自然接收的数据是ROS的Topic/Message了。所以对于普通USB相机,我们还需要一个节点,把普通USB相机的影像流转换成Topic发布出来,才能被标定工具使用。所以我们还需要安装一个叫做usb_cam的工具。按照下面的命令输入,即可编译安装。

cd catkin_ws/src
git clone https://github.com/bosch-ros-pkg/usb_cam.git
cd ..
catkin_make

(3) Realsense D435i

上面的usb_cam是针对一般USB相机的,而对于D435i,我们就不需要安装了。因为D435i以及自带了rs_camera用于打开、读取相机数据。

3.测试

(1) 连接设备

无论是普通USB相机还是D435i,首先把它连接到电脑上,不用多说了。

(2) 启动数据读取节点

对于普通USB相机,启动usb_cam节点获取数据,对于D435i则启动rs_camera节点获取数据。具体命令如下。

a. 普通USB相机

对于普通USB相机,输入roslaunch usb_cam usb_cam-test.launch打开相机,如下。 然后,我们可以list一下Topic,可以看到,已经多了/usb_cam/image_raw这个Topic了,这就是相机的影像流。

b. D435i

对于D435i,则是利用Realsense提供的ROS接口获取数据,也十分简单。输入roslaunch realsense2_camera rs_camera.launch即可启动节点。想要标定不同相机选择不同Topic就好了,比如标定RGB相机,就获取/camera/color/image_raw,想要标定左红外相机就获取/camera/infra1/image_rect_raw即可,也十分简单。如果你还不太会使用D435i,可以参考这篇博客

(3) 打开标定工具

在终端中输入如下命令,打开标定工具。

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.028 image:=/usb_cam/image_raw

节点的启动有几个启动参数,不过也很直观,基本一看就懂,根据自己的实际修改即可。打开后界面如下。 可以看到右边有三个按钮,分别是”CALIBRATE”、”SAVE”、”COMMIT”。右上角有运动的提示,告诉我们哪个维度运动还不够充分。

如果你对ROS比较了解的话,到这一步应该会发现,其实只要告诉标定节点影像流的Topic以及相关信息就可以了。ROS并不在乎这个Topic是实时由相机发出的还是播放的录好的Bag文件。所以我们也可以提前录好序列,然后在这里指定Topic就可以了。

(4) 按照提示移动

按照提示移动相机或者标定板。在这个过程中,标定工具会自动根据移动的情况添加影像,如下所示。 不停移动,等”CALIBRATE”按钮变绿以后,就可以点击标定了。这里需要注意的是,拍摄的时间不能太长,帧率不能太高,不然添加的影像太多,标定过程会非常慢。一般建议添加的Sample个数不要超过100,不然标定可能就比较慢了。(电脑配置好请无视)

(5) 结果保存

点击”CALIBRATE”按钮之后等待一会,标定就完成了,如下图所示。 可以看到窗口中的”SAVE”和”COMMIT”按钮都变绿了。并且终端中也输出了标定好的相关参数。我们点击”SAVE”按钮,稍微等待几秒,即可保存标定好的结果。标定结果默认保存在/tmp/calibrationdata.tar.gz,我们手动拷贝出来即可。内容包含参数文件和标定用到的影像,如下图所示。 另外说一下”COMMIT”按钮,一般情况下不太用的到,顾名思义,它是将标定好的结果“提交”。可以理解为把参数发布,给其它的Topic用于校正。

最后再简单说一下Ubuntu下tmp文件夹的问题。顾名思义,tmp文件夹是用来保存临时文件的地方,而这个临时文件多长时间被清空,就是个问题了。对于Ubuntu,系统会在每次启动的时候自动清理临时文件夹。因此,在标定得到结果以后,一定要记得在关机之前把结果拷贝出来,不然下次开机的时候就被清空了。

4.参考资料

  • [1] http://wiki.ros.org/action/fullsearch/camera_calibration
  • [2] http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration
  • [3] http://wiki.ros.org/camera_calibration/Tutorials/StereoCalibration

本文作者原创,未经许可不得转载,谢谢配合

返回顶部