可能有很多人想在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章學習就行了。
文章爲原創,
請注重博主勞動成果,
錯誤請指出,轉載請註明。
--白巧克力