NMEA:National Marine Electronics Association¶
NMEA(National Marine Electronics Association)は、GNSS受信機が位置情報を出力するための標準的な通信フォーマットです。
正式名称はNMEA 0183で、主にCSV(カンマ区切り)のテキスト形式で位置・速度・時刻などのデータを出力します。
NMEAセンテンス¶
GNSS受信機から出力されるデータは、複数の異なるセンテンス(文)の形式で構成されています。
各センテンスは特定の情報を含んでおり、どのセンテンスを受け取るかによって得られる情報が異なります。
もっとも一般的な形式は
$GPRMC(時刻・位置・速度・日付)と
$GPGGA(時刻・位置・高度・衛星数)です。
特徴¶
- テキスト形式: 人間が読める形式で出力されるため、通信内容の確認が容易です
- カンマ区切り: フィールドがカンマで区切られているため、プログラムでの解析が簡単です
- チェックサム付き: 各センテンスにチェックサム(
*XX)が付いており、データの破損検出が可能です - 複数フォーマット: GGA、RMC、GSA、GSV、VTG など、用途に応じた複数のセンテンス形式があります
主なNMEAセンテンス¶
センテンス名は「GNSSの識別名」+「センテンス形式」となっています
- GNSSの識別名: GPS、GLONASS、GAlileoなど
- センテンス形式: RMC、GGAなど
$GPRMC(推奨最小必須情報)¶
時刻、位置、速度、進行方向、日付を含むセンテンスです。
$GPRMC, # センテンス名
1:utc <hhmmss.ss>, # UTC時刻(時分秒.小数秒)
2: A/V, # 有効(A)または無効(V)
3:latitude <ddmm.mmmm>, # 緯度(度分形式)
4:N/S, # 北緯(N)または南緯(S)
5:longitude <ddmm.mmmm>, # 経度(度分形式)
6:E/W, # 東経(E)または西経(W)
7:speed, # 速度(ノット単位)
8:heading, # 進行方向(0~359度)
9:date <ddmmyy>, # 日付(日月年)
10:magnetic_variation <ddd.d>, # 磁気偏角(0〜180度)
11:direction <E/W>, # 東偏(E)または西偏(W)
*checksum # チェックサム($と*の文字列のXOR)
$GPRMC,093426.00,A,3723.2475,N,12158.3416,E,0.0,0.0,231215,,*49
hhmmss.ss:093426.00= 09時34分26秒00A/V: Alatitude:3723.2475= 37度23分2475秒(=37.387453度)N/S: N = 北緯longitude:12158.3416= 121度58分3416秒(=121.97236度)E/W: E = 東経speed: 0.0heading: 0.0ddmmyy:231215= 2015年12月23日ddd.d: なし(磁気偏角)E/W: なし(磁気偏角の向き)checksum:*49
磁気偏角
磁気偏角(magnetic variation)とその向き(direction)は、多くの受信機で空欄です。
$GPGGA(グローバルポジショニングシステム測位データ)¶
時刻、位置、高度、衛星数、測位品質を含むセンテンスです。
$GPGGA,
1:utc <hhmmss.ss>, # UTC時刻
2:latitude <ddmm.mmmm>, # 緯度(度分形式)
3:N/S, # 北緯(N)または南緯(S)
4:longitude <ddmm.mmmm>, # 経度(度分形式)
5:E/W, # 東経(E)または西経(W)
6:fix_quality, # 測位品質(0=無効、1=GPS通常測位、2=DGPS など)
7:num_satellites, # 測位に使用した衛星数(0~24)
8:hdop, # 水平精度低下係数(低いほど高精度)
9:altitude, # 楕円面上の高度(メートル)
10:altitude_unit, # 単位
11:geoid_height, # ジオイド高度(メートル)
12:geoid_unit, # 単位
13:dgps_age,
14:dgps_id,
*checksum,
$GPGGA,093426.00,3723.2475,N,12158.3416,E,1,08,1.23,45.9,M,-6.2,M,,
hhmmss.ss:093426.00ddmm.mmmm: 3723.2475N/S: Nddmm.mmmm: 12158.3416E/W: Efix_quality: 1num_satellites: 08hdop: 1.23altitude: 45.9 Mgeoid_height: -6.2 Mdgpsdgpsidchecksum
その他のセンテンス¶
- $GPGSA: 衛星の利用状況と精度情報
- $GPGSV: 衛星の位置情報(方位角、仰角、信号強度)
- $GPVTG: 速度情報(速度、進行方向)
NMEA座標形式の変換¶
NMEAで送信される座標は「度分形式(DDM: Degree and Decimal Munites)」です。 以下の変換式で「10進度形式(DD: Decimal Degree)」に変換できます。
\[
\text{decimal} = \text{degree} + \frac{\text{minutes}}{60}
\]
例:
3723.2475=37+23.2475/60 = 37.3874°N(北緯)12158.3416=121+58.3416/60 = 121.9724°E(東経)
from typing import Literal
def nmea_to_decimal(
nmea_value: float,
hemisphere: Literal["N", "E", "W", "S"]
) -> float:
degree = int(nmea_value // 100)
minutes = nmea_value - degree * 100
decimal = degree + minutes / 60.0
# 南緯・西経の場合は符号を反転
if hemisphere in ("S", "W"):
decimal = -decimal
return decimal
NMEAデータの活用¶
GNSS受信機から連続的に出力されるNMEAセンテンスを利用することで
- リアルタイム位置追跡 - 移動物体の現在位置を常に把握
- ログ記録 - 時系列で位置情報を記録し、移動経路を分析
- 高度データの取得 - GGAセンテンスから3次元位置情報を得る
- 測位品質の監視 - 衛星数やHDOP値から測位の信頼度を判定
kurikintonsでは、
GT502MGGモジュールから受け取ったNMEAセンテンス(主にGPRMCとGPGGA)を使って、
位置・時刻・衛星数などのデータを検出イベントに関連付けて記録しています。