📷

RaspberryPi × Gravio でエッジコンピューティング入門

2021/05/01に公開

Raspberry Pi × Gravio

Raspberry Pi と Gravio を組み合わせてエッジコンピューティングへ入門してみます.後半ではデータの可視化を行います.

環境情報

  • Raspberry Pi 4 Model B ( RAM 4GB )
    • OS: Ubuntu Server ( 20.04.3 64-bit )
  • Gravio 4.3 (Basic プラン)

環境構築

Raspberry Pi 自体のセットアップは終わっているものとして, Gravio の環境構築を行うところから行っていきます.また,Gravio は Raspberry Pi OS に対応していないので Ubuntu を載せた Raspberry Pi を利用します.

Gravio HubKit のインストール

公式ドキュメントの Raspberry Pi セットアップページを参考にしながら Raspberry Pi に Gravio HubKit をインストールします.

  1. apt を最新化する
sudo apt update
sudo apt upgrade
  1. Gravio のソフトウェアダウンロードページに行き自分のPCに HubKit をダウンロード
    HubKit Download

  2. scp コマンドを使って自分の PC にダウンロードした HubKit のファイルをラズパイに転送する

    • scp ./setup_-XXXX_XXX64.deb ubuntu@xxx.xxx.xx.xx:/home/ubuntu/ (ファイル名や IP アドレスは各自の環境に合わせてください)
      • 転送したファイルがラズパイ側にあるかを確認する
    • sudo apt install -y ./setup_-XXXX_XXX64.deb を実行
  3. Update Manager にログイン

    • ブラウザを開いて http://xxx.xxx.xx.xx:8080/ にアクセス (xx はそれぞれのラズパイの IP アドレス)
    • Gravio 起動画面が出てきたら OK
    • 処理が終わりログイン画面が出たら完了

Gravio Studio のインストール

ラズパイにインストールした HubKit は Gravio Studio から接続して設定などを行う.
Gravio Studio はそれぞれのローカルマシンへインストールするので,Gravio の製品ページから各環境に合った Gravio Studio をインストールする.

Gravio Studio と HubKit の接続

各自の PC から Gravio Studio を使って Gravio HubKit に接続する.Gravio Studio にログインしておきます.

  1. Gravio Studio の右上にある「+」マークから新規の Hub を追加する ( 以下の画像ではすでに設定済み )

Gravio Studio

  1. 新規 Hub の情報を入力する
    • Hub名は任意のもの
    • HubKit DNS名/IP はIPアドレスを入力
      • Raspberry Pi のターミナルから ip a でIPアドレスを調べる
      • 無線LANなら wlan0inet のIPアドレス

Hub設定

  1. 設定した Hub を選択する ( 接続に成功すると以下の画像のような Actions の画面が開く )
    Actions

エッジコンピューティング

ここからエッジコンピューティングの実験をしていきます.Raspberry Pi と ONVIF 規格に対応したネットワークカメラを接続し,取得したカメラ画像から空間の混雑度を推論します. ( 本当はUSBカメラでやりたかったのですが,Gravio4 ではまだUSBカメラに対応していないとのことです )

※ ネットワークカメラを Raspberry Pi と同じネットワークに参加させておいてください ( カメラによって設定は違うのでここでは割愛 )

Gravio Studio でデバイスの設定

今度は Gravio Studio からデバイスの設定を行う.Gravio Studio の Hub 設定画面からソフトウェアセンサの作成を行う.

  • 先ほど作成した Hub をダブルクリックし,Hub の設定画面を開く.

Hub設定

  • 設定画像推論モデル から NumberOfPeopleTensorFlow を選択する (Free プランではこれしか選べない)
    • 私は Gravio の Basic プランを使っているのでCongestionRecognition_48FeetTensorFlow のモデルにしています

設定

  • デバイスエリア の「+」アイコンをクリックしエリアを追加する ( エリアというのはエッジコンピュータの設置場所を指す )

area

  • レイヤーを追加する ( レイヤーはセンサの種類を指す )
    • このとき,最初に NumberOfPeopleTensorFlow を追加していると一番下で選択できるようになっている

layer

  • レイヤーを選択し論理デバイスの追加からネットワークカメラを追加する ( ネットワークカメラの設定がうまくいっていないと何も表示されない )

IPCamera

  • センサーを「オン」にする

on

  • Gravio Studio のデータタブで推論で取得したデータを確認する
    • センサを ON にしたあと更新や再起動すると取得したデータが画面に反映される

データ

  • 値のところに推論された人数のデータが表示されれば成功!

備考

