Calcolare la distanza percorsa con il GPS,va bene così ?

Ciao, ho rispreso un progetto abbandonato da tempo ovvero un dataloger di coordinate prese dal GPS e salvate su SD per tracciare percorsi su sentieri non segnati, però mi son detto perchè non aggiungervi un LCD (Nokia 5110) per poter leggere la velocità attuale, la distanza percorsa, l'ora e magari le coordinate ?
Per quanto riguarda la gestione dell'LCD mi appoggio alla GFX e PCD di adafruit e non ci sono problemi, per quanto riguarda la lettura del GPS uso come parser la TinyGPS ed anche qui non ci son problemi.
Veniamo al dunque, per calcolare la distanza con il GPS ho trovato un schetch interessante ma ciò che mi interessa è capire se la funzione che contiene per calcolare appunto la distanza è corretta:

void distance(){
 float flat1=flat;     // flat1 = our current latitude. flat is from the gps data. 
 float flon1=flon;  // flon1 = our current longitude. flon is from the fps data.
float dist_calc=0;
float dist_calc2=0;
float diflat=0;
float diflon=0;
x2lat=    25  ;  //enter a latitude point here   this is going to be your waypoint
x2lon= 25;
//---------------------------------- distance formula below. Calculates distance from current location to waypoint
diflat=radians(x2lat-flat1);  //notice it must be done in radians
flat1=radians(flat1);    //convert current latitude to radians
x2lat=radians(x2lat);  //convert waypoint latitude to radians
diflon=radians((x2lon)-(flon1));   //subtract and convert longitudes to radians
dist_calc = (sin(diflat/2.0)*sin(diflat/2.0));
dist_calc2= cos(flat1);
dist_calc2*=cos(x2lat);
dist_calc2*=sin(diflon/2.0);                                       
dist_calc2*=sin(diflon/2.0);
dist_calc +=dist_calc2;
dist_calc=(2*atan2(sqrt(dist_calc),sqrt(1.0-dist_calc)));
dist_calc*=6371000.0; //Converting to meters
Serial.println("distance");
Serial.println(dist_calc);    //print the distance in meters
}

Ora, ieri provandolo ho ottenuto questo risultato:

Acquired Data
-------------
Lat/Long(10^-5 deg): 45249xx, 11733xx Fix age: 249ms.
Lat/Long(float): 45.249xx, 11.733xx Fix age: 270ms.
0
distance
2546684.75
-------------

Apparte quello zero che non centra niente, perchè la distanza è : 2546684.75
Non me lo spiego proprio, togliendo il fatto che non ho avuto molto tempo per provare, che stia qui il problema ? :

x2lat=    25  ;  //enter a latitude point here   this is going to be your waypoint
x2lon= 25;

grazie.

ratto93:
Apparte quello zero che non centra niente, perchè la distanza è : 2546684.75

Perché come detto tante volte per fare questo generi di calcoli con una risoluzione accettabile è necessaria la matematica float a 64 bit, con quella a 32 bit hai grosse approssimazioni.
In pratica i float a 32 bit vanno bene solo per grandi distanze con risoluzione a livello di km, ovvero se devi stimare la distanza Milano-Napoli si può fare, se devi stimare la distanza tra due punti distanti pochi km, peggio se centinaia di metri, l'errore è enorme o, addirittura, valori senza senso.

astrobeed:

ratto93:
Apparte quello zero che non centra niente, perchè la distanza è : 2546684.75

Perché come detto tante volte per fare questo generi di calcoli con una risoluzione accettabile è necessaria la matematica float a 64 bit, con quella a 32 bit hai grosse approssimazioni.
In pratica i float a 32 bit vanno bene solo per grandi distanze con risoluzione a livello di km, ovvero se devi stimare la distanza Milano-Napoli si può fare, se devi stimare la distanza tra due punti distanti pochi km, peggio se centinaia di metri, l'errore è enorme o, addirittura, valori senza senso.

Posso ovviare in qualche modo a questa cosa oppure no ?
Perchè, effettivamente man mano che mi muovevo la distanza aumentava in maniera abbastanza ragionevole, al limite metto un "offset" di 2546684.00 e vedo se poi aumenta in maniera corretta.. sennò tanto vale che la distanza me la calcoli Eart...

