GPSモジュール+arduinoで、緯度経度情報のログを取得、移動軌跡をプロットして精度確認してみました。
概要
使っているのは
GPSモジュール ArduinoUNO ノートPC
のみです。
GPSモジュールからの情報をArduino(ソフトウェアシリアル)で受信。受信した情報をArduinoで処理。処理した情報をArduinoのハードウェアシリアルでパソコンへ送信。パソコンでは受信した情報をカンマ区切り情報として記録してます。
GPSモジュールはデフォルトで出力頻度が1Hz、通信速度は9600bpで出力情報(センテンス)もかなり多いです。今回はGPS設定を少しいじってます。
出力間隔:2Hz 通信速度:9600bps(そのまま) 出力センテンス:$GPGLLと$GPVTG
情報は緯度経度のみで良かったので、出力するセンテンスは$GPGLLと$GPVTGのみにしてます。$GPVTGは取得する必要無かったのですが、試しに出力してみました。
あまり意味はないですがプロット点を少しでも増やしたかったので出力頻度も2Hzにあげてます。(GPSモジュールの設定変更方法)
Arduino(マイコン)側処理
GPSセンサーから情報が垂れ流されてくるので、その情報処理をArduinoで行います。
$GPGLLでは
緯度(ddmm.mmmm) 北緯(N)、南緯(S) 経度(ddmm.mmmm) 東経(E)、西経(W) 時刻 ステータス モード など
$GPVTGでは
真方位 磁気方位 速度(ノット) 速度(km/h) など
の情報がシリアル通信で2Hz(0.5s毎)に垂れ流されてきます。今回は緯度経度の情報のみが必要なので、受信した情報をソース(スケッチ)で処理して、緯度経度情報のみに加工します。
GPS受信部ソース抜粋
int8_t c = GPS_Serial.read(); if (c == '$') { NMEA_cnt = 0; NMEA_index = 0; } else if (c == ',' || c == '*') { NMEA[NMEA_cnt] = '\0'; NMEA_cnt = 0; if (NMEA_index == 0) { if (NMEA[2] == 'G' && NMEA[3] == 'L' && NMEA[4] == 'L')NMEA_flug = 0; if (NMEA[2] == 'V' && NMEA[3] == 'T' && NMEA[4] == 'G')NMEA_flug = 1; } else if (NMEA_flug == 0) { if (NMEA_index == 1)latitude = atof(NMEA); if (NMEA_index == 3)longitude = atof(NMEA); } else if (NMEA_flug == 1) { if (NMEA_index == 1)GPS_compass = atof(NMEA); if (NMEA_index == 7)GPS_vel = atof(NMEA); } NMEA_index++; } else { NMEA[NMEA_cnt++] = c; //NMEA_cnt += 1; }
こんな感じで受信した情報から欲しい情報のみを変数に格納してます。基本的には「$」を先頭にカンマ区切りで情報が流れてくるので、順番に処理していく感じです。
あとは取得した緯度経度情報から移動距離を算出します。
移動距離(北南方向)=(初期緯度ー現在緯度)* 60 * 31 移動距離(東西方向)=(初期経度ー現在経度)* 60 * 25
電源投入時(スタート地点)の緯度経度を初期値として、現在の緯度経度と差分を取って、相対的な位置を算出します。ここはパソコン側で処理しても良かったのですが、Arduinoで処理しました。
今回はそれほど大きく移動しない(秒単位くらいでしか移動しない)のと、GPSの緯度経度の単位が「ddmm.mmmm」のため、単純に差分とって、その後、分を⇒秒単位に変換してます。
で緯度0.06秒≒1.8m、経度0.06秒≒1.2mとして現在の相対位置を推定してます。
最後に推定した相対位置をハードウェアシリアルでパソコンに送信、パソコン側では受信したログ値を記録しているだけです。
精度確認(結果)
Aruduino+GPSモジュールとノートパソコンを持って、適当に歩いてます。その時のログ値(位置)をグラフ化してます。
精度確認といってもおよその移動軌跡を確認しているだけですが。
▼直線移動▼
西向きに概ね真直ぐ歩いてます。距離20mくらいというのも大体あってるきもします・・・・。
よく考えたら、今回Arduino経由でログとってますが、経由する必要全く無かったです・・。GPS情報を直接PCへ取り込んで処理すればよかったですね・・・。Arduinoが便利という先入観で余計なことやってました。
GPSを自作ドローン(クアッドコプター)に搭載してみようと考えてます。位置を把握するだけならいいのですが、位置情報から本体を制御しようとすると、ドローンの向きが分からないと意味ないですね。地磁気センサーも欲しいところです・・。
コメント