2020年9月23日 星期三

[ROS] 使用 USB Camera 攝影機 (使用 libuvc_camera 套件)

在研究如何使用 USB Camera 攝影機的時候,發現好像有不少套件可以使用。不過,一開始看到的 uvc_camera 套件似乎已經被棄置,目前已經被 libuvc_camera 套件所取代。所以,接下來就使用 libuvc_camera 套件,示範如何在 ROS 中使用 USB Camera 攝影機。

 

 

安裝 libuvc_camera 套件

 

要使用 libuvc_camera 套件,第一步當然就是先安裝這個套件囉!這個套件主要包含 USB Video Class Camera Driver,可以用來驅動大部分的 USB Camera

 

安裝指令:

 

$ sudo apt-get install ros-kinetic-libuvc-camera

 

 

檢查 USB Camera 設備檔案是否存在

 

在開始設定之前,可以先使用下列指令,確認一下 USB Camera 設備檔案是否存在。以我來說,就會出現一個 /dev/video0 的設備檔案,這個就是我的 USB Camera 啦!如果完全都沒有出現任何設備檔案的話,有可能是 USB Camera 忘記接上,或是沒有接好,就再自己檢查一下啦!

 

$ ls /dev/video*

/dev/video0

 

 

查看 USB Camera 屬性

 

接下來,使用下列指令來查找 USB Camera Vendor ID Product ID,這兩個值是等一下設定 USB Camera 會使用到的參數。這個指令會列出很多屬性,找到 ATTRS{product} 有顯示 Camera 的就對了。然後,記下 ATTRS{idVendor} ATTRS{idProduct} 的值,這兩個屬性就是 USB Camera Vendor ID Product ID,你的值可能會跟這邊顯示的不同。

 

$ udevadm info --attribute-walk --name=/dev/video0

  looking at parent device '/devices/pci0000:00/0000:00:0c.0/usb1/1-2':

    KERNELS=="1-2"

    SUBSYSTEMS=="usb"

    DRIVERS=="usb"

    ATTRS{authorized}=="1"

    ATTRS{avoid_reset_quirk}=="0"

    ATTRS{bConfigurationValue}=="1"

    ATTRS{bDeviceClass}=="ef"

    ATTRS{bDeviceProtocol}=="01"

    ATTRS{bDeviceSubClass}=="02"

    ATTRS{bMaxPacketSize0}=="16"

    ATTRS{bMaxPower}=="500mA"

    ATTRS{bNumConfigurations}=="1"

    ATTRS{bNumInterfaces}==" 2"

    ATTRS{bcdDevice}=="0100"

    ATTRS{bmAttributes}=="80"

    ATTRS{busnum}=="1"

    ATTRS{configuration}==""

    ATTRS{devnum}=="3"

    ATTRS{devpath}=="2"

    ATTRS{idProduct}=="0030"

    ATTRS{idVendor}=="80ee"

    ATTRS{ltm_capable}=="no"

    ATTRS{manufacturer}=="Web Camera - HD"

    ATTRS{maxchild}=="0"

    ATTRS{product}=="Web Camera - HD"

    ATTRS{quirks}=="0x0"

    ATTRS{removable}=="unknown"

    ATTRS{serial}=="12c0584601e3937b"

    ATTRS{speed}=="12"

    ATTRS{urbnum}=="136914"

    ATTRS{version}==" 2.00"

 

 

設定 USB Camera 檔案權限

 

接下來,要設定 USB Camera 的檔案權限,如果缺少這個步驟的話,執行的時候可能會因為權限問題而無法開啟 USB Camera

 

root 權限創建文件 /etc/udev/rules.d/99-uvc.rules,並且在文件裡面添加下列設定。其中,ATTRS{idVendor} ATTRS{idProduct} 這兩個設定值,必須替換為上一個步驟所查找到的值。我們的設定值應該是不同的,所以千萬不要直接使用下面的設定,必須修改成符合自己的設定,否則是不會有作用的。

 

SUBSYSTEMS=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="80ee", ATTRS{idProduct}=="0030", MODE="0666"

 

執行下列指令,重新載入 Udev 規則,然後再重新插拔 USB Camera 即可。

 

$ sudo udevadm control --reload-rules

 

 

設定 USB Camera 參數

 

在啟動 libuvc_camera 之前,要先編寫一個 Launch 文件,並且在這個 Launch 文件裡面設定 USB Camera 的相關參數。下面列出一個範例供大家參考:

 

-- mycamera.launch

<launch>

  <group ns="camera">

    <node pkg="libuvc_camera" type="camera_node" name="mycam">

      <!-- Parameters used to find the camera -->

      <param name="vendor" value="0x80ee"/>

      <param name="product" value="0x0030"/>

      <param name="serial" value=""/>

      <!-- If the above parameters aren't unique, choose the first match: -->

      <param name="index" value="0"/>

 

      <!-- Image size and type -->

      <param name="width" value="1280"/>

      <param name="height" value="720"/>

      <!-- choose whichever uncompressed format the camera supports: -->

      <param name="video_mode" value="mjpeg"/> <!-- or yuyv/nv12/mjpeg -->

      <param name="frame_rate" value="30"/>

 

      <param name="timestamp_method" value="start"/> <!-- start of frame -->

      <param name="camera_info_url" value="file:///tmp/cam.yaml"/>

 

      <param name="auto_exposure" value="3"/> <!-- use aperture_priority auto exposure -->

      <param name="auto_white_balance" value="false"/>

    </node>

  </group>

