ヴェズルフェルニルの研究ノート

座右の銘「ただ一人犀の角のように歩め」的な研究活動ノート

【ROS】libuvc_cameraによるUVCカメラ映像取得

ROSの研究に本格的に取り組み始めたが、その主目的はカメラ映像や自己位置推定の動画をモバイルデバイスへ配信する環境を作ることだ。

この目的への取っかかりとして、およびROSの動作を理解するために、最初にROS上でのUVCカメラの映像取得を試みてみた。

ググって調べてみると、UVCカメラ用のROSパッケージはlibuvc_cameraとusb_camの2つの種類があるようだ。

$ apt search ros-melodic
....    ....

ros-melodic-libuvc-camera/bionic,now 0.0.10-1bionic.20221025.192649 amd64
  USB Video Class camera driver

....    ....

ros-melodic-usb-cam/bionic 0.3.7-1bionic.20230322.235857 amd64
  A ROS Driver for V4L USB Cameras

....    ....

libuvc_cameraはカメラの映像フォーマットの変更に対応しているが、usb_camの方は対応していないらしい。ただし、上の最終更新日から判るが、よりメンテナンスが行われているのはusb_camのようだ。

取りあえず、libuvc_cameraの方を使ってROS上でのUVCカメラの映像取得をやってみた。

wiki.ros.org

libuvc_cameraパッケージのインストール

$ sudo apt install ros-melodic-libuvc-camera

UVCカメラ映像取得のROSコマンド

ros-melodic-libuvc-cameraパッケージをインストールした後、3つのターミナル画面を開いて、それぞれで以下のコマンドを順番に実行する。

  • ターミナル 1
$ roscore
  • ターミナル 2
$ rosrun libuvc_camera camera_node
  • ターミナル 3
$ rosrun image_view image_view image:=/image_raw

ただし、ターミナル 2 のコマンドを実行すると、下のようなエラーが表示される。

$ rosrun libuvc_camera camera_node
[ INFO] [1693820844.531653508]: Opening camera with vendor=0x0, product=0x0, serial="", index=0
[ERROR] [1693820844.532629997]: Permission denied opening /dev/bus/usb/001/004

このエラーは、デフォルト状態ではUVCカメラ・デバイスに対する書き込み権限がないために起きている。

UVCカメラのアクセス権限設定

上記の障害を回避するには、まず以下のコマンドによって対象カメラ・デバイスがどれなのかを調べる。

$ ls -l /dev/bus/usb/00*
/dev/bus/usb/001:
total 0
crw-rw-r-- 1 root root 189, 0  96 10:36 001
crw-rw-r-- 1 root root 189, 1  96 10:36 002
crw-rw-r-- 1 root root 189, 3  96 10:58 004

/dev/bus/usb/002:
total 0
crw-rw-r-- 1 root root 189, 128  96 10:36 001

/dev/bus/usb/003:
total 0
crw-rw-r-- 1 root root 189, 256  96 10:36 001

/dev/bus/usb/004:
total 0
crw-rw-r-- 1 root root 189, 384  96 10:36 001
crw-rw-r-- 1 root root 189, 385  96 10:36 002
crw-rw-r-- 1 root root 189, 387  96 10:58 004
$ lsusb
Bus 001 Device 004: ID 046d:081b Logitech, Inc. Webcam C310
Bus 001 Device 002: ID 203a:fffc  
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 004: ID 203a:fff9  
Bus 004 Device 002: ID 203a:fff9  
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

上の2つのコマンドの出力情報から、対象カメラ・デバイスLogitech, Inc. Webcam C310であることが判る。

そこで、下のコマンドを実行して、対象カメラのデバイスファイルに対する書き込み権限を与えてやれば、この障害を回避することができる。

$ sudo chmod a+w /dev/bus/usb/001/004
$ ls -l /dev/bus/usb/001/004
crw-rw-rw- 1 root root 189, 3  96 10:58 004

ただし、対象カメラを一旦切断して再度接続すると、そのデバイスファイルのアクセス権限は元に戻ってしまうので、また本障害に遭遇することになる。

恒常的にこの障害を回避するには、下のようなudevルール・ファイルを作成しておけば良い。

$ sudo vi /etc/udev/rules.d/99-uvc.rules
SUBSYSTEMS=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="081b", MODE="0666"

上の記述内のATTRS{idVendor}==ATTRS{idProduct}==に設定する値は、lsusbコマンドによって表示される対象デバイスID 046d:081bから決める。

このファイルを作成した後、対象カメラを一旦切断して再度接続してやれば、udevルールが適用されてカメラ・デバイスへの書き込み権限が設定される。

UVCカメラ映像取得ROSコマンドの再実行

この状態で、ターミナル 2のコマンドを再度起動すると、今度は正常に実行される。

  • ターミナル 2
$ rosrun libuvc_camera camera_node
[ INFO] [1693964283.867968187]: Opening camera with vendor=0x0, product=0x0, serial="", index=0
unsupported descriptor subtype VS_COLORFORMAT
unsupported descriptor subtype VS_COLORFORMAT
attempt to claim already-claimed interface 1
[ WARN] [1693964284.586118108]: Unable to set scanning_mode to 0
[ WARN] [1693964284.597984745]: Unable to set exposure_absolute to 1
[ WARN] [1693964284.600210747]: Unable to set auto_focus to 1
[ WARN] [1693964284.602504735]: Unable to set focus_absolute to 0
[ WARN] [1693964284.607419215]: Unable to set iris_absolute to 0
[ WARN] [1693964284.610973004]: Unable to set pantilt to 0, 0
Controls callback. class: 17, event: 0, selector: 4, attr: 0, data_len: 4
Controls callback. class: 18, event: 0, selector: 4, attr: 0, data_len: 2
Controls callback. class: 18, event: 0, selector: 10, attr: 0, data_len: 2
Controls callback. class: 17, event: 0, selector: 4, attr: 0, data_len: 4
Controls callback. class: 18, event: 0, selector: 4, attr: 0, data_len: 2
Controls callback. class: 18, event: 0, selector: 10, attr: 0, data_len: 2
[ INFO] [1693964284.913010078]: using default calibration URL
[ INFO] [1693964284.913113367]: camera calibration URL: file:///home/LOGINUSER/.ros/camera_info/camera.yaml
[ INFO] [1693964284.913218996]: Unable to open camera calibration file [/home/LOGINUSER/.ros/camera_info/camera.yaml]
[ WARN] [1693964284.913246013]: Camera calibration file /home/LOGINUSER/.ros/camera_info/camera.yaml not found.
Controls callback. class: 18, event: 0, selector: 10, attr: 0, data_len: 2
Controls callback. class: 18, event: 0, selector: 4, attr: 0, data_len: 2
Controls callback. class: 18, event: 0, selector: 10, attr: 0, data_len: 2
Controls callback. class: 17, event: 0, selector: 4, attr: 0, data_len: 4
Controls callback. class: 17, event: 0, selector: 4, attr: 0, data_len: 4
....    ....
....    ....

そして、ターミナル 3のコマンドを実行すると、カメラの映像が取得表示される。

  • ターミナル 3
$ rosrun image_view image_view image:=/image_raw
[ INFO] [1693965375.488105036]: Initializing nodelet with 4 worker threads.
[ INFO] [1693965375.601250199]: Using transport "raw"

【参照サイト】

qiita.com