GPS「NMEA」フォーマットとロケットシミュ

ご無沙汰しておりました。yuukivelです。

卒論の検印もすみ、卒論発表も終わらせ、卒業まで一直線となりました。
2月末に論文2本の締め切りがあるわけですが、それさえ済ませればとうとう晴れて航空宇宙工学を生業とする学生となるわけです。

さて本題です。

最近訳あって、GPSロガーに手を出している。
飛行ロボットなりやっていくにあたってGPSの利用は必須なので、必要な知識というわけだ。

今回はGPSのフォーマット「NMEA」について。
そしてせっかくだから昔作ったロケットシミュ「mq_rocket」というソフトの結果をNMEAではけるようにした。

NMEAのフォーマットの説明はググればいくらでも出てくる。
例えば
http://www.hiramine.com/physicalcomputing/general/gps_nmeaformat.html
とか。

NMEAはさまざまなセンテンスの集まりであり、その情報には重複も含まれる。
疑似NMEAを作成するに当たって、今回は$GPGGAのセンテンスのみ利用した。3次元座標の表現にはこれで十分。
逆にmbedの解説記事とかで目にする$GPRMCだけにすると高度の情報が不足する。

疑似NMEAを作るにあたって注意すべきはチェックサム。これが間違っているとソフトはNMEAを読んでくれない。
チェックサムはの作り方について。
$以降のセンテンスを全て数値コードに変換する。
そののちそれらを前から順次排他的論理和xorをとり、16進数に変換する。

ここについては既存のコードを参考にした。

さて、NMEAを作るには軌道の緯度経度標高とジオイド高のデータが必要だ。
シミュレーションで出てくるのはXYZのデータであり、これを緯度経度に変換しなければならない。
そのために地球中心・地球固定直交座標系ECEF座標系を経由して求める必要がある。

これについての参考資料は以下のリンクより
理解するためのGPS測位計算プログラム入門(その1)

計算の手順としては、


射点の緯度経度標高ジオイド

射点のECEF座標

シミュレーションの結果(地平座標)を回転行列と射点ECEF座標によりECEF座標に変換

得られたECEF座標を緯度経度楕円体高に変換

楕円体高を標高に変換。(標高は楕円体高からジオイド高を引けばよい)


という流れ。

その結果がこちら

これは
NMEA to KMZ file converter というソフトを使ってkmvに変換して表示させている。
http://homepage2.nifty.com/k8/gps/indexj.htm#003
3Dにチェックを入れるのを忘れずに。
本来であればgoogle earthでNMEAは直接読めるはずだが、なぜかできないのでkmzを経由した。



あと、久しぶりにこのプログラムを弄ったついでに、動画出力機能を付けた。
windowsメディアメーカーで作成できる。
出力の選択をすると、figフォルダ内に画像を大量に出力するので、これらをムービーメーカーで再生時間を合わせるだけ。
再生時間の設定をちゃんと同期するように気を付けて下さい。

その結果がこれ。上の軌道のやつです。


あと、いつも通り作ったプログラムを公開します。
mq_rocket


NMEAについてはよく分かったので、ロガーの製作をやりたい。
新作飛行ロボットの設計も終わったし、春休みはやりたいことがたくさんだ。