GPS-Navi mit Track_Back Funktion

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kussji
User
Beiträge: 78
Registriert: Mittwoch 16. Mai 2018, 09:58

Hallo
Ich möchte eine Art Navi machen, mit "Track-Back-Funktion".
Also ich habe eine aufgezeichnete Route mit Wegpunkten [latitude, longitde, height] diese würde ich in aus einer CSV-Datei einlesen.

Das erste Ziel wäre mal den nächstgelegenen Wegpunkt (kürzeste Distanz) in der CSV zum meiner aktuellen GPS-Position zu finden. Als Rückgabe lat/lon/height.

Mir fällt da gerade nicht viel effizientes ein. Vermutlich weil ich nicht die vielen Möglichkeiten kenne und Erfahrung fehlt.
Ich würde jetzt wohl zig Zeilen Code schreiben um das zu lösen. Aber ich bin überzeugt, dass mit dem richtigen Ansatz/ richtigen Funktionen nur wenige Zeilen notwendig sind.

Ideen? Tipps?
Danke euch schon mal.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Entweder Du programmierst Dir selbst eine Funktion, zum Beispiel mit der Haversine-Formel, oder Du verwendest eine Bibliothek wie `geopy` oder `pyproj`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
kussji
User
Beiträge: 78
Registriert: Mittwoch 16. Mai 2018, 09:58

Hallo
Haversine-Formel, oder Du verwendest eine Bibliothek wie `geopy` oder `pyproj`
Kannte ich nicht. Habe mal die Doku's davon überflogen, sieht nett aus - finde ich sicher was. Das ist aber der Schritt 2.
Schritt 1 ist noch unklar.
CSV ist neu für mich. Kann ich direkt in den Row's den kleinsten lat-Wert / lon-Wert zu meinem aktuellen GPS-Wert suchen (mit for-Schleifen ?). Oder packe ich die CSV besser in eine bestimmte Datenstruktur (Array / Mehrdimensional / oder???). Um damit eleganter meine kleinste Abweichung Soll/Ist zu finden.
(Es können einige Tausend Wegpunkte sein. Jede Sekunde mit for-Schleifen den kleinsten Wert suchen? Hhm - ist das der richtige Weg?)

Code: Alles auswählen

import csv

filename = R'C:\Python36\projects\gnss_navi\test.csv'

with open(filename, newline='') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        print(row['lat'], row['lon'], row['height'])
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kussji: Naja, das hängt schon ein bisschen von Schritt 2 ab, denn Du müsstest ja schauen wie die Daten weiterverarbeitet werden sollen um zu entscheiden welche Strukturierung dafür geeignet ist. Die Funktionen in `geopy.distance` wollen zum Beispiel Werte die an `geopy.point.Point` verfüttert werden können. Die CSV-Daten in eine Liste aus Tupeln mit Lat/Lon-Werten zu wandeln wäre beispielsweise. Drei Elemente, also + Höhe ist auch okay.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

hab sowas mal für eine art driver log geschustert. später konnte man auf goigle maps seine route anschauen. ich glaub import datei war eine *.kml
empty Sig
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Um die Suche effizienter zu gestalten nutzt man üblicherweise spezielle Datenstrukturen wie zb Quad trees, um nicht vor zu vielen Daten zu kollabieren.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@kussji: die Suche zum nähstgelegenen Punkt muss du doch nur genau 1x machen, nämlich am Anfang? Wenn du den nächstegelegenen Punkt hast gehst du dort hin und ab dann muss die Punkte im Track doch nur in umgekehrter Reihenfolgen ablaufen.

Gruß, noisefloor
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

@noisefloor: hmjanein. Klar kann man probieren durch lokale Suche um den letzten gewählten Punkt herum das Problem zu optimieren. Das ist aber nur eine Heurisktik! Stell dir vor du läufts einen großen Kreis, bei dem Start und Endpunkt logischerweise nah beieinander liegen, aber im Array weit voneinander entfernt. Je nachdem welchen du da zu Beginn aussuchst, geht die local search Nummer ziemlich in die Hose. Das sind natürlich Randfälle, aber die gilt es eben zu beachten.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@_deets__ : na ja, man nutzt ja eigentlich ein GPS, damit man nicht im Kreis läuft, sondern zielgerichtet zum Ziel ;-)

Ich war halt von der Back-Track Funktionen meines Garmin GPSr ausgegangen. Da wird der Track einfach rückwärts durchlaufen, ohne jegliche Optimierung.

Aber vielleicht möchte der TE ja mal näher ausführen, was er unter der "Track_Back Funktion" genau versteht bzw. implementieren möchte.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wenn man wirklich den naheliegendsten Punkt haben möchte, im Sinne von am schnellsten erreichbar, dann braucht man ja eigentlich mehr als die GPS-Koordinaten und den Abstand per Luftlinie. Das ein Punkt nahe dran ist, heisst ja nicht, dass man den auch leicht/schnell erreichen kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
kussji
User
Beiträge: 78
Registriert: Mittwoch 16. Mai 2018, 09:58

Hallo zusammen
Komisch meine Benachrichtigungen sind untergegangen und hab gerade bemerkt, dass hier noch der eine oder andere Kommentar gepostet wurde.

Also noch etwas zusammengefasst: Ich brauche in der Tat nicht eine vollständige Track-Back-Funktion wie Navis das tun. Gibt es ja - muss ich nicht neu erfinden. Ein mögliches Beispiel für mich: Ich kenne in etwa den Verlauf einer erdverlegten Wasserleitung. Nun will diese später mal finden, also ich will diese ablaufen und dabei soll meine App sagen "ob ihr wirklich richtig steht, seht ihr wenn das Licht angeht" ob ich richtig bin oder weiter links oder weiter rechts muss mit Distanzangaben. Da ich RTK-GNSS nutze ist die Genauigkeit recht gut.

In Zwischen bin ich ein rechtes Stück vorangekommen und bin glaube auf gutem Weg. Ich mache es in der Tat so, dass ich nur einmal den nächsten Punkt suche, danach bewege ich mich je nach dem vorwärts oder rückwärt in der Liste. ev. zwischendurch mal prüfen, ob ich (absolut) wirklich noch richtig bin. Ich nehme immer die beiden nächstgelegenen Wegpunkte "ziehe" eine Gerade dadurch und rechne mit ein bisschen Geometrie (lotrecht) und Logik meine Abweichung Soll/Ist.

Mit wenig Wegpunkten läuft das problemlos. Sollte ich mit grossen Dateien Probleme bekommen wäre dann ev. die genannten "QuadTrees" eine Option die ich mir anschauen werde.

Ich arbeite mit geopy um Distanzen zu berechnen.

Im Moment ist für mich alles klar. Danke euch für die Gedanken und Inputs.

Grüsse
kussji
Antworten