GPS Tracking mit dem Raspberry Pi

Bereits vor einiger Zeit hatte ich mit GPS Modulen für den Raspberry Pi experimentiert, heute wollte ich die verschiedenen Projekte mal zusammenbringen und einen echten Raspberry Pi GPS-Tracker mit Akku Betrieb bauen. Als kleines Addon soll alle paar Minuten ein Bild erzeugt werden welches mit den jeweils aktuellen GPS Daten versehen wird. Dieses Raspberry Pi GPS Projekt kann entweder im Auto als GPS-Tracker mit Bild Funktion oder auch auf Wanderungen oder Fahrradtouren zur Dokumentation der Tour mit einem Akku verwendet werden.

Raspberry Pi GPS

Material

Folgendes Material habe ich verwendet

Verkabelung des GPS Modul

Die Pin Nummern und Bezeichnungen der GPIO-Leiste des Raspberry Pi 2 findet ihr in der GPIO PIN Übersicht.

Verkabelung des Moduls

GPS-Modul
  • VCC wird mit 3,3V versorgt und kommt daher beim RasPi an PIN1 (+ 3,3 V)
  • GND ist natürlich auch beim RasPi GND und kommt daher an PIN6 (GND)
  • RX ist da wir Seriell verwenden beim  RasPi TX PIN8 (TX)
  • TX ist da wir Seriell verwenden beim RasPi RX PIN10  (RX)

PPS verkabeln

neo6 gps module pins
  • PPS Signal für die aktuelle Uhrzeit an PIN12 (GPIO18)

Das PPS-Signal müsst ihr am PIN3 des GPS-Chip oder am markierten Widerstand durch anlöten eines kleinen Kabels abholen

Meine Verkabelung / Aufbau

Raspberry Pi GPS Raspberry Pi GPS

Einrichtung GPS Tracker auf dem Raspberry Pi

Uhrzeit via GPS beziehen

Da wir beim mobilen Einsatz unsers RasPi keine Internetverbindung zum beziehen der aktuellen Uhrzeit haben und ich in diesem Fall auch keine RTC-Modul für den Bezug der Zeit via Funk habe setzen wir die Uhrzeit via GPS. Dafür ist es notwendig das PPS Signal eures Moduls an den GPIO Pin Nr. 12 (GPIO18) weiterzureichen.

Sobald das PPS Signal anliegt können wir den PPS Treiber, welcher das Signal verarbeiten kann, aktivieren. Das erledigen wir via Device Tree Overlay in der Datei config.txt mit dem Editor Nano.

Fügt ans Ende folgende Zeile an und speichert mit STRG+X, Y und Enter.

Zum Testen des PPS Signals (euer PI braucht dafür eine Sichtverbindung zu mindestens zwei GPS Satelliten) installieren wir noch die PPS Tools.

Nach einem Reboot solltet ihr nach folgendem Befehl eine Ausgabe erhalten

Das ist das PPS Signal welches der Pi vom GPS Modul bekommt.

Beendet die Ausgabe mit STRG+C.

Da wir nun die Zeit vom GPS via PPS Signal am Raspberry Pi haben müssen wir noch eine Angepasste Version des Zeitdienstes NTP installieren. Falls ihr eure Zeitzone noch nicht eingestellt habt erledigt das über folgenden Befehl (vermutlich befindet ihr euch wie ich in UTC +1 Europe/Berlin).

raspi-timezone

Um an die Sourcen des NTP Dienstes zu kommen fügen wir das passende Repository zu unserer sources.list hinzu und aktualisieren die Paket Liste. Das ist notwendig da das normale NTP Paket keine PPS Zeitquellen unterstützt.

Dann holen wir uns die Build Dependencies und den Quellcode des NTP Dienstes

Der Source Code wurde in das Home des Benutzers pi abgelegt, bei mir ist das momentan ntp-4.2.6.p5+dfsg. Ich wechsle in das erstellte Quellcode Verzeichnis nach debian.

Hier finden wir eine Datei rules welche wir bearbeiten um die fehlende Funktion für PPS zu aktivieren

Wir müssen in der Datei den configure Aufruf mit –enable-ATOM ergänzen, sucht am Besten mit STRG+W nach configure und fügt am Ende des Aufrufs –enable-ATOM hinzu, die Zeile davor müsst ihr noch mit einem “ \“ergänzen. Bei mir sieht das Ergebnis wie folgt aus. Speichern mit STRG+X, Y und Enter.

Um kompilieren zu können müssen wir in der Datei changelog noch die Version von NTP um eine Nummer erhöhen. Wir verwenden wieder nano

und ändern in der Ersten Zeile 4.2.6.p5+dfsg-2 zu 4.2.6.p5+dfsg-3 und speichern mit STRG+X, Y und Enter.

Jetzt kompilieren wir den NTP Dienst mit, das dauert eine Weile (ca. 30 Minuten),  nach Abschluss des Vorgangs müssen wir nur noch das neu erstellte NTP-Paket installieren

Nun haben wir auf unserem System den NTP Dienst mit aktivierter ATOM Funktion um via PPS gelieferte Daten verarbeiten zu können.

Die Konfiguration von NTP folgt als nächstes, diese wird in einer zentralen Konfigurationsdatei vorgenommen. Ihr findet die Datei in /etc/ntp.conf, ich verwende zum Bearbeiten der Datei wieder den Editor Nano.

Wir möchten nun dem NTP Dienst sagen das zwei zusätzliche Zeitquellen vorhanden sind, zum einen die via PPS angebundene und zum anderen die Ausgabe des GPSD. Hierzu fügen wir der Konfiguration folgende Zeilen hinzu.

