なんとなく気分でUSBカメラのros nodeを立ち上げてくれるDocker Imageを作成したので、公開しておきます。
おそらくDockerで動かす必要もないのですが、何かに使えるかもしれないので...
動作環境
ローカルPC:ubuntu18.04
Docker Image:ubuntu18.04
実装
quickstart
実行方法は簡単です。
まず以下のgithubリポジトリをクローンしてください。
github.com
以下のコマンドを実装することでカメラを動かすことができます。
$ git clone https://github.com/1222-takeshi/ros-usbcam.git
$ cd ros-usbcam
$ docker build -t ros-usbcam:melodic .
$ ./run.sh
この際に動作するのはdev/video1に接続されているカメラになります。
dev/video*に対応する方法
これ以外のカメラを使用している方は以下のコマンドでカメラを確認した後にrun.shを編集してください。
run.shの編集例を以下に示します。
before
xhost +
nvidia-docker run -it --rm \
--env="DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--device=/dev/video1:/dev/video0 \
ros-usbcam:melodic \
/bin/bash /home/live.sh
after
xhost +
nvidia-docker run -it --rm \
--env="DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--device=/dev/video2:/dev/video0 \
ros-usbcam:melodic \
/bin/bash /home/live.sh
video1を指定している部分をvideo2に変更した例です。
また、カメラによってパラメータが異なる可能性があります。(解像度やカメラフォーマットなど)
そのため、そのような問題が発生した場合は、少し面倒なのですが、以下のコマンドで別のDocker Imageを入れて、
/opt/ros/melodic/share/usb_cam/launch/usb_cam-test.launchを編集する必要があります。
usb_cam-test.launchの変更方法
$ cp /opt/ros/melodic/usb_cam/launch/usb_cam-test.launch ./usb_mycam.launch
$ vim usb_mycam.launch
before
<launch>
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
<param name="video_device" value="/dev/video0" />
<param name="image_width" value="640" />
<param name="image_height" value="480" />
<param name="pixel_format" value="yuyv" />
<param name="camera_frame_id" value="usb_cam" />
<param name="io_method" value="mmap"/>
</node>
<node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
<remap from="image" to="/usb_cam/image_raw"/>
<param name="autosize" value="true" />
</node>
</launch>
after
<launch>
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
<param name="video_device" value="/dev/video0" />
<param name="image_width" value="1280" />
<param name="image_height" value="800" />
<param name="pixel_format" value="uyvy" />
<param name="camera_frame_id" value="usb_cam" />
<param name="io_method" value="mmap"/>
</node>
<node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
<remap from="image" to="/usb_cam/image_raw"/>
<param name="autosize" value="true" />
</node>
</launch>
これで動かせるはずです。
動いたらこんな感じになります。

少しでも実装の助けになったら幸いです。
参考資料
【Docker, ROS】Dockerコンテナ内でusbカメラを使う方法 : LiLaBoC
lilaboc.work