広域・低電力無線

GPS

米国の衛星測位システム。

概要

GPS(Global Positioning System)は、米国が開発・運用する衛星測位システムです。地球を周回する30機以上の衛星(軌道高度約20,200km)から発信される電波を地上の受信機で受信し、受信機の位置(緯度・経度・高度)と精密な時刻を求めることができます。

GPSはGNSS(全球測位衛星システム)の一つであり、現代では「GPS」という言葉が広くGNSS全体を指す俗称として使われることも多いですが、厳密にはGPSは米国のシステムのみを指します。スマートフォン・カーナビ・ドローン・農業機械から組み込みIoT機器まで、測位機能を持つ電子機器の大多数にGPS(GNSS)受信機が内蔵されています。

民間利用では無料で3〜10m程度の精度(単独測位)が得られ、RTK技術を使えばcm精度の測位も可能です。

歴史・背景

GPSの開発は1973年に米国国防総省が始めた「NAVSTAR GPS」プログラムに遡ります。軍事・航空・海洋での精密な位置・時刻情報提供を目的として設計されました。

1978年に最初のBlock I衛星が打ち上げられ、1994年に当初設計の24機体制(6軌道面、各4機)で完全運用を開始しました。当初は意図的に民間精度を低下させる「SA(Selective Availability)」が設定されており、民間利用は50〜100mの誤差がありましたが、2000年5月にSAが解除されて10〜30mの精度が無料で提供されるようになりました。

日本の準天頂衛星システム(QZSS/みちびき)は2010年代から整備され、4機体制でGPSの補強・補完を行い、日本上空でのGPS測位精度と可用性を向上させています。

技術仕様

衛星コンステレーション

GPS衛星軌道設計:
  軌道種別: MEO(中軌道)
  軌道高度: 20,200km
  軌道傾斜角: 55°
  軌道面数: 6面
  各軌道面の衛星数: 4〜5機
  総衛星数: 31機(現行ブロック)
  周回周期: 約12時間(0.5恒星日)
  地上から見える衛星数: 通常6〜12機(どの場所でも最低4機)

周波数と信号

GPSは複数の周波数帯で信号を送信します:

信号周波数コード用途
L11575.42MHzC/Aコード(民間), Pコード(軍用)標準測位(最も一般的)
L21227.60MHzPコード(軍用), L2C(民間)電離層補正
L51176.45MHz民間(航空安全向け)高精度・高信頼性
L1C1575.42MHzGPS III新信号Galileo相互運用

最も広く使われるのはL1 C/Aコード(周波数1575.42MHz、コードレート1.023MHz)です。

PRNコード(Pseudo-Random Noise Code)

GPSはCDMA方式を採用し、各衛星に固有のPRN(擬似雑音)コードを割り当てます:

C/Aコード(Coarse/Acquisition Code):
  コードレート: 1.023Mbps
  コード長: 1023チップ(1ms周期)
  用途: 衛星の識別・疑似距離測定(民間用)

GPSの受信原理:
  受信機で同じPRNコードを生成し、衛星から届いたコードと相関演算
  コードの到着遅延時間 × 光速 = 擬似距離

GPS時刻システム

GPSは独自の時刻系(GPST:GPS Time)を使用します:

GPS時刻の特徴:
  基準: 1980年1月6日 00:00:00 UTC
  閏秒なし(UTC閏秒とは分離)
  2024年現在のGPST-UTC差: 18秒(閏秒が18回追加されている)
  
GPS衛星の原子時計:
  Cs(セシウム)またはRb(ルビジウム)原子時計搭載
  精度: 10ナノ秒以下(衛星1機あたり)
  地上管制局が定期的に時刻補正

動作原理

GPS受信機の測位計算

測位計算の流れ:

1. 衛星i の位置ベクトル計算:
   エフェメリスデータ(軌道要素)→ 衛星(xi, yi, zi)の位置計算

2. 疑似距離 ρi の計算:
   ρi = c × Δt_i(コード相関による伝搬時間 × 光速)

3. 幾何学的距離方程式:
   ρi = √((xi-X)² + (yi-Y)² + (zi-Z)²) + c × δt
   
   未知数: 受信機位置(X,Y,Z), 受信機時計誤差δt
   → 4衛星で4方程式を連立して解く

4. 最小二乗法(衛星が4機以上の場合):
   精度向上・冗長性を持たせて解く

5. 座標系変換:
   ECEF(地球中心地球固定)座標 → WGS84楕円体座標(緯度・経度・高度)

NMEA 0183出力

GPSモジュールの標準出力フォーマット:

// NMEA GGA文のパース例
// $GPGGA,123519.00,3440.50000,N,13530.00000,E,1,08,0.9,545.4,M,46.9,M,,*47

#include <stdlib.h>
#include <string.h>

// 緯度経度の変換(DDDMM.MMMM → 10進数度)
double nmea_coord_to_decimal(const char *coord_str, char hemisphere) {
    double raw = atof(coord_str);
    int degrees = (int)(raw / 100);
    double minutes = raw - (degrees * 100.0);
    double decimal = degrees + (minutes / 60.0);
    
    if (hemisphere == 'S' || hemisphere == 'W') {
        decimal = -decimal;
    }
    return decimal;
}

