GPS script : Parsing del segnale NMEA

Da GfossWiki.

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


Torna a HOWTOs e procedure tipo

Strumenti personali
Namespace
Varianti
Azioni
menu principale
GFOSS
Strumenti