広域・低電力無線

GNSS

GPS等の衛星測位システムの総称。

概要

GNSS(Global Navigation Satellite System:全球測位衛星システム)は、地球を周回する複数の衛星から送られる電波信号を受信し、地球上のどこにいても三次元位置(緯度・経度・高度)と時刻を高精度に計測できる衛星測位システムの総称です。

代表的なGNSSシステムとして、米国のGPS・ロシアのGLONASS・EUのGalileo・中国のBeiDou・日本の準天頂衛星システム(QZSS/みちびき)・インドのNavICがあります。現代のGNSSレシーバーは複数のシステムを同時受信(マルチコンステレーション)することで、可視衛星数を増やして測位精度・可用性を大幅に向上させています。

組み込み・IoT機器では、スマートフォンに使われるような小型・低消費電力のGNSSモジュールが広く使われており、LTE-MLoRaWANと組み合わせた位置追跡デバイス、ドローン・自動運転の測位、農業機械の精密制御など幅広い用途があります。

歴史・背景

衛星測位の歴史はNASAとアメリカ海軍が1960年代に開発したTransit衛星システムに遡りますが、現代GNSSの基盤となったのは1978年に打ち上げが始まった米国のGPS(Global Positioning System)です。

GPSは当初軍事用途のみでしたが、1983年の大韓航空007便撃墜事件を受けて民間航空への開放が決定。1994年に24機体制の完全運用を開始し、1995年以降は民間向けに10〜30mの精度で無料提供されました。2000年にSA(Selective Availability:意図的な精度低下措置)が解除され、民間利用が一気に広がりました。

日本では2010年代から準天頂衛星システム(QZSS)の整備が進み、2018年に4機体制で運用開始。日本・東アジア上空での衛星仰角が高くなり、山間部・ビル街でのGNSS測位精度が向上しました。

技術仕様

主要GNSSシステム比較

システム衛星数軌道高度周波数帯民間精度
GPS米国31機20,200km(MEO)L1(1575.42MHz) / L2 / L53〜10m
GLONASSロシア24機19,100km(MEO)L1(1602MHz帯) / L25〜15m
GalileoEU30機23,222km(MEO)E1(1575.42MHz) / E51〜3m(Open Service)
BeiDou中国35機21,500km(MEO)+GEOB1(1561.098MHz) / B22.5〜5m
QZSS日本4機準天頂軌道+GEOL1/L2/L5/L6数cm(補強時)

GNSSの測位原理

GNSSは「到達時間差(Time of Arrival)」に基づいて位置を計算します:

衛星からの距離計算:
  距離 = 電波速度(約3×10⁸m/s)× 伝搬時間(受信機時計誤差含む)

疑似距離(Pseudorange):
  PR = c × (t_受信 - t_送信) + c × δt_受信機
       (真の距離 + 時計誤差の影響)

連立方程式で位置を求める:
  未知数: 緯度(x)・経度(y)・高度(z)・受信機時計誤差(δt)
  → 最低4機の衛星から4つの疑似距離方程式が必要

実際の測位計算では最小二乗法で数十機の衛星データを統合

GNSSの精度と誤差要因

GNSSの主な誤差要因:
┌──────────────────────────────────────┐
│ 誤差要因            │ 大きさ(典型) │
├──────────────────────────────────────┤
│ 電離層遅延          │ 5〜15m        │
│ 対流圏遅延          │ 2〜3m         │
│ 多重反射(マルチパス)│ 0.5〜数m     │
│ 衛星軌道・時計誤差  │ 0.5〜1m       │
│ 受信機ノイズ        │ 0.3〜0.5m     │
└──────────────────────────────────────┘

合計(CEP95%):
  オープンスカイ: 3〜10m(GPS L1単独)
  ビル街: 10〜50m(マルチパス影響)
  屋内: 測位困難

精度向上技術:
  DGNSS: 既知点の基準局で誤差補正 → 0.5〜2m
  SBAS(QZSS SLAS, WAAS等): → 1〜3m
  RTK: → 数cm([RTK測位](/embedded/glossary/rtk/)を参照)
  PPP: → 数cm(数分〜十数分の収束時間)

動作原理

GNSSレシーバーの処理フロー

1. アンテナで衛星信号受信(L1: 1575.42MHz等)

2. RF Frontend:
   LNA(低雑音増幅器)→ ダウンコンバータ → ADC

3. ベースバンド処理:
   捕捉(Acquisition): 衛星PRNコード・Dopplerを探索
   追跡(Tracking): PLL/DLL でコードと搬送波を追尾
   デコード: NAV Message(軌道情報・時刻情報)の復号

4. 測位計算:
   各衛星の疑似距離算出
   衛星位置の計算(エフェメリスから)
   受信機位置の最小二乗法計算

5. NMEA/proprietary形式で位置データ出力

NMEAプロトコル

GNSSモジュールの標準的な出力フォーマットはNMEA 0183です:

$GNGGA,103254.00,3440.12345,N,13520.67890,E,1,12,0.60,52.3,M,37.4,M,,*5F

GGA文(基本測位情報):
$GNGGA  : GNSSGlobal Fix Data(マルチコンステレーション)
103254.00 : UTC時刻 10:32:54.00
3440.12345,N : 北緯34度40.12345分
13520.67890,E : 東経135度20.67890分
1         : 測位品質(0=無効,1=GPS単独,2=DGNSS,5=Float RTK,4=Fix RTK)
12        : 使用衛星数
0.60      : HDOP(水平精度低下率)
52.3,M    : 高度52.3m(WGS84楕円体高)
37.4,M    : ジオイド高37.4m
*5F       : チェックサム
// NMEAパーサー(簡略版)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
    double latitude;   // 小数度(北緯正)
    double longitude;  // 小数度(東経正)
    float  altitude;   // 高度(m)
    uint8_t fix_quality;
    uint8_t num_sats;
    float  hdop;
    bool   valid;
} gnss_position_t;

