Gunosy Tech Blog

Gunosy Tech Blogは株式会社Gunosyのエンジニアが知見を共有する技術ブログです。

ドライブレコーダを作り始めて見た Pt. 1

はじめに

こんにちは! Gunosy マーケティングソリューション事業本部、広告技術部のサンドバーグです。 この記事は Gunosy Advent Calendar 2019 - Qiita 15日目の記事で、昨日の記事は阿部さんのadjust サーバーサイドイベントトラッキングを活用する - Gunosy Tech Blogでした。計測ツール自体の説明ではなく、接続後の情報の取得とその運用の話で実用性があってとてもおもしろい話なので、読んでない人は是非みてください!

それと比べて、今回自分が話そうと思う内容は会社で使っているインフラ設計・言語・技術の話ではなく、完全に趣味に振り切った話となります。それに加え、一つの記事でまとめるには内容厚くなりそうので advent calendar 以降も続けて話そうと思うのでよろしくお願いします!

背景

「年末年始だし新しいことを試してみよう」の精神に基づき、普段触っていない技術・言語回りで自分の生活の中で実用性のある開発をしてみようと思ったところからはじめました。 そこでなぜドライブレコーダに至ったかというと… 最近話題の煽り運転ですよね。

普段バイクに乗るので煽られることは多々ありますし、最近のニュースを見ると煽り方もの激化しているようには感じていたので、タイムリーなトピックだとは思いました。バイクならではの問題もいくつか考えられますし、それなりの技術的チャレンジにもなるかとも。

その上、安全性だけの話ではなく個人的にはドライブレコードを使ってツーリングの記録も撮りたいと思っていたので、今回はその両方の用途をカバーできるような物にしていきたいと思いました!

f:id:shosundberg:20191216001723j:plain
ツーリング

フェーズ分け

ゴールは設定できたところで、実際にどういったステップで開発をするかを考えると、 ざっくり以下の順を追うことになると思っています

  1. 最低限のドライブレコーダー
  2. スクリプトの安定稼働とデータ転送
  3. ユーザインターフェース
  4. キャリアの設計
  5. その後の機能追加

今回はこの中の第一段階の実装だけを目標にしました!

使った物

Raspberry Pi 3 B+

最終的な物として、raspberry pi はオーバースペックになるとは思いますが、開発段階では最も万能だとは思います。 ハードウェアの利点としては raspberry pi 3 からはwifi/bluetoothモジュールも組み込まれていて、今回必須になる CSI カメラポートも初期モデルからサポートしてます。 ソフトの方も Raspbian os 自体常にメンテされていて、コミュニティが大きいのでドキュメントも豊富です。

https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/

CM3ボード用のカメラ

大前提として raspberry pi 対応と記載されているものを選択しましたが、小型デジタルカメラの性能については詳しくないので、価格・視野角度・画素数で適当に決めました。

https://www.amazon.co.jp/gp/product/B07VFFRX4C

モバイルバッテリー

raspberry piを持ち運ぶ際には必須になるので、安くてバッテリー容量が大きい物を選択しました。出力電力は最近のモバイルバッテリーがほとんど5V 2.4A (raspberry 推奨は 5V 2.5A) なのでアンペアが低くないかだけ注意して買いました。

https://www.amazon.co.jp/gp/product/B07PS1S36G

軽い実装

今回の実装においてraspberry piのセットアップは完全に説明から抜きますが、最低限必要なものとしては...

  • Raspbian os (gui もしくは non-gui) がインストール済み
  • python と pip がインストール済み

上記で問題なければカメラの起動と使用までは...

1) カメラモジュールの設定

買った CM3ボート用のカメラをraspberry piのカメラ専用インプットに差し込みます

f:id:shosundberg:20191216001732j:plain
モジュール差し込み

2) Raspbian のコンフィグからカメラモジュールの使用を許可

カメラモジュールを使用する上で必要なfirmwareなどはすべてRaspbianに入っているので、os側でモジュールを許可するだけでカメラは使えるようになるはずです!

# システム最新にしておく
$ sudo apt-get update
$ sudo apt-get upgrade

# Raspbianに組み込まれているコンフィグツールを起動
$ sudo raspi-config

Interface Options を選択し、その中の P1 Camera を選択・起動する。

f:id:shosundberg:20191216001832p:plain
raspi-config

選択した直後に reboot するかを聞かれると思うので、はいと答えましょう。 rebootが完了した後は以下のコマンドを実行しそれに続くレスポンスが返ってくれば問題ないはずです!

$ vcgencmd get_camera
supported=1 detected=1 

(カメラを認識、許容されているカメラモジュールであることを確認)

この時点で Raspbian のカメラモジュール用のコマンドは使えるようになっているはずなので、 静止画を一枚とってみましょう!

$ raspistill -o hoge.jpg

www.raspberrypi.org

3) カメラをスクリプトで管理

実際にカメラをドライブレコーダとして使う場合、シェルスクリプトでは限界があるので python でスクリプトを組みます。 pythonには raspberry pi のカメラモジュール用のパッケージがあるのでそれを使用します!

github.com

# スクリプトに必要なパッケージ
$ sudo pip install picamera

パッケージを入れた後はスクリプトを書くだけになります。 今回は起動と同時にカメラで写真を撮り続けたいので picamera の capture_continuous (タイムラップス)を使い、 停止コマンドを設定しないで永遠と画像を保存さ続けるようにします。

import time
import picamera
    
with picamera.PiCamera() as camera:
    camera.start_preview() # カメラ起動
    time.sleep(5) # カメラ起動後に時間を置く
    for filename in camera.capture_continuous('img-{counter:03d}.jpg'):
        time.sleep(30) # capture_continuousにdelayを設定

実際に持ち運ぶ際には毎回コンソールにアクセスして、上記のスクリプトを実行するのは手間なので、 raspberry pi 起動時にスクリプトを実行するようにします。

/etc/rc.local

python /path/to/script.py &

本来は起動したスクリプトが正常に動いているかプロセス管理をしたいところですが、一旦簡易的な物としては一度の実行で問題ないでしょう。

この段階ですべてがうまくいっていれば raspberry pi に電源を入れた時点から写真を自動的に撮り始めるようになります!

次のステップ

  1. 最低限のドライブレコーダー
  2. スクリプトの安定稼働とデータ転送
  3. ユーザインターフェース
  4. キャリアの設計
  5. その後の機能追加

最低限のドライブレコードとしての機能を実装したところで次回は、 スクリプトのdaemon化と撮った画像の自動転送までをやろうと思います。

想像しているものとしては、家のwifi環境に入った瞬間自動でgoogle driveにデータ転送をしてくれるところまでです!

まとめ

今回の記事はraspberry pi で作るドライブレコーダのキックオフとなりました。 まだまだ実装は中途半端なので、物になるまで頑張って開発していきます!