// UBX-NAV-PVT(u-blox独自プロトコル)のパース例
typedef struct {
    uint32_t iTOW;        // GPS時刻(ms)
    uint16_t year;
    uint8_t  month, day;
    uint8_t  hour, min, sec;
    int32_t  lat;         // 10^-7 deg
    int32_t  lon;         // 10^-7 deg
    int32_t  height;      // mm(楕円体高)
    int32_t  hMSL;        // mm(海抜高度)
    uint32_t hAcc;        // mm(水平精度)
    uint32_t vAcc;        // mm(垂直精度)
    uint8_t  numSV;       // 使用衛星数
    uint8_t  fixType;     // 0:No fix 2:2D 3:3D 4:GNSS+DR
} ubx_nav_pvt_t;

コールドスタート・ウォームスタート・ホットスタート

起動種別と初期化時間:

コールドスタート(初回起動時):
  - エフェメリス(軌道情報)なし
  - アルマナック(概略軌道)なし
  - 初回測位: 30秒〜3分
  
ウォームスタート(再起動):
  - アルマナックあり、エフェメリスは古い
  - 初回測位: 5〜30秒

ホットスタート(短時間停止後):
  - 有効なエフェメリスあり(通常2時間以内)
  - 初回測位: 1〜5秒

AGPS(Assisted GPS):
  - インターネット経由でエフェメリスを事前取得
  - 初回測位: 1秒以下

用途・ユースケース

車両追跡・フリートマネジメント

  • 物流車両のリアルタイム位置管理
  • 建設重機の稼働状況・位置記録
  • タクシー・配車サービスのディスパッチ

ドローン・UAV

  • 自律飛行ルートの維持(GPS Holdモード)
  • ジオフェンスによる飛行制限エリア管理
  • リターントゥホーム機能(離陸地点への自動帰還)

農業精密制御

  • トラクターのGPS自動操舵(メーカー問わず対応)
  • 農薬散布ドローンの自律飛行
  • 収量マッピング(GPS位置+収量センサーの組み合わせ)

マリン・航空

  • 船舶のGPS航法・AIS位置報告
  • 一般航空・UAMの航法支援

実装・開発のポイント

GPSモジュールとの接続

IoT機器での典型的なGPS/GNSSモジュール接続:

接続インターフェース:
  UART(最も一般的): 9600 / 38400 / 115200bps
  SPI: u-blox F9Pシリーズ等
  I2C: u-blox M9N等
  USB: PC接続時

典型的な回路構成:
MCU ─── UART_TX ───→ GPS_RX
MCU ←── UART_RX ─── GPS_TX
MCU ─── GPIO(TIMEPULSE)←── GPS(1PPS出力)
MCU ─── GPIO ──────→ GPS_EN(電源制御)
MCU ─── GPIO ──────→ GPS_NRESET

u-blox M8Nの設定例

// u-blox UBX-CFG-PRT でUART設定
// u-blox UBX-CFG-GNSS でGNSS設定
// u-blox UBX-CFG-MSG でNMEA出力設定

// GGA・RMCのみ出力(1秒間隔)、他は無効化
uint8_t cfg_msg_gga[] = {
    0xB5, 0x62,       // UBXシンクロナイザ
    0x06, 0x01,       // クラスCFG、IDメッセージ
    0x08, 0x00,       // ペイロード長
    0xF0, 0x00,       // NMEA GGA
    0x00, 0x01,       // ポート0:無効, ポート1(UART1):1秒ごと
    0x00, 0x00,       // ポート2,3:無効
    0x00, 0x00,       // ポート4,5:無効
    0x00, 0x00        // チェックサム(要計算)
};
uart_write(cfg_msg_gga, sizeof(cfg_msg_gga));

マルチコンステレーション対応

現代のGNSSモジュールはGPS以外にGLONASS・Galileo・BeiDou・QZSSにも対応しています:

マルチコンステレーション受信のメリット:
  - 可視衛星数が増加(GPS単独の2〜3倍)
  - ビル街・山間部での測位可用性向上
  - DOP値(精度低下率)の改善
  - 初期測位時間の短縮

u-blox M9N でのGNSS設定例(UBX-CFG-GNSS):
  GPS:     有効(L1 C/A)
  GLONASS: 有効(L1OF)
  Galileo: 有効(E1B/E1C)
  BeiDou:  有効(B1I)
  QZSS:    有効(L1C/A、L1S補強信号)

他技術との比較

GPS単独 vs マルチGNSS vs RTK

測位方式精度コスト起動時間適用場面
GPS単独(L1)3〜10m30s〜3min一般追跡・ナビ
マルチGNSS2〜5m低〜中10s〜1min市街地・困難環境
DGNSS/SBAS1〜3m低(ソフト追加)30s〜2min農業・測量入門
RTK(2周波)2〜5cm高(基準局必要)1〜5min(初期化)精密農業・建設
PPP2〜10cm中(サービス契約)10〜30min(収束)広域精密測位

単純な位置追跡・ナビゲーション用途にはGPS/マルチGNSSで十分であり、精密農業・建設・測量ではRTKが必要です。IoT組み込み機器ではRTK測位モジュールをそのまま搭載するよりも、サーバーサイドで補正を行う「ネットワークRTK」や「クラウドRTK」サービスと組み合わせるケースが増えています。

関連用語

参考リンク