bool parse_gga(const char *nmea_sentence, gnss_position_t *pos) {
    if (strncmp(nmea_sentence, "$GNGGA", 6) != 0 &&
        strncmp(nmea_sentence, "$GPGGA", 6) != 0) {
        return false;
    }

    char buf[128];
    strncpy(buf, nmea_sentence, sizeof(buf));

    char *fields[16];
    int n = 0;
    char *p = strtok(buf, ",");
    while (p && n < 16) { fields[n++] = p; p = strtok(NULL, ","); }

    if (n < 10) return false;

    // 緯度変換(DDMM.MMMMM → 小数度)
    double lat_raw = atof(fields[2]);
    int lat_deg = (int)(lat_raw / 100);
    double lat_min = lat_raw - lat_deg * 100;
    pos->latitude = lat_deg + lat_min / 60.0;
    if (fields[3][0] == 'S') pos->latitude = -pos->latitude;

    // 経度変換
    double lon_raw = atof(fields[4]);
    int lon_deg = (int)(lon_raw / 100);
    double lon_min = lon_raw - lon_deg * 100;
    pos->longitude = lon_deg + lon_min / 60.0;
    if (fields[5][0] == 'W') pos->longitude = -pos->longitude;

    pos->fix_quality = atoi(fields[6]);
    pos->num_sats    = atoi(fields[7]);
    pos->hdop        = atof(fields[8]);
    pos->altitude    = atof(fields[9]);
    pos->valid       = (pos->fix_quality > 0);

    return true;
}

用途・ユースケース

位置追跡デバイス

  • 輸送コンテナ・パッケージのリアルタイム追跡(GNSS + LTE-M
  • 家畜・農機の位置管理(GNSS + LoRaWAN
  • 子ども・高齢者の見守りデバイス

精密農業

  • トラクターの自動操舵(RTK測位でcm精度)
  • 農薬・肥料の精密散布制御
  • ドローンの自律飛行

測量・インフラ

  • 建設機械の自動制御(RTK測位
  • 変形監視(ダム・橋梁・地すべり)
  • ジオフェンシング(特定エリアへの入退出管理)

自動運転・モビリティ

実装・開発のポイント

GNSSモジュール選定

モジュールメーカー特徴
M8N / M9Nu-blox最も普及。マルチバンド対応
LC29HQuectelデュアルバンド、RTK対応
L70 / L89Quectel小型・低コスト
MT3333MediaTekコスト重視
ZED-F9Pu-bloxRTK受信機、cm精度

GNSSの省電力設計

IoT機器でのGNSS使用は消費電力が課題です:

// GNSS省電力運用(u-blox M8N/M9Nの例)
#define GNSS_ON_TIME_MS    5000  // 5秒間測位してシャットダウン
#define GNSS_SLEEP_TIME_MS 55000 // 55秒スリープ(1分周期)

void gnss_task(void) {
    while (1) {
        // 1. GNSS電源ON
        gpio_set(GNSS_POWER_PIN, HIGH);
        delay_ms(100);

        // 2. Hot startで高速測位(以前のエフェメリスを使用)
        gnss_position_t pos;
        uint32_t timeout = GNSS_ON_TIME_MS;
        while (timeout > 0) {
            char nmea[128];
            if (gnss_read_nmea(nmea, sizeof(nmea))) {
                if (parse_gga(nmea, &pos) && pos.valid && pos.hdop < 2.0) {
                    // 良好な測位が得られた
                    report_position(&pos);
                    break;
                }
            }
            delay_ms(100);
            timeout -= 100;
        }

        // 3. GNSS電源OFF(バックアップ電源でエフェメリス保持)
        gpio_set(GNSS_POWER_PIN, LOW);

        // 4. MCUスリープ
        sleep_ms(GNSS_SLEEP_TIME_MS);
    }
}

AssistNow(AGPS)による高速起動

コールドスタート(エフェメリスなし)では測位に30秒〜数分かかります。AssistNow(u-blox)等のAGPS(Assisted GPS)サービスを使うと、インターネット経由でエフェメリスを事前取得でき、起動後数秒で測位可能になります:

GNSS起動時間の比較:
コールドスタート: 30秒〜3分(エフェメリス再取得から)
ウォームスタート: 5〜15秒(古いエフェメリスあり)
ホットスタート: 1〜3秒(新しいエフェメリスあり)
AssistNow使用: 1秒以下(サーバーからのアシストデータ使用)

他技術との比較

GNSSと屋内測位技術の比較

GNSSは屋外では優れた精度を発揮しますが、屋内では電波が届かず測位できません。屋内測位には別の技術が必要です:

技術屋外屋内精度コスト
GNSS(GPS)優秀不可3〜10m低(モジュール費用のみ)
UWB不適優秀10〜30cm高(アンカー設置)
BLE Beacon不適中程度1〜5m中(Beacon設置)
Wi-Fi測位一部可5〜20m低(既存AP活用)
セルラー測位一部可50〜500m低(SIMで可能)

GNSSとIMU(慣性計測ユニット)を組み合わせたセンサーフュージョンによって、トンネル内・地下など一時的にGNSS信号が失われる状況での連続測位(デッドレコニング)が可能になります。

関連用語

参考リンク