Raspberry Pi定点カメラの照度センサと連携した夜間撮影

公開 | 更新 

PiAwarreを運用している Raspberry Pi のMIPI CSI-2インターフェイスにカメラモジュールを取り付け、 定点カメラ としても活用して撮影画像を定期的にGoogleドライブへアップロードして、閲覧しやすいような仕組みを構築したり、 照度センサ と連携して 夜間撮影 も出来るようにしてみました。

ハードウェア

今回紹介する定点カメラシステムは、FlightAwareから提供されているSDイメージ版PiAwareが稼働する初代Raspberry Piと、MIPI CSI-2リボンケーブルで繋がるRaspberry Pi Camera Module V1により構成されています(この機器に関する過去の記事はこちら)。

図01.PiAware定点カメラ

図01.PiAware定点カメラ

RaspberryPi向けカメラモジュールには、より高性能なV2やHQもありますが、接続先が非力な初代RaspberryPiなので、無難なV1モジュールを選択。その大まかな仕様は次の通りです。

  • イメージセンサ : Omnivision OV5647
  • 視野角 : 69.1度
  • 静止画解像度 : 2592x1944px
  • 動画解像度 : 1080p30, 720p60, 480p60/90
  • 最大露光時間 : 6秒 (V2モジュールなら10秒)

OSはRaspberry Pi OS Stretchベースなので、本記事はレガシーな raspistill での撮影を前提に進めます。

 

raspistillでの基本撮影

raspistill はファイル出力先を指定するのみでも撮影可能ですが、デバッグモードと画像サイズを指定するのみで実行してみます。

図02.設定デフォルト値での撮影

図02.設定デフォルト値での撮影

実際には意外と時間が掛かります。これは、コマンドを実行してから実際にイメージセンサが撮影開始するまでに、デフォルトで5秒掛けてウォーミングアップしているため。これは次のオプションで変更することが出来ますが、あまり小さな値にしてしまうと、ぼんやり暗い画像になってしまうので、色々と試して以下の設定値としています。

他、画像処理ではお馴染みのパラメータが設定可能ですが、これは被写体や好みにもよるところでしょう。

以上の設定値を織り込んで再び撮影してみます。

図03.設定カスタム値での撮影

図03.設定カスタム値での撮影

また、撮影時刻を -a オプションでアノテーションとして画像へ描くことが出来ます。このとき実際に描画される部分の画像背景によっては見えにくくなるので、アノテーションの背景色を付けておくと便利です。

図04.日付時刻を追加

図04.日付時刻を追加

尚、撮影画像の出力先には、繰り返し撮影する定点カメラの性質を考慮し、tmpfsで領域確保された /tmp フォルダを指定しています(Raspberry Pi OSにおける、tmpfs活用に関する過去の記事はこちら)。

 

画像をGoogleドライブへアップロード

撮影画像は閲覧しやすいよう、Googleドライブへアップロードすることにし、その仕組みには前回組んだPyDriveのPythonスクリプトを使います。

ただ、この機器のネットワーク環境がやや貧弱な電波環境下のWiFi接続のみであることから、画像アップロード中のネットワークリトライ頻発が懸念されます。そこで timeout コマンドによりアップロードスクリプトに実行時間制限(60秒)を設けることで、時間が掛かり過ぎたら諦めて次のタスクに譲る仕様としてみました。実際には次の要領で実行させるだけ。

 

cronへ登録して定点カメラ化

こうして組み上げたraspistillによる静止画撮影〜PyDriveによるGoogleドライブへの画像アップロードの仕組みをシーケンシャルに連結して、cronへ3分毎の繰り返し実行するよう登録します。

この時、raspistillコマンドを直接cronへ記述する際には、アノテーションに使うdateコマンドの日付時刻フォーマット指定に使われている「%」がダメ文字なので「\」でエスケープさせる手間が必要です(cronでは「%」がコマンド終端とみなされるため)。

アップロードされた画像はブラウザで確認出来る他、スマートフォンのGoogleドライブアプリでも簡単に閲覧することが出来てとても便利です。

図05.Android ドライブアプリ表示例

図05.Android ドライブアプリ表示例

長時間露光による夜間撮影

これでしばらく運用してみると、当たり前なことなのですが夜間は真っ暗なので、真っ黒な画像をひたすらアップロードすることになります。

図06.通常露光125msでの夜間撮影

図06.通常露光125msでの夜間撮影

そこで夜間は撮影を停止していた時期もあったのですが、せっかくなので長時間露光による夜間撮影を試してみます。まずは露光時間を3秒に設定し、ISO感度も最大にして撮影してみると。

図07.夜間撮影3秒

図07.夜間撮影3秒

次にこのカメラユニットの最大露光時間である6秒を試してみます。

図08.夜間撮影6秒

図08.夜間撮影6秒

ちょっと全体的に赤いのはおそらく基板上の赤色LEDが窓に反射しているのだと思われます。デフォルトではAutoになっているホワイトバランスをgreyworldに指定すると、さらに見やすくなります。

図09.夜間撮影6秒グレイ

図09.夜間撮影6秒グレイ

照度センサと連動した撮影モード切り替え

ここまでの試行錯誤を経て確定した日中と夜間それぞれの撮影モードを、24時間運用においてどのように適用するか考察してみます。

基本的に時間帯で切り替えるのですが、日の出・日没は季節によって変化します。また、明らかに日が出ている時間にまで照度センサ値で判定するのもナンセンスでしょうし、これは夜中でもまた言えることでしょう。

以上に加え、bashでは単純な時刻比較が出来ないことから、大雑把にHour時(00〜23)を使って次の要領で切り替えようと思います。

  • 00〜03時台  夜間
  • 04〜07時台  照度判定
  • 08〜16時台  日中
  • 17〜19時台  照度判定
  • 20〜23時台  夜間

このRaspberry Piには、冗長化構成した温湿度気圧センサBME280と照度センサBH1750から成る、環境計測システムが構築されており、それは次のような計測ログを毎回上書き出力します。

ここから必要な照度センサ値を取り出すのですが、bashは小数点のある数値演算が出来ないので、少し乱暴ですが小数点以下を切り取ってしまい、冗長化により2つある照度センサの値を加算してゼロかどうかを以って、夜間撮影とするかどうか判断することにします。

そしてようやく組み上げたのがこちらのスクリプトです。時間帯の判断から、照度判定、静止画撮影ののち、Googleドライブへアップロードまでこなします。

問題無く期待通りに動作することを確認したら、cronへは単純に次のように登録します。

各時間帯における実行ログを確認してみました。ログには日付時刻を出力するよう仕込んでおいたので、特に時間の掛かる夜間の所要時間から、cronの実行間隔を決めています。

 

デバッグがてら数ヶ月この仕様で運用しながら、いずれはPiCameraライブラリを使って全てのスクリプトをPythonベースに書き直したいと思っています。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA