GPS script : Parsing del segnale NMEA
Da Wikipedia, l'enciclopedia libera.
Scrip python per la lettura del segnale NMEA sulla porta seriale collegata ad un'antenna bluethout creazione di una stringa contenente le informazioni su : latitudine,longitudine,altezza,velocità,qualità segnale,numero satelliti,hdop,tempo utc,variazione magnetica,... bozza-0.0
#!/usr/bin/python
# Copyright (C) 2008 by Di Stefano Massimo # Published under the terms of GNU General Public License v2 or later. # License text available at http://www.gnu.org/licenses/licenses.html#GPL import serial import string import socket import time gps = serial.Serial('/dev/tty.GarminGPS10-Gps10-1', 4800, timeout=1) file = '/Users/sasha/Desktop/nmea.txt' file3 = '/Users/sasha/Desktop/nmea.gml' print "Acquisizione dati" latitude = 0 longitude = 0 speed = 0 heading = 0 altitude = 0 range = 1000 tilt = 30 quality = 0 sat = 0 hdop = 0 msl = 0 utctime = 0 mag_var = 0 angle = 0 elevation = 0 while 1: line = gps.readline() datablock = line.split(',') if line[0:6] == '$GPGGA': quality = string.atof(datablock[6]) sat = string.atof(datablock[7]) hdop = string.atof(datablock[8]) altitude = string.atof(datablock[9]) msl = string.atof(datablock[11]) if line[0:6] == '$GPRMC': utctime = string.atof(datablock[1]) latitude_in = string.atof(datablock[3]) longitude_in = string.atof(datablock[5]) data = string.atof(datablock[9]) mag_var = string.atof(datablock[10]) speed_in = string.atof(datablock[7]) heading = string.atof(datablock[8]) angle = string.atof(datablock[8]) if datablock[4] == 'S': latitude_in = -latitude_in if datablock[6] == 'W': longitude_in = -longitude_in latitude_degrees = int(latitude_in/100) latitude_minutes = latitude_in - latitude_degrees*100 longitude_degrees = int(longitude_in/100) longitude_minutes = longitude_in - longitude_degrees*100 latitude = latitude_degrees + (latitude_minutes/60) longitude = longitude_degrees + (longitude_minutes/60) speed = int(speed_in * 1.852) range = ( ( speed / 100 ) * 350 ) + 650 tilt = ( ( speed / 120 ) * 43 ) + 30 #rangex = angle rangex = 0 tiltx = 0 headingx = 0 elevation = altitude * 6000 if speed < 10: range = 200 tilt = 30 heading = 0 output="""%s %s %s %s %s %s %s %s %s %s %s %s """ % (latitude,longitude,elevation,speed,altitude,quality,sat,hdop,msl,utctime,mag_var,angle) output3 = """<?xml version="1.0" encoding="utf-8" ?> <ogr:FeatureCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ogr.maptools.org/puntogml.xsd" xmlns:ogr="http://ogr.maptools.org/" xmlns:gml="http://www.opengis.net/gml"> <gml:boundedBy> <gml:Box> <gml:coord><gml:X>%s</gml:X><gml:Y>%s</gml:Y></gml:coord> <gml:coord><gml:X>%s</gml:X><gml:Y>%s</gml:Y></gml:coord> </gml:Box> </gml:boundedBy> <gml:featureMember> <ogr:default fid="F0"> <ogr:geometryProperty><gml:Point><gml:coordinates>%s,%s,%s</gml:coordinates></gml:Point></ogr:geometryProperty> <ogr:cat>1</ogr:cat> <ogr:speed>%s</ogr:speed> <ogr:data>%s</ogr:data> <ogr:uctime>%s</ogr:uctime> <ogr:quality>%s</ogr:quality> <ogr:sat>%s</ogr:sat> <ogr:hdop>%s</ogr:hdop> <ogr:msl>%s</ogr:msl> <ogr:altitude>%s</ogr:altitude> <ogr:mag_var>%s</ogr:mag_var> <ogr:angle>%s</ogr:angle> <ogr:longitude>%s</ogr:longitude> <ogr:latitude>%s</ogr:latitude> </ogr:default> </gml:featureMember> </ogr:FeatureCollection> """ % (longitude,latitude,longitude,latitude,longitude,latitude,altitude,speed,data,utctime,quality,sat,hdop,msl,altitude,mag_var,angle,longitude,latitude) f=open(file, 'w') f.write(output) f.close() #f=open(file2, 'w') #f.write(output2) #f.close() f=open(file3, 'w') f.write(output3) f.close()
p.s. lo scrip è in costante aggiornamento, per la sua stabilità ... va aggiunta la gestione delle eccezoni (per ora nel caso il segnale NMEA viene a mancare (o parte del segnale non contiene tutte le informazioni richieste) lo script esce dal ciclo e va rilanciato, bisogna aggiungere "try: ... except ... slep... continue" )
sto lavorando a una gui (start-capture, selezione porta com , file da salvare (text,gml,kml) )
aiuti,suggerimenti commenti ... modifiche?
--Epifanio 01:20, Mar 6, 2008 (CEST)Massimo Di Stefano

