ROS探索总结(十一)——机器视觉

  • 内容
  • 评论
  • 相关

        机器视觉在计算机时代已经越来越流行,摄像头价格越来越低廉,部分集成深度传感器的混合型传感器也逐渐在研究领域普及,例如微软推出的Kinect,而且与之配套的软件功能十分强大,为开发带来了极大的便利。ROS集成了Kinect的的驱动包OpenNI,而且使用OpenCV库可以进行多种多样的图像处理。

        注:本章内容及代码均参考《ROS by Example》书中的第十章。

一、图像显示

        我们从最基础的开始,想办法显示Kinect的图像数据。

1、安装驱动包

       安装步骤很简单:
       $sudo apt-get install ros-fuerte-openni-kinect 

2、测试

        首先运行kinect节点:
       $roslaunch rbx1_vision openni_node_fuerte.launch 
        然后我们调用ROS的image_view包来直接显示摄像头的数据库。image_view包的介绍可以参考:
        http://www.ros.org/wiki/image_view。
       $rosrun image_view image_view image:=/camera/rgb/image_color 
        我们可以看到弹出了一个独立的图像显示框:


3、分析数据

        下图是我们上面测试中的节点图。

        我们可以使用如下的命令来查看节点之间发送的图像消息是什么样的:
        rostopic echo /camera/rgb/image_color 
        然后就会看到数据刷刷的在显示,有没有感觉看不清楚,我们使用终端的重定向功能将数据全部存储到文件中:
        rostopic echo /camera/rgb/image_color > test 
        好了,现在看看文件中是不是已经有数据了,我们来看一下其中的一帧数据:

  1. header:   
  2.   seq: 19285  
  3.   stamp:   
  4.     secs: 1370867560  
  5.     nsecs: 538447820  
  6.   frame_id: camera_rgb_optical_frame  
  7. height: 240  
  8. width: 320  
  9. encoding: rgb8  
  10. is_bigendian: 0  
  11. step: 960  
  12. data: [223, 225, 225, 220, 225, 225……………..

        从数据中我们可以的出来几个很重要的参数,首先是图像的分辨率:240*320,编码的格式是rgb8,也就是说图像应该有240*320=76800个像素,而每个像素由八位的R、G、B三个数据组成,因此我们可以预计下面的data中应该有76800*3=230400个八位的数据了。
        我们可以验证一下data中到底有多少个数据,这个很简单了,数一下就行了,不过好像有点多,我使用的是linux的“wc”命令。首先我一帧数据复制到单独的文件中,每个数据都是用“,”号隔开的,只要计算“,”的数量就知道数据的数量了。

        结果和我们预想的是一样的。知道这个数据格式以后,我们以后就可以直接把其他摄像头的数据装换成这种格式的数据就可以直接在ROS中使用了。

4、rviz显示图像

        我们再来点高级的。rviz是我们经常使用的工具,把图像显示在rviz中才更有应用价值。rviz已经为我们提供好了显示图像的接口,使用非常简单。
        首先按照上一节的方法运行kinect节点,然后打开rviz:
        rosrun rviz rviz 
        然后修改“Fixed Frame”为/camera_rgb_color,修改“Target Frame”为<Fixed Frame>,接着点击add,选择camera类型。添加成功后选择camera菜单下的Iamge Topic选项,选择/camera/rgb/image_color,确定后下面的显示框内就显示图像了。



二、深度显示

        使用kinect的一大特色就是可以获得传感器的深度数据,也就是物体距离传感器的距离,传说kinect的可识别范围在60cm到10m之间。 

1、显示深度图像

        首先也需要运行Kinect的节点:
        roslaunch openni_launch openni.launch 
        这一步我使用的是ROS安装openni包中的节点,使用与前面相同的命令运行的节点在后面无法产生深度数据。
然后同样适用iamge_view包就可以简单的显示深度图像了:
        rosrun image_view disparity_view image:=/camera/depth/disparity 

 

       

2、rviz中显示深度

        首先运行rviz:
         rosrun rviz rviz 
        然后修改“Fixed Frame”和“Target Frame”,在add中添加PointCloud2类型,修改“topic”,具体参数如下图所示


原创文章,转载请注明: 转载自古月居

本文链接地址: ROS探索总结(十一)——机器视觉

微信 OR 支付宝 扫描二维码
为本文作者 打个赏
pay_weixinpay_weixin

评论

53条评论
  1. Gravatar 头像

    唯一 回复

    胡老师,我使用ROS开发实践书中的第七章三维物体识别包的时候的不到准确的可乐罐识别信息,
    同时摄像头会报[ WARN] [1542421244.161191082]: TF2 exception:
    Lookup would require extrapolation into the past. Requested time 1542421094.859104149 but the earliest data is at time 1542421234.306556182, when looking up transform from frame [camera_depth_optical_frame] to frame [camera_rgb_optical_frame]
    。请问是哪里错了?我用的ORBBEC的摄像头

    • Gravatar 头像

      唯一 回复

      @唯一 识别时,摄像头范围内没有可乐罐和相似物,但也会提示是识别到了可乐罐。

    • 古月

      古月 回复

      @唯一 提示应该是说时间不同步,rviz中可以看到点云数据么?调整fixed frame试试

  2. Gravatar 头像

    灵灵未灵 回复

    古月老师,您好,我使用深度摄像头已经获得了我想要的2D图像像素坐标位置。我希望把找到相应位置的(x,y),映射到PointCloud2消息里面,可是不太清楚 其中data的具体数据结构。求帮助,麻烦古月老师了

    • 古月

      古月 回复

      @灵灵未灵 ROS wiki上PointCloud2的详细数据结构,data里边依次存储了每个像素点的rgb和xyz,抓一个数据包对照rgb值看一下就清楚了

      • Gravatar 头像

        灵灵为灵 回复

        @古月 谢谢古月老师,我自己已经这么干了。可是看到了好像用4个连续uint来表示x,4个连续的uint来表示y,8个连续的uint来表示z,以及16个uint来表示rgb。可是,x、y、z的数值,我不清楚具体代表什么。我看了一下数据,感觉不太像是 我想要的空间坐标。麻烦古月老师了。目前,因为作业的事情,把python3设置成了默认环境,我现在又给设置回2.7,但是roscore一直报错。所以暂时没法给到具体的数据。请见谅。

  3. Gravatar 头像

    曙光 回复

    古月老师,您好:
    我刚开始学习ROS,用的教材是《ROS机器人开发实践》,在机器视觉那一节, 安装好OpenCV,然后运行 roslaunch robot_vision usb_cam-test.launch 这条命令时,报错:
    [usb_cam.launch] is neither a launch file in package [robot_vision] nor is [robot_vision] a launch file name
    The traceback for the exception was written to the log file
    请老师看看这是什么原因
    谢谢古月老师!

    • 古月

      古月 回复

      @曙光 书上写的是usb_cam.launch这个文件吧,不是usb_cam-test.launch,确定路径设置了么?

      • Gravatar 头像

        Dawn 回复

        @古月 对,书上是usb_cam.launch,我给您留言时敲错了,您说的路径是,这条命令必须在特定的路径下执行才有效吗?

        • 古月

          古月 回复

          @Dawn 路径是指环境变量的设置(setup.bash),不然执行程序的时候找不到公能包

      • Gravatar 头像

        Dawn 回复

        @古月 请问老师应该在什么路径下运行?

  4. Gravatar 头像

    caocao zhang 回复

    woc,我还以为你要讲代码原理。

  5. Gravatar 头像

    余涛 回复

    博主,您好!~我在做这个视觉的时候,没有Kinect,只有real senseR200,我该怎么解决订阅这个摄像头,出图像和深度信息的问题呢???单独跑R200摄像头没问题,但跑RBX1例程就有问题了。求带飞!

    • 古月

      古月 回复

      @余涛 首先确定real senseR200的驱动包可以运行并采集数据,然后检查一下输出点云的话题名,应该是和RBX1例程中订阅的话题名不一样,重映射一下就可以了

  6. Gravatar 头像

    zzq 回复

    博主你好:
    我也是按照那本书上来操作的,错误提示:cannot import name cv。然后运行 locate cv2.so | grep python 显示:/opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so。请问一下为什么显示cannot import name cv

    • 古月

      古月 回复

      @zzq 感觉是没找到路径,在CmakeLists里边设置find package试一下

      • Gravatar 头像

        郑争卿 回复

        @古月 博主你好:
        运行roslaunch rbx1_vision usb_cam 时候,提示错误 没有找的 /dev/video0 ,/dev 下的确没找到 video0和video1,那么我该如何安装video0这个驱动呢?

        • 古月

          古月 回复

          @郑争卿 这是因为你的linux系统没有电脑摄像头的驱动,这个和摄像头的硬件型号相关的,最好在google上找下你这个型号电脑有没有人遇到过类似的问题。

  7. Gravatar 头像

    李想 回复

    老师您好。我有机器人视觉问题想请教您。

  8. Gravatar 头像

    周康 回复

    roslaunch rbx1_vision ros2opencv2.launch
    我用的时候出现import cv2.cv as cv
    ImportError: No module named cv
    网上说opencv3不支持,该怎么解决
    跪求!跪求!

  9. Gravatar 头像

    小雷 回复

    楼主 你好我在 运行这个 rosrun rbx1_vision cv_bridge_demo.py
    出现了Traceback (most recent call last):
    File "/home/wl/catkin_ws/src/rbx1/rbx1_vision/nodes/cv_bridge_demo.py", line 28, in
    import cv2.cv as cv
    ImportError: No module named cv
    这是什么情况呢

  10. Gravatar 头像

    James 回复

    博主你好,我安装好驱动包后,再输入roslaunch rbx1_vision openni_node_fuerte.launch 就会出现下面的错误:
    [openni_node_fuerte.launch] is neither a launch file in package [rbx1_vision] nor is [rbx1_vision] a launch file name
    The traceback for the exception was written to the log file
    请问这个怎么回事?

    • 古月

      古月 回复

      @James 我这里用的是fuerte版本的ROS,新版本中已经没有这个文件了,进入rbx1_vision的launch文件夹中找新版中的launch文件名

  11. Gravatar 头像

    薛江涛 回复

    博主您好,很感谢您写的这些高质量的博客,让我获益匪浅,我是一个ros新手,现在在用turtlebot开发,想做一个自己的界面和ros底层交互的软件,界面用python(pyqt)写的,但我不知道怎么才能在python界面程序中运行ros命令(或者调用节点获取数据),麻烦博主帮我分析一下,万分感谢!!

    • 古月

      古月 回复

      @薛江涛 你好,这个和写ROS的节点的一样的,使用python在代码里写一个或多个节点,订阅需要的数据,同样可以使用ros的其他api,包含ROS的库即可。

      • Gravatar 头像

        薛江涛 回复

        @古月 谢谢楼主指点,终于可以使用了 但还是需要在命令行启动才行

  12. Gravatar 头像

    柚子Betty 回复

    博主,你好!我用的是激光雷达,可以确认激光雷达已经连接好,但是打开rviz时,找不到target frame选项设置,我用的indigo版本。,请问这是哪儿出问题了

  13. Gravatar 头像

    LEO 回复

    你好,我执行了rosrun image_view image_view image:=/camare/rgb/image_color 但是弹出窗口后没有图像,kinect是连接过了的。

    • Gravatar 头像

      LEO 回复

      @LEO 已解决,谢谢

  14. Gravatar 头像

    无趣的小涛涛 回复

    你好 我 用的 jade 版本 在执行驱动 安装的时候 sudo apt-get install ros-jade-openni-kinect 用这个命令 但是 找不到 驱动 怎么办

  15. Gravatar 头像

    梦仙 回复

    请问:输入rosrun image_view image_view image:=/camera/depth_registered/image_rect后弹出的窗口没有深度图像。然后使用rqt_image_view选取不同话题也无法显示深度图像。使用rostopic echo /camera/depth_registered/image_rect检查话题发布不正常。但是RGB图像可以显示。请问该如何处理呢?

    • 古月

      古月 回复

      @梦仙 你好,有没有设置depth_registered参数为true?

      • Gravatar 头像

        梦仙 回复

        @古月 您好,在这之前已经按照教程运行了roslaunch openni2_launch openni2.launch depth_registration:=true语句,应该是把depth_registered设定为true了吧。结果还是不显示深度数据。另外我打算直接更改.launch里的depth_registered值,但是提示不能更改。不知道该怎么处理了?(PS我是在win7上安装的虚拟机运行的是否会有影响呢,新手小白谢谢指点!感激不尽!如果方便不知能否加QQ进一步请教您,QQ:942025847.感激不尽!!!)

        • 古月

          古月 回复

          @梦仙 是不是在修改的时候没有超级用户权限?

          • Gravatar 头像

            梦仙 回复

            @古月 应该不是depth_registered值的问题了,我按照原有的.launch写了一个新的,把里面的depth_registered改为true但还是没有深度图像。。。

            • 古月

              古月 回复

              @梦仙 如果传感器没有问题,用ros里边的包应该是没有问题的,建议可以试一试openni库本身自带的测试程序。

              • Gravatar 头像

                梦仙 回复

                @古月 我在Ubuntu下把openni2的驱动装了下就好了。。。显示出了深度图像。然后进行ROS for example(indigo版)教程书上的opencv那里,在运行rosrun rbx1_vision cv_bridge_demo.py语句时有出现了不显示的问题,然后仿照上例,在Ubuntu中安装了opencv2.49,但是这次没有解决问题。哎,真是问题多多啊~~~

                • Gravatar 头像

                  刘凤楠 回复

                  @梦仙 你好,请问一下,你是怎么装的openni2的驱动,我遇到了和你一样的问题

                • Gravatar 头像

                  xf 回复

                  @梦仙 请问你的问题解决了吗?我也是在ros by example运行rosrun rbx1_vision cv_bridge_demo.py时不显示?

              • Gravatar 头像

                梦仙 回复

                @古月 感谢您的解答,抱歉打扰到您了。

                • 古月

                  古月 回复

                  @梦仙 ubuntu下开发是这样的,时常会遇到一些比较诡异的问题,只能耐心的个个击破。QQ我没办法及时回复,有问题也可以和我邮箱交流。

    • Gravatar 头像

      Jx_Rain 回复

      @梦仙 我认为应该是虚拟机的问题,因为我也碰到。在虚拟机中没有深度图像。后来我装了双系统,直接在ubuntu下就有深度图像了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.