GpsFramework - VPDV WS07/08
Transcrição
GpsFramework - VPDV WS07/08
Fachhochschule Wiesbaden University of Applied Sciences Anwendung der Prozessdatenverarbeitung Wintersemester 2007/2008 Anzeige der GPS-Position mit flexiblem Kartenmaterial auf einem PocketPC Carsten Altenhofen ∗ Nils von Brincken 29. Februar 2008 ∗ eMail: † eMail: [email protected] [email protected] † I Inhaltsverzeichnis 1 Über das Projekt 1 2 Entwicklungsumgebung 2.1 Hardware . . . . . . . . . . . . . . . . . . . 2.1.1 Hewlett-Packard iPaq hx2400 . . . . 2.1.2 Navigon GPS-Empfänger "Triceiver" 2.2 Software . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 4 4 3 Datenstruktur 3.1 Google’s map tiles - Die Karten-Kacheln . . . . . . . . . . . . . . . . . . . . . 3.2 Relevante NMEA-Datensätze des GPS-Empfängers . . . . . . . . . . . . . . . 3.3 Berechnung des Sonnenstandes . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 6 8 4 Implementierung 4.1 Anzeige . . . . . . . . . . . . . . 4.2 Die Klassen BluetoothListener und 4.3 Komponenten-Konzepte . . . . . 4.4 Probleme bei der Entwicklung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13 13 17 17 5 Abschliessendes 5.1 Konzeptionelle, noch offene Probleme . . . . . . . . . . . . . . . . . . . . . . . 5.2 Fazit der Entwickler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 19 19 Literaturverzeichnis 20 A Projektplanung November 2007 20 B Projektpräsentation 24.01.2008 22 . . . . . . . . NmeaDecoder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 Über das Projekt Dieses Dokument beschreibt die Entwicklung der GPS-Daten-Visualisierung, die im Lauf der Vertiefungsveranstaltung "Anwendung der Prozessdatenverarbeitung" im Wintersemester 2007/2008 an der Fachhochschule Wiesbaden erstellt wurde. Das Projekt wurde von Herrn Prof. Dr. K.O. Linn betreut. In dieser Dokumentation liess es sich nicht vermeiden, Links ins WWW anzugeben – wir hoffen, dass die Inhalte auch noch nach der Abgabe aktuell sind oder sich weitere Informationen schon bald in Buch- oder weniger flüchtiger Form finden lassen. Die Kommentierung zur Arbeitsweise des Codes findet direkt in den Quelldateien per XML statt und kann darüber auch weiterverarbeitet werden.1 Ziel Das Ziel, der aus Nils von Brincken und Carsten Altenhofen bestehenden Projektgruppe, war die Anzeige einer GPS-Position auf einer Karte. Am Anfang des Projektes wurde dies als ungefähres Ziel festgelegt und dann in wöchentlichen Besprechungen mit Herrn Linn genauer ausgearbeitet. Somit ergab sich aus jedem aufgetauchten Problem auch die Möglichkeit, dieses anzugehen und zu lösen oder einen alternativen Weg zu wählen. Beispielsweise hätte eine weniger anspruchsvolle Zielsetzung bei der Kartendarstellung Entwicklungszeit eingespart, jedoch keinen Mehrwert gegenüber anderen Projekten sichtbar zu machen vermocht. Einige Implementierungsdetails brachten den aufgestellten Zeitplan durcheinander, genauso machten organisatorische Entscheidungen in der Zusammenarbeit klar, dass sich beim terminkritischen Entwickeln alle Komponenten ergänzen müssen. Dies gilt für die verwendeten Software-Werkzeuge, die Einschätzung der eigenen Fähigkeiten und realistische, festgelegte 1 Vorgehen im VisualStudio: Im Solution Explorer die Properties des GpsFramework per Rechtsklick anzeigen lassen. In der Registerkarte Build kann unter Output das Verzeichnis für die Dokumentationsdatei ausgewählt werden. Detaillierte, englische Erklärung zur XML-Kommentierung im MSDN: http://msdn. microsoft.com/msdnmag/issues/02/06/XMLC/ 1 Über das Projekt 2 Meilensteine. So war die Entscheidung, die uns beiden am Anfang noch unbekannte Programmiersprache C# zu verwenden, sicher nicht die effektivste Lösung – aber so konnten wir uns über die Fähigkeiten der Sprache ein Praxisbild machen. Umrissen lagen folgende Aufgaben vor uns: Erstellen der Kartenanzeige, Auslesen der GPSDaten, Anzeigen von Position, Sonnenstand und UTM-Karteninformationen. Als Einsatzgebiet lag uns die Nutzung durch Privatpersonen beim Wandern vor Augen. Somit muss der Kartenausschnitt flexibel, aber nicht auf hohe Bewegungsgeschwindigkeiten ausgerichtet sein. Die Karten liegen auf einem Gerät vor, das eine beschränkte Speicher- und Batteriekapazität aufweist, eine Online-Anbindung soll im Einsatz nicht verfügbar sein. Ergebnis Der Vorteil des iterativen Projektaufbaus lag in der steilen Lernkurve, da Herr Linn uns ermutigte, auch neue Wege zu gehen. So haben wir weitgehend auf vorhandene Bibliotheken wie zur GPS-Dekodierung oder Zeit-Funktionen verzichtet und die dahinterstehenden Algorithmen selbst umgesetzt. Am Projektende können wir leider nicht auf eine vollständige Lösung aller Aspekte verweisen – jedoch auf praktikable Ansätze und softwaretechnische Konzepte, die das Entwicklungsfeld GPS-Visualisierung in der "Anwendung der Prozessdatenverarbeitung" weiterbringen. Implementiert ist die Darstellung des unterschiedlich detaillierten Kartenmaterials, das gleichzeitige Abfragen aller GPS-Informationen und das Anzeigen von Koordinaten, Bewegungsrichtung und -geschwindigkeit sowie des Sonnenstandes. Carsten Altenhofen, Nils von Brincken Anwendung der Prozessdatenverarbeitung 3 2 Entwicklungsumgebung Die Rahmenbedingungen für unsere Arbeit wurden durch die von der FH Wiesbaden bereitgestellte Hardware, einen PocketPC und einen GPS-Empfänger festgelegt – dies wirkte sich auf die Möglichkeiten der Softwarenutzung und Entwicklungstätigkeit aus. Um gleichzeitig arbeiten zu können, mussten wir auf Emulatoren für die Datenbereitstellung zurückgreifen – die jedoch nicht immer präzise Werte lieferten oder unkompliziert zu benutzen waren. Eine weitere Hürde war auch der Einsatz von Microsoft Visual Studio 2005 auf einem virtualisierten Windows XP (siehe 2.2). 2.1 Hardware 2.1.1 Hewlett-Packard iPaq hx2400 Der HP iPaq hx2400 verfügt über einen 520 MHz-Prozessor von Marvell1 und einen berührungssensitiven, 320x240 Pixel-Bildschirm, der mit einem Stift bedient wird. Die Anbindung an andere Systeme funktioniert über Bluetooth, WLAN (802.11b-Standard) und durch ein Cradle für die USB-Schnittstelle zu einem Rechner. Schwierigkeiten: Für den Entwicklungsprozess ergaben sich keine Probleme mit dieser Hardware. Allerdings mussten bei der Konzeption der Anwendung die geringen Ressourcen beachtet werden – Systemleistung (CPU), Speicherkapazität (RAM, CFII-Speicherkarte), Batterielaufzeit. 1 Beschreibung des eingesetzten Boards und der PXA270-CPU auf: http://www.logicpd.com/products/ som/marvell/pxa270 2 Entwicklungsumgebung 4 2.1.2 Navigon GPS-Empfänger "Triceiver" Es handelt sich hierbei um ein Gerät der Firma Navigon2 , dessen GPS-Dekodierung durch einen SiRFII-Chip3 erfolgt. Das Gerät sendet seine Positionsdaten per Bluetooth im NMEA0183-Standard [Bad08] weiter. In Windows XP wird die Hardware dann wie eine serielle Schnittstelle (COM-Port) benutzt. Schwierigkeiten: Als grundsätzliches Problem ist die Beschaffung der Datensätze vom Empfänger anzusehen. Da wir nur über ein Gerät verfügten, mussten wir uns mit Emulatoren behelfen (siehe 2.2). Die Möglichkeit, GPS-Routen aufzuzeichnen und korrekt abzuspielen, konnten wir erst am Projektende einsetzen und somit keinen Nutzen mehr daraus ziehen. 2.2 Software Auf dem Windows Mobile 2003 des PocketPC wurde C# als Anwendungssprache benutzt. Die Programmierumgebung war Visual Studio 2005 unter Windows XP, in dem eine enge Integration zwischen Debugging-Möglichkeiten, Gerätezugriffen und Virtualisierung des PocketPC geschaffen wurde. Um die Virtualisierungs- und Emulations-Situation zu verdeutlichen: Es wurde teilweise mit einem Apple MacBook programmiert, das in MacOS X mit Hilfe von Paralles Desktop4 ein Windows XP virtualisierte. Das darin benutzte Visual Studio stellte wiederum einen virtualisierten PocketPC zur Verfügung. Dieser musste auf die Bluetooth-Schnittstelle (MacBook-Hardware) zugreifen oder auf eine serielle Schnittstelle, die GPS-Daten emuliert bereitstellte. Zusätzliche Werkzeuge SiRF-Demo Windows-Programm, um den Chip des GPS-Empfängers auszulesen, u.a mit den Positionsdaten. http://www.sirf.com/free_demo.html GPS-Utility Windows-Programm, um die GPS-Daten des Empfängers auszulesen http:// www.gpsu.co.uk/ 2 http://www.navigon.com/site/de/de/, der "Triceiver" ist nur noch im Webshop der Firma zu finden. Beschreibung des Chip auf http://www.sirf.com/products/gps_chip7.html 4 Produkt-Homepage: http://www.parallels.com/en/products/desktop/ 3 Carsten Altenhofen, Nils von Brincken Anwendung der Prozessdatenverarbeitung 2 Entwicklungsumgebung 5 gpsfeed+ Ein Emulator, der an der seriellen Schnittstelle, per TCP/UDP oder als XMLAusgabe NMEA-Sätze zur Verfügung stellt, plattformunabhängig. http://gpsfeed. sourceforge.net/ SerialClient Ein Programm, das es Parallels Desktop erlaubt, die seriellen Schnittstellen von MacOS X zu benutzen. Dieses Vorgehen wird unter [SER07] genauer beschrieben. http: //eudyptes.com/SerialClient.php Applet zur Berechnung des Sonnenstandes http://www.geoastro.de/ErdeSonne/SE/erdesonne. html Carsten Altenhofen, Nils von Brincken Anwendung der Prozessdatenverarbeitung 6 3 Datenstruktur Das Projekt verknüpft zwei Bereiche: Das zu visualisierende Kartenmaterial und die Positionsdaten. Bei den Karten nutzen wir Google Maps1 als Basis, bei den Daten die Ausgaben des Empfängers im NMEA-Standard. Dies wurde in der ersten Besprechung so festgelegt, da Herr Linn uns über ein Web-Frontend Kartenteile zur Verfügung stellen konnte. Zusätzlich war die Funktionsweise des Google-Dienstes bereits 2006 dokumentiert worden [PSZ06]. 3.1 Google’s map tiles - Die Karten-Kacheln Die Kartenabschnitte (Kacheln) liegen in einem bestimmten Benennungssystem als Bilddatei (256x256 Pixel-JPEG) vor. Je nach Kartenverwendung (Satellitenfoto, Strassenkarten 2 ) unterscheidet es sich. Die anzuzeigenden Satellitenbilder liegen im TQRS-Format vor [PSZ06, S. 7], somit lassen sie sich gut strukturiert speichern und ein einfacher Zugriff ist möglich. Wir konnten die für eine Koordinate benötigten Kacheln durch vorhandene Algorithmen [PSZ] bestimmen und brauchten keine weiteren Konfigurationsdateien. Diese Algorithmen finden sich auch im WWW – leider nicht von Google bereitgestellt. Im Bereich Informationen über ihre Datenstrukturen hält sich Google recht bedeckt und stellt nur eine Programmierschnittstelle (API) für das WWW zur Verfügung. Die Kacheln jedoch dürfen frei verwendet werden, zumindest für den privaten Bereich.3 3.2 Relevante NMEA-Datensätze des GPS-Empfängers Für unser GPS-Projekt mussten wir uns zuerst mit dem sogenannten NMEA-0183-Standard befassen. Dieser spezifiziert das Format in dem Datensätze übermittelt werden, die schließlich 1 http://maps.google.de/ Das Höhenprofil war während der Entwicklung nicht verfügbar. 3 http://maps.google.de/intl/de/help/terms_maps.html 2 3 Datenstruktur 7 von Empfängern ausgelesen werden. Der Standard ist sehr umfangreich und enthält zahlreiche Sätze, die sich unter anderem mit der Autopilotsteuerung eines Flugzeugs befassen. Diese Sätze werden natürlich von einem Standard-GPS-Empfänger nicht empfangen. Unser GPSEmpfänger mit SiRFII-Chip mit dem wir uns über Bluetooth verbinden, empfängt nur wenige Sätze des Standards: • GPRMC (Recommended Minimum Navigation Information) • GPVTG (Track made good and Ground Speed) • GPGSA (GPS DOP and active Satellites) • GPGSV (Satellites in View) • GPGGA (Global Positioning System Fix Data) Um die für unser Projekt von Interesse befindlichen Informationen zu erhalten, benötigten wir folgende Sätze: RMC – Recommended Minimum Navigation Information $--RMC,hhmmss.ss,A,llll.ll,a,yyyyy.yy,a,x.x,x.x,xxxx,x.x,a,m,*hh<CR><LF> Field Number: 1. UTC Time 2. Status, V = Navigation receiver warning A = Valid 3. Latitude 4. N or S 5. Longitude 6. E or W 7. Speed over ground, knots 8. Track made good, degrees true 9. Date, ddmmyy 10. Magnetic Variation, degrees 11. E or W 12. FAA mode indicator (NMEA 2.3 and later) 13. Checksum Carsten Altenhofen, Nils von Brincken Anwendung der Prozessdatenverarbeitung 3 Datenstruktur 8 VTG – Track made good and Ground speed $--VTG,x.x,T,x.x,M,x.x,N,x.x,K,m,*hh<CR><LF> Field Number: 1. Track Degrees 2. T = True 3. Track Degrees 4. M = Magnetic 5. Speed Knots 6. N = Knots 7. Speed Kilometers Per Hour 8. K = Kilometers Per Hour 9. FAA mode indicator (NMEA 2.3 and later) 10. Checksum 3.3 Berechnung des Sonnenstandes Informationen zur Errechnung des Sonnenstands findet man unter anderem unter http://de. wikipedia.org/wiki/Sonnenstand. Die Errechnung des Sonnenstands ist relativ komplex, deshalb hier nur eine kurze Übersicht des Ganzen. Nachdem ein TimeDateReceived-Ereignis im NmeaDecoder ausgelöst wird, wird wie im Abschnitt 4.2 (Die Klassen BluetoothListener und NmeaDecoder) erwähnt, die Methode decoder_TimeDateReceived(double days_since_2000, double utc_time_in_h) ausgeführt. Der Parameter days_since_2000 enthält die Tage seit dem Standardäquinoktium am 1.1.2000, wobei Schaltjahre zu berücksichtigen sind, und utc_time_in_h die Tageszeit in Stunden und Bruchteilen von Stunden (Beispiel: 10.45 Uhr ⇒ 10.75 ) Diese beiden Zeitwerte sind für die genaue Errechnung nötig, sowie die Koordinaten des Standorts, welche wir uns aus den aktuell errechneten Klassenvariablen für Längen- und Breitengrad holen. Carsten Altenhofen, Nils von Brincken Anwendung der Prozessdatenverarbeitung 3 Datenstruktur 9 Als Erstes wird die Zeitvariable n errechnet, welche sich aus der Anzahl der Tage seit dem Standardäquinoktium im Jahr 2000 und dem Tagesbruchteil zusammensetzt: n = days_since_2000 + utc_time_in_h/24 Daraus läßt sich die Position der Sonne auf der Ekliptik bestimmen. Die Formel geht von der Position aus, welche zum Zeitpunkt des Standardäquinoktium aktuell war: L = 280.460 + 0.9856474 ∗ n Mittels modulo 360,0 muss das Ganze noch in den Bereich von 0,0 bis 360,0 Grad gebracht werden. Um den Einfluss der Bahnelliptizität nachträglich zu berücksichtigen und die ekliptikale Länge zu erhalten, ist hierzu als Korrektur die so genannte Mittelpunktsgleichung zu addieren. Diese Korrektur hängt vom Winkel zwischen Sonne und Perihel ab, der sogenannten Anomalie. Die Mittelpunktsgleichung erwartet als Eingabewert die (fiktive) gleichförmig anwachsende mittlere Anomalie g. Diese wächst um 360 Grad in einem anomalistischen Jahr zu ca. 365,2596 Tagen: g = 357.528 + 0.9856003 ∗ n Mittels modulo 360,0 muss auch dies noch in den Bereich von 0,0 bis 360,0 Grad gebracht werden. Daraus ergibt sich für die ekliptikale Länge Λ der Sonne: Λ = L + 1.9150000 ∗ sin(g) + 0.0200000 ∗ sin(2.0000000 ∗ g) Hierbei ist zu beachten, dass die Argumente im Sinus, welche wir zuvor errechnet haben, im Bogenmaß anzugeben sind. Für die so berechnete, entlang der Ekliptik gezählte, ekliptikale Länge Λ muss nun die zugehörige entlang des Himmelsäquators gezählte Rektaszension α bestimmt werden. Mit der Schiefe der Ekliptik : Carsten Altenhofen, Nils von Brincken Anwendung der Prozessdatenverarbeitung 3 Datenstruktur 10 ε = 23.439 − 0.0000004 ∗ n ergibt sich die Rektaszension α der Sonne. Falls jedoch der Nenner im Argument des Arcustangens einen Wert kleiner Null hat, sind 180◦ zum Ergebnis zu addieren, um den Winkel in den richtigen Quadranten zu bringen (α muss im gleichen Quadranten liegen wie Λ): α = arctan cos(ε) ∗ sin(Λ) cos(Λ) Auch hierbei ist zu beachten, dass die Argumente in den Sinus- und Cosinus-Operationen, welche wir zuvor errechnet haben, im Bogenmaß anzugeben sind. Am Ende muss jedoch alles wieder ins Gradmass zurückgerechnet werden, da dies für den α-Wert gewünscht ist. Die senkrecht zum Himmelsäquator gezählte Deklination δ ergibt sich als: δ = arcsin(sin(ε) ∗ sin(Λ)) Hier gilt das Gleiche wie bei der vorherigen Rechnung. Die Argumente sind ins Bogenmass umzurechnen, das Ergebnis des δ wird wieder ins Gradmass zurückgerechnet. Nun werden die Variablen Azimut A (d.h. die Himmelsrichtung) und der Höhenwinkel h ausgerechnet. Dazu bestimme man die Zeitvariable T0 , dies ist eine Zeitvariable in julianischen Jahrhunderten ab dem Standardäquinoktium im Jahr 2000. T0 = days_since_2000/36525 Und damit die mittlere Sternzeit θ in Greenwich für den gesuchten Zeitpunkt T (Weltzeit UT, in Stunden). Der erste Term ist die Sternzeit von Greenwich zum Zeitpunkt des Standardäquinoktiums im Jahr 2000, der zweite und dritte die Drift des Frühlingspunktes seit dem Standardäquinoktium: h θG = (6.697376 + 2400.05134 ∗ T0 + 1.002738 ∗ utc_time_in_h) Carsten Altenhofen, Nils von Brincken Anwendung der Prozessdatenverarbeitung 3 Datenstruktur 11 Das Ergebnis ist mittels modulo 24,0 in einen Bereich von 24 Stunden zu bringen. Die Sternzeit ist der Stundenwinkel des Frühlingspunktes, ausgedrückt im Zeitmaß (1 Stunde = 15◦ ). Ganzzahlige Vielfache von 24 Stunden werden vom Ergebnis abgezogen. Dafür haben wir aber mittels der Modulo-Operation im Schritt davor schon gesorgt. Die Multiplikation mit dem Umrechnungsfaktor 15 ◦ pro Stunde liefert den Greenwich-Stundenwinkel des Frühlingspunkts im Gradmaß: h ∗ 15 θG = θG Für einen Ort auf der geographischen Länge (nach Osten positiv gezählt) ist der Stundenwinkel des Frühlingspunkts: θ = θG + longitude Subtraktion der Rektaszension der Sonne α liefert den Stundenwinkel τ der Sonne für jenen Ort: τ =θ−α Azimut A und Höhenwinkel h ergeben sich für einen Ort auf der geographischen Breite aus: A = arctan sin(τ ) cos(τ ) ∗ sin(latitude) − tan(δ) ∗ cos(latitude) Falls der Nenner im Argument des Arcustangens einen Wert kleiner Null hat, sind wieder 180◦ zum Ergebnis zu addieren, um den Winkel in den richtigen Quadranten zu bringen. Ebenso sind die Argumente wieder im Bogenmass anzugeben und später ins Gradmass zurückzurechnen. Mittels modulo 360,0 läßt sich das Ganze wieder in einen Bereich von 360◦ bringen. Ausserdem ist der Winkel so vom Süden aus gesehen angegeben. Um das Ergebnis vom Norden aus gesehen zu erhalten sind letztendlich noch 180◦ zu addieren. Höhenwinkel h: h = arcsin (cos(δ) ∗ cos(τ ) ∗ cos(latitude) + sin(δ) ∗ sin(latitude)) Carsten Altenhofen, Nils von Brincken Anwendung der Prozessdatenverarbeitung 3 Datenstruktur 12 Bezüglich der Argumente ist hier gleiches zu beachten. Damit haben wir sowohl den gewünschten Sonnestand (Azimut) als auch den Höhenwinkel der Sonne über dem Horizont für beliebige Orte weltweit ermittelt. Carsten Altenhofen, Nils von Brincken Anwendung der Prozessdatenverarbeitung 13 4 Implementierung Wir entschlossen uns bei Projektbeginn, Zuständigkeiten zu bilden: Carsten Altenhofen befasste sich mit der Verarbeitung der GPS-Daten, während Nils von Brincken die Programmierung der Kartenanzeige übernahm. 4.1 Anzeige Die Anforderungen von Herrn Linn an die Kartenanzeige waren hoch: So sollte sie die verschiedenen Zoom-Stufen des Google Maps-Materials beherrschen und möglichst große Kartenabschnitte zur Verfügung stellen. Beim Implementieren der letzten Vorgabe schossen wir sogar über die Zielsetzung hinaus. Durch ein Kachelmanagementsystem bewegen sich die einzelnen, zueinander gehörenden Kartenabschnitte autark. Im sichtbaren Bereich der Anzeige (320x240 Pixel) sind immer Instanzen der Klasse Tile zu sehen, die sich je nach Bewegungsrichtung wie auf einem unendlichen Band neu anordnen (Abbildung 4.1). Somit müssen nie mehr als sechs Kacheln im Speicher gehalten werden. Eine statische Bildanzeige im C# .NET Compact Framework 2.0 kann nur ein Bild der Größe 1024x1024 Pixel anzeigen [PSZ06, S. 15] . Diese Limitierung wird somit umgangen. 4.2 Die Klassen BluetoothListener und NmeaDecoder Diese Module sorgen für den Empfang von sogenannten NMEA-Sentences und deren Auswertung. Die Klasse BluetoothListener liest, in einem eigenen Tread permanent die serielle Schnittstelle, die in diesem Fall das Bluetooth-Signal eines mobilen GPS-Empfängers darstellt, aus. Sie verfügt über die private Getter-Methoden • get_latitude() • get_longitude() • get_azimut() 4 Implementierung 14 Abbildung 4.1: Darstellung des Kachelmanagements aus Abschnitt 4.1. A: 256x256 PixelKartenabschnitt, deckt in 2 ∗ 6-Anordnung immer jeden Bereich der 320x240Pixel Anzeige ab. B: Bei Bewegungen aus dem sichtbaren Bereich handelt die Kachel selbständig und verschiebt sich mit neuem Inhalt ans andere Ende. Carsten Altenhofen, Nils von Brincken Anwendung der Prozessdatenverarbeitung 4 Implementierung 15 • get_hoehenwinkel() • get_track() • get_speed() mit der sich eine andere Klasse, die eine Referenz auf ein Objekt der Klasse BluetoothListener hält, die aktuellen Werte holen kann. Sie konfiguriert zunächst den SerialPort, mittels welchem wir uns mit der Bluetooth-Schnittstelle verbinden, wie folgt: • Datenübertragung: 9600 bit/s • Datenbits: 8 • Stop Bits: 1 • Kein Parity Bit • Kein Handshake Anschließend konstruiert sich der BluetoothListener als Hilfsklasse einen NmeaDecoder zur Signalentschlüsselung. Zwei weitere Methoden • startReading() • stopReading() sorgen für das Öffnen und Schliessen des Ports. Eingehende Daten auf dem Port lösen das Event DataReceived der SerialPort-Klasse aus. Auf das wird mittels des passenden EventHandler SerialDataReceivedEventHandler reagiert und in der zugehörigen Methode port_DataReceived() die Daten an die decode()-Methode der Klasse NmeaDecoder delegiert, die die Nutzdaten schliesslich auswertet. Dies geschieht, indem die Methode NmeaDecoder.decode() von der Hauptklasse, mit eingehenden Sentences parameterisiert, aufgerufen wird. Die Klasse NmeaDecoder wertet die folgenden Sätze des NMEA-Standards aus: • Recommended Minumum Navigation Information, um sowohl GPS-Koordinaten als auch Zeitinformationen aus dem GPRMC-Satz zu erhalten. • Track made good and Ground Speed Information, um Kurs und Geschwindigkeit aus dem GPVTG-Satz zu erhalten. Carsten Altenhofen, Nils von Brincken Anwendung der Prozessdatenverarbeitung 4 Implementierung 16 Dies beinhaltet eine Verifizierung, durch den Vergleich einer übermittelten und der errechneten Prüfsumme des Satzes. Das Errechnen der Prüfsumme erfolgt, indem die Byte-Werte eines jeden Zeichens des Satzes nacheinander mittels XOR-Operation ausgewertet werden. Der daraus resultierende Byte-Wert wird zweistellig hexadezimal kodiert mit der übermittelten Prüfsumme verglichen und der Satz eventuell verworfen. Nach erfolgreicher Verifizierung wird ein Satz in seine Blöcke zerlegt, die durch Komma separiert sind. Das Präfix im ersten Block entscheidet über die Art des Satzes im NMEA-Standard. Desweiteren wird sichergestellt das die benötigten Blöcke Werte enthalten, ein Block kann trotz korrekter Prüfsumme leer sein. Im Falle eines GPRMC-Satzes wird überprüft, ob die Blöcke, welche Informationen zur UTCZeit und -Datum enthalten, Werte enthalten. Dann werden daraus Werte errechnet, die wiederum zur späteren Errechnung des Sonnenstands nötig sind. Diese sind: • die UTC-Zeit in Stunden und Bruchteilen von Stunden (Beispiel: 10.45 Uhr ⇒ 10.75) • Tage seit dem Standardäquinoktium am 1.1.2000, wobei Schaltjahre berücksichtigt werden. Diese werden nun durch ein Auslösen des Events (TimeDateReceived(days_since_2000, utc_time_in_h)) an den BluetoothListener übergeben und dort weiterverarbeitet. Das war jedoch nicht alles, was im Falle eines GPRMC-Satzes von Belang ist. Weiterhin wird überprüft, ob die Blöcke, welche Informationen zum Längen- und Breitengrad erhalten, Werte enthalten. Ist dies der Fall, dann wandeln wir diese Informationen, die noch in der Grad-, Minuten- und Sekunden-Darstellungen vorliegen, in dezimale Grad-Darstellungen um. Diese werden nun durch ein Auslösen des Events (CoordReceived(latitude, longitude)) an den BluetoothListener übergeben und dort weiterverarbeitet. Im Falle eines GPVTG-Satzes wird analog vorgegangen, indem Kurs und Geschwindigkeit ermittelt werden und durch ein Auslösen des Events (TrackSpeedReceived(track, speed)) an den BluetoothListener übergeben werden. Die vom NmeaDecoder oben genannten ausgelösten Events • CoordReceived • TimeDateReceived • TrackSpeedReceived Carsten Altenhofen, Nils von Brincken Anwendung der Prozessdatenverarbeitung 4 Implementierung 17 werden vom BluetoothListener durch die zugehörigen EventHandlern • CoordReceivedEventHandler • TimeDateReceivedEventHandler • TrackSpeedReceivedEventHandler abgefangen und die passende Methoden des BluetoothListeners • decoder_CoordReceived(double latitude, double longitude) • decoder_TimeDateReceived(double days_since_2000, double utc_time_in_h) • decoder_TrackSpeedReceived(double track, double speed) werden aufgerufen. Diese aktualisieren entweder nur die Klassenattribute für Längen- und Breitengrad oder Kurs und Geschwindigkeit oder führen im Fall von gültig empfangenen Zeitwerten weitere Rechnungen zur Ermittelung des Sonnenstandes (Azimut) und des Höhenwinkels (Höhe über dem Horizont) durch. Dazu werden die aktuellen Längen- und Breitengrade hinzugezogen. (Siehe Abschnitt 3.3). 4.3 Komponenten-Konzepte C# auf dem PocketPC verfügt über einige nützliche Anzeigemechanismen. Dazu gehören die Elemente für die Erzeugung der Bildschirmfenster, die problemlos miteinander arbeiten, sowie Benutzerinteraktion bereitstellen. Einfache Komponenten wie die Fortschrittsanzeige beim Generieren neuer Kacheln sind vorhanden – während genauso selbstverständliche Dialoge wie zum bestimmen eines Verzeichnisses fehlen. 4.4 Probleme bei der Entwicklung Wir entwickelten das Modul zur Signalauswertung des GPS-Empfängers und zur Errechnung der relevanten Werte zuerst als Konsolenapplikation in C# mittels Visual Studio 2005, womit Carsten Altenhofen, Nils von Brincken Anwendung der Prozessdatenverarbeitung 4 Implementierung 18 Abbildung 4.2: Kreislauf der Ereignisse – Abläufe in Abschnitt 4.2 sich gute Erfolge bei den Zwischenzielen erzielen liessen. Verifizieren könnte man seine Ergebnisse anhand diverser Websites und Applets im Internet. Dies war gerade bei der Errechnung des Sonnenstands iterativ nötig, da Folgefehler nur schwer zu erkennen waren. Die Portierung brachte letztendlich jedoch mehr Probleme mit sich. Dabei entwickelten wir mit dem C# .NET Compact Framework 2.0 und testeten auf dem GPS-Emulator des Visual Studio 2005. Zum einen war die Frage, wie das Threadhandling am besten zu gestalten ist, und zum anderen gab es Probleme bei den Versuchen mittels C#-Grafikroutinen in unser Zielanwendung, welche auf einem Windows Mobile-System läuft, zu zeichnen. Da das Compact Framework nur einen Teil der C# Primitiven enthält, ist oft Wichtiges nicht enthalten. Auch bei den Versuchen eine transparente Picturebox mit statischen Grafikelementen über die verschiebbaren Pictureboxen, die das Kartenmaterial enthalten zu legen, gab es Probleme. Das Compact Framework unterstützt keine Transparenz von Haus aus. Carsten Altenhofen, Nils von Brincken Anwendung der Prozessdatenverarbeitung 19 5 Abschliessendes 5.1 Konzeptionelle, noch offene Probleme Es fehlt noch eine Möglichkeit, die Anwendung als Paket zu installieren. Zwar wird sie durch Visual Studio auf den PocketPC ausgerollt (deploy), aber man muss sie über den DateiExplorer aufrufen. Eleganter ist eine Installation über die ActiveSync-Komponente, die dann auch den Anwendungszugriff im Ordner Programme ermöglicht. Für den Anwender sollte zusätzlich die Möglichkeit bestehen, die Bluetooth-Schnittstelle und andere Einstellungen flexibeler bestimmen zu können. 5.2 Fazit der Entwickler Als Anregung für nachfolgende Projekte: Es macht Sinn, zuerst den Rahmen der Entwicklungsumgebung zu schaffen, was auch den SVN-Zugang1 und genug Testdaten beinhaltet. Genauso verfifizierbare Algorithmen (Sonnenstand, zugriff auf Koordinaten) vorher entwickeln und unabhängig überprüfen. Somit entdeckt man Fehler schneller. Engere Bindung zwischen den Teilbereichen ist gefragt, also nicht von weit nach eng programmieren, sondern kleine Schritte zusammen gehen. Ein interessantes, lehrreiches Projekt, da wir viel über die für uns neue Sprache gelernt haben. Wir konnten innovative Ideen weiterentwickeln, auch wenn es nicht unbedingt zum Ziel führte. Im Vergleich zu anderen Projekten [OG07] [MF07] wurde uns bewusst, was in einem Semester alles schaffbar ist. 1 Quelltext-Versionverwaltung, an der FH Wiesbaden für alle Projekte bereitgestellt, http://svnbook. red-bean.com/ 20 Literaturverzeichnis [Bad08] Glenn Baddeley. GPS – NMEA sentence information. http://home.mira.net/ ~gnb/gps/nmea.html, 2008. [Ell06] Frank Eller. Visual C# 2005 Grundlagen und Programmiertechniken. AddisonWesley, München, 3 2006. [MF07] Pascal Martin and Paul Fox. RoadMap – A Car Navigation System for Linux and UNIX (and PocketPC too). http://roadmap.sourceforge.net/index.html, Oktober 2007. "RoadMap is an open source (GPL) program that provides a car navigation for Linux, UNIX and now Windows CE. It displays a map of the streets, tracks the position provided by a NMEA-compliant GPS receiver. Most of the map files used by RoadMap are generated from the TIGER files provided by the US Census Bureau, and from the RNF files provided by Statistics Canada, and thus cover northern North America only. There has been recent work on deriving RoadMap data from other sources, including postgis and other shapefile-based formats, but this work is either not on the main development branch, or very experimental.". [OG07] J. Ostertag and Fritz Ganter. GpsDrive — Navigation Software for Linux. http: //www.gpsdrive.de/, Oktober 2007. "GpsDrive displays your position provided from your GPS receiver on a zoomable map. The maps are autoselected for best resolution depending of your position and can be downloaded from the Internet. GpsDrive is also running on New HP (Compaq) iPAQ devices (if running on Linux with X-Server and GTK+)". [PSZ] Robert Pineker, Matthias Schmelzer, and Martin Zurkowski. PHP-Funktion um Koordinaten ins TQRS-Format zu überführen. http://www.informatik. fh-wiesbaden.de/~linn/vpdv06/gpsNavi2/seiten/doku////__filesource/ fsource_default__bigfilestrack_conf_big.php.html#a21. Quelltext aus der Web-Anwendungsdokumentation auf http://www.informatik.fh-wiesbaden.de/ ~linn/vpdv06/gpsNavi2/index.html. [PSZ06] Robert Pineker, Matthias Schmelzer, and Martin Zurkowski. Studienarbeit zum Thema "GPS Navigation – Pathfinder". Technical report, Fachhochschule Wiesbaden, 2006. [SER07] Share a serial port with Windows on Parallels. http://www.macosxhints.com/ article.php?story=20070111135928615&mode=print, Januar 2007. VPDV ws07/08 – Projektplanung Zielsetzung: Anzeigen von vorhandenem und geeichtem Kartenmaterial auf einem PocketPC. Bestimmung der Position durch ein GPS-Bluetooth-Adapter und Auswahl der dazugehörigen Karten. Einzeichnen von Layern über der Karte: Sonnenstand, in vordefinierten Abständen Längen- und Breitengrade. Unterschiedliche / trennbare Abschnitte Aufeinanderfolgende Arbeitsschritte Anzeigen eines Fensters Formel für das Anzeigen und überlagern der Karten Anzeige von Kartenmaterial im Fenster, stückeln um fortlaufend von der Speicherkarte auslesen und darstellen zu können Auslesen eines Verzeichnisses mit Bildern (Größe beachten, welche Daten sind vorhanden, was ist alles auf den Karten) und ini-Dateien (besser XMLVerwenden, um mehr Inhalte speichern zu können) Anzeigen von geeichten Karten Verbindung zum Bluetoothgeräten (Test der Schnittstelle auch mit Handy etc.) Auslesen von Rohdaten der BluetoothSchnittstelle Parsen der Daten in eine Struktur Verschriftlichung Software-Doku, Hintergründe, Infos für Präsentation Bis Anfang Dezember Layerfunktion über einem Teil des Fensters Layer für Sonnenbitmaps und Zeichnen der Grade Layer-Eichungsfunktion für Grade und Sonnenstand Benutzerhandbuch Version: 06.11.2007 Anwendung der PDV Kartendarstellung im GPS-Framework Nils von BRINCKEN [email protected] Carsten ALTENHOFEN [email protected] Version: 2/27/08 18:13 Wir stellen euch vor ... … welches … welche Ziel wir erreichen sollen Entwicklungsumgebung wir benutzen … wie unsere Datenmodelle aussehen und … wie die Darstellung davon realisiert wurde … was das Framework jetzt kann (Demonstration) Unser Ziel ! GPS-Koordinaten auf einer Karte darstellen ! Anzeige mit Erweiterungen realisieren Sonnenstand, UTM-Angaben, Bewegungsrichtung ! Nutzung ! durch Privatpersonen (Kartenquellen) ! zum Wandern (Übersicht, Unabhängigkeit) ! auf HP iPaq hx2400 (Windows Mobile 2003) Entwicklungsumgebung ! Hardware ! HP iPaq hx2400 (Marvell 520 MHzProzessor, 320x240 Pixel-Touchscreen, Bluetooth, WLAN) ! ! GPS-Empfänger (SiRFII-Chip, Bluetooth) Software (Microsoft-lastig) ! VisualStudio 2005 (C# .NET Compact Framework) ! Pocket PC-Emulator, GPS-Feed+ Google Maps als Kartenquelle ? ! Für persönliche, nichtgewerbliche Zwecke ? Zugreifen auf 17.179.869.184 Kacheln ? " ? Darstellen von 43 TB Bildmaterial ? " NMEA-Sentences GPRMC - Recommended Minimum Navigation Information $--RMC,hhmmss.ss,A,llll.ll,a,yyyyy.yy,a, x.x,x.x,xxxx,x.x,a,m,*hh<CR><LF> Field Number: 1) UTC Time 2) Status: V=Navigation receiver warning, A=Valid 3) Latitude 4) N or S 5) Longitude 6) E or W 7) Speed over ground, knots 8) Track made good, degrees true 9) Date, ddmmyy 10) Magnetic Variation, degrees 11) E or W 12) FAA mode indicator (NMEA 2.3 and later) 13) Checksum NMEA-Sentences GPVTG - Track made good and Ground speed 1 2 3 4 5 6 7 8 9 10 | | | | | | | | | | $--VTG,x.x,T,x.x,M,x.x,N,x.x,K,m,*hh<CR><LF> Field Number: 1) Track Degrees 2) T = True 3) Track Degrees 4) M = Magnetic 5) Speed Knots 6) N = Knots 7) Speed Kilometers Per Hour 8) K = Kilometers Per Hour 9) FAA mode indicator (NMEA 2.3 and later) 10) Checksum Module / Klassen für Empfang und Auswertung der NMEA-Sentences: ! BluetoothListener ! NMEADecoder Klasse BluetoothListener ! Konfiguriert den Serial Port ! Permanentes Lesen der serielle Schnittstelle, in diesem Fall das Bluetooth-Signal eines mobilen GPS-Empfängers ! Konstruiert sich als Hilfsklasse einen NMEADecoder zur Signalentschlüsselung Event-Handler des BluetoothListener // Event-Handler prüft ab, ob serielle Schnittstelle neue Daten // empfangen hat und ruft zugehörige Methode des Handlers auf port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); // Event-Handler prüft ab, ob NMEA-Decoder gültige Koordinaten // empfangen hat und ruft zugehörige Methode des Handler auf decoder.CoordReceived += new NmeaDecoder.CoordReceivedEventHandler(decoder_CoordReceived); // Event-Handler prüft ab, ob NMEA-Decoder gültige Zeitwerte empfangen // hat und ruft zugehörige Methode des Handler auf decoder.TimeDateReceived += new NmeaDecoder.TimeDateReceivedEventHandler(decoder_TimeDateReceived); // Event-Handler prüft ab, ob NMEA-Decoder gültigen Kurs und Geschwindig// keit empfangen hat und ruft zugehörige Methode des Handler auf decoder.TrackSpeedReceived += new NmeaDecoder.TrackSpeedReceivedEventHandler(decoder_TrackSpeedReceived); Klasse NMEADecoder ! Zum Entschlüsseln der NMEA-Sentences aufgrund des NMEA 0183 Standards ! Methode decode() zur Decodierung der Informationen ! Sentence wird verifiziert ! Passende Events werden eventuell ausgelöst Kreislauf der Ereignisse Sequenzdiagramm am Beispiel einer empfangenen Zeitinformation Grafik-Thread BluetoothListener -Konfiguration der seriellen Schnittstelle startReading() port.DataReceived-Event löst port_dataReceived aus -Eventuell Update() Decoder_TimeDateReceived() aus -Errechnung des Sonnenstands aus Zeitwerten -Benachrichtigen des Grafik Thread durch Event NMEADecoder decode() -Ruft isVerificated() auf -Verwirft Nachricht und kehrt zum Polling zurück oder -Extrahieren der Werte aus NMEA-Sentence decoder.TimeDateReceivedEvent löst Module BluetoothListener, NMEADecoder ! Durch das Ereignis/Handler-Design ist das Modul gut in ein GUI einzubinden ! Kompakt und damit ideal für mobile Systeme mit wenig Hauptspeicher Testen und Debugging mittels geeigneter Tools www.geocities.de/ErdeSonne GPS Utility zum Vergleichen Schon implementiert ! Fortlaufende Anzeige der Karten mit Zoomfunktion ! GPS-Daten Auslesen und Aufbereiten (Ort, Sonnenstand, Track, Speed) Und jetzt in die Praxis ...