在研究如何使用 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> |
參考資料
- ROS 中 UVC_Camera 的使用
https://www.itread01.com/content/1541919963.html
- ROS web tutorial part 2 - working with cameras
https://msadowski.github.io/ros-web-tutorial-pt2-cameras/
- ROS.org Wiki - libuvc_camera
沒有留言:
張貼留言