OpenStreetMap

Ausgangslage

Unser Kenwood-Autoradio im Wohnmobil mit integrierter Navigation (Kenwood DNX450TR, Doppel-DIN-Format) hat das letzte Kartenupdate 2020 erhalten. Die Karten sind nun schon über 3 Jahre alt und zeigen häufig veraltete Geschwindigkeitsbegrenzungen, und es fehlen auch mal Umgehungsstraßen, Kreisverkehre, etc. Kurz, ein Update steht an.

Die Navigationsfunktion im Gerät ist von Garmin, welches als OEM-Partner von Kenwood die Navigationssoftware bereitstellt. Allerdings ist auf der Garmin-Webseite für OEM-Geräte das DNX450TR nicht mehr gelistet. Es gibt also anscheinend keine Kartenupdates vom Hersteller mehr.

Wir wollen auch während der Fahrt nicht vom Mobilfunknetz abhängig sein, entsprechend sind online-Navigationslösungen (Google Maps, etc) keine Alternative. Zusätzlich hat das Gerät keine gute Smartphone-Integration, daher funktioniert die Nutzung von Offline-Navigation auf dem Android-Telefon nicht zusammen mit dem DAB-Radio. Man kann zwar die Sprachausgabe des Telefons auf dem Autoradio ausgeben, hat dann aber kein Radio. Bei Ausgabe über den Telefonlautsprecher regelt natürlich das Radio nicht ab. Also auch keine zufriedenstellende Lösung.

Das teure Radio entsorgen (~ 1000€ Neupreis, wegen des LKW-Modus in der Navigationssoftware (TR = “truck” im Modellnamen)) und durch z.B. ein Gerät auf Android-Basis ersetzen ist ebenfalls nicht zufriedenstellend.

OpenStreetMap für das Kenwood/Garmin Navi?

Es gibt einige Anbieter von Garmin-kompatiblen Kartensätzen, die Liste aus dem OSM Wiki ist gut gefüllt: https://wiki.openstreetmap.org/wiki/OSM_Map_On_Garmin/Download

Aber

Die meisten der gelisteten Quellen sind optimiert für Hiking, MBT, Ski, Radfahren, Wandern, etc. Rendering ist optimiert für Garmin Handhelds mit Displays, die nur 16/64 Farben darstellen können, etc… Manche haben keine Indexsuche, entsprechend keine Adresseingabe, die aber für eine Autonavigation zwingend funktionieren muss. Die meisten angebotenen Karten haben schlicht einen eher inkompatiblen Hauptfokus.

Die Jagd nach einem geeigneten Kartensatz

Anforderungen sind

  1. Muss überhaupt mit dem Kenwood-Radio funktionieren. Es war zu Beginn nicht klar, ob die Garmin-Software nur von Kenwood signierte/verschlüsselte Kartendaten lesen kann, oder ob sie mit beliebigen Karten im Garmin-Format funktioniert.
  2. Navigierbar, Beachtung von Gewichts-/Breiten-/Höhenbeschränkungen
  3. Funktionierende Adresssuche
  4. Kein Hochkontrast-Stil für Displays mit 160x320x4bit. Diese sehen auf dem Radiobildschirm extrem überladen und unübersichtlich aus.
  5. Keine Höhenlinien. Die überfrachten die Anzeige der eh schon dichten Karten weiter
  6. Nach Möglichkeit keine Anzeige von Dingen, die für die PKW/LKW-Navigation unwichtig sind. Keine Anzeige von individuellen Bäumen, die in manchen Innenstädten erfasst sind. Keine Fuß- und Radwege, Treppen. Anzeige diverser landuse-Tags ist auch nicht unbedingt nötig.
  7. Übersichtliche Anzeige von Autobahnen und Bundesstraßen auf niedrigen Zoomstufen

Der beste Treffer bislang sind die Karten von freizeitkarte-osm.de. Das Rendering ist angenehm dezent, im Stile des offiziellen OSM Tileset. Keine Gebäudeumrisse in knalligem Signalrot, Felder in Grellgelb, etc. Spoiler: Es ist allerdings schon fast zu dezent. Insbesondere im niedrigen Zoombereich werden von der Navigationssoftware keine Straßen angezeigt. Somit kann man bei der Routenübersicht nach Adresseingabe nicht sinnvoll aus den vom Navi generierten Alternativrouten wählen. Man sieht schlicht die Straßen nicht.

