概要
GNSS(Global Navigation Satellite System:全球測位衛星システム)は、地球を周回する複数の衛星から送られる電波信号を受信し、地球上のどこにいても三次元位置(緯度・経度・高度)と時刻を高精度に計測できる衛星測位システムの総称です。
代表的なGNSSシステムとして、米国のGPS・ロシアのGLONASS・EUのGalileo・中国のBeiDou・日本の準天頂衛星システム(QZSS/みちびき)・インドのNavICがあります。現代のGNSSレシーバーは複数のシステムを同時受信(マルチコンステレーション)することで、可視衛星数を増やして測位精度・可用性を大幅に向上させています。
組み込み・IoT機器では、スマートフォンに使われるような小型・低消費電力のGNSSモジュールが広く使われており、LTE-MやLoRaWANと組み合わせた位置追跡デバイス、ドローン・自動運転の測位、農業機械の精密制御など幅広い用途があります。
歴史・背景
衛星測位の歴史は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 / L5 | 3〜10m |
| GLONASS | ロシア | 24機 | 19,100km(MEO) | L1(1602MHz帯) / L2 | 5〜15m |
| Galileo | EU | 30機 | 23,222km(MEO) | E1(1575.42MHz) / E5 | 1〜3m(Open Service) |
| BeiDou | 中国 | 35機 | 21,500km(MEO)+GEO | B1(1561.098MHz) / B2 | 2.5〜5m |
| QZSS | 日本 | 4機 | 準天頂軌道+GEO | L1/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;
}
用途・ユースケース
位置追跡デバイス
精密農業
- トラクターの自動操舵(RTK測位でcm精度)
- 農薬・肥料の精密散布制御
- ドローンの自律飛行
測量・インフラ
- 建設機械の自動制御(RTK測位)
- 変形監視(ダム・橋梁・地すべり)
- ジオフェンシング(特定エリアへの入退出管理)
自動運転・モビリティ
- 車両の自己位置推定(GNSSとIMUのセンサーフュージョン)
- 地図のHD Map更新
実装・開発のポイント
GNSSモジュール選定
| モジュール | メーカー | 特徴 |
|---|---|---|
| M8N / M9N | u-blox | 最も普及。マルチバンド対応 |
| LC29H | Quectel | デュアルバンド、RTK対応 |
| L70 / L89 | Quectel | 小型・低コスト |
| MT3333 | MediaTek | コスト重視 |
| ZED-F9P | u-blox | RTK受信機、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信号が失われる状況での連続測位(デッドレコニング)が可能になります。