5.22.2008

Manual rápido de programación con GPS

Hace tiempo que tenía ganas de poner un post de este tipo, así que vamos allá. Pongamos que no sabes lo que es GPS y quieres hacer una aplicación que necesite saber donde estás, estás en el sitio correcto, voy a tratar de enumerar lo que necesitas saber de forma clara y concisa:

- Qué es GPS: es un sistema que permite saber en qué posición del globo estás situado
- En qué se basa: Hay una serie de satélites orbitando que emiten señales, el receptor las interpreta y gracias a triangulación determina tu posición
- Necesito saber triangular: no, el receptor hace todo por tí, olvida a doppler, trigonometría, etc :)
- qué información da el GPS: te da la posición gracias a la latitud y longitud, esto es, lo hace en coordenadas polares. Además el GPS da mucho más información...
- Cómo me da la información el GPS: usa NMEA, un protocolo de texto separado por comas donde viene la información bien clarita.
- Cómo recojo la información del GPS: pues normalmente a través de puerto serie... "pero mi receptor GPS es bluetooth", no te preocupes, tu bluetooth se comportará como un puerto serie.
- Cómo uso la información desde mi aplicación: abres el puerto y vas leyendo linea a linea los datos NMEA, extraes la información y la usas, por ejemplo, para poner un punto en un mapa.
- Las coordenadas polares no son útiles para mi: lógico, estamos acostumbrados a trabajar en coordenadas cartesianas (el plano XY de toda la vida). Alguien ya pensó en eso e inventó UTM, que no es más que un sistema para proyectar latitud y longitud a nuestro querido plano castesiano. En resumen, al final tendremos X e Y y con eso es muy fácil empezar a trabajar

- Ya, dicho así es fácil, pero cómo lo hago en la realidad?. Lo primero es tener un GPS, por ejemplo , como mi pc no tiene puerto serie uso un conversor USB->serie. De esta forma ya puedo acceder al GPS... cómo? pues con python y los siguientes pasos:

- instalo python
- instalo Python for Windows extensions si estoy en windows
- instalo pyserial que nos da acceso al pueto serie.
- instalo pygps: este hará el trabajo de interpretar NMEA y proyectar a UTM por nosotros

- abro el editor y programo:


import serial;
from threading import Thread;
from NMEA import NMEA;
from LatLongUTMconversion import LLtoUTM;

class GPSPosition(Thread):
    def __init__(self, callback):
        Thread.__init__(self);
        #serial conf
        s = serial.Serial()
        s.baudrate = 4800
        s.port = "COM1" 
        s.open();
        self.serial = s
        self.nmea = NMEA();
        self.callback = callback
        self._run = 1;
        self.start();

    def end(self):
        self._run = 0;
    def run(self):        
        while self._run:
            nmea_data = self.serial.readline();
            self.nmea.handle_line(nmea_data);
            zone, easting, northing = LLtoUTM(23, self.nmea.lat, self.nmea.lon)
            self.pos = (easting, northing);
            self.callback(self.nmea.lat,  self.nmea.lon, self.pos, self.nmea.mode > 0);

if __name__ == '__main__':
    def position(lat, lon, pos, valid_pos):
        if(valid_pos):
            print "current position", pos, "lat: ", lat, " lon:", lon;
        else:
            print "invalid position
  
    gps = GPSPosition(position);
    


ejecuto:

C:\temp>c:\Python25\python gps.py
invalid position
invalid position
current position: 314418.53, 4575413.58 lat: 41.31 lon: -5.22
current position: 314418.53, 4575413.58 lat: 41.31 lon: -5.22
current position: 314418.80, 4575413.20 lat: 41.31 lon: -5.22


- qué es posición inválida? Pues resulta que un GPS no sabe su posición nada más conectarse, necesita un tiempo (que depende de muchas cosas) para tener una posición válida.
- Lo hago y no me funciona: sal a la calle porque en casa el GPS no es capaz de coger señal de satélite dentro de casa!!
- No me da bien la posición: Lo habitual son 10 metros de error como mucho, normalmente está entre los 2 o 3 metros.
- Lo hago pero me oscilan las posiciones: en GPS es bueno pero milagros no hace.

