カーナビ作るぜ!【番外編】(1) GPSで時刻合わせ

PCの時刻というのは放っておくと結構簡単に狂ってしまうもの。ネットワークにつながっているPCであればSNTPなりNTPで時間をあわせておけばよいのですが、車載となるとそう簡単にはいかない。でも、GPSがあるということは世界標準時間にいつでもアクセスできるわけで、これを使わない手はないわけです。gpsdにはntpと連携して衛星の時間を取り込む方法があるので、それを使って時刻調整をすることに。

さてさて、本題に入る前にNTPについて。

NTPとはNetwork Time Protocolの略で、ネットワークを介して超正確な時間を持っているサーバにアクセスし、時刻情報をもってきて時間調整をするための仕組みというかプロトコルです。Windowsが標準で持っているネットワーク時間というのはSNTPのことで、Simple Network Time Protocolの略。SNTPは定期的(Windowsの場合は1週間に一度)時刻サーバに時間を聞きに行って、ずれていれば修正しています。これに対して、NTPは比較的頻繁に時刻サーバに時間を聞きに行ってずれいていたら少しだけ修正します。この少しだけの修正を繰り返していって、正しい時刻に近づけていきます。サーバや常時時間を扱うようなアプリケーションがある場合には、SNTPでいきなり数十秒も時間が変わると困ることがあります。なので、NTPでは少しずつずらすことにより、調整を行い、動いているシステムやプログラムからは時間が調整されていることをわからないようにしています。

閑話休題。で、GPSレシーバから得た情報を基にPCの時刻をあわせる方法です。車載PCの場合、日常的にはネットワークにつながっていないため、時刻サーバを利用して時刻をあわせることができません。とりあえず、いろいろ探してみたんですが、古いプログラムしか見付からず、コンパイルもままならない状況…。自分で書くしかないかなぁ、と思っていたら、gpsdでできるようなことが書いてある英語のページ(というかMLのログページ)を見つけた。が、今ひとつ容量を得ない。gpsdとntpで検索していると…、gpsdのmanページがひっかかる。???と思いつつ、gpsdのmanを読んでみると…、ちゃんと書いてありました。gpsdとntpdの連系のし方がorz。

$ man gpsd

で読んでみると下の方に書いてあります。要約すると、ntp.confに以下のように書くとgpsdと連携すると。

server 127.127.28.0 minpoll 4 maxpoll 4
fudge 127.127.28.0 time1 0.420 refid GPS

server 127.127.28.1 minpoll 4 maxpoll 4 prefer
fudge 127.127.28.1 refid GPS1

127.127.28.{0,1}は魔法のエセIPだそうです…。

うまく動いているかどうか確認するには、ntpdを再起動後しばらく待ってから

# ntpq -p

とすると、ntpdの同期状況を確認することができます。

remote            refid       st  t when poll reach  delay    offset  jitter
=========================================================================
-SHM(0)           .GPS.       0  l    13   16  377    0.000    0.885   0.882
*SHM(1)          .GPS1.     0 l   11   16  377    0.000   -0.059   0.006

reachの下の数字が0のままの場合はうまく機能していないらしいです。gpsdがちゃんと起動しているかどうか確認しましょう。なお、gpsdは-nを付けずに起動すると、クライアントアプリから要求があるまで測位を開始しません。なので、ntpdと連携する際には-nをつけてgpsdを起動するようにしましょう。あと、チェックは測位ができる場所で行う必要があります。あらかじめ、xgpsなどで測位できているかどうかを確認するとよいかと思います。

さてさて、これでしばらく放っておいて、一見うまく言っているように見えても、実際にはズレが生じることがあります。衛星からの情報到達や受信してから処理するまでにかかる時間で誤差が生じるようです。この誤差を解消してやる必要があります。(GPSレシーバなどによっては、この誤差自体を吸収する機能があるものもあるようですが、わたし自身はよくわかっていません。PPSがどうのこうのと書いてあるのですが…)。

この誤差を修正するための設定が、ntp.confに追加した設定の中の2行目にあるtime1の後に書いてある数字です。誤差の値を秒で記述します。Garmin GPS-18/USBで0.035くらい、 Garmin GPS-18/LVCで0.420くらいがよいと書いてあります。私の環境(USBGPS2)では2秒くらいズレがあるので、2.0位にしておけばいいかなと思ったのですが、もう少しちゃんと計ってみることにしました。

まず、time1の値を0.0にして、ntpdを再起動し、しばらく放置します。これにより誤差がある状態で時刻調節が行われます。ここで、ntpdを停止し、PCをネットワークに接続します。(私の場合は、ntpdの自動起動設定をOFFにしてから一度PC自体を停止し。車から外してネットワーク環境のあるところへ持っていって再び起動。)この状態で、ntpdateを利用して時間を強制的に修正します。ntpdateはSNTPの様にいきなり時刻調整をしてくれます。

ntpdateではどこか手近にある信頼できるNTPサーバを指定する必要があります。(ここでは、仮に192.168.1.1とする)。すると、時間調整をして、どんだけズレを修正したかが表示されます。

# ntpdate 192.168.1.1
13 Oct 13:56:34 ntpdate[2522]: step time server 192.168.1.1 offset 1.808318 sec

これによって、GPSによる調節が、実際の時間とどれだけずれているかがわかります。この例の場合、1.808318秒ずれていることがわかります。これをntp.confのオフセット(time1の値)として設定します。で、ntpdの自動起動設定を再びONにしてやれば、今後はぴったり時間があうようになります。

Posted by TechStrom on Monday, October 13, 2008