可能有很多人想在ROS下学习视觉,先用摄像头获取图像,再用opencv做相应算法处理,可是ROS下图像的采集可不像平常的read一下那么简单,需要借助外部package的使用。而摄像头即可以用笔记本自带的摄像头,也可以用外部的kinect,当然还可以是外部接入的usb接口的摄像头。前两者照着《ROS by Example 1》的 第10章来学习,安装一下相应的package很容易上手。但是Lz在用ROS操作外部接入的摄像头时遇到了一些问题,用书中的uvc_cam package读入不了图像,Lz采用的镜头是SONY
的CCD镜头,然后接了一个UVC图像采集卡(关于这个采集卡,去淘宝搜就有,无需安装驱动,在ubuntu下直接可以用),这个采集卡出来的图像格式是MJPEG。在废了一些功夫后,解决了如何采集图像的问题,一一记录下来。

本文将从两个方向介绍如何采集图像到ROS下:

1、首先简要介绍如何用笔记本自带的摄像头采集图像,这部分主要就是《ROS by example 1》中第10章的内容,但贴出了lz在使用过程中遇到的问题和解决办法。

2、用ROS如何采集笔记本或台式机上上外部摄像头的图像,硬件:ccd摄像头+uvc图像采集卡(usb接口),出来的视频流是MJPEG格式。

一、用笔记本自带摄像头采集图像。

笔记本自带的摄像头的设备号一般为/dev/video0

第一步:安装Webcam 驱动

$ sudo apt-get install git-core
$ cd ~/catkin_ws/src
$ git clone https://github.com/ericperko/uvc_cam.git
$ rosmake uvc_cam

其中第二行   catkin_ws/src  对应你自己建立的catkin工作空间

在新的终端中输入,假设你已经安装了《ROS by example 1》中的rbx1 package:

roslaunch rbx1_vision uvc_cam.launch device:=/dev/video0

如果见到ERROR:cannot launch node of type [uvc_cam/uvc_cam_node]:uvc_can.....这个错误的话,如下图。出现这个问题应该是你还没有安装uvc_camera 的驱动。

新建一个终端窗口输入:

sudo apt-get install ros-hydro-uvc-camera

hydro为的ros版本号,请替换为你自己的ROS版本。

这个问题也是LZ在查看了ros answer后找到的解决方法,原链接:http://answers.ros.org/question/193121/can-anybody-please-tell-how-to-use-web-camera-in-ros/

现在重新输入你之前的

roslaunch rbx1_vision uvc_cam.launch device:=/dev/video0

这个时候在终端窗口中还会看到ERROR:Problem setting exposure....可以忽略。

新建终端输入:

rosrun image_view image_view image:=/camera/rgb/image_color

这时候应该就可以看到弹出一个窗口,等待几秒,就可以见到图像了。

二、用外部摄像头采集图像

这部分废了LZ一些时间,本来想直接用上面读取笔记本自带摄像头的方法应该也可以用在这。于是,我直接按照上面的方式输入:

roslaunch rbx1_vision uvc_cam.launch device:=/dev/video1
rosrun image_view image_view image:=/camera/rgb/image_color

结果,没有图像,以为是图像宽度和高度设置错误,改成640*480,有了!结果是下面这样:

由于UVC图像采集卡出来的视频格式是MJPEG,lz查看了uvc_cam的程序以后,进行简单修改,折腾一番后还是无功而返。

于是,开始排查问题,第一步看摄像头采集卡有没有问题:在软件中心,查找 guvcview ,安装这个软件,然后在video&Files中device一栏选择为你的外部摄像头,看有没有图像。如果没有图像,说明你的视频采集卡有问题或者CCD摄像头有问题。

硬件没问题以后,只能从ROS的摄像头驱动想办法了,ROS支持的摄像头开发包有很多,这里有一个列表进行了罗列,还有这里有一篇文章进行了各个驱动的简单对比。在查看usb_cam
的wiki说明
的时候,发现pixel_format 一栏默认的是mjpeg,大喜!于是决定启用这个package.

