# [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 :-)

>
> "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

Where:
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)

Where:
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);

Abdel.

```