Beschreibung avNav

Raspberry Pi als Bordcomputer / Navigation im Browser

26.01.2020

Ein Hinweis vorweg:

Ich kann keine Garantie für die Funktion der App übernehmen, insbesondere die Nutzung zu Navigationszwecken geschieht auf eigenes Risiko. In jedem Falle empfehle ich einen intensiven Test der Genauigkeit der Darstellung und des verwendeten Kartenmaterials.

Motivation

Nachdem ich schon eine ganze Weile mit Rasterkarten unterwegs navigiere (erst unter Windows mit Seaclear, dann unter Windows, WindowsCE und OSX mit OpenCPN und OziExplorer) hatte ich schon länger nach Möglichkeiten gesucht, das zu erweitern und noch besser tauglich für unterwegs zu machen.

Meine Wunschliste dabei war:

  • Navigation auf kleinen Geräten (Laptop ist immer ein wenig unhandlich) – 7 oder 10 Zoll Tablet wäre Ideal

  • Navigation auch im Cockpit

  • Trackaufzeichnung

  • Verknüpfung mit der „on board“ Navigation (seit einiger Zeit habe ich ein RO4800 als Funke, das auch einen AIS Decoder hat – und ja auch schon GPS Daten bekommt)

  • Nutzung der Rasterkarten (BSB, NV, alles was sich per Download über mobile atlas creator bekommen lässt...)

  • Minimaler Installationsaufwand

  • Klein, wenig Stromverbrauch (sollte möglichst immer laufen können)

  • Wenig „Bastelarbeit“ - also möglichst keine eigenen Schaltungen löten

Irgendwann habe ich mal den raspberry pi entdeckt und nachdem er zu Hause jetzt schon eine Weile als media center arbeitet, dachte ich, dass der eine gute Basis für einen Bordcomputer abgeben könnte.

Allerdings musste ich nach einiger Recherche feststellen, dass es noch keine fertige Software gab, die meinen Anforderungen genügen würde. Insbesondere die Einbettung der seriellen Schnittstellen (typisch seriell-usb-Wandler) macht immer wieder Mühe, da Linux hier immer etwas kreativ ist...

Also habe ich beschlossen mich selbst daran zu machen. Im Folgenden will ich meine Lösung beschreiben, da es ja vielleicht Interessierte gibt, die es Nachnutzen möchten. Die gesamte Software steht zum download unter einer open source Lizenz bereit.



Überblick

avnav-raspi-2020
Wie im Bild zu sehen, besteht die gesamte Lösung aus mehreren Teilen:

  • Einem Raspberry Pi mit einer server software (avnav_server.py), die die angeschlossenen Geräte (NMEA über Seriell-USB Wandler – z.B. PL 2303), Bluetooth GPS,... abfragt, die Daten aufbereitet und per WLAN zur Verfügung stellt

  • Einer Software für Windows/OSx/Linux, die zum Vorbereiten und Konvertieren der Karten dient

Über ein WLAN, das der raspberry pi als access point bereitstellt, können verschiedene Geräte auf die Daten zugreifen. Dabei gibt es mehrere Varianten:

  • Auf den Geräten (z.B. Ipad oder Laptop) kann eine Navigationssoftware laufen (getestet: InavX,OpenCPN), diese greifen über TCP auf die NMEA Daten zu. Navigationssoftware und Karten müssen natürlich auf den Geräten installiert sein.

  • Auf den Geräten läuft nur ein Browser, die Navigation erfolgt per Java Script app, die vom raspberry bereitgestellt wird. Dazu muss nur die entsprechende URL aufgerufen werden. In diesem Falle ist auf den Geräten keine Software installiert, nur ein aktueller Browser muss vorhanden sein (getestet: Chrome unter Windows, OSX, Safari, Android ab 4.x – Chrom/Stock/Boat Browser, IOS, Blackberry stockBrowser, WebBrowser mini).