データが取得されるタイミングは,カメラのプロパティのキャプチャ間隔で指定したタイミングとなるようです ( https://doc.gravio.com/manuals/gravio4/1/ja/topic/software-sensors ).また,NumberOfPeopleTensorFlow の推論モデルでは人物の顔を正面から映したときに認識されるようで,有効範囲は数メートルとなるそうです.

Google のサービスを用いたデータ可視化

コチラの記事を参考に,Google のサービスを駆使してデータの可視化を行ってみます.基本は元記事がしっかりまとまっているのでここではサクッと概要だけメモします.

Google サービスの設定

Google のサービスを駆使するので連携させるための準備を行います.

  • Google Drive などでGoogle フォームを作成する
    • 「質問」の設定から「記述式」の質問を作成し,ほかはデフォルトのままにする
    • 「送信」を押してリンクを取得しどこかにメモる https://docs.google.com/forms/d/e/XXXXX/viewform?usp=sf_link
    • リンクの末尾 viewform?usp=sf_linkformResponse に変更し以下のようにする
      • https://docs.google.com/forms/d/e/XXXXX/formResponse
    • 修正したリンクの URL にアクセスする
    • cmd + opt + i で DevTool を開く
    • Elements で質問の解答欄の要素を探して質問IDである name=entry.NNNNNN を見つけてメモしておく
    • 見つからない場合は entry. などと入力して grep する
  • HubKit に接続した Gravio Studio に入る
    • 新規のアクションを作成する
    • Step1 に httpRequest のアクションコンポーネントを追加しプロパティを設定する
    メソッド: POST
    URL: https://docs.google.com/forms/d/e/XXXXX/formResponse
    Content-Type: application/x-www-form-urlencoded
    Body: "entry.NNNNNN="+av.Data
    
    • Http Request についてはコチラ
      • Http Request の body は cv.Payload で以下のようなフォーマットで指定する
        • cv.Payload = {"entry.2027959015": tv.Data}
  • 実行をしてみてデータが Google フォームのスプレッドシート保存されていたらデータの送信には成功
  • tv. の tv は trigger value の略で,トリガーから送信されるデータなのであとでトリガーを設定するまでは値は0となる
  • 次にトリガーを設定し,定期的にデータが入っていることが確認できたらスプレッドシートを DB としてデータが蓄積されていく
  • Google Data Portalなどで可視化すれば Google のサービスとの連携によるデータの可視化は完了

Summary

Raspberry Pi 4 と Gravio 4, Ubidots を用いてノーコードでエッジコンピューティングに入門しました.自作で People Count を行おうとすると Deep Learning 周りでなかなかハードルが高いですが,Gravio を導入することでそこの手間を省くことができます.

とはいえ,Gravio 自体の導入もなかなか難しいものがあります.ドキュメントを参考にしつつ進めましたが,最近 Gravio が3から4になったようで少し手間取りました.最終手段としてはフリープランでも参加できる Slack コミュニティがあるので,そこで質問を投げることで解決することができました.Reference にも上げていますがドキュメントや関連記事は豊富だと思うので参考になると思います.

また,Google Data Portal を使ってデータの可視化にも挑戦しました.複数のツールを組み合わせて簡単にエッジコンピューティングを行いましたが,それぞれのツールの使い方に慣れる必要もあり,思い通りのアプリケーションを作ろうと思うと超えるべきハードルがいくつかあります.

ただ Raspberry Pi と Gravio を使うことで,ノーコードで割と簡単にエッジコンピューティングに入門できることがわかりました.

Trouble Shooting

1度 Ubuntu ( RPI ) の電源を切ったあと再開するとデータが取得・送信できない

→ HubKit が停止しているのと,IPアドレスが変わっているため

  • ネットワークの接続と HubKit の起動 ( sudo docker-compose up -d ) をし直す
  • Gravio Studio で HubKit に接続
    • このときIPアドレスが変わっていたら新しいものに変更する
  • Studio で HubKit に接続できたらネットワークカメラをバインドし直す ( IPアドレスが変わっていれば )
  • トリガーで指定しているネットワークカメラのIPアドレスを新しいものに差し替える ( IPアドレスが変わっていれば )

HubKit を起動してしばらく経つと Raspi がフリーズして HubKit も停止する

→ 推論処理の負荷によるもの

  • Raspberry Pi の RAM が 4GB で Ubuntu Desktop を使っていると推論の処理で落ちてしまうことがある
    • Desktop なので Window System などでリソースを使っていることでうまくいかなくなることがあるようです
  • Raspberry Pi の OS を Ubuntu Desktop ではなく Ubuntu Server にすることで RAM 4GB でもうまくいく

Acknowledgement

この記事を書くにあたって,質問に答えていただいた Gravio コミュニティの皆様に感謝申し上げます.

Reference

  1. Gravio
  2. Gravio JP
  3. Gravio HubKit 4 マニュアル
  4. Gravio 4 アクションとは
  5. Gravio 公式ブログ
  6. Gravio 4でCO2データをCSVに出力する
  7. Gravio 4からCO2データをUnidotsに送って可視化する
  8. Ubidots
  9. Ubidots Doc
  10. Ubidots Doc (send-data)
  11. Googleスプレッドシート上でGravioが収集したセンサーデータを表示
  12. IoTツールのGravioでセンサーからのデータをGoogleスプレッドシートに連携させる
  13. Raspberry Pi 4 セットアップまとめ - Ubuntu編 -

Discussion