対象となる読者
- ROS2を使ってUSBカメラの映像を取得したい人
- USBカメラのpermissionを設定したい人
開発環境
再現を容易にするためハード,ソフトの環境を事細かに記載しておく
ハードウェア
ソフトウェア
- python3.12
手順
簡単に映像取得を試すためにROS2とPythonで作って学ぶAIロボット入門の「第5章 ビジョン」に記載の手順を踏襲して実施
必要ライブラリのinstall
pip3 install opencv-contrib-python==4.10.0.84
sudo apt install ros-jazzy-vision-opencv ros-jazzy-usb-cam
- OpenCVと拡張モジュール群をまとめてinstallできるライブラリ
ros-jazzy-vision-opencv
- ros2とopencvとを繋ぐインターフェース
- ros2のtopicをopencvが受け取るために必要
ros-jazzy-usb-cam
- usbカメラ用のnodeを生成するパッケージ
実行
実行しているコードはsample codeそのままなのでここでは省略
やるべき手順は以下の通り
-
usb_cam_node
の立ち上げ-
ros2 run usb_cam usb_cam_node_exe
-
- OpenCVを使ったコードのnode立ち上げ
- 今回は
front_camera_node
という名前にした -
ros2 run front_camera front_camera_node
- 今回は
-
rqt
によるimage topicの表示-
rqt
-
それぞれを動かすためのterminalが必要なので事前に用意しておく
rqt_graph
も使うとnode毎の繋がりが視覚化されるので,上手く動かない場合は使ってみると欲しいnodeが繋がっていないとかを見ることができる
Tips: usbカメラのpermission errorの解消
root user以外がusbカメラにアクセスすると以下のようなErrorではじかれてしまう
[ERROR] [1730529629.400962429] [usb_cam]: Device specified is not available or is not a vaild V4L2 device: /dev/video0
これはpermissionが制限されているために起こるErrorであるため,root user以外からもアクセスできるようにしてあげればいい
一時的にpermissionを通す場合
sudo chmod 777 /dev/video0
全てのuserに全権限を渡すため,書き換えやアクセスなどを自由にできる
以下の2つの問題から基本的にはbad case
- 複数のuserが好きにシステムの改変ができてしまう
- あくまで一時的な対応であるため,usbカメラを外す,再起動する,などでpermissionは元に戻る
恒久的にpermissionを通す場合
sudo usermod -aG video $USER
現在使っているuserがvideoのアクセスに関するgroupに追加する
こうすることで誰がvideoにアクセスできるかを管理でき,かつ他のデバイスが追加されてもアクセスができる
感想
改めて整理すると結構シンプルな構成でROS2を使ったストリーミングができた
ただしterminalを複数立ち上げるのは大変なので,ロボット起動の際には一度にすべてのnodeを立ち上げられるように設定ファイルを書いておきたい