2017.08.21   |   Python

天気を監視するライブカメラをRaspberryPiで作った


最近雨多いですね。
それも局所的に降るタイプのが多いので、広域の天気予報だとあてにならないです。
出かける度に傘がいるのか、外を確認したり詳細な雨雲予報を調べたりといろいろ面倒です。

家の前で雨が降ってるか教えてくれたら良いのに…と思い自作できないか試してみることにしました。
(この前行った MakerFaireTokyo の影響を多分に受けてます)

システム完成図

こんな感じのシステムを(最終的には)作りたいです。

  • RaspberryPiにUSBのカメラを繋いで、それをインターネットからスマホで見れるように(ライブカメラ)。
  • また、カメラの映像を解析して、雨が降っていればLEDなどで室内にもお知らせ出来るように。

といった感じのシステムを目指して作っていきます。

必要なもの

  • RaspberryPi2 ModelB
  • USBカメラ

ライブカメラだけだったらもう製品になっているものがゴロゴロ売っているのですが、画像の解析とかをするにはやはり自分で作ったほうが自由度が高そうです。なので前に買って持て余してた RaspberryPi2 ModelB を使ってみることにしました。

カメラの方は今回新たに買いました。UVC という規格に対応していれば、RaspberryPi でもドライバ不要で使えるという事だったので、ヨドバシでUSBカメラ探してきました。
夜でもちゃんと雨の様子を撮影できないと意味をなさなくなってしまうので、出来る限り画質の良いものを求めてきました。

Webカメラ、思ったより種類があったので結構迷ったのですが、最終的にはエレコムのこれにしました。UVC 対応と箱に明記してあり、かつ f1.8 の明るいレンズを載せていたので期待が持てそうです。

動作確認

RaspberryPi に買ってきたカメラを繋いで早速動作確認をしてみました。

RaspberryPi 側の設定はこちらを参考に MJPG-streamer というストリーミングサーバーを設定しました。

このカメラでも問題なく動いてくれそうです。
起動時に解像度やフレームレートを設定できるのですが、カメラの性能である 2592x1944 は設定できませんでした。
起動まではうまくいくのですが、ストリーミング画像は真っ白で上手く取得できません。
スペックの高い RaspberryPi 3 を使えばフル解像度でもいけるかもしれません。
今回は解像度特に必要なかったので、 720x480 の解像度で毎秒15枚の映像をストリーミングすることにしました。

あとは Upstart 入れて自動起動するようにしたり、Nginx を噛ませて認証無しでストリーミングだけは取れるようにとか細かい設定をしてます。

server {
        listen 80 default_server;
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;
        server_name _;

        location /live/stream {
                proxy_pass http://localhost:8080/?action=stream;
        }
        location /live/capture {
                proxy_pass http://localhost:8080/?action=snapshot;
        }
}

とりつけ

早速このカメラを取り付けます。
賃貸なので釘とかしっかりした固定は出来ませんし、カメラも防水でないので外に設置するわけにも行きません。
そこで妥協案として、ガラスサッシにビニールテープで固定することにしました。

すごく怪しいです…。
正面に障害物があったり、天気を中心に撮影するために俯角が必要だったりするため、いい感じにカメラを固定するのが大変でした。
最終的にパッケージのダンボールを使って台座を作り、それをビニテでペタペタ固定するようにしています。

またRaspberryPiを床に置くとサッシの開閉に支障をきたすので、中央のサッシに貼り付けて邪魔にならないようにしてます。

すごく怪しい…。
こんな感じの時限爆弾漫画とかで見たことあります。

サッシの中央ということはちょうどカーテンの切れ目にもなるので、カーテンをゆるく閉めればいつでも見ることが出来ます。LEDとかを生やしてお知らせする時も都合が良さそうです。


これでいつでも家の外の様子が見れるようになりました。 ※画像はイメージです。

雨が降っているかも一目瞭z…。ん…?

雨分からない問題

ちょうど土曜土砂降りがあったのでストリーミング画像とにらめっこしてたのですが、雨降ってる様子全然分かりませんでした…。
等倍でみると遠くの建物とかが揺れていて何か動いているなという感じは分かるのですが、直接の雨粒は全く見れません。
肉眼だとそこそこ降っている様子が分かるのですが、広角目のカメラだと全然ダメですね。
ストロボとか炊けば雨粒撮れるかもしれませんが、四六時中そんなパシャパシャするわけにもいきません。

WIP: 画像解析する

建物揺れてる感じを上手くプログラムで検知できれば、雨自体が見えなくても当初の目的は達成できます。
そこで PIL をつかって解析することにしました。
いろいろな気象条件でのキャプチャをサーバーに集めて、どういう状況になれば雨なのかというのを上手く解析出来たらなと思ってます。

まだ画像集めてる段階なので特に進展ないですが、いい感じになったらまたレポート書きたいと思います。