I have a set of rovers with commercial grade GPS boards (Adafruit Ultimate GPS Breakout). They send their uncorrected data to the central server. There, before recording each position in the database, I need to correct it the best I can, hopefully to a 1-2 meter accuracy. I'm new to this topic and have read a lot of info on sending corrections to the rover's GPS units and have them correct itself. I don't need this, as I'm correcting everyone in a central server location. I imagine, this should be just a matter of adding a small number to every long, lat, and elev reading I've got from the field. But from what I've read so far, no one is doing just this. Is there a simple way to get these corrections and apply them in this simple way? I can set up a base station (another Adafruit Breakout?) that would know it's location and would send it's reading to the server as well. Would it be enough to just get its reading, compare to it's known location, and apply the 3 deltas to corresponding readings from the rovers in the field?
2 Answers
Conceptually you can do this, but it might not produce the result that you expect.
The reason is related to where the GPS errors come from. GPS works on multilateration (you might be more familiar with triangulation, think of the same concept but with distance instead of angles, and more than three measurements - at least four, but likely more with the current satellite constellation and receiver technology). So measurements in those distance measurements (called pseudo-range, because they are ranges to the satellite, plus a fixed time error that you're solving for with the fourth measurement) are most of the error (and essentially all of the error that you can correct for). The physics behind the error is mostly from ionospheric delay (because the range is derived from transmission time, but the speed through the ionosphere varies according to how much charge there is; plus some second order effects).
So lets say you have some error in the pseudo-range to a particular satellite, and you are trying to correct for that in three locations:
- your base station, which I'll assume is west of where the satellite is overhead
- rover 1 (R1), which has the satellite "overhead"
rover 2 (R2), which has the satellite well to the east of rover1 (and your base station).
X / | \ / | \ / | \ B R1 R2 W <-----> E
So at your base station position, you determine you need to apply some correction for the pseudo-range error, and you do it by making a longitude offset (direction of the offset depends on the pseudo-range error, but not important here). That correction is not applicable to R1, and actually goes in the wrong direction for R2 (you're making the error greater).
Hopefully you can now see that you want to apply pseudorange corrections, not position corrections. Those corrections can be done afterwards, but only if you have the original pseudo-range measurements. Or you can send them to the receiver, which is sometimes easier.
If you have a high-accuracy stationary receiver occupying a known position you can use a technique known as Differential GPS to correct the raw pseudo-range information from the rovers before calculating positions.
As @BradHards noted previously, these corrections have to be done on a per-satellite pseudorange basis to improve the resulting position calculation.
There is an open-source package, RTKLIB which can perform the correction calculations for you given the raw pseudorange measurements. There are also a few other open-source projects that can do position calculation if you'd like to really get your hands in it.