otra cosa, los modulos GPS puede que no te den resolucion menor a 10-5 mts. tendrías que tener muchos stélites linkeados para que tengas buena resolucion...
Sí, ése detalle es muy importante. Por el momento me estoy enfocando en la precisión de las trigonométricas.
Es extraño, uso ese mismo PIC y calculo varias cosas con el (uso CCS) y nunca me dio problemas, es mas lo comparamos en los cálculos durante el desarrollo, haciendo los mismos cálculos en PC y la única diferencia la obtuvimos en el sexto decimal.
No habrá un bug en la librería del XC8 ?
De hecho las aproximaciones trigonométricas me están dando un error en el octavo decimal, lo cual es bueno, muy bueno, pero no suficientemente bueno para mi cálculo.
El PIC no sabe nada de trigonometría, así que todo viene dado por el compilador y cómo aproxima los cálculos trigonométricos para ahorrar ROM. Sería interesante correr el mismo ejemplo pero con CCS para ver qué tanta precisión ellos aplican en sus funciones trigonométricas.
Creo que no puedes comparar los datos con los que te da la PC, digo, no pretendas tener en el microcontrolador el mismo error que en la PC, los micros usados para PC hoy tienen funciones trigonometricas propias de él, y tu usas una libreria que implementa por software los calculos.
Estuve viendo que hay un algoritmo para estos cálculos, y que se usa justamente en microcontroladores que carecen de instrucciones especificas para calculos de trigonometrias, se llama CORDIC.
No se como será el algoritmo de la libreria math, quizás sea ese mismo.
De acuerdo Willynovi. Tomé como referencia los de la PC porque no sabía si el algoritmo como tal en el PIC estaba funcionando. Sí funciona, pero su margen de error viene dado por las aproximaciones trigonométricas usadas en XC8, no creo que sea por la precisión de 32 bits.
Voy a poner en segundo lugar al CORDIC en mis pruebas. Por ahora el Haversine tiene 2 votos a favor jeje.
En la que hay funciones trigonométricas:
Circular trigonometric functions
Gracias Manolo... el implementar las funciones trigonométricas desde cero será mi tercera opción. Tengo un aproximado de 25kB de ROM para quemar... a ver si caben.
El problema está en los bits que utilizas.
Con 32 bits, tienes 8 de exponente y 24 de mantisa.
El error que vas a tener puedes calcularlo como:
1 - 2^-24 = 0,99999994039
Se me hace extraño que el tamaño de 32 bits en los cálculos sea el que determine la calidad de los resultados. Afecta... sí, pero creo que va más por el lado de cómo XC8 implementa los cálculos trigonométricos. Una PC tiene su coprocesador que es súper preciso, pero XC8 implementa tablas de aproximaciones.
Algo debe estar mal en el código, porque el error máximo con precisión de coma flotante de 32bits, debería ser de unos 3 metros.
¿Qué valores de latitud y longitud estás poniendo?
Saludos.
El código es idéntico en el PIC y en la PC. En la PC también uso 32 bits. La diferencia es que la PC usa el coprocesador para trigonometría. Esto es lo que uso:
int main(int argc, char *argv[])
{
float lat1 = 20.574570;
float lon1 = -100.382116;
float lat2 = 20.574570;
float lon2 = -100.382116;
float result;
result = SIM_GPS_Distance(lat1, lon1, lat2, lon2);
printf("%f\n", result);
system("PAUSE");
return 0;
}Ambos datos son idénticos. No he hecho pruebas con metros de distancia, pero el cero de distancia es el que me preocupó.
Voy a hacer pruebas amigos. Gracias de nuevo por sus tips. Qué padre es el foro Todopic
