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:
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;
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.
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.
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
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
Con gli AVR xmega sono nella stessa situazione pure li vero ?
magari trovavo un core ed usavo quelli...
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.
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
primo non l'ho ancora presa, secondo devo fare una cosa ultracompatta...
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
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.
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
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
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
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
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
ratto93:
Si a quel punto faccio l'investimento e mi prendo la DUE
grazie comunque dell'interessamento
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
Ideonaaaaaaaaaaaaaaaaaaaa
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
no ?