Generic NMEA GPS Receiver
Last update: February 7, 2024 16:41 UTC (14013a760)
Last update: 13-Jan-2020 07:12 UTC
Table of Contents
Synopsis
- Address:
127.127.20.u
- Reference ID:
GPS
- Driver ID:
GPS_NMEA
- Serial Port:
/dev/gpsu
; 4800 - 115200 bps, 8-bits, パリティーなし
- Serial Port:
/dev/gpsppsu
; PPS信号 (/dev/gpsu
より先に処理)
- Serial Port:
/dev/gpsu
; このドライバー nmead のシンボリック・リンク
- Features:
tty_clk
Description
このドライバーは、GPS受信機のNMEAセンテンスの $GPRMC, $GPGLL, $GPGGA, $GPZDA, $GPZDG
をデフォルトで処理対象にしています。 Accord社のNMEAセンテンス $GPZDG
は、他のセンテンスがUTC時刻を通知するのに対し、GPS時刻を通知することに注意して下さい。 UTC時刻とGPS時刻の違いは、UTC時刻にはうるう秒が挿入されることです。 UTC時刻とGPS時刻の混在による問題を回避するため、このドライバーは、UTC時刻の $GPZDG を受信したら処理を無効にします。
注意: GPS以外のGNSS(衛星測位システム)や複数のGPS受信機を利用するときは、後述の Talker IDs をご参照下さい。
GPS受信は このドライバーがサポートしているNMEAセンテンスの少なくとも一つを出力するように設定する必要があります。
時刻同期の精度は、GPS受信機に依存します。 安価なGPSモジュールでもPPS信号は、NMEAセンテンスの送信情報と比較して精度が良く、1マイクロ秒程度の精度があります。 多くの場合、時刻同期の精度は、時刻情報のシリアル・ラインによる転送遅延時間とシステムの処理時間で制限されます。
OSが PPSAPI (RFC 2783) をサポートしているなら、 設定ファイルの fudge flag1 1
と指定することにより有効化して利用することができます。
このドライバーが認識するNMEAセンテンスは以下とおりです。 これ以外のNMEAセンテンスは無視されます。
Accepted NMEA sentences
Sentence |
Vendor |
$GPRMC,UTC,POS_STAT,LAT,LAT_REF,LON,LON_REF,SPD,HDG,DATE,MAG_VAR,MAG_REF*CS |
|
$GPGLL,LAT,LAT_REF,LON,LON_REF,UTC,POS_STAT*CS |
|
$GPGGA,UTC,LAT,LAT_REF,LON,LON_REF,FIX_MODE,SAT_USED,HDOP,ALT,ALT_UNIT,GEO,G_UNIT,D_AGE,D_REF*CS |
|
$GPZDA,UTC,DD,MM,YYYY,TH,TM,*CS |
|
$GPZDG,GPSTIME,DD,MM,YYYY,AA.BB,V*CS |
Accord |
$PGRMF,gpsWk,gpsTow,DATE,UTC,LEAPS,LAT,LAT_REF,LON,LON_REF,TYPE,MODE,SPD,HDOP,TDOP*CS |
Garmin |
$PUBX,04,UTC,DATE,utcTow,utcWk,LEAPS,clkBias,clkDrift,tpGran,*CS |
UBLOX |
NMEA data items
Symbol |
Meaning and Format |
ALT |
高度 |
ALT_UNIT |
高度単位 (Metres/Feet) |
DATE |
日付 (ddmmyy) |
DD |
日 (1-31) |
D_AGE |
DGPSのエイジ |
D_REF |
DGPSのID |
FIX_MODE |
位置特定 (0 = 無効, >0 = 有効) |
GEO |
ジオイド高 |
GPSTIME |
GPS時刻 [fraction (opt.)] (hhmmss[.f]) |
gpsTow |
GPS週開始からの経過秒 (0..604799) |
gpsWk |
GPS週番号 (may exceed 1024) |
G_UNIT |
ジオイド高単位 (M/F) |
HDG |
磁北と真北の偏角 (x.x) |
HDOP |
水平測位精度 |
LAT |
緯度 (llll.ll) |
LAT_REF |
緯度方向 (N = 北緯, S = 南緯) |
LEAPS |
うるう秒、または、GPS時刻とUTCの差 |
LON |
経度 (yyyyy.yy) |
LON_REF |
経度方向 (E = 東経, W = 西経) |
MAG_REF |
磁北と真北の偏角方向 (E = 東, W = 西) |
MAG_VAR |
磁北と真北の偏角 (x.x) |
MM |
月 (1-12) |
POS_STAT |
ステータス (A = 有効, V = 無効) |
SAT_USED |
利用衛星数 |
SPD |
移動速度 (knots) (x.x) |
UTC |
UTC時刻 [fraction (opt.)] (hhmmss[.fff]) |
YYYY |
年 |
WEEK |
GPS週番号 (0-1023) |
WSEC |
GPS週開始からの経過秒 (0-604799) |
LEAP |
GPSうるう秒(UTCからの進み秒) |
AA.BB |
信号強度 (should be < 05.00) |
V |
GPS同期状態 0 => 時刻は無効 1 => 時刻同期精度 +/- 20ms 2 => 時刻同期精度 +/- 100ns |
CS |
チェックサム |
<cr><lf>
|
行末 |
NMEA Talker IDs
GNSS受信機(衛星測位システム受信機)は、処理するGNSS固有の talker ID を使用します。 複数の衛星測位システムを同時に処理する受信機は、$GPRMC
(GPS), $GLRMC
(GLONASS), $GARMC
(Galileo), $GNRMC
(generic/combined) など、 他のNMEAセンテンスも一つのデータ・ストリームで出力します。
このドライバーは、NMEAセンテンスの talker ID を無視して RMC, GLL, GGA, ZDA, ZDG
を処理します。 できれば、このように処理すべきではなかったことは後述しますが、現在は、このように処理しています。 この文書で $GPRMC
という記述は、それ以外の talker ID も同様に該当すると読み替えて下さい。
この方法には欠点があります。一つの受信機で簡単にいろいろなGNSSを扱える半面、複数の受信機でGNSSを分けて扱うことができません。 GNSSが実際にデータを提供するかは定義されていなので、不都合な動作につながる可能性があります。 これは、異なるGNSSが大きく異なる信号品質を受信機に提供する場合に特に当てはまります。 ドライバーは最良の時刻ソースを選択することができず、実際には利用可能な最悪の時刻ソースを使用することになった場合です。 従って、このような場合、受信機を一つのGNSSだけを処理するように設定するか、または、 NMEA標準で定義された GN
talker ID に結合されたデータのみを出力するように設定して下さい。
The ‘mode’ byte
処理対象のNMEAセンテンスやシリアル通信速度は、設定ファイルの server ステートメントの mode
で指定します。
server 127.127.20.x mode X
mode byte bits and bit groups
Bit |
Decimal |
Hex |
Meaning |
0 |
1 |
1 |
処理対象 $GPRMC |
1 |
2 |
2 |
処理対象 $GPGGA |
2 |
4 |
4 |
処理対象 $GPGLL |
3 |
8 |
8 |
処理対象 $GPZDA or $GPZDG |
4-6 |
0 |
0 |
シリアル通信速度 4800 bps |
|
16 |
0x10 |
シリアル通信速度 9600 bps |
|
32 |
0x20 |
シリアル通信速度 19200 bps |
|
48 |
0x30 |
シリアル通信速度 38400 bps |
|
64 |
0x40 |
シリアル通信速度 57600 bps |
|
80 |
0x50 |
シリアル通信速度 115200 bps |
7 |
128 |
0x80 |
全てのNMEAセンテンスについて、秒以下のタイムスタンプを clockstat に出力します。 これは、fudge time2 の値を取得するのに使うことができます。 注意: これにより、clockstats ファイルがかなり速くいっぱいになります。 一時的にのみ使用して、選択したNMEAセンテンスの番号を取得します。</ |
8 |
256 |
0x100 |
処理対象 $PGRMF |
9 |
512 |
0x200 |
処理対象 $PUBX,04 |
10-15 |
|
0xFC00 |
予約(0 に設定) |
16 |
65536 |
0x10000 |
追加の統計情報を clockstats 行に出力。後述。 |
17 |
131072 |
0x20000 |
“Silent PPS” モード。 PPS信号(fudge flag1 で有効に設定している場合)を使用して、正確な受信タイムスタンプを取得します。 クロックはPPSピアとは見なさないため、クロック・ステータスにPPSフラグを設定しないで下さい。 |
18 |
262144 |
0x40000 |
NMEAで配信された日付を信頼します。 受信機が本当に信頼できる場合のみ、使用して下さい。 >参照. 注意: このビットは移動されています。 |
デフォルトの mode 0 は、シリアル通信速度4800bpsで、このドライバーがサポートする全てのNMEAセンテンスを処理します。 これにより、同期処理の各サイクルで最初に受信および認識されたNMEAセンテンスの結果となります。 もし特定のNMEAセンテンスを処理したい場合は、mode の該当するものだけを有効に設定して下さい。 複数のNMEAセンテンスを処理対象として設定することはできますが、同期処理のサイクルで最初に受信したNMEAセンテンスだけが処理されます。 同期処理のサイクルで複数のNMEAセンテンスを処理することができない理由は、以下のとおりです。 fudge time2 でNMEAセンテンスの通信遅延時間を補償・調整しますが、複数のNMEAセンテンスではその時間が異なります。 同期処理のサイクルごとに複数の文を使用すると、内部のデータ・フィルター処理が過剰になります。
このドライバーのデフォルトのシリアル通信速度は 4800 bpsですが、mode のビット 4 から 6 で速い通信速度を指定することができます。
注意: 早いシリアル通信速度は、時刻同期の精度向上に必須ではなく、このNMEAドライバーにとっても必ずしも役立つとは限りません。 早いシリアル通信速度は、4800bpsで1秒のサイクルに収まらない量のデータに対応するために使用できます。 NMEAはプロトコルでハンドシェイクをサポートしていないため、高速で大量のNMEAデータはシリアル・ライン・ドライバーでバッファー・オーバーフローなどの問題を引き起こす可能性があります。 時間同期の目的でのみ使用されるデバイスは、関連するデータのみを送信するように構成する必要があります。 例えば、$GPRMC
あるいは $GPZDA
を1秒に1回だけ 4800 bps か 9600 bps で出力する、など。
About distrusting NMEA date stamps
NMEAで配信されるカレンダー日付を信頼することは危険です。 デフォルトでは、これらの日付は非常に懐疑的に扱われます。 多くの受信機は、ファームウェアに焼き付けられた開始点から、わずか1024週間しか正しいカレンダー日付を配信できません。
それを超えると、開始点に戻って、誤った日付情報を配信します。 良く見られるこの問題に対処するため、デフォルトで、GPS時間に再び戻って、暗黙の日付かファームウェアに焼き付けられた基準日に再マッピングされた日付が配信されます。 正しい日付を配信する受信機を製造することは不可能ではなく高価になります。 受信機が正しい日付を配信することを本当に信頼できる場合は、mode のビット 18 でGPS週の世代のマッピングをバイパスできます。 ほとんどの場合、このビットを設定する必要はありません。 信頼性の低い受信機で設定すると、深刻な影響を与える可能性があります。取り扱い注意。
経緯: この機能は、ビット値が異なる、文書化されていない機能としてしばらくの間利用可能でした。 mode のビットマスクの過度の散乱を避けるために、このビットは公式に承認される過程で移動されました。
Monitor Data
受信または拒否された最後のNMEAセンテンスが clockstats ファイルに書き込まれ、ntpq -c clockvar
で使用できます。 拒否された記録は、拒否された原因を調べたりデバッグするために利用できます。 フィルターされたNMEAセンテンスは記録されません。
mode のビット 0x10000 をオンにすると clockstats ファイルのログに記録されるNMEAセンテンスには、いくつかのカウンターが追加されます。 例えば、
56299 76876.691 127.127.20.20 $GPGGA,212116.000,3726.0785,N,12212.2605,W,1,05,2.0,17.0,M,-25.7,M,,0000*5C 228 64 0 0 64 0
Clockstats
Column |
Sample |
Meaning |
1 |
56299 |
MJD |
2 |
76876.691 |
1日の通算秒 |
3 |
127.127.20.20 |
IPアドレス |
4 |
$GPGGA,...0*5C |
NMEAセンテンス |
5 |
228 |
受信したセンテンス数 |
6 |
64 |
有効で時刻同期に使用されたセンテンス数 |
7 |
0 |
時刻同期には有効でないと判定されたセンテンス数 |
8 |
0 |
チェックサム・エラーや有効でな日時で無効なセンテンス数 |
9 |
64 |
mode の設定によりフィルターまたは同時刻のセンテンス数 |
10 |
0 |
NMEAセンテンスのかわりに使用されたPPS信号数 |
$GPGSV
のように時間が含まれていない文は、合計にカウントされますが、それ以外の場合は無視されます。
Configuring NMEA Refclocks で、奇妙な動作を示す特定のハードウェア・デバイスについて役立つヒントが得られる場合があります。
特定の設定を行うには、mode のバイト・テーブルから対応する10進値を選択し、それらをすべて合計して、 結果の10進値を設定ファイルの server ステートメントの mode に設定します。
Setting up the Garmin GPS-25XL
次の文字列を送信して、すべての出力をオフにします
$PGRMO,,2<cr><lf>
次の文字列を送信して、$GPRMC
の出力をオンにします。
$PGRMO,GPRMC,1<cr><lf>
一部のシステムでは、PPS信号はデフォルトでオンになりません。 次の文字列を送信することでオンにできます。
$PGRMC,,,,,,,,,,,,2<cr><lf>
Fudge Factors
time1 time
- PPS信号の調整時間、単位:秒(小数点以下も可)、デフォルト 0.0秒
time2 time
- シリアル通信の調整時間、単位:秒(小数点以下も可)、デフォルト 0.0秒
stratum number
- 階層番号、0 から 15 の整数、デフォルト 0
refid string
- ドライバーのREFID、ASCIIの1文字から4文字、デフォルト
GPS
flag1 0 | 1
- 0(デフォルト): PPS信号は処理しない / 1: PPS信号を処理する
flag2 0 | 1
- 0(デフォルト): PPS信号の立ち上がりが正秒 / 1: PPS信号の立ち下がりが正秒
flag3 0 | 1
- 0(デフォルト): ntpd clock discipline / 1: kernel discipline
flag4 0 | 1
- 0(デフォルト): タイムコード内の場所を隠さない / 1: タイムコード内の場所を隠す
flag1, flag2
, and flag3
は、Windows においては無視されます。
Reference Clock Drivers