GPS för lata gamla nördar (3 / 5 steg)
Steg 3: Min GPS program
Vad jag kommer att täcka är några av de problem och lösningar i allmänhet termer.
Programmet mål:
Prata med GPS och exempel GPS-data.
Visa latitud, longitud, höjd.
Beräkna en löpande genomsnittlig ovan.
Etapp 2: Jag ville se hur exakt min GPS var. Se nästa steg.
Problem: Prata med GPS. BU-353 är en USB-enhet. Det mottar + 5V på USB-anslutningen. En av de trevliga funktionerna är att när det har makt, det börjar sända NMEA 0183 seriella data på 4800 baud automatiskt varje sekund.
Lösning: Så VB Express har redan en kontroll kallas Serialport. Ställa in den till 4800 baud, sätta den till rätt Com nummer och öppna den.
Problem: GPS exempeldata. Om du har ett sätt att se på den seriella data från BU-353, skulle en rad vara ungefär så här:
$GPGGA, 233632.000, 3913.9963, N, 10844.2590, W, 2, 09, 0,9, 1424.3, M,-16.7, M, 0,8, 0000 * 79
Här är hur NMEA 0183 definierar detta:
GGA - viktiga fix uppgifter som ger 3D-läge och korrekta data.
$GPGGA, 123519, 4807.038, N, 01131.000, E, 1, 08, 0,9, 545.4, M, 46,9, M,, * 47
Var:
GGA Global Positioning System Fix Data
123519 fix vid 12:35:19 UTC (Coordinated Universal Time)
4807.038, N latitud 48 deg 07.038' N
01131.000, E longitud 11 deg 31.000' E
1 fix kvalitet: 0 = ogiltig
1 = GPS-fix (SPS)
2 = DGPS fix (detta betyder att WAAS aktiverad och arbetande)
08 antal satelliter som spåras
0,9 horisontella utspädning av position (något att göra med noggrannhet)
545.4, M höjd, meter över havsytan
46,9, M höjd GeoID (havsnivån) ovanför WGS84 ellipsoid
(tomma fält) tid i sekunder efter sista DGPS-uppdateringen
(tomma fält) DGPS station ID-nummer
* 47 checksum data, börjar alltid med *
Tips: Jag lärde mig något om latitud och longitud. Latitude kan bara gå från 0 till 90. longitud kan gå från 0 till 180. Det är därför latitude värdet ovan har fyra siffror före decimaltecknet och longituden har fem. I exemplet ovan skrivs 11 grader 011.
NMEA 0183 protokoll definieras över hela Internet. Här är en:
http://biostatmatt.com/uploads/DescriptionNMEA.pdf
Detta protokoll är inte bara för GPS så inte alla meningar är relevanta.
SubproblemA: BU-353 sänder flera data stränger varje sekund. Programmet tar emot seriella dataströmmen men inte vet var det "börjar." (Detta kallas asynkron kommunikation).
SolutionA: Vad programmet har att göra är ständigt titta på strömmen av data tills den ser "$GPGGA", då det vet relevanta uppgifter kommer att följa.
SubproblemB: $GPGGA data är en rad med data. Datorn måste att dela data i olika delar.
SolutionB: I programmeringsspråk kallas detta parsning. NMEA-protokollet har ganska stränga regler om hur strängarna definieras. Varje element i en angiven position och avgränsade med kommatecken. Så programmet har att gå igenom data och extrahera vad den vill och strunta i resten. För mina syften, jag läste ner till höjd och hoppade över resten av raden.
FYI: Kontrollsumman är ett sätt att kontrollera om datasträng är skadad eller intakt. I allmänhet får du skadade data, blir oftast det oläsbara ändå. Jag ignorera bara kontrollsummorna.
Problem: Visa latitud, longitud, höjd. Vid denna punkt, är alla data i tecken. Det kan enkelt visas i textrutor. Men för mina syften, det finns två problem. En är datorer är dumma, de kan inte genomsnitt tecken, de måste använda nummer. Jag använder ett antal typ "dubbel" vilket innebär att det kan inkludera ett decimaltecken, som 545.4. Det andra problemet är att latitud och longitud anges i formatet grader och minuter i ett nummer. 4807.038 är 48 deg 07.038'. Datorer är dumma de inte kan förstå detta.
Oroa dig inte om följande inte meningsfullt för dig.
Lösning: De flesta programmeringsspråk har ett sätt att konvertera tecken till en dubbel. I VB uttryckliga använde jag detta:
dLat = Convert.ToDouble(lineArr(2))
Konvertera att latitude är lite svårare, jag gjorde detta
grader = Int(dLat / 100) //This tar de två första siffrorna och konverterar dem till ett heltal (tal utan decimaler)
decimaldegrees = (dLat - (100 * grader)) / 60,0 / / Detta tar originalnummer,
subtraherar grader portion och
omvandlar den till ett decimaltal
fullLat = grader + decimaldegrees //This kombinerar de två
T.ex. om dLat = 4807.038
grader = Int(4807.038 / 100)
grader = Int(48.07038)
grader = 48
decimaldegrees = (dLat - (100 * grader)) / 60,0
decimaldegrees = (4807.038 - (100 * 48)) / 60,0
decimaldegrees = (4807.038 - (4800)) / 60,0
decimaldegrees = (7.038) / 60,0
decimaldegrees = 0.1173
fullLat = grader + decimaldegrees
fullLat = 48 + 0.1173
fullLat = 48.1173
Så är inte programmering roligt? Nej! Det är inte! Den goda nyheten är när du får programmet rätt, datorn kommer att göra alla beräkningar utan ansträngning. De dåliga nyheterna är om programmet (algoritm) är fel, det kommer att göra det fel utan ansträngning. Eftersom jag inte nästan perfekt, måste jag göra en hel del felsökning.
Karta läge: Jag kopierade denna funktion från en annan programmerare (jag önskar jag kom ihåg var jag hittade det). Om du har en Internetanslutning och en bra CPU, kommer att tryck på denna knapp öppna upp Google Maps och Visa din GPS-position. Detta är inte mycket användbart för mig. Om jag använder min Pentium III laptop i min bil, det är för långsamt att visa detta och jag skulle vanligtvis har inte internet-anslutning på vägen ändå.
Problem: Beräkna en löpande genomsnittlig ovan.
Lösning: Detta är relativt lätt, bara att hålla addera värdena och dividera med antalet prover.
Jag har tagit två versioner av programvaran.
För att använda den första, publish.zip, behöver du en internet-anslutning. (Jag har inte testat detta) Spara zip-filen till din dator, kör setup.exe. Om detta fungerar hur det använder till, kommer den hämta alla stödfiler och installera programmet. Du bör kunna använda den här med alla USB GPS som stöder NMEA 0183 protokoll.
Den andra versionen, Michaels GPS.zip innehåller alla källkoden. Jag föreslår att du installerar Microsoft Visual Basic Express 2010 först, sedan kopiera mina filer i projektkatalogen. Mine ser ut så här:
\\MICHAEL-PC\Users\Michael\Documents\Visual studio 2010\Projects\
Körbara är under projektnamnet, ner några kataloger... \bin\release. Teoretiskt kan du köra .exe-filen. Anledningen till att jag föreslog är installera Microsoft Visual Basic uttrycka 2010, att det installeras alla .NET grejer behövs i programmet. Om det inte fungerar, kan du också starta VB-express och öppna projektet och köra den.
Setup: Ange rätt Comm port för USB GPS. Klicka på Uppdatera. Data bör börja uppdatera. Om du får ett felmeddelande, Stoppa uppdateringar och Uppdatera igen.