Fin, espero no haberme dejado nada.

11 comentarios:

Victor M. dijo...

Lo que siempre me he preguntado es como se las hacen para calcular rutas en mapas tan grandes. Aunque tengan el grafo precalculado debería tardar milenios.

PpluX dijo...

Qué bueno! me lo apunto por si algún día me da por hacer algo... :)

@victor, si no recuerdo mal la búsqueda en grafos puede ser muy costosa (cierto), pero si se cumple la desigualdad triangular entre los nodos (como es el caso en los mapas) la cosa se reduce drásticamente.

miguelSantirso dijo...

Interesante xD

auraham dijo...

Oye el tutorial esta perfecto, aunque aun no lo ejecuto...

Desde hace una semana he andado buscando open source al respecto en SourceForge y googleando, pero nada daba al 100 (o yo no daba el 100)

en fin....

si puedes aumentar el tutorial con nuevas cosas....se te agradece

Anónimo dijo...

NECESITO SABER COMO INCLUIR UNA DIRECCION CON UN NOMBRE,POR EJEMPLO,EL DE UN COMERCIO,GRACIAS
djjules2@hotmail.com

Anónimo dijo...

oye muy buen aporte pero quisiera saber si no tienes algo sobre programacion en visual studio, c# o c++, stoy trabajando con gps pero solo necesito informacion para saber distancia entre un punto y otro y ademas la velocidad en la k se mueve un automovi...estare visitando tu blog para ver si hay alguna novedad, de antemano muchas gracias

Anónimo dijo...

TENGO UN GPS PERO NOC XQ TRATO D INTRODUCIR EL NOMBRE D MI REGION Y NO LO ACEPTA SOY DE TUXTEPEC OAX. LA VERDAD ES EL PRIMER GPS QUE TENGO!SI PUDIERAS AYUDARME CON ALGUN TIPS T LO AGRADECERIA! EL MOD. ES StreetPilot c330

Anónimo dijo...

Levadura, sos un IGN que se regocija con lo inteligente que cree ser y es a la inversa, lo que publicaste no sirve para nada. Hacete medir tu CI y desengañate, n te suicides, todos servimos para algo, el tema es no sobreestimarnos ni subestimarnos, lo justo. Aprende a progrmar en CGPS y hace algo útil. NO te guíes de los qiles que et dicen Que Bueno, NO vivas engañado. LO QUE HICISTE NO SIRVE PARA NADA. Saludos. Hector

Anónimo dijo...

Mira baja el manual de programacion de Sky Patrol y puedes hacer muchas mas cosas.
Mira Hector, eres un ducho en la materia, pues ayudale y no apabuyes.
Realmente tu si tienes que medir tu CI.

Angelica dijo...

Creo que hoy en dia las mayorías de los autos suelen tener un gps y por eso es importante saber programarlo para no tener problemas al respecto luego. No parece ser muy difícil y por eso espero poder disfrutar de programar y luego utilizar el mio

Anónimo dijo...

Soy programador de Gps. Y Los pasos son los siguientes.

1. conectar bateria y simcard al GPS
2. conectar Iperterminal al GPS. esto para acceder al equipo.
3. dependiendo del modelo o equipo gps se ingresa al Desk esto quiere decir dependiendo del modelo GPS.
4. Paso cargar scritp este scritp debe tener el acceso al simcard osea la clave del vpn.

Ok esto seria lo basico. pero se necesita una plataforma para ver el gps aqui hay muchas empresas que dan ese servicio. el Script debe estar enlazado a dicha plataforma. En esa plataforma configuras nombres etc sobre el vehiculo asignado. Dare mas comentarios de acuerdo a las preguntas y como programar si lo desean.