前回、ロボット座標(TF)付きでオドメトリを配信できるようになったが、実はオドメトリのトピックの配信元と先で時刻に大分差があり、地図構築などに支障きたしていた。
hirotaka-hachiya.hatenablog.com
そこで、今回はロボットの周辺のPC間で時刻の同期をとるために、ローカル(インターネットには接続していない)のNTPサーバを立ち上げた。
サーバ側(192.168.0.25)の/etc/ntp.confのserverに、ローカルのIPアドレスを設定する。
server 127.127.1.0 prefer
fudge 127.127.1.0 stratum 10
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap
通常、TCP/IPでは、ローカルのIPアドレスは、127.0.0.1だが、NTPの世界ではローカルは127.127.1.0で識別しているとのこと。
クライアント側(192.168.0.30)の/etc/ntp.confの設定にて、サーバのIPアドレスを設定する。
# You do need to talk to an NTP server or two (or three). #server ntp.your-provider.example server 192.168.0.25 prefer
サーバおよびクライアントそれぞれで、ntpdを再起動する。
> /etc/init.d/ntp restart
また、sysv-rc-conf(chkconfigのubuntu版)で起動時に自動的に実行されるように設定する。
> sudo sysv-rc-conf
ここで、ntpqを用いて時刻同期が出来ているかを確認する。
【サーバにて】
remote refid st t when poll reach delay offset jitter ============================================================================== *LOCAL(0) .LOCL. 10 l 17 64 377 0.000 0.000 0.000
【クライアントにて】
remote refid st t when poll reach delay offset jitter ============================================================================== *192.168.0.25 LOCAL(0) 11 u 18 64 377 0.356 -12.967 17.698
ある程度同期が出来ているが、まだ、クライアントがサーバより0.356秒(deleyの値)遅れている。
これでは、ロボットのようなセンサー値と連動して制御するようなシステムではまだ使えない。。。
TFを見てみると、やはり(0.036 sec old)となっている。。。
そこで、ntpdは同期をとるのに起動してから時間がかかるとのことなので、
瞬時に同期をとるために、ntpdをやめてntpdateコマンドを利用してみた。
【クライアントにて】
> sudo /etc/init.d/ntp stop > sudo ntpdate -v 192.168.0.25 25 Jul 17:59:15 ntpdate[4245]: ntpdate 4.2.6p5@1.2349-o Wed Jun 28 18:06:27 UTC 2017 (1) 25 Jul 17:59:21 ntpdate[4245]: adjust time server 192.168.0.25 offset -0.047859 sec
これにより、delayは0.047859secまで減らせたようだ。
もう一度、TFを見てみると、(0.055 sec old)まで時刻差が減少していた、これなら何とかなりそうである。