Die server software auf dem raspberry ist in python geschrieben und über ein xml file konfigurierbar (was im Normalfall aber nicht notwendig sein sollte). Ich stelle neben dieser Software auch ein fertiges Image für den raspberry zur Verfügung, dass nur noch auf eine SD-Karte installiert werden muss (Empfehlung: mindestens 8GB, mehr ist besser...).

Die Web Applikation bietet eine  Navigation mit Rasterkarten inklusive AIS Darstellung, Wegepunkt Navigation und Routing. Falls die Web-Applikation verwendet werden soll, müssen die Karten dafür auch auf dem raspberry installiert werden. Diese müssen dazu vorher auf dem PC (Windows, Osx, Linux) oder direkt auf dem raspberry in das gemf Format konvertiert werden. Im Wesentlichen können die folgenden Kartenquellen verarbeitet werden:

  • Alle Kartentypen, die die GDAL software lesen kann (also insbesondere BSB Karten)

  • Mit Mobile Atlas Creator heruntergeladene Karten

Daneben gibt es noch eine Android-App, die eine weitgehend identische Funktionalität bereitstellt. Der Server-Anteil ist hier nativ in Java geschrieben, die Anzeige-Funktionen sind identisch zur raspberry Variante.

In den folgenden Abschnitten gehe ich auf die Funktion der einzelnen Teile ein wenig genauer ein.

Die Server Software (avnav_server.py)

Auf dem raspberry pi ist zunächst ein ganz normales Debian image installiert (ca. 2GB). Dazu kommen einige Zusatzpakete (liste siehe unten) und meine Software.

Der Hauptbestandteil der Sofware auf dem raspberry pi ist ein in python geschriebener Server. Im Folgenden beschreibe ich in groben Zügen, was dieser Server intern tut.



Dieser Server versucht alle am raspberry angeschlossenen seriellen Geräte zu erkennen und deren NMEA Daten zu lesen. Typisch werden die Geräte über seriell-usb Wandler angeschlossen (bei mir z.B. PL2303). Man muss ein wenig aufpassen, dass man einen Wandler hat, der vom Raspberry auch sauber unterstützt wird - siehe z.B. hier. Da das Verwalten der seriellen Schnittstellen unter Linux etwas magisch ist, scant der Server (per Dbus) die angeschlossenen Geräte auf eine entsprechende serielle Klasse und ermittelt deren Schnittstelle (device). Anschliessend versucht er ein auto bauding zwischen 4800 und 34000 Baud und bemüht sich, NMEA Daten zu erkennen. Falls keine Daten empfangen werden, wird die Schnittstelle geschlossen und das Spiel beginnt von vorn. Damit „überlebt“ er auch das Anschliessen/Abstecken von Wandlern im Betrieb oder das An- bzw. Abschalten von Geräten. Bei mir hängt ein RO4800 mit AIS Decoder dran, die GPS Daten werden durchgereicht. Alternativ versucht er auch Kontakt zu seriellen Bluetooth Geräten aufzunehmen, falls er per discovery welche findet und versucht ebenfalls NMEA Daten zu Lesen. Getestet bei mir mit einer Holux GPS Slim236. In diesem Sinne arbeitet er auch als NMEA Multiplexer.

Alle GPS-Daten werden intern in eine Liste eingefügt und per TCP bereitgestellt. Verbundene TCP Empfänger (z.B. OpenCPN) bekommen so jeden empfangenen Datensatz weitergereicht. Per Default "lauscht" der server (intern:SocketWriter) auf Port 34567.

Daneben lassen sich Daten auch per TCP, UDP oder direkt über die seriellen Schnittstellen des Raspberry lesen und schreiben.

Anschliessend werden die NMEA Daten an den Decoder weitergereicht. Die dekodierten gps und AIS Daten werden im Server abgelegt ("NMEA decoded data") für den Zugriff per HTTP aus der WebApp.Zusätzlich werden die dekodierten Daten auch benutzt um Track Dateien zu schreiben.

