GR-M02U を Android スマホに繋いで便利で高精度な GNSS ロガーを作る
デジタルカメラで撮影した画像に位置情報を付与するために、Android スマホで GPSLogger for Android というロガーアプリを使っているのだが、その精度を向上させられないかと思い GR-M02U という USB 接続の GNSS レシーバーを買ってみた。結果的には無事にスマホよりもよい精度で測位できているのだが、ものがものだけに情報がほとんど出回っていないし、色々調べてみないと挙動を理解できないことも多かったので、引っ掛かったポイントをまとめておく。
なお、自分はこの手の分野の専門家でもなんでもなくて、勢いで飛びついて手探りで試行錯誤した結果を載せているだけなので、全然間違ったことを書いているかもしれない。ただ、これが間違っているか確認するだけの情報も見当たらなくて苦労したので、多少なりとも参考になればと思って記事にした。
前提
最初は Windows PC があったほうがよい。というのも、設定変更までできる公式のアプリの NaviViewer が Windows でしか提供されていないためである。実態としてはシリアルポートを介して NMEA 0183 (NMEA) という仕様でデータが流れているだけなので、これで伝わるような人であれば各自の環境でどうとでもできるのだが、多くの人にとってはハードルは高いと思う。
初期設定のまま Android に繋いで使うことも不可能ではないものの、個人的にはいくつか設定変更したほうがよい点があると感じていて、そのまま使うのはおすすめできない。
自分は Windows のノート PC を持っていないので、持ち出して試すために macOS 上で Whisky (Wine) を使って NaviViewer を動かせないか試したものの、残念ながらうまくいかなかった。
# PuTTY でシリアルポートを開いて NMEA を読み取ることはできたので、可能性は感じたんだけど、Wine と NaviViewer の相性がよくないのかもしれない。
NaviViewer での設定
PAIR コマンドの実行
NaviViewer を用いたとしても、UI 上で変更できる設定項目は一部のみ。基本的にはドキュメントを参照して PAIR コマンド (コマンド) を実行する必要がある。
NaviViewer を起動して GR-M02U の COM ポートを開くと NMEA のログが表示されるので、ログの表示されている黒い領域を2回クリックするとコマンドを入力できる。コマンドをキーボードで入力して最後に Enter を押せばコマンドが実行される。コマンドの末尾には *
に続けてチェックサムを記述するのが本来の仕様だが、NaviViewer から実行する場合には自動で付与してくれるので、*
の手前まで入力して Enter を押せばよい。
コマンドの結果は $PAIR001,ID,結果
という文字列に続く行で報告される。ID は実行したコマンドの ID で、結果が0であれば成功である。例えば、コマンド ID 062 を実行して成功していれば以下のような結果が返ってくる。
ドキュメントは公式サイトで製品のシリアル番号を入力した先のページにある。加えて Web ターミナルというのもあって、ブラウザ上でコマンドを実行することもできるのだが、ここで選べるコマンドも一部のみで、特に後述する設定の保存ができないので、残念ながらスマホで使うための事前の設定という用途では使えなさそうだった。HTML を改造すれば候補にないコマンドを実行することもできて、Web ターミナルであれば macOS でも使えるので、Mac だけで設定したい場合には試してみてもよいかもしれない。
GNSS の停止と再開
GR-M02U が立ち上がると NMEA のログがずっと流れ続ける。設定を変更している間はログが邪魔になって先述の実行結果を確認しづらいので、一時的に GNSS を停止しておくとよい。また、一部のコマンドでは GNSS を停止しておく必要がある場合もある (ドキュメント参照)。
GNSS を停止するにはコマンド ID 3 を実行する。
再開するにはコマンド ID 2 を実行する。
GST センテンスを出力する
NMEA で流れてくるデータには、いくつかの種類のセンテンスがある。その中でも、初期設定では出力されない設定になっている GST センテンスは重要なので出力する設定に変更しておくことをおすすめしたい。
具体的な影響としては、誤差 (精度) の表示に関わる。GST センテンスのデータがないと GNSS レシーバーが誤差を把握できないため、各アプリが誤差を推定することになり、誤差の表示がまったく当てにならない。
GST センテンスを設定できることはコマンド ID 63 のリファレンスには記載されていないのだが、NaviViewer のアプリ上では選択肢が存在しており、UI 操作時に流れるコマンドを見たところ、Type=8 を指定すれば設定できるようだった。まあ、アプリには選択肢があるのでアプリ上で設定してしまうのが手っ取り早いと思うが。
一応、以下のようなコマンドを実行することでも設定できる。
みちびきのサブメータ級測位補強サービス (QZSS SLAS) を使用する
原理はわかっていないのだが、みちびきが送信しているサブメータ級測位補強情報を受信することで位置情報の精度を改善でき、誤差 1m で測位できるとされている。ただ、初期状態では有効になっていないようだったので、使うように設定した (つもり)。どうやら、コマンド ID 400 と 420 が QZSS SLAS に関係しているようである。
ただ、設定してみたはいいものの、実際にこれが効果を発揮しているかというと、それを確認するための情報が NMEA のログの中に見当たらなくてよくわからない。サブメータ級という触れ込みながら、結局誤差は 2~3m 程度は出ているので、もしかしたらこれではうまく設定できていないのかもしれない (ちゃんと効いたうえで精度はこんなもんという可能性もある)。
ホットスタートを有効にする
前回起動に受信していたエフェメリスと呼ばれる衛星の起動情報を NVRAM に保存しておき、起動から衛星を見つけるまでの時間を短縮する。コマンド ID 4 で設定できる。
Dead Reckoning (DR) LIMIT を設定する
トンネルやビルなどで GNSS の信号が遮蔽された場合に、DR LIMIT を設定しているとジャイロや加速度のセンサーの情報を組み合わせて精度を高めようとしてくれる。正直なところ、適切な設定値が分からないしそもそも設定すべきなのかも謎だが、修正を行う回数を低めにして設定している。
3というのが位置情報を出力する回数3回分ということであれば、3秒間ということになるので、徒歩での移動スピードを考えたときにほとんど意味がない気がするが、それすらよくわからない。
設定の保存
設定は変更しただけだと電源を切ったら失われてしまう。設定する環境と測位する環境が同じであれば毎回設定し直してもよいが、PC で設定してスマホで測位する前提であれば、設定を保存しておくことが必要になる。
コマンド ID 513 がそれなので、NaviViewer で他のコマンドを実行したあと最後に以下のように入力してコマンドを実行する。
スマホで GR-M02U を使う
国内で GR-M02U を販売している東京通商のサイトには記載されていないが、海外で販売しているサイトを見ると Android での使い方も紹介されている。以下のページの手順に従えば Android でも簡単に使うことができる。
Android スマホの多くは USB Type-C のポートしか持たないため、GR-M02U を接続するためには OTG ケーブルが必要。何でもいいけど自分が使っているのはこれ。
紹介されている GPS Connector 以外に、UsbGps4Droid を使うこともできた。GPS Connector では見えている衛星の情報が表示されるものの、みちびきをまったく掴んでいないような表示になっていて謎。状態を見るためには別途 GPSTest を使っている。
GPSLogger for Android の Tips
GPSLogger for Android は操作を自動化するための設定方法が公開されているのが強み。MacroDroid などと組み合わせることで、スマホにまったく触れることなくログの開始・終了などの操作ができる。自分の場合は、自宅の Wi-Fi アクセスポイントから切断されたら記録を開始して、再び接続されたら終了するようにしている。これで出掛けている間は常に位置情報が記録される。加えて、自動アップロードの機能を使ってログを Dropbox にアップロードしているので、PC で結果を活用するまでも操作不要。ここまでの利便性は専用のロガーでは出せないと思うので、Android ならではかなと。
ただ、ここまで便利に使えるのは GR-M02U を使っていない場合の話で、GR-M02U が入ってくると、USB 機器を利用するための確認や GPS Connector の起動が必要になってくるので多少手間が掛かる。GR-M02U を繋ぐことでスマホのバッテリー消費も増えるので、繋ぎっぱなしで使うというよりは必要に応じて使う形になりそう。