Stap 3: Mijn GPS programma
Wat ik zal dekken zijn enkele van de problemen en oplossingen in het algemeen voorwaarden.
Doelstellingen van het programma:
Praten met GPS en monster GPS-gegevens.
Breedtegraad, lengtegraad, hoogte weergeven
Berekenen van een lopend gemiddelde van de bovenstaande.
Fase 2: Ik wilde zien hoe nauwkeurig mijn GPS was. Zie de volgende stap.
Probleem: Praat met GPS. De BU-353 is een USB-apparaat. Zij ontvangt + 5V op de USB-aansluiting. Één van de leuke eigenschappen is dat zodra het macht heeft, het begint automatisch elke seconde, afgeven aan de NMEA 0183 seriële data op 4800 baud.
Oplossing: VB Express heeft dus al een besturingselement met de naam Serialport. Stel deze in op 4800 baud, stel deze in op de juiste Com-nummer en open deze.
Probleem: GPS voorbeeldgegevens. Hebt u een manier om te kijken naar de seriële data van de BU-353, zou één regel iets als dit:
$GPGGA, 233632.000, 3913.9963, N, 10844.2590, W, 2 09, 0.9, 1424.3, M-16.7, M, 0.8, 0000 * 79
Hier is hoe de NMEA 0183 definieert dit:
GGA - essentiële correctie gegevens waarmee 3D-gegevens van de locatie en nauwkeurigheid.
$GPGGA, 123519, 4807.038, N, 01131.000, E, 1, 08, 545.4, 0.9 M, 46.9, M,, * 47
Waar:
GGA Global Positioning System Fix gegevens
123519 fix genomen op 12:35:19 UTC (Coordinated Universal Time)
4807.038, N Latitude 48 deg 07.038' N
01131.000, E breedtegraad 11 deg 31.000' E
1 fix kwaliteit: 0 = ongeldig
1 = GPS-fix (SPS)
2 = DGPS fix (dit betekent WAAS is ingeschakeld en werken)
08 aantal satellieten worden bijgehouden
0.9 horizontale verdunning van positie (iets te maken met nauwkeurigheid)
545.4, M hoogte, meter boven zeeniveau
46.9, M hoogte van geoide (zeeniveau) boven WGS84 ellipsoïde
(leeg veld) tijd in seconden sinds laatste DGPS bijwerken
(leeg veld) DGPS station id-nummer
* 47 de controlesom gegevens, begint altijd met *
Tip: Ik heb net iets over lengte- en breedtegraad. Latitude kan alleen gaan van 0 tot 90; lengte gaat van 0 tot 180. Dat is de reden waarom de bovenstaande latitude-waarde heeft vier cijfers vóór het decimaalteken en de longitude heeft vijf. In het bovenstaande voorbeeld is de 11 graden 011 geschreven.
NMEA 0183-protocollen worden gedefinieerd allemaal via het Internet. Hier is een:
http://biostatmatt.com/uploads/DescriptionNMEA.PDF
Dit protocol is niet alleen voor GPS zo niet dat alle van de zinnen relevant zijn.
SubproblemA: De BU-353 stuurt meerdere gegevens snaren elke seconde. Het computerprogramma is de seriële datastroom ontvangen maar niet weet waar het 'Start'. (Dit heet asynchrone communicatie).
SolutionA: Wat het programma te maken heeft is voortdurend kijken de stroom van de gegevens totdat het ziet "$GPGGA", dan weet dat de relevante gegevens zullen volgen.
SubproblemB: De gegevens van de $GPGGA is een lijn van gegevens. De computer moet scheiden van de gegevens in de verschillende delen.
SolutionB: In programmeertaal heet dit ontleden. De NMEA protocol heeft vrij strenge regels over hoe de snaren worden gedefinieerd. Elk element in een opgegeven positie en gescheiden met een komma. Het programma heeft dus om te gaan door middel van de gegevens en halen wat hij wil en de rest negeren. Voor mijn doeleinden, ik lees tot de hoogte en de rest van de regel overgeslagen.
FYI: De controlesom is een middel om te verifiëren of de gegevensreeks beschadigd of intact is. In het algemeen, als u beschadigde gegevens, zal het meestal onleesbaar worden hoe dan ook. Ik negeer controlesommen.
Probleem: Breedtegraad, lengtegraad, hoogte weergeven Op dit moment is alle gegevens in tekens. Het kan eenvoudig worden weergegeven in tekstvakken. Maar voor mijn doeleinden, zijn er twee problemen. Een is computers zijn stom, ze kunnen niet gemiddeld tekens, ze moeten gebruik maken van nummers. Ik gebruik een aantal van de 'dubbele' waardoor dat het kan bevatten een decimale komma, zoals 545.4. Het tweede probleem is dat de lengte- en breedtegraad worden ingeschreven in het formaat van de graden en minuten in één getal. 4807.038 is 48 deg 07.038'. Computers zijn stom dat zij niet begrijpen dit.
Maak je geen zorgen als de volgende niet zinvol voor u.
Oplossing: De meeste programmeertalen hebben een manier om te converteren naar tekens op een double. Ik gebruikte deze in VB express:
dLat = Convert.ToDouble(lineArr(2))
Converteren dat latitude nummer is een beetje lastiger, ik deed dit
graden = Int(dLat / 100) //This neemt de eerste twee cijfers en converteert ze naar een geheel getal (getal zonder een decimaal)
decimaldegrees = (dLat - (100 * graden)) / 60,0 / / dit originele nummer, neemt
afgetrokken van het gedeelte van de graden en
wordt geconverteerd naar een decimaal getal
fullLat = graden + decimaldegrees //This combineert de twee
Bijvoorbeeld als dLat = 4807.038
graden = Int(4807.038 / 100)
graden = Int(48.07038)
graden = 48
decimaldegrees = (dLat - (100 * graden)) / 60,0
decimaldegrees = (4807.038 - (100 * 48)) / 60,0
decimaldegrees = (4807.038 - (4800)) / 60,0
decimaldegrees = (7.038) / 60,0
decimaldegrees = 0.1173
fullLat = graden + decimaldegrees
fullLat = 48 + 0.1173
fullLat = 48.1173
Zo is niet programmeren leuk? NEE! Het is niet! Het goede nieuws is dat zodra je het programma gelijk, dat de computer zal moeiteloos alle berekeningen doen. Het slechte nieuws is dat als het programma (algoritme) fout is, het zal het verkeerd doet moeiteloos. Aangezien ik niet bijna perfect, heb ik te doen een heleboel problemen oplossen.
Kaart: Ik heb deze functie gekopieerd van een andere programmeur (ik wou dat ik herinnerde me waar ik het vond). Hebt u een internetverbinding en een goede CPU, zal indrukken van deze toets openen omhoog kaarten Google en weergeven van uw GPS-locatie. Dit is niet zeer nuttig voor mij. Als ik mijn Pentium III laptop gebruik in mijn auto, het is te traag om dit weer te geven en ik meestal geen internetverbinding hebt op de weg toch.
Probleem: Berekenen van een lopend gemiddelde van de bovenstaande.
Oplossing: Dit is relatief eenvoudig, gewoon houden optelling van de waarden en gedeeld door het aantal monsters.
Ik heb ook twee versies van mijn software.
Als u wilt gebruiken de eerste, publish.zip, hebt u een internetverbinding nodig. (Ik heb dit niet getest) Sla het zip-bestand op uw computer, voert u setup.exe. Als dit de manier waarop het gebruikt om te werken, zal het alle de ondersteuningsbestanden downloaden en installeer het programma. U moet zitten kundig voor dit te gebruiken met elke USB GPS die NMEA 0183-protocollen ondersteunt.
De tweede versie, Michaels GPS.zip bevat alle van de broncode. Ik stel u Microsoft Visual Basic Express 2010 eerst te installeren en vervolgens mijn bestanden kopiëren naar de projectmap. Mijne ziet er als volgt:
\\MICHAEL-PC\Users\Michael\Documents\Visual studio 2010\Projects\
Het uitvoerbare bestand is onder de naam van het project, onderaan een paar folders... \bin\release. Theoretisch, kunt u het .exe-bestand uitvoeren. De reden die heb ik voorgesteld is het installeren van Microsoft Visual Basic Express 2010, dat het alle .NET spullen nodig door het programma installeert. Als dat niet werkt, kunt u ook starten van VB express en open het project en draaien.
Setup: Voer de juiste Comm-poort voor uw USB GPS. Klik op Update. De gegevens beginnen met bijwerken. Als u een fout, Stoppen met Updates en Update opnieuw.