三浦製作所

興味のあるものをとりあえず動かしてみた、実装してみたシリーズをガンガン上げていきたいと思います。あくまでも自身の備忘録としてですが、誰かの助けになったらうれしいです。

Docker+ROSでUSBカメラ使えるようにするImageを作った

なんとなく気分で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を編集してください。

$ ls /dev/video*

run.shの編集例を以下に示します。

before
#!/bin/bash

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
#!/bin/bash

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を編集する必要があります。

$ ./run-change.sh

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>

これで動かせるはずです。

 

動いたらこんな感じになります。

f:id:bamboomush:20201210185614p:plain

 

少しでも実装の助けになったら幸いです。

 

 

 参考資料

【Docker, ROS】Dockerコンテナ内でusbカメラを使う方法 : LiLaBoC

lilaboc.work