例によって「Try! SORACOMキャンペーン」です!
https://www.lp.soracom.jp/202112-blog-campaign
はじめに
前回の投稿でSORACOMのGPSマルチユニットを使った幼稚園バストラッカーを紹介しました。
既製品のデバイスを手軽に使えて良かったのですが、このシステム、以下が課題だなーと思ってました。
- (デバイスの仕様上)位置情報の送信が1分に1回しかできない
- (機能が無いので)距離が正確に算出できない
- (機能の都合で)移動していない時も1分に1回情報を送り続ける
「もっと細かい設定ができたらなー・・」と思ってたら、ハッ!
前々回の投稿でスマホ(RedMobile)という絶好のIoTデバイス(武器)を手に入れていました。
早速調べると、やはりありました!locationノード。

お試し
最低限で以下のフローで動かせます。

subscribeノードのSensorを「GeoLocation」にしてデプロイします。

injectノード実行でデバッグウィンドウに数秒おきに緯度経度が表示されます。

RedMobile最高!
ついでにダッシュボードに表示。


実装
ここからSORACOMです。
SIMグループのHarvest Data設定などは割愛させていただきます。
まず取得した緯度経度をflow変数にセットします。


そしてinjectノードで設定した周期でSORACOM(Unified Endpoint)にhttp request。



「送信データ作成」functionノードは以下。
var data = {};
data["lat"] = flow.get("lat");
data["lon"] = flow.get("lon");
msg.payload = data;
return msg;
これで課題1(短周期での送信)が解決!
続いて課題2(ちゃんとした距離の算出)。
2点の距離は緯度経度、三角関数で出せるそうです。
前回は緯度経度を使い、三平方の定理もどきで距離っぽいものを出していましたが、今回はコレが使えます。

距離取得のfunctionノードを追加します。
var base_lat = (起点の緯度);
var base_lon = (起点の経度);
var now_lat = msg.payload.latitude;
var now_lon = msg.payload.longitude;
var dist = 6371 * Math.acos(Math.cos(base_lat * Math.PI / 180) * Math.cos(now_lat * Math.PI / 180) * Math.cos(now_lon * Math.PI / 180 - base_lon * Math.PI / 180) + Math.sin(base_lat * Math.PI / 180) * Math.sin(now_lat * Math.PI / 180)) * 1000;
flow.set("dist", dist);
msg.payload = dist;
return msg;
そして送信データに距離を追加するだけ。
var data = {};
data["lat"] = flow.get("lat");
data["lon"] = flow.get("lon");
data["dist"] = flow.get("dist");
msg.payload = data;
return msg;
課題3(移動時のみ位置データ送信)は同じ方法で前回の送信場所からの移動距離を判定して「移動していなければ送らない」を実装して解決(手抜きですみません・汗)。
実証
開発はSORACOM Arcでやりましたが、本番はSORACOM Air(SIM)を挿して息子のバッグに忍ばせます。
そしていつものSORACOM Lagoonで可視化。

いい感じです。
拡大するとわかるのですが、短周期なので、より細かいトラッキングができていました。
前回のオチで書いた通り、世のシステムが立派すぎてコレもお蔵入りですが、今後どこかで使えたらいいなーって思います。
補足
せっかく作ったので、通勤の時に持って歩いたところ、アレ?

実際のルート(赤線)は直線的なのに超ジグザグ・・
というのも私、河川敷を徒歩で通勤しているのですが、どうやらRedMobileのlocationは道じゃないところは苦手なようです。
やってみてわかることってあるなーと感じた2021年年末でした(雑な結び)。
みなさま、よいお年を・・



















