概要
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
動いた