TODOPIC
FORO TÉCNICO => Telefonía, GPS y Microcontroladores => Mensaje iniciado por: scientist en 17 de Diciembre de 2010, 21:08:17
-
Hola amigos, tengo una duda, estoy leyendo las tramas de un gps, y solo busco leer el comando
gpgga
el cual me da
$GPGGA,160920.807,1947.5139,N,09037.3225,W,0,05,2.3,81.1,M,-9.7,M,,*6D
en este ejemplo, me encuentro en la escuela, y saco el valor de latitud y longitud, los guardo en una variable double, la pregunta es
¿como puedo saber que pase por un punto o cerca de un punto que haya guardado anteriormente, vamos a suponer que quiero guardar la coordenada 1948.51 y 09038.32 en latitud y longitud respectivamente, y estoy en la trayectoria de un vehiculo, en ese momento paso por ahi otra vez, y quiero guardar la hora que pase por ahi, una de mis soluciones fue la simplemente sacar la distancia entre el punto guardado y el punto actual, con la formula
d=sqrt((x2-x1)^2+(y2-y1)^2)) y una vez que tengo esa distancia compararla con un radio de tolerancia aproximado, el problema viene, cuando me pregunto, en que unidaddes esta esto???? que fue lo que saque??? por que mi idea es despues comparar esa "distancia" con 50 metros, alguien me puede hechar una mano de que formula utilizar? saludos
-
d=sqrt((x2-x1)^2+(y2-y1)^2)) y una vez que tengo esa distancia compararla con un radio de tolerancia aproximado, el problema viene, cuando me pregunto, en que unidaddes esta esto???? que fue lo que saque??? por que mi idea es despues comparar esa "distancia" con 50 metros, alguien me puede hechar una mano de que formula utilizar?
Hola scientist, esa fórmula no te va a servir, busca el método de Haversine o SLC (Spherical Law of Cosines)
Por haversine es así:
def havDistance(lat1, lon1, lat2, lon2):
dLat = lat2 - lat1
dLon = lon2 - lon1
a = math.sin(dLat / 2) * math.sin(dLat / 2) \
+ math.cos(lat1) * math.cos(lat2) \
* math.sin(dLon / 2) * math.sin(dLon / 2);
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
return R * c
por SLC
def slcDistance(lat1, lon1, lat2, lon2):
return math.acos(math.sin(lat1) * math.sin(lat2)
+ math.cos(lat1) * math.cos(lat2)
* math.cos(lon2 - lon1)) * R
links
http://en.wikipedia.org/wiki/Haversine_formula
http://mathworld.wolfram.com/SphericalTrigonometry.html
http://www.deanandara.com/Argonaut/Sensors/Gps/GettingData.html
saludos.
-
muchas gracias Felixls, de hecho, eso estaba tratando de entender en esta pagina
http://www.movable-type.co.uk/scripts/latlong.html (http://www.movable-type.co.uk/scripts/latlong.html)
veo que defines la funcion como una especie de macro, para que lenguaje es ese? saludos!!! y Gracias de nuevo
Se me olvidaba, veo en la pagina que postee, que la longitud y latitud la convierten a radianes, en la formula que pones es igual, los valores de latitud y longitud los tomo igual que como los saca el GPS en gpgga ???
o los convierto como en esta pagina?
http://u3x.net/al-karem/?p=63 (http://u3x.net/al-karem/?p=63)
-
El código es python, está sacado de uno de los links, en realidad son conceptos muy simples, de trigonometría esférica, algo muy útil para los navegantes (antes, ahora está el GPS :lol:)
saludos
-
Por lo que he visto hasta ahora una diferencia de latitud de 0.000500 es aproximadamente 50 mts(eso por la latitud +-12), si necesitas programar en PIC, donde creo q es más dificil hacer el cálculo real, por las funciones, intenta con esa aproximación y para hacerlo más fácil no es necesario que sea circular sólo un cuadrado, osea si la diferencia de latitudes es menor a tu tolerancia y lo mismo ocurre en la longitud, estás cerca de tu punto.
Sólo son dos restas y un operador AND.
-
Hola a todos, me preguntaba si este metodo que publican, me podria servir para programr un geocerco, en un pic, o alguien tednra la teoria de como hacerlo, he buscaod en el foro peor no encuentro algo al respecto. gracias
-
por SLC
def slcDistance(lat1, lon1, lat2, lon2):
return math.acos(math.sin(lat1) * math.sin(lat2)
+ math.cos(lat1) * math.cos(lat2)
* math.cos(lon2 - lon1)) * R
Estoy queriendo usar esta formula para lograr esto, pero me doy cuenta que los valores que tengo son con decimales (-12.86026,-76.4891467, despues de haberlos pasado a radianes). Y las funciones del math.h del CCS solo admiten en sus argumentos de sin, cos, etc. variables de 32 bits solamente, mas no floats. No habria algun prolblema con esto? Se podria?
Gracias, un saludo.
-
Vaya, debe ser por el sueño pero si que se puede en ccs hacer cos, sin o tan con argumento de float y hasta de 64 bits... seguro vi mal. Losiento =D
Porcierto, como lo resolviste scientist?
Saludos :D
-
Hola. Habra alguna forma de crear una zona amplia de varios puntos y que el pic sepa si esta dentro de toda esa area o no? Sera que con varios radios o hay alguna otra forma mas conveniente? Gracias.
-
Podes tener un punto especifico y darle un tolerancia de aprox. +/-11m modificando el 4º decimal. O sea:
Longitud: xxx.xxx_ -> Latitud 0º:11m | 45º:7.8m | 70º:3.7m
Latitud: xx.xxx_ -> 11 m
El problema está para latitudes mayores a 60º donde la longitud comienza a reducirse bastante. Si eso no fuera problema poder armar un sector a controlar mediante un punto.
Saludos!
-
Gracias Suky. Veras, quisiera que el area que el PIC pudiese controlar sea asi mas o menos:
(http://)
Entonces, como hago esas verificaciones de acuerdo a esta area que tiene varios puntos...?
-
En ese caso los juegos que ha propuesto en su momento jgpeiro06 pueden ayudarte, hay un par de algoritmos :)
http://www.todopic.com.ar/foros/index.php?topic=25639.msg209665#msg209665
Saludos!
-
Uy, estaria algo dificil integrar eso en coordenadas de GPS y todo no? gracias suky.
-
No, podes verlo como x,y.
-
Tu te refieres a la propuesto que dio BrunoF en su momento en ese juego? Pues, para el caso de GPS, son valores del tipo float...
-
Tu te refieres a la propuesto que dio BrunoF en su momento en ese juego? Pues, para el caso de GPS, son valores del tipo float...
Claro, para un float de 32 bits hasta el 5º/4º decimal de la latitud/longitud creo que es valido. Por ahí no vas apoder copiar/pegar y ejecutar el código, pero se puede estudiar el algoritmo y capaz es cambiar un int por float :tongue: No lo he mirado, pero los algoritmos propuestos en el juego son para determinar si hay un punto dentro de un polígono
Saludos!
-
si, interesante esta. Gracias hombre
-
Estaba pensando... y que tal si enves de cambiar el programa para convertir a floats lo hacemos al revees, es decir, los valores que te da el gps (por ejemplos: 12.125487) multiplicarlos por 1,000,000 para tenerlo en entero y adecuar mejor la funcion con in int32 talves.
-
También, una opción.
Saludos!
-
Hola!
Ya son floats en el algoritmo, no se donde viste jeremy enteros... Igualmente puede que necesites desplazar un poco la coma porque me parece que son demasiados decimales...