[脱線編] 玄関にモニタカメラを付けてみる

(更新

Attached a camera module to Raspberry Pi and running a surveillance camera software on it.  The physical installation below is for reference purpose only.  Please refer it at your own risk.

週末は仕事から脱線していました。

私事ですが、仕事中に電話があったり来客があったりするのが非常に苦手で、それに加えて、頭を切り換えるのが下手な質なものですから、しんどい来客があったりすると午後はまるきり仕事にならなくなります。他には、夕食直前まで仕事をしていたりすると、妻に「頭が仕事モードだね」って言われたりします。

閑話休題。そんな訳で、玄関のドアスコープに監視カメラを付けてみることにしました。玄関の横にこれ見よがしに防犯カメラを付けたりしているお宅もありますが、ちょっと抵抗があるので、もともと備わっているドアスコープを活用することにします。

まずは、Raspberry Pi 用の純正カメラモジュールを購入します。純正カメラには通常型と赤外線フィルタ除去型の 2種類があり、通常型のカメラは RS コンポーネンツでは在庫切れ、スイッチサイエンスでも在庫限りになっていました。しかし、赤外線フィルタ除去カメラはちょっと抵抗があったので、スイッチサイエンスで通常のカメラを購入してみました。

ここのサイトを見てセットアップを終え、raspistill で、なかなか綺麗な写真を撮影できることが分かったので、さっそくソフトを探します。

後記(2019/6/13)

3年後に試した pistreaming というソフトが秀逸です。お勧め!

Motion 編

最初は、Raspberry Pi で有名な Motion というソフトを試してみました。説明は、ここなどに見つかります。各所の説明を見ると割とポジティブなレビューが多いのですが、私の Raspberry Pi が旧型の Model B(B+ ではない)のためか、デフォルトの設定では画質が粗く、レイテンシ(遅延。以下、技術的観点からレイテンシと呼びます)が大きく、フレームレートも遅く、監視カメラとしてはちょっと使いづらい印象を受けました。また、デフォルトで有効な動き検出も、私の用途では不要です。

ちょっとここで、私の用途に必要な条件を優先度順にリストアップしてみることにしました。

  1. 簡単に導入できること
    私は、監視カメラソフトの専門家になりたい訳ではありません。また、Raspberry Pi による動画処理は変化の早いテーマのようですから、1〜2年で世の中の動向が変わってしまっているかも知れません。
  2. 外部のサーバーに動画をアップロードしないこと
    この理由から、市販のネットカメラは対象から外しました。最近、企業からの個人情報漏洩のニュースが増えているようです。普段は自宅 LAN で見られれば十分ですし、必要ならば VPN を使えば済むことです。
  3. 低レイテンシなこと
    玄関の来客を見たい訳ですから、遅延が大きいと大切な来客(宅配便など)に失礼になりますし、こちらのアクションも遅れてしまいます。
  4. 画質がそこそこ良いこと
    上記と同様、来客の姿形くらい識別できないと意味がありません。
  5. 画像のクロップ(切り出し)ができること
    玄関のドアスコープにカメラを当ててみると分かるのですが、iPhone 6 Plus の飛び出したカメラを当ててみても、かなりの画欠けが発生します。そのため、撮影時に画角の切り出し(クロップ)ができると便利です。(ちなみに、市販の USB カメラではドアスコープにカメラレンズを近接させることができず、これは用途に合いませんでした。その点、Raspberry Pi のカメラモジュールはレンズが小さく、また先端が飛び出していて使いやすそうです。)

上記 Motion は、条件 1, 2 には良かったのですが、他はうまくないようでした。

ZoneMinder 編

ZoneMinder は、Linux などの世界で有名な監視カメラのソフトウェアスイートです。非常に高機能なようで、私もこれを試してみることにしました。

まずは Raspberry Pi の特殊な環境ではなく、手持ちの Ubuntu 14 LTS を使ってみました。いきなり apt-get でインストールを始めてしまったのですが、ZoneMinder のサイトを見ると、そうではなく、ZoneMinder のポート責任者が管理しているものをダウンロードしたほうが良さそうです。途中でインストールをやり直したりしたのですが、パス設定やログディレクトリの設定、パーミッション設定が難しく、途中で諦めました。ZoneMinder の管理者を目指すのであれば、まずは安定動作の環境を作り上げ、Raspberry Pi での設定を確認していくべきなのでしょうが、なにぶん私は専門家を目指している訳ではないからです。

ちなみに Raspberry Pi にもインストールしてみたのですが、

  • Add Monitor での設定方法がよく分からない
    /etc/modules に bcm2835-v4l2 を追加し、Video4Linux のドライバ経由で使おうと思ったのですが、Add Monitor での適切な設定方法がよく分かりませんでした。白黒だったら、なんとか見られたのですが、これ以上 Video4Linux に詳しくなるつもりはないので、諦めました。
  • ソフトウェアスイートとして、規模が大きすぎる
    ZoneMinder を動かすには MySQL や PHP、Apache 2 のセットアップが必要で、せっかく上記問題を解決しても、1〜2年後には状況が変わってしまっている可能性もあります。さらに、手持ちの Raspberry Pi Model B(旧型)には負荷が重そうなことも弱点と思いました。

このような理由から条件の 1 を満たせそうになかったので、ZoneMinder は候補から外しました。

MJPG-streamer 編

他の候補を探していると、MJPG-streamer というソフトウェアを見つけました。ソフトウェア単体でも、プラグインライブラリをうまく組み合わせることで HTTP サーバーの機能も果たすことができる優れものです。また、Raspberry Pi 専用にカスタマイズされた(フォークした)Jacksonliam 版(mjpg-streamer)というものもあります。標準の MJPG-streamer は Video4Linux のフレームワークを使っているのですが、Jacksonliam 版は Raspberry Pi のカメラモジュールを生でアクセスする機能を持っています。エレガントな実装ではないのでしょうが、計算リソースの少ない Raspberry Pi には現実的なアイデアに思えます。

試してみると、(特に後者は)なかなか綺麗な動画を高フレームレートで、ウェブブラウザから閲覧できるのですが、一つだけ大きな問題を見つけました。それは、ストリーミングのレイテンシが大きいのです。私の環境(Raspberry Pi Model B と 802.11 n Wi-Fi)では、おおよそ 5〜6秒程度のレイテンシが見られました。これは、来客モニタとしてはちょっと辛い性能です。5秒の間こちらがアクションを起こさなかったら、来客は帰ってしまうかも知れません。

というわけで、MJPG-streamer も上記条件 3 を満たせないことが分かりました。ちなみにクロップ(条件 5)ができないことも残念なところです。

gstreamer 編

そんなことをしていたら、gstreamer と呼ばれるソフトウェアを見つけました。0.5秒という低遅延を目指したプロジェクトのようで、非常に興味を持ったのですが、以下の理由で断念しました。(時間があったら、後日試してみたいと思います。)

  • ストリーミングの再生に専用ソフト(Mac 用?)が必要なこと
    特に、スマホやタブレットで見られないのは辛いと思いました。

これは当初の条件には入っていませんでしたが、重要なことです。

VLC (VideoLAN) 編

最後に見つけたのが、この方法です。これは、Raspberry Pi カメラモジュール専用動画ソフトウェアである raspivid の出力を、VLC と呼ばれるメディアサーバーソフトウェアを使って配信するというものです。raspivid を使うので、カメラ機能の細かい設定ができるのが特徴です。クロップも可能なのではないかと予想しました。

紹介は、こちらのサイトなどにあります。コメント欄を見ると、2〜4秒程度の遅延があって困っているという意見もありましたが、かなり候補数を失ってきていることもあり、試してみることにしました。iOS 用のビューアがないと不便とも思ったのですが、ちゃんと iOS 用アプリも公開されていました。

上記サイトにある通りのコマンドでは、うまく TCP ポートにアクセスできなかったのですが、以下の VLC の設定説明サイトを見ながら試行錯誤したところ、うまく動くようになりました。

私のところでは、例えば次のコマンドラインで動いています。

raspivid -o - -t 0 -w 1280 -h 960 -fps 25 -roi 0.23,0.2,0.5,0.5 | cvlc stream:///dev/stdin --sout '#duplicate{dst=std{access=http,mux=ts,dst=:8090}}' :demux=h264

気になるレイテンシですが、だいたい 1秒強程度の遅延に収まっています。これなら十分に実用になります。

上記コマンド例は、解像度を 1280 × 960、ただしドアスコープのエリアに合わせて -roi 0.23,0.2,0.5,0.5 でクロップをしています。フレームレートは 25 FPS を指定していますが、Wi-Fi(802.11n)経由で、だいたいその程度のレート(25 FPS)で閲覧できています。-w, -h オプションと -roi オプションの関係がいまひとつ分かっていないのですが、とりあえず不要な領域を外してエンコードされているのは精神衛生上良いです。(-roi の話は、この辺りのサイトが詳しいです。)

なお、パソコン用のビュアーや iOS アプリから閲覧する場合は、たとえば Raspberry Pi の IP アドレスが 192.168.100.1 ならば、VLC アプリの「ネットワークを開く」というようなメニューから http://192.168.100.1:8090 と入力することになります。(上記コマンドラインで、ポート 8090 を指定しているため。)

スクリーンショット 2016-03-28 13.38.11

スクリーンショット 2016-03-28 13.34.40

設置編

さて Raspberry Pi とカメラモジュールをどのように実装したかというと、このような感じです。最初は、家族の心理的抵抗を回避すべく「ぬいぐるみ」などで偽装してみたのですが、逆に目立ちすぎたのでこのような形に落ち着きました。

2016-03-28 11.32.47

ケースには、Raspberry Pi 付属の紙箱をそのまま使っています。過熱や失火の心配があるので皆様にはまったくお勧めしませんが、現状、触ってみた感じでは特に高熱になっている様子はないので、しばらくこれで使ってみたいと思います。お約束ですが、皆様の自己責任でお試しください。最終的には、市販のプラスチックケースに収める予定です。(Model B 用のケースがまだ売られているかが心配。)

なお、レンズモジュールは市販の「ひっつき虫」という粘土(?)で固定しています。レンズを十分にドアスコープ内に埋めることができ、また周りからの光を遮光できるのが利点です。時間が経つと位置がずれてしまう心配は残ります。

自宅ネットワークには、前述の通り Wi-Fi で接続しています。USB 電源ケーブルが邪魔なので、もう少し整理してみたいと考えています。

長くなりましたが、とりあえず目的を達成できたので本業に戻ることにします。最後までお読み頂き、ありがとうございました。

後記(2019/06/12)

久々に VLC を Raspberry Pi Zero W で試してみたのですが、Raspberry Pi 上の VLC バージョンが変わったためか、うまく動かなくなってしまいました。この分野は本当に難しい。また、いろいろ試してみたいと思います。