OSM-Karten auf das Navi übertragen

Ein erster Versuch, die Navi eine aus OSM-Daten erstellte Karte laden zu lassen schlug fehl. Einfach die Karten als Datei /Garmin/gmapsupp.img auf der SD-Karte abzulegen führte nicht zum Erfolg.

Ein zweiter Ansatz führte zum gewünschten Ergebnis: Die Micro-SD vom Gerät initialisieren lassen (In der Navigationssoftware das Kartenupdate im Einstellungsmenü auswählen), und dann mittels der Software Garmin Express mit der OEM-Karte befüllen lassen. Danach die von Garmin-Express erstellte Kartendatei /Garmin/gmapsupp.img durch eine OSM-Karte ersetzen. Die Navigationsoftware lud die OSM-Karte anstatt der Originalkarte.

Ein erster Erfolg. Das Gerät ist in der Lage, mit offenen Tools erstellte Garmin-Karten zu laden und zu verwenden. Es gibt keine Signaturprüfung, die nur vom OEM zugelassene Karten erlaubt.

Analyse der OEM-Karte

Die OEM-Karte (Im Gerät unter “myMaps” angezeigt als “OEM CN Europe NTU 2020 ALL North” und “OEM CN Europe NTU 2020 ALL South”) liegt in 2 Teilen vor, Nordeuropa unter /Garmin/gmapsupp.img, und Südeuropa unter /Garmin/Map/gmapsupp.img. Diese Zuordnung wurde mit Hilfe des gimginfo-Tools gefunden, welche die genannten Namen in den Dateiheadern gefunden hat.

Garmin-Express legt zusätzlich noch eine Reihe anderer Dateien ab, wie z.B. die Spurassistenz-Bilder. All diese Informationen werden in der XML-Datei /Garmin/GarminDevice.xml abgelegt:

Hier ein Auszug. Interessanterweise wird Nordeuropa als Typ “PreProgrammedMaps” registriert, Südeuropa weiter unten in der Datei als “SupplementalMaps”. Außerdem spezifiziert die Datei 2 Dateien des Typs “PreProgrammedMaps”: “gmapsupp”, und “gmapsup1”, allerdings schreibt Garmin Express nur gmapsupp.img.

  <MassStorageMode>
    <DataType>
      <Name>PreProgrammedMaps</Name>
      <File>
        <Specification>
          <Identifier>IMG</Identifier>
        </Specification>
        <Location>
          <Path>Garmin</Path>
          <BaseName>gmapsupp</BaseName>
          <FileExtension>img</FileExtension>
          <Extensions>
            <dtlx:DataTypeLocationExtension>
              <dtlx:ExternalPath>Garmin/</dtlx:ExternalPath>
            </dtlx:DataTypeLocationExtension>
          </Extensions>
        </Location>
        <TransferDirection>InputOutput</TransferDirection>
      </File>
    </DataType>

Diese XML-Datei ist recht gut lesbar und erweiterbar. Man kann im DataType PreProgrammedMaps weitere Dateien hinzufügen, indem man einfach weitere <File>-Blöcke hinzufügt.

Weitere Karten beziehen und registrieren

Ich habe mir Karten für 14 Länder in Mittel- und Westeuropa in der Version vom Dezember 2023 von freizeitkarte-osm.de geladen, und diese in 4 Pakete nahe 4GiB (dem FAT32-Dateigrößenlimit) gepackt.

Zur Berechnung der Packung in möglichst wenige Dateien unter 4GiB diente das Python-Paket binpacking. Das eigentliche Kombinieren der Einzelkarten anhand der berechneten Packung übernahm dann die CLI-Version von GMapTool

Damit ergaben sich 4 Dateien, benannt gmapsup1.img, gmapsup2.img, gmapsup3.img, und gmapsup4.img.