安装usb_cam package的流程和上面的uvc_cam几乎一样:

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

安装好以后就是如何使用了。

在catkin_ws/src/rbx1/rbx1_vision/launch 下创建一个新的空白文件,命名为usb_cam.launch,名字和文件夹是你自己设定的,前面是lz存放的方式。在usb_cam.launch文件中输入:

<launch>
<arg name="device" default="/dev/video0" /> <node name="usb_cam_node" pkg="usb_cam" type="usb_cam_node" output="screen">
<remap from="usb_cam_node/image_raw" to="camera/rgb/image_color" />
<param name="video_device" value="$(arg device)" />
<param name="image_width" value="640" />
<param name="image_height" value="480" />
<param name="framerate" value="30" />
<param name="brightness" value="128" />
<param name="contrast" value="128" />
<param name="saturation " value="70" />
</node>
</launch>

其中:对比度,饱和度,亮度,那三个参数是LZ自己摄像头上比较好的配置,根据guvcview那个软件配置的,launch文件中的remap 将image_raw 映射到image_color是为了和书中的内容对应。

然后启动:

roslaunch rbx1_vision usb_cam.launch device:=/dev/video1
rosrun image_view image_view image:=/camera/rgb/image_color

当然你也可以不用image_view去看,可以在终端中输入:

rqt

用rqt去查看图像,如下:



    注意:usb_cam这个驱动默认的视频格式是mjpeg,如果你想用这个驱动来读取笔记本自带摄像头的图像,需要usb_cam.launch中修改视频像素格式,在launch文件中添加如下语句:

<param name="pixel_format " value="yuyv" />

其中笔记本的视频格式yuyv是通过guvcview软件查看获得。

这个渣渣图像,是一开始usb_cam默认参数配置的结果。一开始遇到的时候,把lz吓坏了,这像素用来做算法会是个坑啊。于是lz关闭所有ROS节点,将摄像头断电,uvc图像采集卡拔下来重新插上,重新给摄像头上电,然后启动guvcview,会出来一套默认的参数,效果很好,于是记下了那几个参数,就是前面的对比度(128),亮度(128),饱和度(70).将这几个参数修改以后,果然好了很多。

至此,无论是关于外部摄像头(实验室大多数情况)采集图像还是用笔记本摄像头采集图像,都已经解决了,下面就是在ROS下操作opencv写算法了,照着《ROS by example 1》中第10章学习就行了。

文章为原创,

请注重博主劳动成果,

错误请指出,转载请注明。

--白巧克力

