German GPS_LocationChanged

D

Deleted member 103

Guest
Hallo Jungs,

kann mir jemanden sagen warum, obwol sich mein Handy nicht bewegt, die Variable locDistance ein Wert von mehr als 0 (null) bekommt?
Oder ist es normal, und ich muss erst wenn es größer z.B. als 1 zu meine Variable TotalDistance dazu addieren?

B4X:
Sub GPS1_LocationChanged (Location1 As Location)
   Dim locDistance As Double

   If Location1.SpeedValid Then
      If Location1.speed > 0 AND tbtnStart.Checked Then
      
         If GPSPathPreviuous.speed > 0 Then
            locDistance = GPSPathPreviuous.DistanceTo(Location1)

            TotalDistance= TotalDistance + locDistance / 1000
         End If
   
         GPSPathPreviuous = Location1
      End If
   End If

   If Location1.Time > 0 Then
      lngTimer=DateTime.Now - Location1.Time
   End If

End Sub

Ciao,
Filippo
 

BlueVision

Active Member
Licensed User
Longtime User
Nun, da stößt Du an die Grenzen von GPS. Prinzipiell ist GPS eine immense Rechenarbeit für "alle Beteiligten".
Der Fehler liegt in der grundsätzlichen Funktionsweise von GPS begründet. GPS bedeutet nichts anderes als den Versuch, ein Koordinatensystem auf einem Rotationsellipsoid (unseren Planeten) mittels Funksignalen darzustellen. Je mehr Satelliten zur Ermittlung Deiner Position benutzt werden, umso genauer wird die Sache. Die Satelliten bewegen sich auf nicht-geostationären Bahnen um die Erde, d.h. wenn man sie sehen könnte, würde diese sich bewegen. Die Satelliten müssen sowohl untereinander als auch mit den Bodenstationen synchronisiert werden, was die gemeinsam verwendete Zeitbasis für das System angeht. Selbstverständlich gibt es dabei Toleranzen, die allerdings sehr gering sind. Nun breiten sich aber auch Funkwellen nicht mit unendlicher Geschwindigkeit aus, sondern mit Lichtgeschwindigkeit. Dies ist der Grund für Deine Abweichungen, die allerdings minimal sein sollten. Es sind zu 99% immer Laufzeitverzögerungen der Satellitensignale, die Deine GPS-Position "wackeln" lassen.

Zu kompliziert?
Ok, einfacher. Stell Dir vor, Du empfängst die Signale eines der Satelliten über eine Reflexion hier auf der Erde, lass es zum Beispiel eine Häuserwand sein oder ein vorbeifahrender großer LKW. Das Signal des Satelliten kommt in diesem Fall nicht direkt in Deinem Handy an, sondern über einen Umweg. Und Umweg bedeutet immer Laufzeitverzögerung und damit Ungenauigkeit. In Gebirgen ist das manchmal ziemlich vertrackt, es sei denn man steht auf einem Berggipfel. Schon diese kleine Laufzeitverzögerung eines Signals beeinflußt die Genauigkeit Deiner errechneten Position.

Diese Ungenauigkeiten, so gering sie sein mögen, bewirken die Abweichungen vom Ideal. Dazu kommen dann auch noch Sachen wie die Umgebungstemperatur Deiner Hardware und die Qualität des in Deinem Gerät verbauten GPS-Chips und seiner Zeitbasis. Alles hat seine Grenzen. Die zappelnde Anzeige auf Deinem Gerät beruhigst Du am Besten softwaremäßig, in dem Du diese naturgegebene Streuung einfach anders intrerpretierst in Deinem Programm. Deshalb ist es ja nicht gleich ungenauer.

Gruß aus Berlin
BV
 

BlueVision

Active Member
Licensed User
Longtime User
Ach noch was...

1. interessant wäre, wie oft Du diesen Code ausführst. Ich nehme an das ist eine ziemlich hektische Routine? Lass die Routine einfach seltener laufen...

2. wie weit bewegt sich denn Dein Handy im Ruhezustand?

Versuche darüber in Deinem Code die zappelnde Anzeige in den Griff zu bekommen. Prinzipiell nehme ich an, dass sich Dein Handy wahrscheinlich immer wieder ein paar Zentimeter bis zu ein paar Meter vom eigentlichen Ort bewegt, je nach Umgebung (Reflexionen). Sind große sich bewegende Objekte in der Nähe, wird es schwer werden...
 
D

Deleted member 103

Guest
Hallo BlueVision,

vielen Dank für deine Ausführliche Erklärung, aber es wäre nicht nötig gewesen den mir ist sehr klar was GPS bedeutet.

Ich denke das Problem mit der zappelnde Anzeige lag mehr an die Variable "Dim locDistance As Double". Ich habe es jetzt als "Float" definiert und die Anzeige zappelt nicht mehr.

Die Funktion "GPSPathPreviuous.DistanceTo(Location1)" gibt ein Float-Wert und nicht eine Double-Wert zurück.


Ciao,
Filippo
 
Top