概要
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は複数の周波数帯で信号を送信します:
| 信号 | 周波数 | コード | 用途 |
|---|---|---|---|
| L1 | 1575.42MHz | C/Aコード(民間), Pコード(軍用) | 標準測位(最も一般的) |
| L2 | 1227.60MHz | Pコード(軍用), L2C(民間) | 電離層補正 |
| L5 | 1176.45MHz | 民間(航空安全向け) | 高精度・高信頼性 |
| L1C | 1575.42MHz | GPS 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〜10m | 低 | 30s〜3min | 一般追跡・ナビ |
| マルチGNSS | 2〜5m | 低〜中 | 10s〜1min | 市街地・困難環境 |
| DGNSS/SBAS | 1〜3m | 低(ソフト追加) | 30s〜2min | 農業・測量入門 |
| RTK(2周波) | 2〜5cm | 高(基準局必要) | 1〜5min(初期化) | 精密農業・建設 |
| PPP | 2〜10cm | 中(サービス契約) | 10〜30min(収束) | 広域精密測位 |
単純な位置追跡・ナビゲーション用途にはGPS/マルチGNSSで十分であり、精密農業・建設・測量ではRTKが必要です。IoT組み込み機器ではRTK測位モジュールをそのまま搭載するよりも、サーバーサイドで補正を行う「ネットワークRTK」や「クラウドRTK」サービスと組み合わせるケースが増えています。