ratto93:
Posso ovviare in qualche modo a questa cosa oppure no ?

No perché il problema è nei calcoli trigonometrici con in input valori che hanno molti decimali, per giunta con variazioni minime nelle ultime cifre sulle brevi distanze, con i float a 32 bit semplicemente non puoi fare questi calcoli con la necessaria precisione/risoluzione.

Uff ...
Cavolo, farò senza allora...
Grazie comunque :slight_smile:
Una curiosità, al momento non voglio prenderlo però se ci aggiungessi questo :
http://www.robot-italy.com/it/um-fpu-v3-1-floating-point-coprocessor.html
ne ricaverei qualcosa di buono ? oppure mi tocca per forza passare ai pic 32 ? :slight_smile:

ratto93:
Una curiosità, al momento non voglio prenderlo però se ci aggiungessi questo :
http://www.robot-italy.com/it/um-fpu-v3-1-floating-point-coprocessor.html
ne ricaverei qualcosa di buono ? oppure mi tocca per forza passare ai pic 32 ? :slight_smile:

Quelli sono dei PIC18 preprogrammati per fare conti, l'equivalente di una calcolatrice, pure loro lavorano con float a 32 bit e interi a 64 bit, esattamente come fa il 328p, quindi non cambia nulla salvo il fatto di avere alcuni tipi di calcoli pronti all'uso normalmente non previsti nelle librerie dei compilatori.
Se devi fare conti i float a 64 bit il minimo possibile sono i dsPIC33 che sono processori a 16 bit dotati di core DSP, sono perfettamente in grado di calcolare il vettore tra due waypoint gps con risoluzione al centimetro per la distanza e al decimo di grado per l'angolo, riescono a farlo in poco più di un millisecondo :slight_smile:

Il problema del passare ai DsPic è che sono un tantino arrugginito nella programmazione, finche sono pic ad 8 bit me la cavo o meglio cavavo, con quelli non saprei :slight_smile: :blush:
Con gli AVR xmega sono nella stessa situazione pure li vero ?
magari trovavo un core ed usavo quelli...

Domanda per pura curiosità x @astro.
Arduino Due è a 32 bit. Con quello ci sono i double (float a 64 bit mentre x arduino uno double=float=32 bit) ?

ratto93:
Con gli AVR xmega sono nella stessa situazione pure li vero ?
magari trovavo un core ed usavo quelli...

Non cambia nulla visto che alla fine il vero limite è il compilatore che non prevede la matematica a 64 bit, in realtà è possibile fare questi calcoli anche su un 328p, ci vuole molto più tempo rispetto a quelli a 32 bit, e nel tuo caso non penso sia un problema se ci mette qualche decimo di secondo invece di centesimi, però il compilatore di Arduino, indipendentemente dal micro, usa esclusivamente float a 32 bit.
Potresti passare alla DUE, hai la stessa semplicità di programmazione di Arduino e tutta la potenza di calcolo di un processore a 32 bit.

astrobeed:

ratto93:
Con gli AVR xmega sono nella stessa situazione pure li vero ?
magari trovavo un core ed usavo quelli...

Non cambia nulla visto che alla fine il vero limite è il compilatore che non prevede la matematica a 64 bit, in realtà è possibile fare questi calcoli anche su un 328p, ci vuole molto più tempo rispetto a quelli a 32 bit, e nel tuo caso non penso sia un problema se ci mette qualche decimo di secondo invece di centesimi, però il compilatore di Arduino, indipendentemente dal micro, usa esclusivamente float a 32 bit.
Potresti passare alla DUE, hai la stessa semplicità di programmazione di Arduino e tutta la potenza di calcolo di un processore a 32 bit.

Quindi a rigor di logica se programmo il micro con le stesse lib però su AVR studio scavalco il problema ?
Non uso la due per due motivi :slight_smile:
primo non l'ho ancora presa, secondo devo fare una cosa ultracompatta...

Scusa Astro, con questo potrebbe risolvere ? Micromega: uM-FPU64

Guglielmo

gpb01:
Scusa Astro, con questo potrebbe risolvere ? Micromega: uM-FPU64

Guglielmo

