Il metodo del GPS Differenziale prevede una correzione basato sul cacolo delle effemeridi dei satelliti e degli errori degli orologi atomici. L'idea sarebbe quella di effettuare un sistema DGPS usando due GPS di due telefoni senza la pretesa di scendere alla precisione del centimetro ma quanto meno di migliore l'errore di posizionamento di un singolo telefono.
Se i due telefoni sono ragionevolmente vicini (nel raggio di qualche chilometro l'uno dall'altro) e condividono la stessa elettronica saranno ragionevolmente affetti dagli stessi errori sistematici che si possono annullare mantenendone uno fisso
Per il secondo test di GPS differenziale mi sono dotato di due telefoni identici (due Huawei 8150 Ideos Vodafone) con montato il medesimo programma utilizzato per il primo test. I due telefoni sono stati posti uno vicino all'altro (pochi centimetri) fissato il punto in modo simultaneo e messi in registrazione in simultanea
Lo script del test 1 e' stato leggermente modificato in modo da scrivere anche il tempo e data ripresi dall'orologio del telefono ed tempo ripreso dal satellite GPS (loc.getTime())
In particolare e' interessante il secondo valore (espresso in millisecondi a partire dalla data del 1 gennaio 1970 00:00:00) perche' puo' essere utilizzato come sincronizzatore tra le due serie di misure. Questa funzione e' quella impiegata dalla app GPS Time (
Market Android). Per passare dallo Unix time in millisecondi al formato data/ora in formato leggibile da un umano si puo' usare in Openoffice Calc la formula
A1/86400000+DATA(1970;1;1) e poi formattando la cella come data/ora (supponendo che il dato da convertire sia nella cella A1)
--------------------------------------------------------------------------------------------------------
package com.test.gpstest;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.widget.Toast;
public class GpsTestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* Use the LocationManager class to obtain GPS locations */
LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
LocationListener mlocListener = new MyLocationListener();
mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
}
public class MyLocationListener implements LocationListener
{
@Override
public void onLocationChanged(Location loc)
{
loc.getLatitude();
loc.getLongitude();
loc.getAccuracy();
String Text = "My current location is: " + "Latitud = " + loc.getLatitude() +"Longitud = " + loc.getLongitude()+" Accuracy = " + loc.getAccuracy();
Toast.makeText( getApplicationContext(),Text,Toast.LENGTH_SHORT).show();
// scrive i dati sul file
try {
File root = Environment.getExternalStorageDirectory();
if (root.canWrite()){
File gpxfile = new File(root, "dati_gps.txt");
FileWriter gpxwriter = new FileWriter(gpxfile,true);
BufferedWriter out = new BufferedWriter(gpxwriter);
//String currentDateTimeString = DateFormat.getDateInstance().format(new Date());
String currentTimeString = new SimpleDateFormat("HH:mm:ss").format(new Date());
out.write(currentTimeString+";"+loc.getTime()+";"+loc.getLatitude()+";"+loc.getLongitude()+";"+loc.getAccuracy()+"\n");
out.close();
}
} catch (IOException e) {
}
}
@Override
public void onProviderDisabled(String provider)
{
Toast.makeText( getApplicationContext(),"Gps Disabled",Toast.LENGTH_SHORT ).show();
}
@Override
public void onProviderEnabled(String provider)
{
Toast.makeText( getApplicationContext(),"Gps Enabled",Toast.LENGTH_SHORT).show();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{
}
}/* End of Class MyLocationListener */
}
--------------------------------------------------------------------------------------------------------
|
Dati non elaborati |
Come si osserva nei primi istanti l'errore di posizionamento e' alto ma decresce rapidamente fino a 2 metri dichiarati. La distanza relativa tra i due punti e' stata calcolata usando il valore medio di latitudine e longitudine (eliminando i primi punti con HDOP troppo elevata) ed e' risultata di circa 1.2 m
Calcolando la differenza di ogni latitudine e longitudine rispetto al valore medio per i due GPS si osserva una certa correlazione sulla longitudine ma non sulla latitudine
|
Differenze di longitudine rispetto alla media |
|
Differenze di latitudine rispetto alla media |
Effettuando una correzione utilizzando i delta di differenza tra i due GPS non si hanno significativi miglioramenti della distanza reciproca tra i sensori
|
Distanza tra sensori con valori corretti sulla base del valore medio |
Usando un altro approccio ovvero correlando a coppie le varie posizioni GPS allo stesso tempo si osserva una correlazione decisamente piu' stringente
Utilizzando le correlazioni precedenti per correggere i valori delle posizioni GPS le nuove tracce GPS sono le seguenti. Si osserva chiaramente il miglioramento e la sostanziale coincidenza dei dati misurati
|
Dati corretti da retta di calibrazione |
|
Calcolo della distanza corretta |
La distanza tra i due GPS e' calcolata con il metodo correlatao in circa 4 cm che e' sostanzialmente la reale distanza presente tra i due sensori al momento delle acquisizioni
Questa prova si e' rivelata sostanzialmente un successo che ha comunque necessita' di conferme