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


Torna a HOWTOs e procedure tipo

Personal tools