LoginSignup
6
6

More than 3 years have passed since last update.

USBカメラをDockerから使いたい

Posted at

概要

UVC対応のUSBカメラ(BUFFALO BSW200MBK)をDockerから使おうとしてつまずいたので、試したことをまとめます。
本記事ではROSを利用していますが、ROS側の問題では無いはずです。

ホスト

  • HP Spectre x360 2019年モデル
    • intel i7-1065G7
    • intel CPU内蔵グラフィック
  • Ubuntu 18.04
  • Docker version 19.03.12, build 48a66213fe
  • 一般ユーザーはsudo gpasswd -a $USER dockerとして、sudoなしで起動できるように設定済み

試したこと

次のようなDockerfileを作成して、

FROM ubuntu:16.04

# 中略 ROS kinetic のインストール

RUN apt-get update && apt-get install -y \
  ros-kinetic-uvc-camera

RUN useradd -m -d /home/myubuntu16 myubuntu16 -p $(perl -e 'print crypt("myubuntu16", "salt"),"\n"') && \
    echo "myubuntu16 ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

RUN \
  apt-get update && \
  apt-get -y install libgl1-mesa-glx libgl1-mesa-dri && \
  rm -rf /var/lib/apt/lists/*

ENV QT_X11_NO_MITSHM 1

ENV USER myubuntu16
USER myubuntu16

CMD ["bash"]

次のコマンドでコンテナを起動しました。

docker build -t myubuntu:16 .

docker run  -it \
    --name myubuntu_test \
    --volume=/tmp/.X11-unix:/tmp/.X11-unix \
    --volume=$(pwd)/myubuntu16:/home/myubuntu16  \
    --device=/dev/dri:/dev/dri \
    --device=/dev/video0:/dev/video0 \
    --env="DISPLAY=$DISPLAY"   \
    myubuntu:16

立ち上がったコンテナでroscoreを起動して、別のターミナルから同じコンテナに入って、カメラを起動するノードを立ち上げたところでエラーが発生。

# ターミナル2
$ docker exec -it myubuntu_test bash
$ rosrun uvc_camera uvc_camera_node 
[ INFO] [1594303093.006722031]: using default calibration URL
[ INFO] [1594303093.006790555]: camera calibration URL: file:///home/myubuntu16/.ros/camera_info/camera.yaml
[ INFO] [1594303093.006832237]: Unable to open camera calibration file [/home/myubuntu16/.ros/camera_info/camera.yaml]
[ WARN] [1594303093.006850909]: Camera calibration file /home/myubuntu16/.ros/camera_info/camera.yaml not found.
opening /dev/video0
terminate called after throwing an instance of 'std::runtime_error'
  what():  couldn't open /dev/video0
Aborted

couldn't open /dev/video0と出たので、カメラの状態を取得するツール(?)を実行

$ sudo apt install v4l-utils
$ v4l2-ctl --list-device
Failed to open /dev/video0: Permission denied

権限を確認して、変更してみるとPermission deniedは解消された。

$ ls -la /dev/video*
crw-rw---- 1 root video 81, 0 Jul  9 13:48 /dev/video0

$ sudo chmod 777 /dev/video0
$ v4l2-ctl --list-device
USB_Camera: USB_Camera (usb-0000:00:14.0-1):
    /dev/video0

ふたたび、同じコンテナ内の3個のターミナルで以下をそれぞれ実行

$ roscore
$ rosrun uvc_camera uvc_camera_node
$ rosrun image_view image_view image:=/image_raw

動いた

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6