Diese in der /Garmin/GarminDevice.xml, in der Sektion PreProgrammedMaps abgelegt und auf die Micro-SD kopiert. Ausschnitt:

      <File>
        <Specification>
          <Identifier>IMG</Identifier>
        </Specification>
        <Location>
          <Path>Garmin</Path>
          <BaseName>gmapsup2</BaseName>
          <FileExtension>img</FileExtension>
          <Extensions>
            <dtlx:DataTypeLocationExtension>
              <dtlx:ExternalPath>Garmin/</dtlx:ExternalPath>
            </dtlx:DataTypeLocationExtension>
          </Extensions>
        </Location>
        <TransferDirection>InputOutput</TransferDirection>
      </File>
      <File>
        <Specification>
          <Identifier>IMG</Identifier>
        </Specification>
        <Location>
          <Path>Garmin</Path>
          <BaseName>gmapsup3</BaseName>
          <FileExtension>img</FileExtension>
          <Extensions>
            <dtlx:DataTypeLocationExtension>
              <dtlx:ExternalPath>Garmin/</dtlx:ExternalPath>
            </dtlx:DataTypeLocationExtension>
          </Extensions>
        </Location>
        <TransferDirection>InputOutput</TransferDirection>
      </File>

Karte einsetzen

Nach dem Ablegen der Kartendateien auf der Micro-SD, und erweitern der GarminDevice.xml um die 4 neuen Kartendateien werden die OSM-Karten nach dem Einsetzen der Micro-SD vom Navigationssystem erkannt und benutzt. Man kann nun im Menü myMaps zwischen der Originalkarte und den OpenStreetMap-Karten wechseln.

Kartenauswahl

Das Resultat soweit

Kartendarstellung auf regulären Zoom-Stufen soweit akzeptabel. Könnte klarer sein, aber erst einmal nicht schlecht:
Kartendarstellung

Auf Übersichtskarten gibt es keine Übersicht:
Es sollte ein Straßennetz erkennbar sein

Ausblick/Nötige Verbesserungen

Das Standard-Rendering der Freizeitkarte-Karten ist nicht für reine Autonavigation optimiert. Es besteht Verbesserungsbedarf:

  • Auf niedrigen Zoomstufen werden keine Straßen angezeigt. Man kann sich also am Bildschirm keine visuelle Übersicht über das Autobahn-/Bundesstraßennetz verschaffen.
  • Auf hohen Zoomstufen werden unnötige Details angezeigt, wie z.B. Rad- und Fußwege

Als nächsten Schritt dann herausfinden, wie man den Stil anpassen kann. Der Stil soll wohl in TYP-Dateien festgelegt sein. Also schauen, wie man den Stil aus den Karten extrahiert, anpasst, und einfügt.

Discussion

Comment from giggls on 30 December 2023 at 11:30

Der fehlende Nachtmodus ist das was mir als Radfahrer bei der Freizeitkarte fehlt und mein Versuch die Nachtfarben für den Stil automatisch zu berechnen war nicht so sehr erfolgreich.

Quellcode für die Freizeitkarte ist hier: https://github.com/freizeitkarte/fzk-mde-garmin

Falls Du in die Kartenentwicklung einsteigen möchtest QMapShack kann die fertig berechneten Karten darstellen.

Abschalten von nicht benötigten Details ist relativ einfach. Das .TYP file ist aber die falsche Stelle. Dort wird spezifiziert welcher Straßentyp wie aussehen soll.

Gruss

Sven

Comment from luziferius on 30 December 2023 at 14:21

Danke für die Hinweise. QMapShack ist in den Ubuntu-Repositories, wird jetzt direkt installiert. Das ist definitiv besser, als für jeden Versuch die Daten auf die Micro-SD zu kopieren, und zu hoffen, dass es klappt.

Für generelle Navigation, Radtouren, etc. nutze ich OSMAnd, das hat einen funktionierenden Nachtmodus.

Für das automatische berechnen der Nachtfarben ist es vermutlich sinnvoll, die RGB-Werte in den HSV-Farbraum umzurechnen. Darauf kann man Farben farbechter auf der Hell/Dunkel-Skala bewegen. Ich kann mir Vorstellen, dass ein Invertieren des Helligkeitskanals relativ gute Ergebnisse erzielt.

Mein erster Ansatz mit den FZK-Karten war, die bereits ins Garmin-Format konvertierten Karten zu nehmen, die Linienbreite von nicht benötigten Wegtypen auf 0 Pixel zu setzen, und eventuell Autobahnen/Schnellstraßen etwas kontrastreicher zu gestalten. Das ist auch etwas, was ich auf meinem Laptop unterwegs gut machen kann. Meine bisherigen Erfahrungen mit dem Konvertieren von OSM-Karten war, dass der Vorgang relativ viel RAM benötigt. Daran werde ich mich machen, wenn ich wieder Zugriff auf meine Workstation habe.

