IoT
Raspberrypi3
定点カメラ

岩舘電気の中の人がRaspberry Pi を使ってホワイトボード共有システムを作ってみた

久しぶりの投稿です。岩舘電気の中の人です。秋もだいぶ深まってきましたが、皆さんお元気でしたでしょうか。
岩手の秋といえばもちろん岩舘電気とRaspberry Pi ですよね!?

ということで Raspberry Pi で定点カメラを作成し、ホワイトボードを共有するシステムを作成したトピックを投稿いたします。

弊社ではエンジニアの出先をホワイトボードに書いていくようにしているのですが、エンジニアの部屋と離れたバックオフィスにも行先を連絡する必要があり、この連絡に内線電話を使っていました。絵に書くと下のような感じです。エンジニアは行き先をバックオフィスに電話したうえでホワイトボードに行き先を書き、電話を受けたバックオフィスの人もホワイトボードへの書き込みを行う必要があります。

無題.png

ただこの仕組みは、ほんのちょっと出かけるにも毎回電話をかける必要があるため心理的な負担がありますし、バックオフィスの人が忙しくて「電話をもらったけどあとで予定を書いておこう」と思ってそのまま忘れてしまう、というようなこともあり得ます。何より情報の参照先がエンジニアとバックオフィスで別々であるというのは、情報のシングルインスタンスの原則からも外れています。

 これを解消するためにウエブカメラを設置し、次の図のような仕組みで解決しようと考えました。

無題2.png

 実は一度市販のウエブカメラを使ってみたのですが、解像度に問題があったり、ライブ配信にするとストリームの数に制限があったりして結果がイマイチでしたので、Raspberry Pi とカメラモジュールで解決することにしました。

 とりあえず Raspberry Pi 3 とカメラモジュールを購入します。これが無いと始まりません。ついでにスイッチサイエンスからスターターキットを購入し、電源とOSがブートするSDカードを入手します。一般的なご家庭であれば Raspberry Pi や SD カードが余っていると思いますので適当に使いまわしてしまいましょう。さて Raspberry Pi が起動することが確認できたら入手後のおまじないです。

$ sudo apt-get update
$ sudo apt-get upgrade

 次にカメラモジュールをenable したら(すみません、ぐぐってくださいませ)、リモートデスクトップを有効にします。ssh でもいいのですが、今回は画像を扱うのでリモートデスクトップのほうが便利です。(また個人的にはVNCより軽くて便利なイメージなのですが、今はどうなのでしょう?)ついでに apache も入れてしまいます。

$ sudo apt-get install xrdp
$ sudo apt-get install apache2

 さて、カメラモジュールで数秒に一度写真を撮っていくわけですが、これを毎回SDカードに書き込むとSDカードの寿命が縮まってしまいますので、RAM disk を作成して画像はそこに保存していくことにします。
/etc/fstab に以下の一行を追加します。(必要に応じてその他の設定もすると良いと思います。なおこちら https://curecode.jp/tech/raspberrypi-ramdisk/ の設定を参考にさせていただきました。)

tmpfs   /var/www/html/image tmpfs   defaults,size=32m   0   0

 おおよその準備ができましたのでこの状態で写真を撮るとこんな感じになります。(ボカシが多めですが、なんとなくイメージをつかんでいただけると思います。)

image.jpg

 カメラの設置できる場所に制限があるので、せっかくの画像が斜めになってしまいますね。これでも悪くありませんが、せっかくのRaspberry Pi ですので補正してしまいましょう。補正のために imagemagick を入れます。

$ sudo apt-get install imagemagick

 早速、imagemagick を使って perspective の修正をします。以下のような感じで修正を行います。(実際に撮影された写真に合わせて数値を変更する必要があります。)また、撮影した日時も画像に埋め込んでしまいましょう。これで今見ている画像の撮影日時を一目で確認することができます。(ntp の設定も必要ですね。)

$ sudo convert -matte -virtual-pixel transparent -distort Perspective '695,219 170,0 686,1096 170,1232 1503,1057 1470,1232 1490,283 1470,0' -pointsize 50 -annotate 0x0+10+50 "`date +\"%m/%d %H:%M:%S\"`" -fill yellow /var/www/html/image/image.jpg /var/www/html/image/export_pre.jpg

 なお本当は opencv あたりを使ってマーカーを検出してやればフレキシブルなのでしょうが、CPU負荷を高めて消費電力が増えるのもアレですし、カメラは基本的に固定された位置で運用しますので、まずはこのまま運用してみることにします。
 それでは変換後の画像を見てみましょう。

export.jpg

 ちゃんと正面から撮影されているように見えますね!
なお変形はそこそこ重たい処理のようなので、今回はカメラモジュールの設定を 1640 x 1232 の解像度で撮影するようにしてあります。最大サイズの縦横とも半分、面積にして 1/4 のサイズです。

 動作の確認が取れましたので、これら一連の作業をサービスとして登録してみます。
まずは /opt/capnconv.sh という名前でバッチファイルを作成します。

#!/bin/bash
while true
do
sudo raspistill -t 1 -w 1640 -h 1232 -o /var/www/html/image/image.jpg
sudo convert -matte -virtual-pixel transparent -distort Perspective '695,219 170,0 686,1096 170,1232 1503,1057 1470,1232 1490,283 1470,0' -pointsize 50 -annotate 0x0+10+50 "`date +\"%m/%d %H:%M:%S\"`" -fill yellow /var/www/html/image/image.jpg /var/www/html/image/export_pre.jpg
sudo mv -f /var/www/html/image/export_pre.jpg /var/www/html/image/export.jpg
sleep 3
done

raspistillは撮影の命令です。撮影が終わったら perspective の変形を行います。(数字は環境に合わせて書き換えてください。)ここで一旦export_pre.jpgというファイル名にして、処理が終わってからexport.jpgに差し替えます。これはファイルを書き出している途中に httpd からアクセスしに行くと読み出しに失敗するため、この時間を最小限にするための処置です。外部からはexport.jpgにアクセスさせます。(html によしなに記述してください。)そしてこれらの処理が終わったら3秒待ってからループします。試してみたところ、この設定でだいたい5秒から7秒程度の時間でループするようです。なお、メインメモリから画像を配信しているため、いったんセッションが繋がってしまえば非常に高速に表示されます。環境に応じて数秒に一度再読み込みをするようにindex.htmlに設定すると良いでしょう。

さて、このファイルをサービスとして登録するために、/etc/systemd/system/capnconv.serviceというファイルを作成します。

[Unit]
Description=Capture and Convert

[Service]
ExecStart = /opt/capnconv.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

このサービスを enable して自動起動します。

$ sudo systemctl enable capnconv
$ sudo systemctl start capnconv

 これでプロセスが落ちても再起動してくれるようになりました。

 あとはカメラ等々をちゃんと固定して終了です。現状ではカメラが動くと imagemagick の設定変更が必要ですので、ちゃんと固定しちゃいましょう。次の写真のように Raspberry Pi とカメラ、電源を固定しました。

IMG_1491.JPG

 カメラモジュールのケースの中に白く見えるのは不織布です。実はスイッチサイエンス様から購入したカメラケースが、どうもカメラモジュールの頭部分に接触するのか、ケースをつけると焦点が合わなくなるという現象が発生してしまったため、ケースの穴を大きく広げてカメラモジュールの頭に接触しないようにし、代わりに不織布を詰めて軽く基盤を押さえて固定する格好にしてあります。

 というわけで、Raspberry Pi を活用し、「補正機能付き定点カメラでコミュニケーションエラーを抑える IoT 活用事例」の紹介でした。