Skip to content

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など
  • センテンス形式: RMCGGAなど

$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秒00
  • A/V: A
  • latitude: 3723.2475 = 37度23分2475秒(=37.387453度)
  • N/S: N = 北緯
  • longitude: 12158.3416 = 121度58分3416秒(=121.97236度)
  • E/W: E = 東経
  • speed: 0.0
  • heading: 0.0
  • ddmmyy: 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.00
  • ddmm.mmmm: 3723.2475
  • N/S: N
  • ddmm.mmmm: 12158.3416
  • E/W: E
  • fix_quality: 1
  • num_satellites: 08
  • hdop: 1.23
  • altitude: 45.9 M
  • geoid_height: -6.2 M
  • dgps
  • dgpsid
  • checksum

その他のセンテンス

  • $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センテンスを利用することで

  1. リアルタイム位置追跡 - 移動物体の現在位置を常に把握
  2. ログ記録 - 時系列で位置情報を記録し、移動経路を分析
  3. 高度データの取得 - GGAセンテンスから3次元位置情報を得る
  4. 測位品質の監視 - 衛星数やHDOP値から測位の信頼度を判定

kurikintonsでは、 GT502MGGモジュールから受け取ったNMEAセンテンス(主にGPRMCGPGGA)を使って、 位置・時刻・衛星数などのデータを検出イベントに関連付けて記録しています。