[FOSS-GPS] Introduction

Abdelrazak Younes younes.abdel at gmail.com
Sat Sep 20 05:04:26 EDT 2008

On 19/09/2008 18:18, Tyler Mitchell (OSGeo) wrote:
> On 19-Sep-08, at 12:51 AM, Abdelrazak Younes wrote:
>>  I am mostly interested in innotive navigation algorithms (using the 
>> embedded GPS and accelerometers).
> Hi everyone,
> Abdelrazak's comments reminded me of my hobby interests in GPS and 
> accelerometers[1].  By day, I work for OSGeo helping day-to-day admin, 
> marketing, promotion and more.  I'm a long time open source fan, 
> particularly in geospatial applications like MapServer, GDAL/OGR, 
> PostGIS.  I wrote about them in my book.[2]
> But sometimes at night I break out the soldering iron and my Arduino 
> prototyping board[3] and interface it to my GPS receiver, 
> accelerometers (in a game controller) and digital compass chip.  Then 
> I pump them into the 3D globe viewer, OSSIMPlanet.[4]

Sounds cool :-)

> I'm at the point where (I think) I need to learn more about 
> "navigation algorithms", such as Kalman filters, etc.  So I can merge 
> my inputs into something useful and less jittery than what I have 
> now.  If anyone else want to discuss this, it'd be a great point for 
> this list - since I'm quite lost on my own :)

I know about Kalman filtering. The technique becomes interesting only 
when you start playing with the raw data (i.e. the range domain). If you 
stay in the position domain, using position and velocity offered by the 
GPS then simpler techniques can be used. The most useful and simple 
technique is just to smooth the position with the velocity. It is a fact 
that is not widely known that, provided a good enough constellation 
geometry and signals, GPS derived velocity is much more accurate than 
GPS derived positions. This is because velocity is computed using 
carrier phase measurement (i.e. integrated doppler). Here is a simple 
algorithm for you:

Ps = P * A + Pp * B

Ps is the smoothed position
A + B = 1, for example A = 0.01 and B = 0.99
P is the GPS position solution
Pp is the projected position:
Pp(t_n) = P(t_n) + (t_n - t_{n-1}) * V(t_n)

t_n is the current epoch
t_{n-1} is the previous epoch
V(t_n) is the current GPS Velocity solution.

Of course you want to use the velocity only if it is accurate enough. 
Some receiver like the ublox gives accuracy indicator for velocity too. 
You might also want to apply a low band filter on the velocity before 
using it; the cut frequency would be a function of the use case 
(pedestrian, automotive, etc). Finally you want to impose a certain 
minimum threshold on the velocity:

if (norm(V) <= 0.05 m/s)
     V = (0, 0, 0);


More information about the FOSS-GPS mailing list