Beschreibung avNav

Navigation im Browser

Raspberry Pi als Bordcomputer

Für einen schnellen Einstieg: Quickstart

15.12.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 dann 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 bestimmt 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 greift ü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 eine XML Datei 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, das nur noch auf eine SD-Karte installiert werden muss (Empfehlung: mindestens 8GB, mehr ist besser...).

Die Web Applikation bietet eine  Navigation mit Rasterkarten (gemf,mbtiles)  oder OESenc Vektorkarten inklusive AIS-Darstellung, Wegpunkt-Navigation und Routing. Falls die Web-Applikation verwendet werden soll, müssen die Karten dafür auch auf dem Raspberry installiert werden.

OESenc Karten können im Shop von o-charts erworben werden.

Karten, die die Software nicht direkt verarbeiten kann (siehe Karten), müssen vorher auf dem PC (Windows, Osx, Linux) oder direkt auf dem raspberry (innerhalb der App) 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 AvNav-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 (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, scannt der Server 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“ der Server auch das Anschliessen/Abstecken von Wandlern während des Betriebes oder das An- bzw. Abschalten von Geräten. Bei mir hängt ein RO4800 mit AIS Decoder an einem Seriell-USB Wandler, die GPS Daten werden durchgereicht. Alternativ versucht AvNav auch Kontakt zu seriellen Bluetooth-Geräten aufzunehmen. Falls er per "discovery" welche findet, versucht er von diesen ebenfalls NMEA Daten zu lesen. Das wurde z.B. mit einer Holux GPS Slim236 getestet. In diesem Sinne arbeitet der AvNav-Server 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") und für den Zugriff per HTTP aus der WebApp bereitgestellt. Zusätzlich werden die dekodierten Daten auch benutzt, um Trackdateien 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. Wegpunkte) aus und berechnet daraus die Daten für eine Autopilot-Steuerung. Diese werden als RMB NMEA Datensätze wieder in die internen 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, Osx (Mac) oder Linux laufen. Dazu muss Python ab 2.7 installiert sein, falls reale serielle Daten gelesen werden sollen, muss dazu noch pyserial installiert werden.

Der Server kann in weiten Grenzen durch eine XML Datei konfiguriert werden, für die verschiedenen Nutzungsfälle liegen dokumentierte Beispiele vor.

Die ausgelieferte avnav_server.xml Datei enthält Kommentare, so dass 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.

.../data/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 in AvNav integrierten Webserver auf dem Pi. Die Einstiegsseite ist unter der url http://avnav.avnav.de/viewer/avnav_viewer.html erreichbar. Es ist 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.