【ROS实践入门(八)ROS使用USB视觉传感器相机】
本内容经官网实例以及一些参考书总结而成,欢迎留言评论交流~
联系方式:ziyuanw#foxmail.com(#换成@)
ROS对许多传感器诸如:游戏杆,游戏手柄,IMU,激光测距仪,Kinect(RGBD)传感器,USB视觉相机等都提供了支持,本文只探讨USB相机的使用方式包括:ROS下USB相机驱动安装, 相机节点编译执行,单目相机标定方式。
ROS对于图像处理和计算机视觉提供了摄像机标定过程,畸变矫正,颜色解码,等其他一些底层操作,更加复杂的图像处理任务可以借助OpenCV,cv_bridge和Image_transport库通过建立连接,订阅和发布图像主题进行交互,另外还提供了物体识别,增强现实,视觉里程计等算法功能包。
https://github.com/ros-drivers/usb_cam
因为当我们在使用USB相机时需要对其参数进行自行修改,此时从源码进行安装就能够非常方便设定,一般情况不需要对其源码进行修改。
注意:下面所有步骤都是在我创建好的catkin_ws工作空间里面进行的,usb_cam驱动下载至catkin_ws/src文件夹下。若不知道如何创建该工作空间可参考我前面的第二篇博客。
//1.克隆远程仓库
git clone https://github.com/ros-drivers/usb_cam
//2.切换至usb_cam文件夹中
cd usb_cam/
//3.检查所有分支
git branch -av
//4.在本地建立一个master分支并保持与远程(remote)master仓库分支同步(该步骤可选)
git checkout -b master origin/master
//5.检查此时分支
git branch -av
//6.重新切换至develop分支
git checkout develop
//7.检查此时分支
git branch -av
默认是第三行:"/dev/video0",我的usb相机设备号是2所以将其修改为video2。(根据个人设备号修改,0为电脑自带相机设备号,外置usb相机设备号一般为1,或2.)
或者查看设备号(把usb相机插拔前后看看哪个设备号变化了):
ls /dev/video*
查看一下usb_cam内部结构,并使用vim编辑launch文件:
切换至catkin_ws工作空间,并编译:
ziyuan@zyub:~/catkin_ws/src/usb_cam$ cd ~/catkin_ws/
ziyuan@zyub:~/catkin_ws$ catkin_make
编译成功如下:(成功建立相机节点:usb_cam_node)
(同样,和之前博客提到的一样,source devel/setup.bash更新一下环境配置)
roscore
执行相机usb_cam-test.launch文件(不熟悉launch文件启动方式可以参考上一篇博客):
source devel/setup.bash
roslaunch usb_cam usb_cam-test.launch
弹出一个小窗,效果如下:
如果相机启动时如下警告:(那是由于相机没有进行标定,因此会出警告。)
[ INFO] [1569724530.848204371]: Unable to open camera calibration file [/home/ziyuan/.ros/camera_info/head_camera.yaml]
[ WARN] [1569724530.848223218]: Camera calibration file /home/ziyuan/.ros/camera_info/head_camera.yaml not found.
下面对其进行标定。
在ROS中已经集成了对相机完成标定以及畸变矫正的整个流程,用起来非常方便。通常使用张正友相机标定方法,即利用平面坐标的单应性关系,流程简洁。
在网上可以找到黑白相机棋盘格的pdf文档,这里给一个Matlab官方相机标定黑白棋盘格链接:
http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/pattern.pdf
下载之后将其打印在A3或者A4纸张上,然后量出其方格边长即可(自己量多少就写多少,单位换为国际单位m)。我这里使用的A3纸张,最终尺子量出来是0.03m,A4的是0.028m。
黑白棋盘格是由9×7的黑白格组成,但是使用时仅仅用到内部交点数即8×6的角点。
roscore
roslaunch usb_cam usb_cam-test.launch
rosrun camera_calibration cameracalibrator.py –size 8×6 –square 0.03 image:=/usb_cam/image_raw
注意标定过程中左右,上下,前后,对角方向前后倾斜标定板,这样使得右边X,Y,Size,Skew变成绿色后,CALIBRATE按钮变为蓝色,然后点击(等上半分钟左右)变为下面三个按钮都可以点击,依次点击SAVE(保存)和COMMIT(提交)到相机配置文件中。即可将标定结果保存至本地。
点击SAVE之后:('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')
如果第三步点击COMMIT出现:
raise ServiceException("service [%s] unavailable"%self.resolved_name)
rospy.service.ServiceException: service [/camera/set_camera_info] unavailable
那么只能自行将标定参数移动至:~/.ros/camera_info
1.cd /tmp
2.tar -zxvf calibrationdata.tar.gz
3.将ost.yaml复制到~/.ros/camera_info
4.打开并重命名为head_camera.yaml
camera_name:head_camera
再次打开相机节点就不会出现如下警告:
[ INFO] [1569724530.848204371]: Unable to open camera calibration file [/home/ziyuan/.ros/camera_info/head_camera.yaml]
[ WARN] [1569724530.848223218]: Camera calibration file /home/ziyuan/.ros/camera_info/head_camera.yaml not found.
至此相机使用过程以及完成,后面将会实践ORB-SLAM的ROS版本。
上一篇:【ROS实践入门(七)launch文件和动态参数使用】
下一篇:【ROS实践入门(九)ROS编译ORB-SLAM2运行】
参考资料:
【1】ROS官网
【2 】ROS上基于usb_cam相机使用: https://blog.csdn.net/pengrui18/article/details/88958487
【3】ROS机器人高效编程。