旅トレ君できた!GPS情報で旅を振り返る。夏休みの自由研究にも
こんにちは
週末に車に乗って出かけて楽しいドライブをしたあと
「今日も1日楽しかったね! あんなところに行ったり。 こんなところに行ったり。 いやぁー楽しかった!」
って思っても 具体的にどこをどういうふうに通ってどんな順番でどこに行ったのかさっぱり思い出せず楽しい思い出だけは残ってると言う 状況ありませんか? 私はよくあります!
2週間も経つと 楽しかった以外 まじで思い出せない・・・
そこで思いついたのが
と言う作戦です。 実際やってみたらとても楽しくて病みつきになりました。 トレースしたGPS情報を後で振り返ると
これってすごい無駄に走ってるやん! 一本向こうの通りにもっと楽しいところあったね。。。 次はそっちにも行ってみよう! などなど 前向きに反省しながら楽しく旅を振り返ることができます! しかもGPS情報はHTML方式の地図情報とともに保存しておけるのでいつでも旅の軌跡をロードして振り返ることができます。
私はこの旅の思い出をトレースするシステムに旅トレ君と名づけました!
今回 私は旅トレ君をマイカーに取り付けて思い出作りに勤しみましたがバイクの方も徒歩で電車や新幹線バスなどで旅する方もモバイルバッテリーを搭載することで使用可能となります! これからの季節夏休みの自由研究も兼ねて子供たちと作ってみるのもいかがでしょうか?
旅トレ君本体について
旅トレ君本体は、こちらになります。
スイッチサイエンスで売っています笑
GPSの電波を拾って本体側面にあるSDカードスロットに挿入したmicroSDにGPS情報を保存してくれます。
プログラムは自分で書き換え可能なので自由にカスタム可能です。
リンクはこちら!
私は、旅トレくんをシガーソケットからUSBーCの給電ケーブルで電源を取りサイドブレーキ脇において旅立ちました。なんと私の車には旅トレくんがシンデレラフィットしてしまうポケットがついていたのでしたw
このポケットのおかげで常にGPSアンテナが上面を向いていて安定してくれました。ポケットに恵まれない方は両面テープ等でGPSアンテナが衛星を拾える場所に固定しておくことをお勧めします。
私は、いつもお出かけは 車なのでこういう形で給電しておけば良いのですが徒歩やバイク等で出かける方はこの下のような追加バッテリーを搭載しておけば旅トレ君を起動しとくことができます。
旅トレ君のソフト
さてそれでは旅トレ君に ソフトをインストールしていきましょう。
ソフトのインストールにはアルディーノIDEを使って行っていきます。
下記のようなサンプルプログラムが用意されているのでそれをまず入れてみましょう。
私はGPSの情報を取るインターバルを20秒に変更しております。 あんまりGPS情報をたくさんとってしまっても後で分析するときに大変になりますので20秒ぐらいかなぁと言うカンで20秒に設定しています。
/*This is an example used SerialBT,you can can view gps data by connecting
* to Bluetooth assistant on your mobilephone or Serial Monitor
* the GPS log will be written to SD card
*
*/
#include "M5Atom.h"
#include "GPSAnalyse.h"
#include <SPI.h>
#include "FS.h"
#include <SD.h>
#include <BluetoothSerial.h>
BluetoothSerial SerialBT;
GPSAnalyse GPS;
uint64_t chipid;
char chipname[256];
const char filename[] = "/GPSdata.txt";
File txtFile;
float Lat;
float Lon;
String Utc;
bool writeLog(String filename) { //Write GPSdata to SDcard
txtFile = SD.open(filename, FILE_APPEND);
if(txtFile){
txtFile.print(String(Lat,5));
txtFile.print(", ");
txtFile.print(String(Lon,5));
txtFile.print(", ");
txtFile.println(Utc);
txtFile.close();
}else{
return false;
}
return true;
}
void setup() {
M5.begin(true,false,true);
chipid = ESP.getEfuseMac();
sprintf( chipname, "SerialBT_%04X", (uint16_t)(chipid >> 32));
Serial.printf("Bluetooth: %s\n", chipname);
SPI.begin(23,33,19,-1);
if(!SD.begin(-1, SPI, 40000000)){
Serial.println("initialization failed!");
}
sdcard_type_t Type = SD.cardType();
Serial.printf("SDCard Type = %d \r\n",Type);
Serial.printf("SDCard Size = %d \r\n" , (int)(SD.cardSize()/1024/1024));
M5.dis.fillpix(0x00004f);
Serial1.begin(9600,SERIAL_8N1,22,-1);
SerialBT.begin(chipname);
GPS.setTaskName("GPS");
GPS.setTaskPriority(2);
GPS.setSerialPtr(Serial1);
GPS.start();
}
void loop() {
GPS.upDate();
Lat = GPS.s_GNRMC.Latitude;
Lon = GPS.s_GNRMC.Longitude;
Utc = GPS.s_GNRMC.Utc;
SerialBT.printf("Latitude= %.5f \r\n",Lat);
SerialBT.printf("Longitude= %.5f \r\n",Lon);
SerialBT.printf("DATA= %s \r\n",Utc);
Serial.printf("Latitude= %.5f \r\n",Lat);
Serial.printf("Longitude= %.5f \r\n",Lon);
Serial.printf("DATA= %s \r\n",Utc);
writeLog(filename);
delay(20000);
}
↑こちらが今回の旅で取得したGPSデータを地図上にプロットした結果です!おーーってなりません??
トンネル等の影響でGPS情報が取れない時があります。それは良いのですが、見ての通り1点ノイズなのか左下に明らかに不明なGPS情報があります。
↑地図を拡大してみるとあとのほとんどはご覧のようにちゃんと走ったところにプロットされています。すごい!走っていた車線もしっかり合ってました。
↑山間部を走った時は、電波が届きにくいのか欠損している部分もありました。
結果分析と改善
もっと詳しく見てみると。なんと!中国内陸部の砂漠に1点GPS情報が飛んでいる・・・なぜ?
この1点のせいで緯度、経度で散布図を書いて検証しようとするとグラフが潰れてしまう。
そこでデータ取得範囲を日本国内に収めるために経度125〜150度、緯度23〜45度以内のデータのみ抽出するようにしました。
そうすると、↓こちらのように今回の旅行の範囲にGPSデータが収まりました。
でも、やっぱり↑この左下の1っ点が気になる。。。
そこで経度、緯度それぞれの15プロットの移動平均を求めて、現在値から移動平均値を引いて明らかに変化が大きい点を閾値をもうけて除去するプログラムを実装してみました。
↑緑の線が閾値です。左上のマス部以外の点を除去してみました。
そうすると、このように気になっていた左下の点を除去することができました!
みなさんもよかったら旅トレ君作ってみてください♪
もしもっと詳しく知りたい!詳細なコードをおしえて!等あればお気軽に連絡くださいませ♪
続編を準備いたします。