Acceder al Gps via Udev-Gpsbabel
sábado, 16 de mayo de 2009Udev es el sistema que se encarga de gestionar los dispositivos que se conectan al sistema GNU/Linux. Cada vez que se detecta la conexion de un dispositivo al ordenador udev leer una serie de archivos llamados «reglas» situados en /etc/udev/rules.d/ (para openSuSe) y aquellos cuyo patrón de condiciones se cumpla se ejecuta la acción indicada.
Udev se encarga, por ejemplo, de asegurar que cada vez que se conecte una webcam esta sea asignada al grupo «video», y estos disponga de permisos de acceso correctos. O, como en este caso, ejecutar un script que haciendo uso de gpsbabel conecte nuestro GPS con GoogleEarth y poder ver/archivar en él nuestras rutas, waypoints ó incluso mostrar nuestra posición en tiempo real en GoogleEarth mientras nos desplazamos con el portatil en el coche.
Para transferir los datos usaremos gpsbabel, un programa capaz de leer y escribir datos del GPS en multitud de formatos. Gpsbabel funciona en linea de comandos y está disponible para otras plataformas (Windows, MAC) y es usado como base por multitud de otros programas.
Identificar el dispositivo
Lo primero es identificar el dispositivo tal y como se conecta al ordenador. Para esto enchufa el GPS al USB y en una consola ejecuta dmesg, en mi caso se puede leer:usb 2-9.1: new full speed USB device using ehci_hcd and address 57
usb 2-9.1: new device found, idVendor=091e, idProduct=0003
usb 2-9.1: new device strings: Mfr=0, Product=0, SerialNumber=0
usb 2-9.1: configuration #1 chosen from 1 choice
garmin_gps 2-9.1:1.0: Garmin GPS usb/tty converter detected
usb 2-9.1: Garmin GPS usb/tty converter now attached to ttyUSB0
Con los valores de idVendor y idProduct construimos una nueva regla para udev con el siguiente contenido:KERNEL=="ttyUSB*", ACTION=="add", SYSFS{idVendor}=="091e", SYSFS{idProduct}=="0003", MODE="0666", RUN="/home/tu-nombre-usuario/bin/udev_gps.sh %k &>/dev/null"
Basicamente dice: Cuando se añada un dispositivo USB con IdVendor=091e y IdProduct=0003, da permisos de lectura y escritura a todo el mundo y ejecuta el script «udev_gps.sh» pasando como primer parametro el valor del KERNEL (ttyUSB0)
Guarda esta linea en /etc/udev/rules.d con el nombre que quieras, por ejem: 999-mis-regla-para-gps.rules
De ahora en adelante cada vez que se conecte este dispositivo el sistema tratará de ejecutar el script indicado, vamos a crearlo….
Script de ejecución de GpsBabel
En tu carpeta de ~/bin crea un script llamado udev_gps.sh con algo como esto:
#!/bin/bash
DISPLAY=":0.0"; export DISPLAY
HOME=/home/tu-nombre-usuario; export HOME
sel=`/opt/kde3/bin/kdialog --geometry 300x200 --miniicon gps.png --icon gps.png --title "Garmin GPS" --menu "GPS Conectado" \
opcion1 "Importar tracks de hoy" \
opcion2 "Importar tracks y waypoints de hoy" \
opcion3 "Importar tracks de ayer" \
opcion4 "GPS tiempo real"`
case $sel in
opcion1 )
gpsbabel -t -i garmin -f /dev/$1 -x nuketypes,waypoints -x track,pack,sdistance=0.5k -x track,start=`date +%Y%m%d -d "1 day ago"`,stop=`date +%Y%m%d -d "now"` -o kml,units=m -F "/home/tu-nombre-usuario/Desktop/Tracks.kml"
;;
opcion2 )
gpsbabel -t -i garmin -f /dev/$1 -x track,pack,sdistance=0.5k -x track,start=`date +%Y%m%d -d "1 day ago"`,stop=`date +%Y%m%d -d "now"` -o kml,units=m -F "/home/tu-nombre-usuario/Desktop/Tracks y Waypoints.kml"
;;
opcion3 )
gpsbabel -t -i garmin -f /dev/$1 -x nuketypes,waypoints -x track,pack,sdistance=0.5k -x track,start=`date +%Y%m%d -d "2 day ago"`,stop=`date +%Y%m%d -d "1 day ago"` -o kml,units=m -F "/home/tu-nombre-usuario/Desktop/Tracks ayer.kml"
;;
opcion4 )
/opt/kde3/bin/ksystraycmd --hidden gpsbabel -T -i garmin -f /dev/$1 -o kml -F "/home/tu-nombre-usuario/Desktop/gps_realtime.kml" &2>/dev/null; /opt/kde3/bin/kdialog --icon gps.png --msgbox "Detener GPS Tiempo real"; killall gpsbabel
;;
esac
El contenido y aspecto de este script podeis verlo en la captura de arriba. Basicamente incluye las 3 acciones que mas habitualmente hago cuando conecto el GPS al ordenador:
– Descargar el track del dia siempre y cuando mida más de 500 metros ( para evitar importar los movimientos dentro de casa o al encenderlo en el coche)
– Idem anterior más los waypoints del dia
– Idem de la primera pero del dia anterior (algunas veces tardo en volcar los tracks al ordenador)
– y una cuarta consistente en mantener gpsbabel conectado al GPS y escribiendo en un archivo KML/GoogleEarth las coordenadas que emite el dispositivo. Este archivo podeis abrirlo desde GoogleEarth como «Enlace de red» y activando una actualización cada 1-2 segundos vereis vuestra posición en tiempo real. (para facilitar la detencion de esto, añado un dialogo oculto en la barra del sistema que detiene el proceso gpsbabel activo. Necesario tener instalado ksystraycmd.).
Tendreis que adaptar los parametros de ejecución de Gpsbabel para que funcione con vuestro modelo de GPS o para exportar los datos a cualquier otro formato salida de los muchos que soporta. Según el script anterior los datos son guardados en formato KML legible perfectamente por GoogleEarth ó GoogleMaps.
tomaquina
#1/ 17 de May/2009 a 18:00:34
Otros comentarios de «tomaquina»
Hola, magnifico post, felicidades.
Te ha faltado nombrar a Gebabbel, una utilidad para utilizar gpsbabel sin necesidad de líneas de comandos (algunos novatos lo preferimos). Aunque por supuesto tu sistema es mucho más flexible.
Victor
#2/ 18 de May/2009 a 19:32:00
Otros comentarios de «Victor»
Muy buen post, pero yo, con más de 1 añito con ubuntu, no he podido AÚN conectar el p... garmin forerunner 305. Sigo teniendo ke tener una particion con w.... solo para él (mi última frontera para la independencia total).
Y el tema es con el USB, pq lo enchufo y no hace nada. El dmesg no me da el iDvendor y lo otro (pongo esos mismos), y el gebabbel, si no te pilla el USB, no sirve para nada como el resto de las aplicaciones. Lo del modprobe tambien esta hecho... y ya pienso que o son los 64 bits o es incompatible con ext4 (pff, sera por pensar)
Despues de otra tarde más desperdiciada, a reiniciar con ventanuco, pero de verdad, GRANDIOSO POST. Y EN ESPAÑÓ.
Trebol-A
#3/ 18 de May/2009 a 19:58:56
Otros comentarios de «Trebol-A»
Hola, y gracias a los dos.
Victor, para que lo reconozca udev es necesario tener instalado el modulo del kernel llamado "garmin_gps". Asegurate de tenerlo cargado (sudo modprobe garmin_gps) y de que NO existe un filtro que impida que se cargue dicho modulo desde /etc/modprobe.d/
Un grupo de aplicaciones llamado "Garmintools" tienen problemas con este módulo y al instalarlas lo banean añadiendo un regla en modprobe.d que evita que este módulo se cargue. Comprueba que en dicho directorio ningún fichero contiene una linea con:
blacklist garmin_gps
18 de December, 2024 @ 18:00