Die anderen eingetragen NTP Server habe ich durch voranstellen einer Raute (#) entfernt da ich im offline Betrieb GPS als Zeitquelle verwenden will und für den online betrieb die UK Pool Server

Speichert wieder mit STRG+X, Y und Enter.

Zum testen ob alles geklappt hat müsst ihr einmal den Dienst, folgender Befehl gibt uns dann die konfigurierten Zeitquellen aus.

ntp-test

Falls euer Raspberry Pi eine IP-Adresse via DHCP erhält und euer DHCP Server zusätzlich auch ein NTP-Server ist (wie meine FritzBox) müsst ihr die automatische Konfiguration via DHCP abschalten.

Innerhalb der Datei entfernt ihr hinter request folgenden Inhalt: ntp-servers

Zusätzlich lösche ich noch die folgenden Dateien um zu verhindern das noch eine alte Konfiguration angezogen wird und starte meinen Pi neu.

GPS Einrichten

Wichtig ist das wir als erstes die Serial Funktion aktivieren, öffnet hierzu raspi-config

Navigiert in die „Advanced Options“ auf „Serial“ und beantwortet die Frage „Would you like a login shell to be accessible over serial? “ mit No. Nun können wir den GPS Dienst, welcher für uns die Kommunikation mit dem Modul übernimmt, installieren

Wir konfigurieren den Dienst nun direkt, hierzu rufen wir den Konfigurationsdialog auf

  • Die erste Frage nach dem Automatischen Start bestätigen wir mit NO
  • Die zweite Frage ob USB-Geräte verwenden werden soll beantworten wir wieder mit NO
  • Die Frage nach dem GPS Device beantworten wir durch Eingabe des Geräts  /dev/ttyAMA0
  • Die Rückfrage nach den Parametern tragen wir folgendes ein -n 
  • Den gpsd control socket belassen wir so wie er vorgeschlagen wird

Zum aufzeichnen der Daten verwende ich ein Python Script welches via gpspipe die GPS Daten jede Sekunde speichert. Das ist notwendig um den GPS-Dienst und das Tracking nach start des Raspberry Pi jeweils verzögert zu starten, das vermeidet Probleme.

Die Datei bekommt folgenden Inhalt (das Script ist einfach gestaltet und hat noch keine Fehlerbehandlung).

Nach dem Speichern wird diese ausführbar gemacht.

Dann fügen wir einen Autostart für das Script hinzu.

Am Ender der Datei, vor exit 0 tragen wir folgenden Befehl ein

Nach einem Reboot wird nun mit etwas Verzögerung unter /home/pi/ eine Datei mit dem Namen gpstrack-<zeitstempel>.txt geschrieben.

GPS Daten in Google Maps anzeigen

Wir haben nun fleißig Daten gesammelt, diese liegen uns im im Roh-Format als NMEA Daten vor. Um diese zb. in Google Maps importieren und anzuzeigen müssen wir diese in das KML Format umwandeln. Das erledigt das Tool gpsbabel für uns.

Die Datei könnt ihr dann z.B. via WinSCP von eurem Raspberry Pi holen, geht eure IP-Adresse und die Logindaten ein und klickt auf Login

winscp raspberry pi

Kopiert die Datei durch Drag and Drop auf euren Rechner. Die KML Dateien könnt ihr dann zum Beispiel mit Google Earth oder in My Google Maps importieren, bearbeiten und abspeichern.

Für den KML Import für Google Maps

  1. Öffnet hierzu https://www.google.com/mymaps
  2. Ihr müsst euch ggf Anmelden, sagt dann „Neue Karte erstellen
  3. Ihr erhaltet eine Leere Karte mit einer leeren Ebene, bennent die Ebene nach euren Wünschen um
  4. Klickt dann für die Ebene auf Import und wählt die KML File von eurem Rechner
  5. Die Karte könnt ihr dann mit euren Freunden und bekannten teilen

Für den KML Import für Google Earth

  1. Die Datei kann einfach via Drag&Drop hinzugefügt werden
kml-import kmz in google earth

Bilder

Die Bilder via Raspberry Pi CAM erstellen wir wie üblich via „raspistill“, vorab müsst ihr eure Kamera allerdings via „sudo raspi-config“ mit „5 Enable Camera“ aktivieren. Zusätzlich installiere ich die Software Imagemagick welche es mir erlaubt in das aufgenommene Bild die aktuellen GPS Daten als Text zu integrieren.

Zusätzlich installieren wir das Tool „exiftool“, anhand dessen fügen wir dem aufgenommenen Bild Meta-Informationen im JPEG Header hinzu, das ganze nennt sich auch Geotagging und macht es uns später einfacher die Bilder in einem Map Anwendung dem Aufnahmeort zuzuordnen.

Ein kleine Script nimmt nun alle paar Minuten ein Bild auf, dabei werden vorher kurz die aktuellen Koordinaten, die Höhe und die Geschwindigkeit abgefragt und dann via convert als Text ins Bild geschrieben. Zusätzlich erhält das aktuelle Bild den Aufnahmeort und weitere Informationen via EXIF in den JPEG Header.

Das Script erhält folgenden Inhalt (hat noch Experimentier-Status, das werde ich bei Gelegenheit noch verbessern).

Speichert mit STRG+X, Y und Enter. Jetzt machen wir das Script noch ausführbar.

Ans Ende eurer GPS Start-Datei  für den GPS Dienst könnt ihr nun noch folgenden Befehl anhängen, dieser sorgt dafür das die Bild-Aufnahme mit gestartet wird (sudo nano /home/pi/gps-tracker.py)

Bei mir wurden auf einer Testfahrt folgende Bilder aufgezeichnet, diese müsstet ihr natürlich wieder mit WinSCP auf euren Rechner holen (wundert euch nicht das die Schrift auf dem Kopf steht, ich hatte einen Parameter der Cam falsch gesetzt).

bild_20150725_122219