9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Raspberry Pi 3 Model BにインストールしたDocker上からカメラを扱う

Last updated at Posted at 2017-06-20

Raspberry Pi 3 Model BにDockerをインストールし、さらにDockerコンテナ上からRaspberry Piカメラモジュールを使った際のメモです。

結論から言えば、raspistillコマンドで静止画を、raspividコマンドで動画をそれぞれ撮影することができました。
本記事ではRaspberry Piカメラモジュール(CSI接続)のみを扱い、USBカメラについては述べていませんのでご注意ください。

Raspberry Pi 3 Model BにDockerをインストール方法については別のQiita記事『Raspberry Pi 3 Model B(Raspbian)にDockerをインストールする』を書きました。

3行まとめ

  • Dockerコンテナ上からもRaspberry Piカメラモジュールを使用できる。
  • raspistillコマンド、raspividコマンドはlibraspberrypi-binパッケージに含まれている。
  • Raspberry Piカメラモジュールを使用するためには、docker runコマンドに--privilegedオプションが必要となる。

環境

本記事の執筆時の環境は以下の通りです。

# Raspberry Piに接続する。mDNS名称を使う。
macOS$ ssh pi@raspberrypi.local

# OSのバージョンを確認する。
pi@raspberrypi$ uname -a
Linux raspberrypi 4.4.34-v7+ #930 SMP Wed Nov 23 15:20:41 GMT 2016 armv7l GNU/Linux
pi@raspberrypi$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

# Dockerのバージョンを確認する。
pi@raspberrypi$ docker version
Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 17:13:32 2017
 OS/Arch:      linux/arm

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 17:13:32 2017
 OS/Arch:      linux/arm
 Experimental: false

libraspberrypi-binパッケージのインストール

Raspbianのベースイメージにはsdhibit/rpi-raspbianを使用しました。よく紹介されるresin/rpi-raspbianbashすら正常に起動できなかったためです。(詳しくは調べていません)
また、ハードウェアにアクセスするため、docker runコマンドに--privilegedオプションが必要です。もっと細かく権限を指定することもできるかと思いますが、今回は詳しく調べていません。

raspistillコマンド、raspividコマンドはlibraspberrypi-binパッケージに含まれており、該当パッケージはfirmwareリポジトリに含まれていますので、それをインストールします。

# Dockerコンテナ上でRaspbianのbashを起動する。
pi@raspberrypi$ docker run --interactive --tty --rm --privileged \
  sdhibit/rpi-raspbian \
  /bin/bash

# ここからDockerコンテナ内。
# OSのバージョンを確認する。
root@docker$ uname -a
Linux 3eb8e87bda27 4.4.34-v7+ #930 SMP Wed Nov 23 15:20:41 GMT 2016 armv7l GNU/Linux
root@docker$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

# デフォルトのパッケージソースを確認する。
root@docker$ cat /etc/apt/sources.list
deb http://archive.raspbian.org/raspbian jessie main

# パッケージソースを書き換える。
root@docker$ echo "deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi firmware" > /etc/apt/sources.list

# libraspberrypi-binパッケージをインストールする。
root@docker$ apt-get update
root@docker$ apt-get install --yes libraspberrypi-bin

# raspistillコマンド、raspividコマンドが存在することを確認する。
root@docker$ which raspistill
/usr/bin/raspistill
root@docker$ which raspivid
/usr/bin/raspivid

撮影

raspistillコマンド、raspividコマンドは、通常の環境(Dockerホスト側)と同様に使用できます。

# 静止画を撮影する。
root@docker$ raspistill --output /tmp/still.jpg
# 動画を撮影する。
root@docker$ raspivid --output /tmp/video.h264 --timeout 3000

# 撮影したファイルをDockerホスト側にコピーする。(「0cd3938672a8」はコンテナID)
pi@raspberrypi$ docker cp 0cd3938672a8:/tmp/still.jpg .
pi@raspberrypi$ docker cp 0cd3938672a8:/tmp/video.h264 .

docker runコマンドに--privilegedオプションを指定しなかった場合は、以下の様なエラーが出力されます。

root@docker$ raspistill --output /tmp/still.jpg
* failed to open vchiq instance
root@docker$ raspivid --output /tmp/video.h264 --timeout 3000
* failed to open vchiq instance

参考

参考にしたサイトは以下の通りです。

9
8
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
9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?