EurekaMoments

新米エンジニアが一人前を目指す修行の日々を記していくブログです。

Self-Learning Notebook about GPS

Introduction

ロボットや車が自律移動をする際に自分の位置を計測する手段としてGPSがあります。カーナビやスマートフォンの地図アプリなどでも自分の居場所を知るために利用されるGPSですが、障害物検知用のミリ波レーダやスキャンレーザの計測精度を評価するためのリファレンスとして使われることもあります。
GPSで取得した位置情報は緯度、経度の形で表されますが、それを解釈したり座標変換したりするやり方を間違えると本来とは全然違うを自分の位置を認識してしまうので注意が必要です。今回の記事では、GPSを正しく扱うために必要な基礎知識をメモとして残しておきます。

Reference

今回は以下の書籍を見て勉強させていただきました。

https://www.enri.go.jp/~fks442/K_MUSEN/1st/1st060428rev2.pdf

Difference between GNSS and GPS

人工衛星によって地上の現在位置を決定する衛星測位システムをNSSと呼ぶ。その中で、地球全てを測位可能なものをGNSS、特定地域が測位可能なものをRNSSと分類する。GPSアメリカが開発したシステムであり、GNSSの一つとなる。

Geodetic system

地球上の位置を緯度経度及び標高を用いる座標によって表すシステムのことで、測量や地図作成の基準となっている。現代では準拠楕円体、測地座標系、ジオイド面の3要素を特定する事により定められている。
明治時代ベッセル楕円体を用いた測地系日本測地系であり、その後の観測でより実際の地表面に近い準拠楕円体として測量法が改良され、GRS80楕円体を準拠楕円体とした測地系世界測地系になる。

Coordinate system

GPSの基準座標系はWGS84(World Geodetic System 1984)という右手系の直行座標である。
f:id:sy4310:20180827213808p:plain
直行座標であれば、衛星位置や受信位置を(X, Y, Z)のように3つの数字のベクトルで表せる。これを、地球中心・地球固定直行座標系 ECEF(Earth Centered, Earth Fixed)と呼ぶ。地球の重心を原点として、地球の自転軸の北極方向をZ軸とする。Z軸に垂直にグリニッジ子午線の方向をX軸として、これらの軸と直交するように右手系でY軸を決めるという意味である。緯度(Φ)、経度(λ)、楕円体高(h)からXYZに変換するための定数と公式は以下の通り↓
f:id:sy4310:20180827214351p:plain
f:id:sy4310:20180827214404p:plain
f:id:sy4310:20180827214413p:plain

Geoid

地球の表面の7割は海洋で覆われており、測地学では世界の海面の平均位置に最も近い「重力の等ポテンシャル面」を「ジオイド」と定め、これを地球の形状としている。日本では、東京湾平均面を「ジオイド」と定め、標高の基準としている。標高は、ジオイドから測った高さとなる。
地球の地殻構造は不均質で、そのため地球の引力はこの不均質を反映して場所によって変化する。ジオイドにもこれに応じた起伏があり、ジオイドの起伏ともっとも良く合う地球楕円体と比べたとき、ジオイドの凹凸は最大約±100mに達する。日本では、「GRS80楕円体」を地球楕円体として採用していて、この楕円体からジオイドまでの高さを「ジオイド高」としている。この高さは基準となる楕円体によって変わる。
f:id:sy4310:20180827214621p:plain
測量やナビゲーションに利用されているGPSでは、幾何学的な位置を求めることができるが、重力を考慮していないため、標高を直接求めることはできない。GPSを用いて標高を求めるにはジオイド高が必要になる。

NMEA

受信機とナビゲーション機器の通信に使用されるプロトコルのこと。通信の際はシリアルポートを使用する。GPS機能を使って位置情報を取得する場合、GPSモジュールは1秒間隔で位置情報を出力する。
このNMEAにはいくつもの出力仕様(センテンス)があり、その中でも代表的なセンテンスとして、$GPGGA、$GPGSA、$GPRMCがある。

$GPGGA Data Format

UTCタイム, 緯度, N, 経度, E, 品質, 使用衛星数, 水平精度低下率, 海抜高さ, M, ジオイド高さ, M, 差動基準地点, ID, チェックサム。位置特定品質の値が4ならRTK fixed、5ならRTK floatの状態であることを意味する。

$GPGSA Data Format

モード, 特定タイプ, 衛星番号, 位置精度低下率, 水平精度低下率, 垂直精度低下率, チェックサム

$GPRMC Data Format

UTCタイム, A, 緯度, N, 経度, E, 移動速度, 移動の真方位, 日付, 磁北と真北の間の角度の差, 方向, モード, チェックサム

Coordinate Transformation

緯度、経度の単位は「度」と「分」、かつ100倍に桁上げした数値で出力される。これをGoogleマップなどで表示させたり、座標変換によりXYZの位置座標を求める場合は単位を10進数「度」に変換する必要がある。
例えば、3538.5028は35度38.5028分、13936.2530は139度36.2530分となる。これらを「度」の単位に変換する場合は、まず出力された数値を「度」の部分と「分」の部分に分割する。元の数値を100で割り、それの整数部分を抽出すれば「度」の値になる。次に、100で割った直後の数値から整数部分を引けば少数点以下の値が分かり、それを100倍して60で割れば「度」の値になる。最後に、これら二つの度数を足せばOK。