2017-06-03 1 views
-1

Ich versuche, eine Echtzeit-Autoüberwachung Anwendung mit Android zu bauen. Die Autos würden auf der Karte mit ihrer aktuellen Position erscheinen. Das Problem ist, dass die Aktualisierung der Position über das GPS langsam ist. Die vorgeschlagene Lösung besteht darin, die Interpolation zu verwenden und die fehlenden Koordinaten zu ermitteln, bis das GPS die Position aktualisiert. Alle vorgeschlagenen Lösungen, die ich gefunden habe, benötigen wir zwei GPS-Koordinatenpunkte, um zwischen ihnen zu interpolieren, aber da ich versuche, in der Echtzeit zu arbeiten, habe ich nur die anfänglichen GPS-Koordinaten, um sich zu addieren. Kann mir jemand helfen, wie ich das erreichen kann? Oder gibt es eine andere vorgeschlagene Methode, die ich verwenden könnte?Wie interpoliere ich die GPS-Messwerte in Echtzeit in Java

+0

Ich bekomme es nicht, wenn es in Echtzeit ist, können Sie viele der vorherigen Positionen gespeichert haben? Vielleicht nicht für das erste Update, aber von da an .. – cYrixmorten

+0

ja, aber ich kann nicht die nächste Position und interpolieren zwischen ihm und meiner aktuellen Position für eine reibungslose Animation auf der Karte @ cYrixmorten – prog

Antwort

1

Dazu müssen Sie die Durchschnittsgeschwindigkeit berechnen, mit der das Fahrzeug von den vorherigen zwei Positionen (Entfernung/Zeit, vorzugsweise Meter/s) ging. Daraus können Sie einen Vektor konstruieren und ihn zum aktuellsten Positionsvektor hinzufügen, indem Sie ihn jede Sekunde zwischen dem nächsten Update selbst multiplizieren. Einfache Pseudo-Code unten:

prevPos = vector 
currentPos = vector 

prevPosTime = time 
currentPosTime = time 

speed = ((currentPos - prevPos).magnitude)/(currentPosTime - prevPosTime) 

waitingtime = 0 
until currentPos change: 
    assumedLocation = currentPos + ((currentPos - prevPos).normalized * speed * waitingtime) 
    wait(1s) 
    waitingtime += 1 

Ich weiß, es unglaublich grundlegende, aber ich hoffe, Sie erhalten den Kern, wo ich mit diesem gehe.

Bearbeiten - Einfach mehr Erklärung, was ich blabbering auf über

(currentPos - prevPos).normalized dies ist die letzte bekannte Richtung des Fahrzeugs. Dies kann durch Multiplikation mit einem beliebigen Wert skaliert werden

(currentPos - prevPos).magnitude Dies ist die letzte bekannte SPEED. Wir können den normalisierten Vektor dafür nicht verwenden, weil das Normalisieren jede Skalierung "entfernt". Wir berechnen im Grunde nur, wie groß der Vektor ist und das ist unsere Geschwindigkeit.

currentPos + ((currentPos - prevPos).normalized * speed * waitingtime) Dies addiert den Vektor aus der aktuellen Position durch die Richtung multipliziert mit der Geschwindigkeit, die wiederum mit der Zeit seit der letzten Aktualisierung multipliziert wird. Sie erhalten eine Vorhersage, wo das Auto auf der vorherigen Geschwindigkeit und Fahrtrichtung basieren sollte

Vorgeschlagene Änderung: Wichtiger Hinweis, dies ist Vorhersage, keine Interpolation. Wir würden die Interpolation verwenden, wenn wir beide Werte kennen würden, aber da einer unbekannt ist, verwenden wir die Vorhersage.

+0

Ich verstehe das bisher, aber was tun Du meinst normalisiert hier '(currentPos - prevPos) .normalized' – prog

+0

Okay, also die normalisierte Version eines Vektors ist ein Vektor mit einer Magnitude von 1. Ich kann wie folgt berechnet werden (zuerst brauchen wir dann die Länge): 'length = sqrt (vector.x^2 + vector.y^2) '' normal = neuer Vektor (vector.x/length, vector.y/length) ' – Polymer

+0

Video verlinkt falls Sie eine genauere Erklärung wünschen: https: // www.youtube.com/watch?v=7fn03DIW3Ak – Polymer

0

Polymer hat eine große Antwort mit linearer Vorhersage. Es gibt jedoch einige bessere Vorhersagemethoden, wenn Sie sie benötigen.

Was ich verwenden würde, ist Double Exponential Smoothing. Dies berücksichtigt nicht nur die vorherigen Positionen, sondern auch alle anderen Positionen.

Wenn Ihr GPS auch die Genauigkeit jeder Erkennung angeben kann, können Sie einen Kalman-Filter verwenden. Kein einfacher Filter, aber ein wirklich guter Filter.

Verwandte Themen