GPS script : Parsing del segnale NMEA
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 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 True: line = gps.readline() datablock = line.split(',') if line.startswith('$GPGGA'): quality = float(datablock[6]) sat = float(datablock[7]) hdop = float(datablock[8]) altitude = float(datablock[9]) msl = float(datablock[11]) if line.startswith('$GPRMC'): utctime = float(datablock[1]) latitude_in = float(datablock[3]) longitude_in = float(datablock[5]) data = float(datablock[9]) mag_var = float(datablock[10]) speed_in = float(datablock[7]) heading = float(datablock[8]) angle = float(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