ROS 教程之 vision : 用各种摄像头获取图像的更多相关文章

  1. ROS 使用自带和usb摄像头获取图像

    笔记本自带的摄像头的设备号一般为/dev/video0 第一步:安装Webcam 驱动 $ sudo apt-get install git-core $ cd ~/catkin_ws/src $ g ...

  2. ROS 教程之 navigation :在 catkin 环境下创建costmap layer plugin

    在做机器人导航的时候,肯定见到过global_costmap和local_costmap.global_costmap是为了全局路径规划服务的,如从这个房间到那个房间该怎么走.local_costma ...

  3. ROS 教程之 network:多台计算机之间网络通信(2)

    在上一篇文章中我们已经搭建好了两台计算机间通信的条件,但是每次都需要在新的终端里输入一长串export ROS_MASTER_URI之类的.实际弄起来的时候也不方便,因此在本文中,我们更进一步,简化两 ...

  4. Kail Linux渗透测试教程之ARP侦查Netdiscover端口扫描Zenmap与黑暗搜索引擎Shodan

    Kail Linux渗透测试教程之ARP侦查Netdiscover端口扫描Zenmap与黑暗搜索引擎Shodan ARP侦查工具——Netdiscover Netdiscover是一个主动/被动的AR ...

  5. [转]搬瓦工教程之九:通过Net-Speeder为搬瓦工提升网速

    搬瓦工教程之九:通过Net-Speeder为搬瓦工提升网速 有的同学反映自己的搬瓦工速度慢,丢包率高.这其实和你的网络服务提供商有关.据我所知一部分上海电信的同学就有这种问题.那么碰到了坑爹的网络服务 ...

  6. jQuery EasyUI教程之datagrid应用(三)

    今天继续之前的整理,上篇整理了datagrid的数据显示及其分页功能 获取数据库数据显示在datagrid中:jQuery EasyUI教程之datagrid应用(一) datagrid实现分页功能: ...

  7. jQuery EasyUI教程之datagrid应用(二)

    上次写到了让数据库数据在网页datagrid显示,我们只是单纯的实现了显示,仔细看的话显示的信息并没有达到我们理想的效果,这里我们丰富一下: 上次显示的结果是这样的 点击查看上篇:jQuery Eas ...

  8. jQuery EasyUI教程之datagrid应用(一)

    最近一段时间都在做人事系统的项目,主要用到了EasyUI,数据库操作,然后抽点时间整理一下EasyUI的内容. 这里我们就以一个简洁的电话簿软件为基础,具体地说一下datagrid应用吧 datagr ...

  9. kali linux 系列教程之metasploit 连接postgresql可能遇见的问题

    kali linux 系列教程之metasploit 连接postgresql可能遇见的问题 文/玄魂   目录 kali linux 下metasploit 连接postgresql可能遇见的问题. ...

随机推荐

  1. C语言中的指针和数组

    下面的内容节选自由我所执笔的会议记录.对于本文的不足之处,各位可以提出自己的看法. Q1:指针和数组到底是怎么一回事? A:指针和数组有本质的不同.指针就是一个内存地址,在32位系统下,一个指针永远占 ...

  2. CURL实现HTTP的GET POST方法

    Curl是Linux下一个非常强大的http命令行工具,其功能十分强大. 一.CURL对HTTP的常规訪问 1. 訪问站点 $ curl http://www.linuxidc.com 回车之后.ww ...

  3. BZOJ 1029 JSOI2007 建筑抢修 贪心+堆

    题目大意:n个建筑须要抢修.第i个建筑须要T1时间抢修.必须在T2时间之前抢修完成.求最多能抢修多少建筑 首先我们对T2排序 然后依次修理 可是这样贪心显然是不对的 比方说这组数据: 5 10 10 ...

  4. 简易C#动态加载dll(实现插件化)

    可以通过该方法来实现程序插件化. 假设A,B两个类,A类为宿主,B类为插件需要加载到A类中: class Program { public interface IHellow { void Hello ...

  5. 关于modelsim时序仿真的几篇文章

    1.http://wenku.baidu.com/view/386597f37c1cfad6195fa797.html 2.http://wenku.baidu.com/view/4b9521f9f7 ...

  6. uva--242(邮资问题 dp)

    输入输出: id=26127" style="color:blue; text-decoration:none">Sample Input 5 2 4 1 4 12 ...

  7. java playframework

    刚学了java不久就让我们尝试架构,就选择了一个比較简单的架构 play framework直接上图 这里的执行环境是JDK1.7,我试了一下jdk1.8不行出问题了play使用的是play-1.2. ...

  8. 每日英语:Robots To Revolutionize China

    A new worker's revolution is rising in China and it doesn't involve humans. With soaring wages and a ...

  9. Spring 是如何解决并发访问的线程安全性问题的

    springmvc的controller是singleton的(非线程安全的),这也许就是他和struts2的区别吧!和Struts一样,Spring的Controller默认是Singleton的, ...

  10. Ribbon重试机制与Hystrix熔断机制的配置问题

    Ribbon超时与Hystrix超时问题,为了确保Ribbon重试的时候不被熔断,我们就需要让Hystrix的超时时间大于Ribbon的超时时间,否则Hystrix命令超时后,该命令直接熔断,重试机制 ...