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
本文作者原创,未经许可不得转载,谢谢配合