2017年12月30日土曜日

Building a Raspberry Pi3 Stratum-1 NTP Server (u-blox 6)


1.基本的な考え方

野外活動用のロボットを開発している。
室内では、電源や、ネットワークなど当たり前にあるけど、野外では無いんだなぁ。。。
ネットワークも、LTEつなげればというけど、、、Docomoの携帯電波が取れない所もあり、、、
逆に、そのような所の方が、自律移動型ロボットのニーズが強いわけで、、、

ネットワーク、電源などは、本当にいろいろ考えさせれる。
ネットワークが届かなければ、ロボットのコントローラのRaspberry Piだって時刻同期ができないという事があり、、、RTCを積めばよいというけど、RTC積んだって同期は必要なわけで、、、

となると解決は、Raspberry Pi自身がGPSを使ってStratum-1のNTPサーバになればよいという変身技、、、

本当は、GPSからとれるtimepluseも一緒に使えば良いけど、それが無いGPSモジュールでも、一秒はずれるかもしれないけど、その程度なら野外ロボットを運用するためには、まずは許容範囲。

まずは、u-blox 6で、次は、timepluse付きのu-blox 8

2.環境

私の場合は、OSはStretchなので以下の説明は、全てStretch前提
Raspberry Piは、2B、3
GPSは、Amazonで購入したのは、これ!

安さ重視(^^)

3.手順

因みに、通常のOSインストールの場合は、NTPクライアントとしては、systemd-timesyncdが動いている。リモートサーバに時刻を同期する為のクライアント側のデーモン。NTPクライアントとして、定期的にNTPサーバと時刻を同期する。
timedatectlコマンドを使うと状態が解る。

timedatectl status
Local time: Fri 2017-12-29 23:54:41 JST
Universal time: Fri 2017-12-29 14:54:41 UTC
RTC time: n/a
Time zone: Asia/Tokyo (JST, +0900)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no

すでに、gpsdは、インストールしてあるものとして、、、
gpsdのインストールは、ここ

sudo apt-get install ntp
sudo vi /etc/ntp.conf
cat /etc/ntp.conf

変更・追加箇所だけ

# pool.ntp.org maps to about 1000 low-stratum NTP servers.  Your server will
# pick a different set every time it starts up.  Please consider joining the
# pool: <http://www.pool.ntp.org/join.html>
#server 0.debian.pool.ntp.org iburst
#server 1.debian.pool.ntp.org iburst
#server 2.debian.pool.ntp.org iburst
#server 3.debian.pool.ntp.org iburst

または、(raspberry Pi 2B)
#pool 0.debian.pool.ntp.org iburst
#pool 1.debian.pool.ntp.org iburst
#pool 2.debian.pool.ntp.org iburst
#pool 3.debian.pool.ntp.org iburst

# Generic NMEA GPS Reciever
#server 127.127.20.0 minpoll 4 prefer
#fudge 127.127.20.0 refid GPS flag1 0
#server ntp.nict.jp iburst
#これは、USB接続などのGPSを使う場合。
#この時は、gpsxのデバイスファイルを作る必要がある
#sudo ln -s /dev/ttyAMA0 /dev/gps0


#この指定(28)は、gpsd のshare memoryを使う指定
#GPSと、ないけどPPSの指定をしている。
server 127.127.28.0 minpoll 4
fudge  127.127.28.0 time1 0.183 refid NMEA
server 127.127.28.1 minpoll 4 prefer
fudge  127.127.28.1 time1 0.183 refid PPS

127.127.28.0は、IPアドレスでは無くて
https://www.eecis.udel.edu/~mills/ntp/html/refclock.html
ここに説明があるReference Clock Supportの番号
gpsdを立ち上げた場合は、28と指定する。

ところで、time1は遅延の設定値。PPS使わないのでNMEAに0.183秒の遅延幅の設定をしても意味がないと思われるで、
結局このセクションは、以下ように設定をした。

server 127.127.28.0 minpoll 4
fudge  127.127.28.0 flag1 1 refid NMEA
server 127.127.28.1 minpoll 4 prefer
fudge  127.127.28.1 time1 0.183 refid PPS


sudo reboot
または、su
sudo ssytemctl restart ntp

ntpq -p




SHMは、Shared Memoryの略。gpsdをSHMを介してやりとりしている。
/etc/ntp.confではインターネット上のサーバは指定していないので、
上図のようになる。*SHM(0)の'*'は、gpsが採用されている事を現わす。


Peace!!

自分が納得するうえで参考になったリンク。ありがとうございました。

http://lowfreq.info/archives/18314

https://www.eecis.udel.edu/~mills/ntp/html/refclock.html

https://blog.cles.jp/item/7932

補足


2つのdaemonが走っており、かつGPSがgpsd経由でNTPサーバになっている
という事で、、、(^^)/


表 13-4. 符号の意味
符号意味
*現在同期中のサーバーです。
+参照可能なサーバーです。
#距離は遠いものの参照可能なサーバーです。
空白距離が遠いなどの理由で参照しないサーバーです。
x検査で参照不可能と判断されたサーバーです。
.参照しているサーバーが多いために外されたサーバーです。
また、ntpq -p コマンドが出力する各列の意味は以下の通りです。
remote
参照先の NTP サーバーの名前です。
refid
参照先の NTP サーバーがどこから時刻を取得しているかを示します。サーバーのホスト名や GPS.などが表示されます。
st
Stratum の階層を示しています。
t
l(local)、u(unicast)、m(multicast)、b(broadcast)を示します。
when
参照先の NTP サーバーからのパケットを最後に受信してからの経過時間を秒単位で表示します。
poll
ポーリング間隔を秒単位で表示します。
reach
NTP サーバーへの接続を試みた最後の 8 回分の結果を 8 進数で表示しています。8 ビットのビット列で結果を保持しており、サーバー接続できた場合はビットが立ちます。したがって全部成功した場合は、377 と表示されます。
delay
時刻同期要求に対する返答時間をミリ秒単位で表示します。
offset
NTP サーバーと自ホストの時刻の誤差をミリ秒単位で表示します。
jitter
ばらつきをミリ秒単位で示しています。値が低い方が、正確な時刻同期が可能であることをあらわします。

0 件のコメント:

コメントを投稿