chrony with GPS for Time Synchronization – Kicks NTP’s A$$

by on August 18, 2016

time syncing

Time synchronization is something that affects many robots. As robots have more computers and more sensors keeping everything in sync becomes increasingly important. Trying to look through log files where all of the times are skewed is not fun and makes processing difficult. Merging sensor data together with GPS can also be disastrous if the times are offset. Further complicating time synchronization on robots is that they are often not connected to the internet so utilizing public time servers will not work.

My preferred tool for time synchronization is Chrony. Chrony is based on NTP but performs better when not connected to the internet, has smoother clock adjustments, and is easier to get GPS and PPS signals into.

Installing Time Synchronization

If you are using GPS as your time source the first step is to wire the GPS to a serial port on your computer. If you want to use PPS make sure your GPS has a PPS output such as the Garmin 16x or 18x). For wiring this I use the standard pins of 2,3 & 5 (GPS tx, GPS rx, ground) for RS-232 DB-9 serial connections, then I run the PPS line into pin 1 of the DB9 connector. I have not tried it but I assume the GPS with no PPS would work via USB.

There are 2 methods to installing Chrony that I use.
1. If a PPS (Pulse per Second) input is being used (such as from a GPS receiver), then we need to build chrony from source:

– git clone git://www.linuxpps.org/git/pps-tools pps-tools to get timepps.h.

– From chrony install manual
If a ‘timepps.h’ header is available (e.g. from the LinuxPPS project), chronyd will be built with PPS API reference clock driver. If the header is installed in a location that isn’t normally searched by the compiler, you can add it to the searched locations by setting CPPFLAGS variable to -I/path/to/timepps.

– Then git clone git://git.tuxfamily.org/gitroot/chrony/chrony.git
run .configure, make all, and make install

– I needed to run sudo apt-get install bison to get it the make all to compile

That should give you chrony with pps support!

2. If no PPS input is being used (this is the easy option):

sudo apt-get install chrony

Now we need to install the GPS driver. For this I use GPSD. Using GPSD is nice because it is easy and also allows you to run a GPSD client that listens to the GPS so you can also use the position on your robot. GPSD is needed to allow clients to use the GPS that is connected to one serial port.
To install GPSD:

sudo apt-get install gpsd
The config file in /etc/default/gps should be edited using the dpkg command to set baud rate and the port of the GPS device.

We now need to edit the chrony config file /etc/crony/crony.conf on the main computer

– If the robot will ever connect to the internet:
Modify the existing server lines to say offline right after the server name. ex. server SERVER_NAME offline
– If the robot will never touch (figuratively) the internet:
Delete (or comment) all of the server lines

Now here are some settings I change:
# Stop bad estimates upsetting machine clock.
maxupdateskew 100.0

I see many people also comment out dumponexit. I am not entirely sure why.

There are 2 ways to add the GPS/PPS ( a href=”https://chrony.tuxfamily.org/doc/2.3/manual.html#refclock-directive”>https://chrony.tuxfamily.org/doc/2.3/manual.html#refclock-directive:
1:
# add socket with small delay for PPS
refclock SOCK /var/run/chrony.sock offset 0.002 delay 1e-4 refid SOCK
makestep 0.1 5
maxupdateskew 100.0

set stratum local stratum 6

2:
refclock PPS /dev/pps0 lock NMEA
refclock SHM 0 offset 0.5 delay 0.2 refid NMEA noselect

On any secondary computers that need to sync with the main computer here is what I do

Remove all existing servers and then add our server:
makestep 0.1 100 #This will jump the clock if time error is greater than 0.1s in first 100 cycles. This works good if server is online when this secondary computer boots.
# replace IP below with your server IP
server 192.168.10.2 minpoll 1 maxpoll 2

I see many people also comment out dumponexit. I am not entirely sure why.

Running Time Synchronization

1. Start GPS Daemon: sudo gpsd -n -N -D2 /dev/ttyS0 Changing /dev/ttySx for the port your GPS is connected to. -N -D2 are debugging flags.
– You should see a bunch of lines such as: gpsd:INFO PPS cycle……
– This can also be run from an init.d script (I have seen the default /etc/init.d/gpsd script not work, edit do_start to run sudo gpsd -n /dev/ttyS0).
2. Running chrony: sudo /etc/init.d/chrony start

The two commands I use most for debugging and checking status are chronyc tracking and chronyc sources -v.
– The tracking command shows how good your current time is and what the offset of your system clock is.
– The sources command shows information about which sources are available, their status, and when they last were checked. If you are connected to the internet you will see a bunch of servers. If you are just connected to GPS and PPS you will just see those sources. I use -v (this is a pro tip) since it tells me what each field means. In the second field if you see a ? that means the source is unreachable, you should usually see a * sign.
– A good reference for the commands above is here.

Chrony commands when using GPS.

Output of tracking and sources command for chrony while using GPS. If PPS was enabled it would also show as a source.

One thing to be aware is that with just GPS and no internet time servers I often see that it takes 10 minutes for the chrony server to enter online mode. When checking any status such as cronyc sources you get an error saying 506 Cannot talk to daemon. After connecting to an internet time server or waiting about 10 minutes chrony will come online and start working. You just need to be patient and wait, humans are bad estimates of time so use a clock (there is probably a better solution but I do not know it).

I know there is a lot of detail above and you might need to tweak things for your application, but I hope the above helps you and I know I will look back to this as a reference.


Main image is from https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Proxy_concept_en.svg/2000px-Proxy_concept_en.svg.png

Liked it? Take a second to support David Kohanbash on Patreon!

Leave a Reply