The context is a GPS app running on a phone or a tablet.
AIUI (I am a C programmer, embedded systems, no idea about android/ios
APIs) there are two ways the app can get GPS data
- NMEA, typically from a bluetooth external GPS, via a serial port
(dev/tty under android)
- something similar under IOS (Apple never supported NMEA but defined
a different stream)
- the positioning API in the OS (which uses wifi assist etc)
There also appear two ways to get velocity:
- use successive position points and work it out from the timings
- use the GPS doppler velocity (much better)
The Q is whether the app gets actual speed, when there is a gradient?
Searching around, it appears that everything delivered via either NMEA
or the API is horizontal i.e. 2D, so if say you drive a car down a 45
degree slope with the (assume accurate) speedo showing 100, the GPS
speed will be 70.7. One could test this with a satnav app but it is
hard to find a road with a significant enough slope.
Apparently the GPS receiver itself computes the 3D velocity naturally
but this is not presented via either NMEA or the API.
The reason I am digging around in this is because all phone apps used
in skiing have great difficulties getting the right speed.
Talking to somebody in the business, it appears that the app cannot
get the 3D velocity so it gets the 2D velocity and then calculates the vertical velocity vector from the way the altitude varies, and adds
that in.
The result is usually poor because GPS altitude is not all that
reliable. I am involved with high-end GPS products in my day job so I
know how this works and the reasons. Normally GPS altitude is pretty reasonable (within some 10-20m) but if you are trying to calculate a
velocity vector from its variation, that's going to be massively prone
to errors. An altitude delta of say 2m in 1 second, barely noticeable
in most applications, is a massive error if added as a 2m/s Z vector
to the horizontal (2D) velocity vector.
Does the above make any sense to the experts here?
Is there any way to get the original 3D velocity, via the device API?
The context is a GPS app running on a phone or a tablet.[snip]
The Q is whether the app gets actual speed, when there is a gradient?
Searching around, it appears that everything delivered via either NMEA
or the API is horizontal i.e. 2D, so if say you drive a car down a 45
degree slope with the (assume accurate) speedo showing 100, the GPS
speed will be 70.7. One could test this with a satnav app but it is
hard to find a road with a significant enough slope.
Apparently the GPS receiver itself computes the 3D velocity naturally
but this is not presented via either NMEA or the API.
The reason I am digging around in this is because all phone apps used
in skiing have great difficulties getting the right speed.
Talking to somebody in the business, it appears that the app cannot
get the 3D velocity so it gets the 2D velocity and then calculates the vertical velocity vector from the way the altitude varies, and adds
that in.
The result is usually poor because GPS altitude is not all that
reliable. I am involved with high-end GPS products in my day job so I
know how this works and the reasons. Normally GPS altitude is pretty reasonable (within some 10-20m) but if you are trying to calculate a
velocity vector from its variation, that's going to be massively prone
to errors. An altitude delta of say 2m in 1 second, barely noticeable
in most applications, is a massive error if added as a 2m/s Z vector
to the horizontal (2D) velocity vector.
Does the above make any sense to the experts here?
Is there any way to get the original 3D velocity, via the device API?
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 365 |
Nodes: | 16 (3 / 13) |
Uptime: | 25:34:41 |
Calls: | 7,748 |
Files: | 12,888 |
Messages: | 5,740,151 |