ROS 教程之 vision : 用各種攝像頭獲取圖像

        可能有很多人想在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章學習就行了。



文章爲原創,

請注重博主勞動成果,

錯誤請指出,轉載請註明。

                                --白巧克力







發佈了57 篇原創文章 · 獲贊 1259 · 訪問量 139萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章