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カメラの映像取得をやってみた。
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 9月 6 10:36 001 crw-rw-r-- 1 root root 189, 1 9月 6 10:36 002 crw-rw-r-- 1 root root 189, 3 9月 6 10:58 004 /dev/bus/usb/002: total 0 crw-rw-r-- 1 root root 189, 128 9月 6 10:36 001 /dev/bus/usb/003: total 0 crw-rw-r-- 1 root root 189, 256 9月 6 10:36 001 /dev/bus/usb/004: total 0 crw-rw-r-- 1 root root 189, 384 9月 6 10:36 001 crw-rw-r-- 1 root root 189, 385 9月 6 10:36 002 crw-rw-r-- 1 root root 189, 387 9月 6 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 9月 6 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"
【参照サイト】