Correcting for GPS Altitude Error

| Comments (3) | Gear Software Sports
As I mentioned, I have a Garmin Forerunner 305 (BTW, the 405 is now out and looks really sweet). Anyway, it's not bad for giving you a record of your workout, but like all GPS-devices, the vertical accuracy is pretty bad (see here for an overview of why.) The problem isn't just that the receivers are wrong, it's that they drift a lot over a short period of time. As an example, I just turned on my 305 and over the past 5 minutes, I've seen it record anything from 5 to 57 feet. While this isn't a real problem when you're using it as a straight altimeter, since you don't need to be accurate to within more than a few tens of feet. But when you're trying to measure how many feet you've climbed or descended, it's a different story. For example, here's yesterday's workout:

For those of you who live in the area, this is Rancho San Antonio: PG&E Trail + Upper Wildcat Trail (Rancho Runner code 1bEF3MNLKR654V2D1aEF3UTS6RKLNM3FEb1) and is nominally 16.58 miles/2515 ft of climb. By contrast, the GPS thinks it's 5200 feet of climbing. Now, the maps that Rancho Runner is based on could be a little inaccurate, but they're not off by nearly 3,000 feet. To get a feel for what's going on, look at the last major downhill, starting at around 12.75 and descending to around 13.75. This is more or less a continuous downhill with no significant uphills, but as you can see, the graph shows a nontrivial amount of climbing. I suspect that the error in aggregate ascent is basically due to this sort of error. Since the nominal altitude varies a bit around the true altitude it looks like you're constantly climbing and descending, even when you're not, so you get very inaccurate ascent and descent readings.

Obviously, what you really want is to correct the GPS readings with a barometric altimeter, of course, and you can get watch-sized altimeters. For instance, I have a Polar 625 SX. That said, the Polar isn't small and the Forerunner isn't small either, and I think it's fair to assume that if you stick them together, it's not going to get any smaller. So, it's interesting ask whether you can correct the errors via software-only fixes.

Obviously, if you're willing to stand in one place long enough, you can average out the error, but that's not very useful if you're running, since you actually may be changing your altitude: the system needs to discriminate between actual altitude changes and GPS error. This isn't to say you can't average out, though: one possibility is to assume that there's some maximum slope to the trail and fit some sort of smoothing curve (e.g., a Kalman filter, a spline, FFT to remove high frequency components, etc.) to the data points and then use that to remove some of the error. Unfortunately, this only works to the extent to which the GPS drifts faster than the slope of the hill, and I'm not sure that's true. I'm seeing fairly high levels of drift (3-5 fps) with the unit sitting on my couch, but I have lousy reception here and it might be better outside. A moderately steep trail can easily drop 1-2 fps, so we're right on the edge of this working here.

Another idea, suggested by Kevin Dick, is to simply try to estimate the aggregate level of drift of the system against some natural reference (e.g., when the horizontal position is more or less fixed) and then try to use that to produce an overall correction factor. It's hard to predict how well this work, too, since it depends on the vertical error rate being approximately constant. I'm not sure that's actually true, though, since it's dependent on how many satellites are in view, their elevations, etc. If the vertical drift isn't relatively constant, though, then your correction factor will be completely out of whack, and you'll still get bogus results.

UPDATE: Cleaned up the discussion of filtering a bit.


Some of the Garmin products also have barometric altimeter. For example the Edge 305.

Surely you could approach this as a GIS problem: either given a set of accurate contour lines for the area, compute the intersections between the GPS horizontal track and the contours, and use those as your vertical profile, or interpolate a DEM along the GPS track. Both functions are available in GIS libraries.

I'd be interested actually in seeing the FFT of the fixed-position drift over time. In other words, see if the drifting is "lumpy" in the frequency domain, where it's stable for a couple seconds, then in second 5 it "recalculates" and suddenly jumps 50 ft.

Leave a comment