Über den integrierten WebServer kann der Zugriff auf diese dekodierten Daten erfolgen (per HTTP GET, Antwort als json).

Der Route-Handler wertet eingestellte Routen (bzw. Wegepunkte) aus und berechnet daraus die Daten für eine Autopilot-Steuerung. Diese werden als RMB NMEA Datensätze wieder in die NMEA Daten eingespeist und stehen so an allen Schnittstellen zur Verfügung.

Falls gültige GPS Zeitinformationen empfangen werden, wird die Systemzeit des raspberry entsprechend eingestellt.

Auf dem raspberry gibt es noch einen service, der den avnav_server beim Systemstart automatisch startet und es auch ermöglicht, ihn geordnet zu beenden.

Da der gesamte server in python geschrieben ist, kann er auch (vor allem zu Testzwecken) unter Windows oder Osx (Mac), Linux laufen. Dazu muss python ab 2.7 installiert sein, falls reale serielle Daten gelesen werden sollen noch pyserial.

Der Server kann in weiten Grenzen durch ein xml File konfiguriert werden, für die verschiedenen Nutzungsfälle liefere ich dokumentierte Beispiele mit.

In der Auslieferung für den pi ist die Software so konfiguriert, dass sie alle per USB angebundenen seriellen Schnittstellen öffnet, dort versucht NMEA Daten zu erkennen (per auto-bauding von 4800 B/s bis 38400 B/s) und diese dann verarbeitet.

Ausserdem wird (falls ein Bluetooth adapter erkannt wurde) versucht, mit allen seriellen Bluetooth Geräten Verbindung aufzunehmen und auch von dort NMEA Daten zu empfangen. Damit sollte im Normalfall keine weitere Konfiguration nötig sein und NMEA Daten sofort erkannt werden (kann man im Status display prüfen - s.u.).

Die ausgelieferte avnav_server.xml Datei enthält Kommentare, so das Anpassungen an die eigenen Bedürfnisse einfach möglich sein sollten.

Die Software ist auf github verfügbar - für die Installation siehe die separate Beschreibung.

Software auf dem raspberry

Auf dem raspberry ist die Software in der folgenden Verzeichnisstruktur installiert:

Verzeichnis

Inhalt

/usr/lib/avnav die Software nach der Installation

/home/pi/avnav/data/

Basis für die Nutzer-Daten

.../data/charts

Verzeichnis für die Kartendateien -siehe Karten konvertieren.

.../dava/log

logfiles

.../data/tracks

Die trackfiles (gpx). Sie werden in einem File pro Tag gespeichert. Ausserdem nmea logs.

.../data/routes Routen - xxx.gpx und das aktuelle Segment (Leg) currentLeg.json
.../data/import Hier abgelegte Karten werden konvertiert in das gemf Format, so das die WebApp sie verarbeiten kann

 

Bis auf die systemd scripte läuft die gesamte Software unter dem Nutzer pi (auf dem raspberry) oder als beliebiger anderer Nutzer (avnav als default). Die Installation muss allerdings als root erfolgen.

Die Web App

Zur Navigation mit den auf dem Raspberry Pi vorhandenen Karten gibt es eine Web App. Diese ist mit ReactJs realisiert.
Die App kommuniziert mit dem webserver des avnav_server.py auf dem pi. Die Einstiegsseite ist unter der url http://avnav/viewer/avnav_viewer.html erreichbar. Es is eine sogenannte „single page app“, d.h. Die weitere Kommunikation mit dem server geschieht per Ajax durch den JavaScript Anteil. Vom Layout ist sie optimiert für die Darstellung auf einem 7 Zoll (oder größer) Tablet (bei mir momentan im Einsatz: Nexus 7 am Navitisch, Blackberry Playbook draussen), sie läuft aber natürlich auch auf größeren Tablets (Ipad) oder auf einem Laptop/Desktop. Eine sinnvolle Nutzung ist ab etwa 900x540 Pixel möglich.

Zur Beschreibung der WebApp hier.