Den Link zum Github-Repo habe ich tatsächlich auf der Seite nicht gefunden. Ganz unten auf der “Entwicklung”-Seite ist ein link zum Download des automatisch generierten ZIP-Archivs des git HEAD commits. Hab ich wohl übersehen.

Es ist vermutlich das beste, das Repo zu klonen, den Stil kopieren, und neue Karten aus dem angepassten Stil zu erstellen. Das dürfte dann vermutlich auch die Dateigröße reduzieren, wenn ungewünschte Typen gar nicht erst ins Kartenmaterial aufgenommen werden. Wenn das zu einem guten Ergebnis führt, kann ich das als PR beitragen.

Für den Einsatz im Wohnmobil ist auch ein anderer POI-Satz wichtig. Dinge wie Ver-/Entsorgungsstationen, 230V-Stromsäulen, Stellplätze mit Übernachtungsmöglichkeit, etc. Wäre von Vorteil, wenn solche Punkte auf der Karte prominent dargestellt werden.

Grüße, Thomas

Comment from giggls on 30 December 2023 at 14:39

Falls das Teil Dateien im Garmin POI Format verarbeitet hilft dir eventuell auch mein Garmin POI Overlay aus den Daten der OpenCampingMap

https://github.com/giggls/ocm4garmin

Leider habe ich es noch nicht geschafft ein Overlay für Osmand aus den Daten der OpenCampingMap zu erzeugen. Das ist zwar alles auch nur OSM was ich in der OpenCampingMap darstelle aber halt aufbereitet.

Was ich für den Nachtmodus probiert habe ist die RGB-Werte in HLS umzurechnen, L zu invertieren und dann nach RGB zurück.

Das gab im wesentlichen eine viel zu dunkle Karte.

Gruss

Sven

Comment from luziferius on 30 December 2023 at 15:11

Ich werde mir die Tools mal anschauen :)

HLS und HSV sind sehr ähnlich zueinander, so wie auch HSB und HSI, die sich nur in der Definition der Helligkeit unterscheiden. Hast du einen positiven Offset und/oder lineare Skalierung nach der Invertierung probiert? Sowas wie L_nacht = (255-L_tag)*1.1+10 oder (255-L_tag+10)*1.1.Dabei mit den Parametern (10 und 1.1) experimentieren, bis das Resultat eine angenehme Helligkeit hat. Eventuell passt auch ein Skalierungsfaktor unter 1 (0.7-0.9), zusammen mit einem größeren positiven Offset. Das macht dann die Karte insgesamt heller, reduziert aber den Dynamikraum, damit helle Linien nicht ganz so gleißend hell weiß sind.

Comment from giggls on 30 December 2023 at 15:17

Der Python code sieht so aus:

hls = colorsys.rgb_to_hls(rf,gf,bf) rgb = colorsys.hls_to_rgb(hls[0],1-hls[1],hls[2])

Das ist halt so halbautomatisch gewesen was ich da gebaut habe.

Comment from luziferius on 30 December 2023 at 15:34

Versuch mal sowas wie

hls = colorsys.rgb_to_hls(rf,gf,bf)
l = max(0.7-hls[1], 1)  # Entweder das: Offset 0,3 auf alle Helligkeitswerte
rgb = colorsys.hls_to_rgb(hls[0],l,hls[2])
hls = colorsys.rgb_to_hls(rf,gf,bf)
l = max((1-hls[1])*1.3, 1)  # Oder das: Alle Helligkeitswerte mit 1.3 skalieren
rgb = colorsys.hls_to_rgb(hls[0],l,hls[2])
hls = colorsys.rgb_to_hls(rf,gf,bf)
# Oder das: Dynamikreduktion ins Interval [0, 0.6], danach 0.3 auf alle Werte,
# resultiert in Wertebereich [0.3, 0.9]
l = (1-hls[1])*0.7+0.3
rgb = colorsys.hls_to_rgb(hls[0],l,hls[2])

Und dann ein wenig mit den Parametern experimentieren. Da sollte sich eine Lösung finden.

Comment from luziferius on 30 December 2023 at 15:36

Meinte min(), anstatt max() und Kommentare kann man wohl nicht bearbeiten. Ups.

Log in to leave a comment