GPS logger / field data collection
Jim Morris
ml at e4net.com
Tue Aug 19 04:49:25 CEST 2008
Neil Brown wrote:
> On Monday August 18, ml at e4net.com wrote:
>> I was kind of surprised that gpsd didn't give me a simple way to just get the current location, I
>> had to capture 5 sentences to do that simple thing, but what I really wanted was to simply get the
>> last known lat and long I was at. With the data logger I can presumably do that by getting the last
>> entry of the log.
>
> from the man page for gpsd
>
> p
> Returns the current position in the form "P=%f %f"; numbers are in
> degrees, latitude first.
>
>
That doesn't work if you connect, get a fix and disconnect. From the FAQ...
Why does my single-shot query fail to return fix data?
This is closely related to the previous item.
The old-style query commands such as P and A are are safe to use with J=1 if you're polling
repeatedly, but they're a dicey way to go if you're opening a channel to gpsd, doing a single-shot
query, and then hanging up. Even repeating the query a few times won't necessarily work.
The problem is that your queries are in a race with the daemon's logic for assigning and
initializing a GPS. It won't try to assign a GPS to your channel until the first command that
demands actual device information.
Then the race begins. The daemon will be interleaving reads of whatever packet fragments the GPS is
shipping with reads from your client socket. It is entirely possible that the rest of your commands
will get processed before the daemon reads and processes enough GPS sentences to get a fix —
especially if the serial device is slow and the GPS has a long initialization sequence.
(A similar race existed in gpsd versions before multi-device support was added in 2.21; if you
issued a query too soon after device open it would fail in exactly this way.)
The right way to code your client is to set watcher mode and read a couple of O responses before
trying to parse one. That way the daemon paces the action, actually telling the client when it
receives packets.
To be certain of having full fix data, you'd need to wait for as many O responses as there are
sentences that set fix data in the device's normal cycle. For SiRFs, one read will do because
normally only one sentence in the cycle ships fix data. For NMEA devices you don't have a full fix
before five reads, enough for an entire GPRMC/GPGGA/GPVTG/GPGLL/GPGSV cycle in whatever permutation
the device ships it.
In practice, three O reads will always be enough to get you some fix information — worst case is
your first O came from a GPGSA and all you get is a mode, and then you get GPVTG, but you'll always
get lat/lon on the next O.
Clients that poll P or A repleatedly won't have a problem; the race effects will show up but be
limited to noise in the first few seconds of samples.
--
Jim Morris, http://blog.wolfman.com
More information about the community
mailing list