</launch>

 

其中,以紅色標示的設定 vendor/product/width/height/video_mode/frame_rate,請自行修改為符合相機支援的設定,若是設定不正確,有可能會無法看到正常的影像。

 

可以使用下列指令,查看目前使用的相機所支援的設定:

 

$ v4l2-ctl --list-formats-ext -d /dev/video0

ioctl: VIDIOC_ENUM_FMT

Index       : 0

Type        : Video Capture

Pixel Format: 'MJPG' (compressed)

Name        : Motion-JPEG

Size: Discrete 640x480

Interval: Discrete 0.033s (30.000 fps)

Interval: Discrete 0.040s (25.000 fps)

Interval: Discrete 0.050s (20.000 fps)

Interval: Discrete 0.067s (15.000 fps)

Interval: Discrete 0.100s (10.000 fps)

Interval: Discrete 0.200s (5.000 fps)

Size: Discrete 320x180

Interval: Discrete 0.033s (30.000 fps)

Interval: Discrete 0.040s (25.000 fps)

Interval: Discrete 0.050s (20.000 fps)

Interval: Discrete 0.067s (15.000 fps)

Interval: Discrete 0.100s (10.000 fps)

Interval: Discrete 0.200s (5.000 fps)

Size: Discrete 320x240

Interval: Discrete 0.033s (30.000 fps)

Interval: Discrete 0.040s (25.000 fps)

Interval: Discrete 0.050s (20.000 fps)

Interval: Discrete 0.067s (15.000 fps)

Interval: Discrete 0.100s (10.000 fps)

Interval: Discrete 0.200s (5.000 fps)

Size: Discrete 424x240

Interval: Discrete 0.033s (30.000 fps)

Interval: Discrete 0.040s (25.000 fps)

Interval: Discrete 0.050s (20.000 fps)

Interval: Discrete 0.067s (15.000 fps)

Interval: Discrete 0.100s (10.000 fps)

Interval: Discrete 0.200s (5.000 fps)

Size: Discrete 640x360

Interval: Discrete 0.033s (30.000 fps)

Interval: Discrete 0.040s (25.000 fps)

Interval: Discrete 0.050s (20.000 fps)

Interval: Discrete 0.067s (15.000 fps)

Interval: Discrete 0.100s (10.000 fps)

Interval: Discrete 0.200s (5.000 fps)

Size: Discrete 848x480

Interval: Discrete 0.033s (30.000 fps)

Interval: Discrete 0.040s (25.000 fps)

Interval: Discrete 0.050s (20.000 fps)

Interval: Discrete 0.067s (15.000 fps)

Interval: Discrete 0.100s (10.000 fps)

Interval: Discrete 0.200s (5.000 fps)

Size: Discrete 960x540

Interval: Discrete 0.033s (30.000 fps)

Interval: Discrete 0.040s (25.000 fps)

Interval: Discrete 0.050s (20.000 fps)

Interval: Discrete 0.067s (15.000 fps)

Interval: Discrete 0.100s (10.000 fps)

Interval: Discrete 0.200s (5.000 fps)

Size: Discrete 1280x720

Interval: Discrete 0.033s (30.000 fps)

Interval: Discrete 0.040s (25.000 fps)

Interval: Discrete 0.050s (20.000 fps)

Interval: Discrete 0.067s (15.000 fps)

Interval: Discrete 0.100s (10.000 fps)

Interval: Discrete 0.200s (5.000 fps)

 

 

啟動 Launch 文件

 

一切都準備就緒之後,執行下列指令,啟動我們的 Launch 文件。

 

$ roslaunch mycamera.launch

 

 

檢視 USB Camera 影像

 

接著,就可以準備來觀看 USB Camera 所擷取到的影像了。在這裡,我們使用 image_view 這個工具程式來觀看 USB Camera 影像。

 

指令格式:

 

$ rosrun image_view image_view image:=<image topic>

 

因為 libuvc_camera 會把 USB Camera 擷取到的影像,發佈到 /camera/image_raw 這個主題 (Topic)。所以,我們實際要執行的指令就是:

 

$ rosrun image_view image_view image:=/camera/image_raw

 

也可以把下列設定,加到前面那個 Launch 文件裡面,這樣執行 Launch 文件的時候,就會自動啟動 image_view,就不需要另外執行指令來啟動 image_view 了。

 

  <node pkg="image_view" type="image_view" name="image_view" output="screen">

    <remap from="image" to="/camera/image_raw"/>

  </node>

 

 

參考資料

 

  1. ROS UVC_Camera 的使用

https://www.itread01.com/content/1541919963.html

 

  1. ROS web tutorial part 2 - working with cameras

https://msadowski.github.io/ros-web-tutorial-pt2-cameras/

 

  1. ROS.org Wiki - libuvc_camera

http://wiki.ros.org/libuvc_camera

沒有留言:

張貼留言

和我聯絡

名稱

以電子郵件傳送 *

訊息 *