Positionen von GPS-Satelliten in 3D
- Written by: Nancy Nancy Wiedemann
- Category: Uncategorized
- Published: April 16, 2022
ArcGIS Runtime
Mit der Einführung der NMEA-Unterstützung in ArcGIS Runtime 100.10 eröffnen sich viele Möglichkeiten. Diese hochgenauen GNSS-Empfänger liefern über NMEA-Sätze nicht nur hochgenaue Positionsdaten, sondern auch eine Fülle von Zusatzinformationen wie Genauigkeit, Kurs und GPS-Satelliten in Sicht.
Viele Handheld-GPS-Empfänger unterstützen mehr oder weniger die Anzeige der Satelliteninformationen. Bei einigen Geräten werden sie als eine Reihe von Signalbalken angezeigt; bei anderen Geräten werden zwei konzentrische Kreise verwendet, um die Erde und die Umlaufbahn darzustellen, und die Satelliten werden in diese Grafik eingezeichnet. Diese Grafiken sind in Ordnung, aber weder intuitiv noch informativ.
Die Positionen der Satelliten werden durch Elevations- und Azimutwinkel in `$GPGSV`-Sätzen in den NMEA-Spezifikationen dargestellt. Was sind das für Sätze? Kurz gesagt, der Azimut sagt uns, in welche Richtung wir schauen müssen, und die Elevation sagt uns, wie hoch wir in den Himmel schauen müssen. Stellen Sie sich eine Person vor, die auf dem Boden steht und sowohl einen GPS-Empfänger als auch einen Kompass in der Hand hält. Wenn man sich von Norden her umdreht und den Kopf hebt, kann man mit diesen beiden Winkeln die ungefähre Richtung des Satelliten am Himmel anvisieren. Wenn es jedoch um Kartensoftware geht, werden die Dinge ein wenig kniffliger.
Wie kann man Azimut und Elevation auf einer Karte oder einem 3D-Globus darstellen? Nun, wir kennen den aktuellen Standort des Geräts oder die Breiten- und Längenkoordinaten auf der Erdoberfläche. Wir wissen auch, wohin wir mit den 2 Winkeln blicken sollen. Das Problem ist, dass der räumliche Bezug der Karte irgendwie in 2D dargestellt wird. Da die Erde ein Globus ist, berücksichtigen wir normalerweise nicht den Radius der Erde, der immer 6371 km beträgt. Um unsere Lat-Lon-Koordinaten in den 3D-Raum umzuwandeln, müssen wir einige Trigonometrien durchführen.
Sammeln von Informationen
Zunächst habe ich versucht, im Internet nach einem Algorithmus zu suchen, der Azimuth-Höhen-Koordinaten in die allgemein üblichen Lat-Lon-Koordinaten umrechnet. Zu meiner Überraschung hatte ich keinen Erfolg. Die APIs der `GeometryEngine` in ArcGIS Runtime bieten zwar eine Reihe nützlicher Methoden zur geodätischen Berechnung, aber sie sind auf die Erdoberfläche beschränkt. Es scheint, dass ich die Trigonometrie selbst entwickeln muss.
Analysieren Sie das Problem
Der erste Gedanke, der mir in den Sinn kam, war, alle Koordinaten in ein kartesisches 3D-Koordinatensystem umzuwandeln. Das Problem ist, dass es sehr schwierig und fehleranfällig ist, alle Winkel korrekt in xyz darzustellen. Die Konvertierung von Breiten- und Längengraden ist nicht allzu schwierig – es sind nur ein paar rechtwinklige Umwandlungen in Polarkoordinaten erforderlich. Aber was ist mit dem Azimutwinkel – wie kann man ihn kartesisch darstellen? Das brachte mich dazu, über Vektoroperationen und Matrizen nachzudenken.
Tatsächlich lässt sich das Problem kurz und bündig in einem sphärischen Koordinatensystem darstellen. Die resultierenden Koordinaten des Satelliten sind die Summe von zwei Vektoren: der eine vom Erdmittelpunkt zum aktuellen Standort, der andere vom aktuellen Standort zum Satelliten in seiner Umlaufbahn, dargestellt durch Azimut- und Höhenwinkel.
Die räumlichen Beziehungen dieser Vektoren lassen sich in den Kugelkoordinaten allerdings nur schwer darstellen. Nachdem ich einige Tangentialebenen auf Papier gezeichnet hatte, beschloss ich, das Ganze in 3D zu zeichnen, um es klarer zu machen.
3D-Geometrie, Matrix und Rotationen
An diesem Punkt fand ich ein GitHub-Repositorium, das hilfreichen Code von Michael Fogleman, einem Ingenieur bei Formlabs, enthält. Obwohl seine Berechnung nicht korrekt war, wies mir der Code im Repo den Weg in die richtige Richtung. (Außerdem waren die Grafiken auf seiner persönlichen Webseite ziemlich schick!) Das hat mich davon überzeugt, dass die Berechnung korrekt durchgeführt werden kann und dass ich mit den Möglichkeiten von ArcGIS Runtime einige wirklich schöne Dinge erstellen kann.
Zwei weitere wichtige Entdeckungen machten diese Berechnung machbar.
Erstens: SIMD-Anweisungen
In Michaels Implementierung führt er die Matrixmultiplikation in Python von Hand aus. Auch wenn es möglich ist, dies in Swift nachzubilden, ist es doch ziemlich mühsam, einen ganzen Haufen mühsamer Mathematik in eine so elegante Anwendung zu integrieren. Glücklicherweise hat Swift eine praktische `simd`-Bibliothek. Sie unterstützt bis zu 4×4 Elemente in einer Matrix, was perfekt für unseren nächsten Zweck geeignet ist: Quaternionen.
Zweitens: Qua
ternionen
Ehrlich gesagt, habe ich noch nie von diesem Begriff auf Englisch gehört, und obwohl ich zuerst an eine Matrix dachte, wusste ich nicht, wo ich anfangen sollte. Als ich seine Wiki-Seite sah, erinnerte ich mich an meinen Physikunterricht. Es ist eine gängige Praxis, die Drehung eines Vektors durch eine Matrix darzustellen, und genau so heißt es auch im Englischen!
Die Lat-Lon-Koordinaten können effektiv durch Quate
rnionen dargestellt werden. Betrachten wir einen Einheitsvektor der Erde, mit einem Anfangspunkt im Erdmittelpunkt und einem Endpunkt bei 0° Ost. Dreht man diesen Vektor entlang des y-Vektors um den Breitengrad und des z-Vektors um den Längengrad, so erhält man den Punkt an der Breitengradposition. Mehr dazu erfahren Sie im folgenden Abschnitt.