Tagliando la testa al toro, forse va bene questa:
http://www.pjrc.com/store/teensy3.html
ma devo documentarmi meglio... costa meno del coprocessore con il vantaggio che fa tutto lei...

ratto93:
Quindi a rigor di logica se programmo il micro con le stesse lib però su AVR studio scavalco il problema ?
Non uso la due per due motivi :slight_smile:
primo non l'ho ancora presa, secondo devo fare una cosa ultracompatta...

AVR studio è solo un IDE, poi devi aggiungere la toolchain che alla fine è sempre avr-gcc con tutti i lmiti del caso, gli Xmega non li uso ma non mi pare che il loro compilatore preveda i float a 64bit, però questa cosa è da verificare.

gpb01:
Scusa Astro, con questo potrebbe risolvere ? Micromega: uM-FPU64

Si, sarebbe da verificare la velocità di calcolo e l'effettiva precisione a 64 bit, però in linea di massima dovrebbero risolvere il problema, ovviamente mettendo da parte le considerazioni sul costo aggiuntivo :slight_smile:

ratto93:
Tagliando la testa al toro, forse va bene questa:
PJRC Store

Non mi pare che si programma come Arduino, anzi non vedo linkato nessun sistema di sviluppo, il che vuol dire che devi passare per Eclipse/Netbeans più un compilatore per ARM, p.e. gcc arm eabi, ovvero ti servono diverse settimane solo per far lampeggiare un led :slight_smile:

No no, usa una versione modificata dell'IDE di arduino solo che a quel punto non so se le librerie sono compatibili....
Ergo mi sa che mi renderò la due o aspetterò la versione mini della DUE..
Che potremmo anche progettare a tempo perso :slight_smile:

Edit:
Si funziona :
http://www.pjrc.com/teensy/td_libs_TinyGPS.html
Anche quella per la SD funziona, cè da vedere se la GFX e la PCD4884 funzionano...
ora gli mando un email così magari sento se ne sanno qualcosa...

astrobeed:
Si, sarebbe da verificare la velocità di calcolo e l'effettiva precisione a 64 bit, però in linea di massima dovrebbero risolvere il problema, ovviamente mettendo da parte le considerazioni sul costo aggiuntivo :slight_smile:

Neanche a farlo a posta, c'è giusto un'Application Note relativa al GPS ... http://www.micromegacorp.com/downloads/appnotes/AN101-Reading%20GPS%20data.pdf XD

Guglielmo

P.S. : Ovvio ... per quanto poco ... sono sempre 20 US$ da aggiungere + spese di spedizione, IVA, Dazio e balzelli vari :grin: :grin: :grin:

gpb01:

astrobeed:
Si, sarebbe da verificare la velocità di calcolo e l'effettiva precisione a 64 bit, però in linea di massima dovrebbero risolvere il problema, ovviamente mettendo da parte le considerazioni sul costo aggiuntivo :slight_smile:

Neanche a farlo a posta, c'è giusto un'Application Note relativa al GPS ... http://www.micromegacorp.com/downloads/appnotes/AN101-Reading%20GPS%20data.pdf XD

Guglielmo

P.S. : Ovvio ... per quanto poco ... sono sempre 20 US$ da aggiungere + spese di spedizione, IVA, Dazio e balzelli vari :grin: :grin: :grin:

Si a quel punto faccio l'investimento e mi prendo la DUE :slight_smile:
grazie comunque dell'interessamento :slight_smile:

ratto93:
Si a quel punto faccio l'investimento e mi prendo la DUE :slight_smile:
grazie comunque dell'interessamento :slight_smile:

Figurati ...
... la cosa interessante di quel chip è che gli carichi a bordo un "programma" e quindi scarichi il processore con cui comunica (es. Arduino) da una serie di calcoli/operazioni che quello fa autonomamente ed in parallelo :slight_smile:

Guglielmo

Ideonaaaaaaaaaaaaaaaaaaaa :slight_smile:
Io grazie alla tinyGPS mi ritrovo anche la velocità, non posso calcolare la distanza calcolando la distanza appunto in un secondo e sommarla via via ?
non sarebbe precisissimo ma forse lo sarebbe più che con il calcolo suddetto :slight_smile:
no ?