LEO-Navigationsnachricht
Der Szenariotyp leo-navmsg baut die Rundsende-Nachricht aus Ephemeride und Uhr eines Satelliten für Positionierung, Navigation und Zeitgebung (PNT) im niedrigen Erdorbit (LEO) und beantwortet die Fragen, die sich ein Nachrichtenentwickler stellt: Wie lange kann eine Nachricht gelten, was bringt jeder zusätzliche Parameter, was sieht ein Nutzer, wenn sich die Nachricht mitten in einem Überflug ändert, und wie viele Bit braucht es, um sie auf den Zentimeter genau zu übertragen.
Er ist systemunabhängig. Jede Bahn, jeder Träger und jedes der vier Ephemeridenmodelle laufen ganz ohne Voreinstellung; die benannten Voreinstellungen sind optionale Daten (siehe Voreinstellungen).
Ein mitgeliefertes Beispiel mit kshana example <name> ausgeben (ein Name je Aufruf) und mit kshana scenarios/<name>.toml ausführen: leo-navmsg-fit-interval-trade, leo-navmsg-model-comparison, leo-navmsg-midpass-update und leo-navmsg-encode-decode. Der Typ ist außerdem die Nachrichtenstufe des Typs leo-pnt-chain (LEO-PNT.md) und ein Mitglied der Kampagne leo-focus-data-services, die vier Nachrichtenkonfigurationen zusammensetzt und die Rahmenlänge jeder einzelnen berichtet (146, 154, 159 und 171 Bytes).
Code: src/leo_navmsg/ — elements.rs (Datensätze und Nutzeralgorithmus), truth.rs (wahre Bahn und Uhr), fit.rs (Anpassung), sisre.rs (Entfernungsfehler im Signal im Raum), services.rs (Ionosphäre und koordinierte Weltzeit (UTC)), codec.rs (Binärformat), text.rs (Exporte im Stil von Receiver Independent Exchange Format (RINEX) und als kommagetrennte Werte (CSV)), presets/ (eine Datei je Voreinstellung), mod.rs (der Typ).
Was eine Nachricht enthält#
| Teil | Inhalt |
|---|---|
| Hilfsdaten | Raumfahrzeugkennung (SVID), Datenausgabestand (IOD), Bandkennung, Signalzustand (Galileo-Konvention: 0 in Ordnung, 1 außer Betrieb, 2 erweiterter Betrieb, 3 im Test) |
| Synchronisation | Wochennummer, Wochenzeit (TOW) der Aussendung und ein Uhrenpolynom zweiter Ordnung af0 + af1·(t − toc) + af2·(t − toc)² |
| Ephemeride | eines der vier folgenden Modelle |
| Weitere Dienste | ein rundgesendeter ionosphärischer Klobuchar-Satz, Galileo-NeQuick-G-Koeffizienten ai0, ai1, ai2 mit fünf Sturmkennzeichen und Parameter von der Systemzeit zu UTC A0, A1, ΔtLS, t0t, WNot, WNLSF, DN, ΔtLSF |
Ephemeridenmodelle#
| Code | Modell | Parameter |
|---|---|---|
kepler16 |
der Kepler-Satz aus dem Galileo Open Service Signal-in-Space Interface Control Document (OS SIS ICD): √A, e, i0, Ω0, ω, M0, Δn, Ω̇, i̇, Cuc, Cus, Crc, Crs, Cic, Cis, toe |
16 |
kepler-rac |
derselbe Satz, dazu Korrekturpolynome längs der Bahn, quer zur Bahn und radial (RAC) a0…, c0…, r0… in τ = tk / tau_s, Koeffizienten in Metern, tau_s die Zweierpotenz bei oder über der Hälfte des Anpassungsintervalls (übertragen), Grade festgelegt durch rac_degrees (Standard 7, 5, 6) |
standardmäßig 16 + 21, dazu die Zeitskala |
liu22 |
das 22-Parameter-Modell von Liu, Su, Xie, Zhou und Qu (2025, Remote Sensing 17(16):2894, doi 10.3390/rs17162894): die 16 plus ȧ, ṅ, Crs3, Crc3, Crs1, Crc1 |
22 |
ecef-poly |
das „Zero-Clock“-Modell ATOMIC (Autonomous Time and Orbit Determination for Microsatellite Constellations): ein erdzentriertes erdfestes (ECEF) Polynom je Achse in τ = (t − t_ref) / 64 s (Standardgrad 6), ohne Uhrenterme, weil die Satellitenuhr auf die Systemzeit gesteuert wird (InsideGNSS) |
standardmäßig 22 |
Der Nutzeralgorithmus (elements::sat_state) ist die Abfolge des Galileo-ICD (Kepler-Gleichung, Korrekturen zweiter Harmonischer, erdfester Knoten), gefolgt, für kepler-rac, von den drei Polynomen im eigenen Bezugssystem der Kepler-Bahn: radial entlang der ausgewerteten Position, quer zur Bahn entlang der Bahnnormalen aus korrigierter Inklination und korrigiertem Knoten, längs der Bahn als Ergänzung zum Dreibein. Die Uhr fügt den relativistischen Term des ICD F·e·√A·sin E hinzu; für ecef-poly ist es die allgemeine Form −2 r·v / c² aus dem Polynom und seiner Ableitung.
Die Terme nach Liu et al. folgen dem Nutzeralgorithmus der Veröffentlichung (Abschnitt 2,2, Gl. 1-7): A = A0 + ȧ·tk, n = √(μ/A0³) + Δn + ṅ·tk (Versionen vor 0,30 verwendeten die Konvention der zivilen Navigation des Global Positioning System (GPS) ½·ṅ·tk, sodass ein von ihnen geschriebenes ṅ das Doppelte desjenigen der Veröffentlichung ist), und Crs1·sin Φ + Crc1·cos Φ + Crs3·sin 3Φ + Crc3·cos 3Φ, zum Radius addiert, Φ ist das unkorrigierte Breitenargument. Die Skalierungskonvention von ṅ ist aus Gl. 1 der Veröffentlichung übernommen; der Vergleich mit der Veröffentlichung an realen Bahnen hängt nicht davon ab (ein Faktor ½ auf ṅ lässt jede angepasste Zahl unverändert), sodass die Bedeutung eines übertragenen nDot-Wertes dort nicht validiert ist.
Zwei Auslegungen stammen von Kshana selbst und sind als solche angegeben:
- Das RAC-Bezugssystem und die Normierung
τ = tk / tau_s. Kein öffentliches Dokument definiert ein LEO-Korrekturbezugssystem für eine Rundsende-Nachricht. - Die Uhr einer Zero-Clock-Nachricht ist insgesamt null: Es wird angenommen, dass die Steuerschleife die scheinbare Uhr, einschließlich des relativistischen Terms, auf der Systemzeit hält.
Die Anpassung#
truth.rs integriert die Bahn mit einem Runge-Kutta vierter Ordnung fester Schrittweite in einem Bezugssystem, das durch eine einzige Drehung in erdfeste Achsen übergeht, θ(t) = θ0 + Ω̇e·t, dieselbe einzelne Drehung, die ein Rundsende-Nutzeralgorithmus anwendet. Die Gravitation ist Zweikörper (gravity_degree = 0), die zonalen Harmonischen J2 bis J6 (2 bis 6) oder das Feld des Earth Gravitational Model 2008 (EGM2008) bis Grad und Ordnung 7 bis 70, dessen tesserale Terme die kurzperiodische Signatur tragen, die eine LEO-Anpassung schwer macht. Der Luftwiderstand ist optional (statische exponentielle Dichte). Die Uhr ist freilaufend (Versatz, Drift, Driftrate und weißes Frequenzrauschen bei einer angegebenen Allan-Abweichung von einer Sekunde, dazu der periodische relativistische Term) oder gesteuert (ein Gauß-Markov-Rest erster Ordnung).
fit.rs passt den Kepler-Satz mit Levenberg–Marquardt an nichtsinguläre Elemente an (e·cos ω, e·sin ω, λ0 = M0 + ω): Eine LEO-Bahn ist nahezu kreisförmig, sodass ω und M0 allein kaum zu unterscheiden sind. Sie beginnt beim oskulierenden Zustand bei toe mit der J2-Knotenrate. Schwache, auf null zentrierte A-priori-Werte begrenzen die Raten und Harmonischen, die ein kurzer Bogen nicht auflösen kann; mit einem Beobachtungsgewicht von 1 cm wirken sie nur in diesen Nullrichtungen. Die Anpassung liu22 übernimmt stattdessen Start und Schätzer aus Abschnitt 2,3 der Veröffentlichung: Sie beginnt mit allen Korrekturtermen null, hat keine A-priori-Werte (einfache Methode der kleinsten Quadrate) und behält die Obergrenze von 100 Iterationen der Veröffentlichung. Sie endet nach Kshanas eigener Regel zur Parameterkonvergenz, wenn jeder Parameterschritt unter 1e-3 seiner formalen Standardabweichung liegt; die Veröffentlichung endet stattdessen, wenn sich der RMS um weniger als 0,1 mm ändert. Die RAC-Polynome werden dann durch lineare Methode der kleinsten Quadrate an die Residuen längs/quer/radial angepasst, und das Uhrenpolynom an die wahre Uhr abzüglich des relativistischen Terms, den der Nutzer wieder hinzufügt.
Ein Befund, den die Standardwerte abbilden: Nach einer Kepler-Anpassung nach der Methode der kleinsten Quadrate ist das Residuum konstruktionsbedingt das, was die 16 Parameter nicht abdecken können; es schwingt daher über das Fenster (mehrere Nulldurchgänge in jeder Komponente), statt zu driften. Ein Korrekturpolynom beseitigt es nur, wenn sein Grad höher ist als das, was der Kepler-Satz bereits abdeckt: Längs der Bahn 7, quer zur Bahn 5 und radial 6 bringen ein 15-Minuten-Residuum von Zentimetern auf etwa einen Millimeter, während niedrigere Grade quer zur Bahn fast nichts beseitigen (das Residuum quer zur Bahn ist ungerade um die Fenstermitte). Ein System, das seinen Kepler-Anteil auf andere Weise ableitet, hinterlässt ein Residuum anderer Form, und die Grade, die es braucht, ergeben sich daraus. Die eigenen Korrekturgrade der Voreinstellung Celeste (niedriger als diese; sie stehen nur in der Voreinstellungsdatei src/celeste_iod.rs) laufen hier auf Kshanas Basis nach der Methode der kleinsten Quadrate, weshalb ihre Terme quer zur Bahn in dieser Engine wenig beitragen: eine Aussage über Kshanas Anpassung, nicht über irgendein reales System. toe und toc sind ganze Sekunden, so wie das Binärformat sie trägt.
Jede Nachricht wird über einen Zeitraum verwendet, der in ihrem Anpassungsfenster zentriert ist (die erste Abwägungstabelle verwendet das ganze Fenster). Die Zahlen zum Entfernungsfehler im Signal im Raum (SISRE) messen den Darstellungsfehler der Nachricht gegenüber der Wahrheit, an die sie angepasst wurde, als quadratischen Mittelwert (RMS) und als Maximum über die Spanne. Der Fehler von Bahnbestimmung und Bahnvorhersage, den ein reales Boden- oder Bordsegment zusätzlich hinzufügt, ist nicht modelliert.
Entfernungsfehler im Signal im Raum#
sisre.rs verwendet den global gemittelten SISRE von Montenbruck, Steigenberger und Hauschild (2018, Advances in Space Research 61(12):3020–3038, doi 10.1016/j.asr.2018.03.041):
SISRE_orb = sqrt( w_R² R² + w_AC² (A² + C²) )
SISRE = sqrt( (w_R R − c·dT)² + w_AC² (A² + C²) )
Die Gewichte sind die Mittelwerte über Nutzer, die gleichmäßig auf der sichtbaren Erdkappe verteilt sind, von cos² η und ½ sin² η, wobei η der Nadirwinkel der Sichtlinie am Satelliten ist, berechnet für den eigenen Radius und die eigene Elevationsmaske der Bahn. Bei einer Maske von 0° reproduziert die Berechnung die Tabelle der Veröffentlichung für die mittlere Erdumlaufbahn (GPS 0,98 und 1/49, GLONASS 1/45, Galileo 1/61, BeiDou 1/54) und die geostationäre Bahn (0,99 und 1/126): Das ist die VALIDATED-Prüfung. Im LEO ergibt derselbe Mittelwert
| Höhe | w_R |
1 / w_AC² |
Nadirwinkel am Horizont |
|---|---|---|---|
| 320 km | 0.384 | 2.35 | 72.2° |
| 510 km | 0.459 | 2.53 | 67.8° |
| 550 km | 0.472 | 2.57 | 67.0° |
| 786 km | 0.536 | 2.81 | 62.9° |
| 1080 km | 0.597 | 3.11 | 58.8° |
| 1336 km | 0.638 | 3.37 | 55.8° |
sodass ein LEO-Nutzer, der den Satelliten weit vom Nadir entfernt sieht, Fehler längs und quer zur Bahn viel stärker spürt als ein Nutzer in mittlerer Umlaufbahn.
Analysen#
analysis = [...] wählt beliebige der vier aus (Standard: alle).
Abwägung des Anpassungsintervalls#
[trade] legt die Spanne, die Anpassungsintervalle, die Aktualisierungsperioden und die Modelle fest. scenarios/leo-navmsg-fit-interval-trade.toml (550 km, 97,6°, EGM2008 bis Grad 20 und Luftwiderstand, 30 Minuten Nachrichten) ergibt, bei einer Nutzungsdauer gleich dem Anpassungsintervall:
| Modell | Anpassungsintervall | SISRE Bahn RMS | SISRE Bahn Maximum | SISRE mit Uhr RMS | radial / längs / quer RMS |
|---|---|---|---|---|---|
kepler16 |
60 s | 0,041 cm | 0,179 cm | 0,069 cm | 0,09 / 0,01 / 0,00 cm |
kepler16 |
120 s | 0,032 cm | 0,160 cm | 0,079 cm | 0,06 / 0,01 / 0,01 cm |
kepler16 |
180 s | 0,093 cm | 0,540 cm | 0,134 cm | 0,18 / 0,06 / 0,00 cm |
kepler16 |
300 s | 0,310 cm | 1,033 cm | 0,329 cm | 0,09 / 0,49 / 0,02 cm |
kepler16 |
450 s | 1,690 cm | 7,542 cm | 1,696 cm | 0,72 / 2,65 / 0,04 cm |
kepler16 |
600 s | 2,875 cm | 10,219 cm | 2,866 cm | 1,72 / 4,42 / 0,26 cm |
kepler16 |
900 s | 9,345 cm | 34,032 cm | 9,349 cm | 6,46 / 14,14 / 0,91 cm |
kepler-rac |
60 s | 0,000 cm | 0,000 cm | 0,057 cm | 0,00 / 0,00 / 0,00 cm |
kepler-rac |
120 s | 0,000 cm | 0,000 cm | 0,074 cm | 0,00 / 0,00 / 0,00 cm |
kepler-rac |
180 s | 0,000 cm | 0,001 cm | 0,090 cm | 0,00 / 0,00 / 0,00 cm |
kepler-rac |
300 s | 0,004 cm | 0,014 cm | 0,106 cm | 0,00 / 0,00 / 0,01 cm |
kepler-rac |
450 s | 0,037 cm | 0,176 cm | 0,127 cm | 0,05 / 0,01 / 0,04 cm |
kepler-rac |
600 s | 0,214 cm | 0,643 cm | 0,229 cm | 0,28 / 0,09 / 0,26 cm |
kepler-rac |
900 s | 1,015 cm | 3,695 cm | 1,062 cm | 1,52 / 0,70 / 0,91 cm |
Und bei einer Anpassung von 300 s, wobei variiert wird, wie oft eine neue Nachricht übernimmt:
| Modell | Aktualisierungsperiode | SISRE Bahn RMS | SISRE Bahn Maximum |
|---|---|---|---|
kepler16 |
30 s | 0,314 cm | 0,850 cm |
kepler16 |
60 s | 0,288 cm | 0,859 cm |
kepler16 |
150 s | 0,219 cm | 0,830 cm |
kepler16 |
300 s | 0,310 cm | 1,033 cm |
kepler-rac |
30 s | 0,004 cm | 0,009 cm |
kepler-rac |
60 s | 0,004 cm | 0,009 cm |
kepler-rac |
150 s | 0,004 cm | 0,010 cm |
kepler-rac |
300 s | 0,004 cm | 0,014 cm |
Der 16-Parameter-Kepler-Satz verschlechtert sich von 0,04 cm bei 60 s auf 9,35 cm bei 900 s: Ein Kepler-Satz mit Harmonischen zweimal je Umlauf kann den höherfrequenten Gravitationstermen und dem Luftwiderstand eines LEO-Bogens nicht länger als wenige Minuten folgen, und sein Residuum nach der Methode der kleinsten Quadrate schwingt über das Fenster. Die Polynome längs/quer/radial (Grade 7, 5, 6) nehmen auf, was übrig bleibt: 1,01 cm bei 900 s, 0,21 cm bei 600 s. Bei den kürzesten Intervallen liegen die Kepler-Zahlen im Submillimeterbereich und sind nicht mehr streng geordnet (die Anpassung ist dann durch die Konditionierung begrenzt, nicht durch das Modell).
Modellvergleich#
scenarios/leo-navmsg-model-comparison.toml lässt die vier Modelle bei 1, 5 und 10 Minuten auf derselben Bahn laufen, mit der Zahl der Parameter und den Bits für Ephemeride und Uhr in Kshanas Kodierung:
| Modell | Anpassungsintervall | Parameter | Bits für Ephemeride + Uhr | SISRE Bahn RMS | SISRE mit Uhr RMS |
|---|---|---|---|---|---|
kepler16 |
60 s | 16 | 570 | 0,022 cm | 0,049 cm |
kepler16 |
300 s | 16 | 570 | 0,230 cm | 0,260 cm |
kepler16 |
600 s | 16 | 570 | 3,061 cm | 3,071 cm |
kepler-rac |
60 s | 37 | 1045 | 0,000 cm | 0,044 cm |
kepler-rac |
300 s | 37 | 1045 | 0,005 cm | 0,120 cm |
kepler-rac |
600 s | 37 | 1045 | 0,160 cm | 0,208 cm |
liu22 |
60 s | 22 | 730 | 0,014 cm | 0,046 cm |
liu22 |
300 s | 22 | 730 | 0,074 cm | 0,142 cm |
liu22 |
600 s | 22 | 730 | 0,258 cm | 0,290 cm |
ecef-poly (Zero-Clock) |
60 s | 22 | 750 | 0,000 cm | 28,784 cm |
ecef-poly (Zero-Clock) |
300 s | 22 | 750 | 0,005 cm | 28,784 cm |
ecef-poly (Zero-Clock) |
600 s | 22 | 750 | 0,561 cm | 28,774 cm |
Die Zeile mit Zero-Clock wird gegen eine Uhr bewertet, die mit einem Residuum von 0,24 m gesteuert wird (die ATOMIC-Zahl), die anderen gegen die freilaufende Uhr, die sie anpassen.
Liu et al. 2025, SISRE gegenüber der Höhe (MODELLED). Dasselbe Szenario passt Kshanas 22-Parameter-Modell über 20-Minuten-Bögen in den fünf Höhen der Veröffentlichung an, jeweils bei der Inklination des Satelliten:
| Satellit | Höhe | Inklination | Liu et al. 2025 | Kshana (nur Bahn, RMS) | Verhältnis |
|---|---|---|---|---|---|
| GRACE-A | 320 km | 89.00° | 8,88 cm | 4,25 cm | 0.48 |
| GRACE-C | 475 km | 89.00° | 6,21 cm | 2,87 cm | 0.46 |
| Sentinel-2A | 786 km | 98.57° | 2,87 cm | 2,20 cm | 0.77 |
| HY-2A | 966 km | 99.34° | 2,11 cm | 1,25 cm | 0.59 |
| Sentinel-6A | 1336 km | 66.04° | 0,75 cm | 0,51 cm | 0.67 |
Das ist keine Validierung. Die Veröffentlichung hat reale präzise wissenschaftliche Bahnen der genannten Satelliten angepasst (mit ihrer vollen Gravitations-, Luftwiderstands- und nichtgravitativen Vorgeschichte); Kshana passt seine eigene integrierte Bahn an, wertet die sechs hinzugefügten Parameter wie oben beschrieben aus und verwendet seine eigenen SISRE-Gewichte. Der Vergleich zeigt den Trend und die Größenordnung. Der Vergleich an denselben realen Bahnen, die die Veröffentlichung angepasst hat, ist tests/leo_navmsg_fit_real_orbit_oracle.rs (seit 0,30 stimmt die 22-Parameter-Anpassung dort innerhalb des vorab festgelegten Faktors 1,5 überein, an den Tagen der Veröffentlichung und an acht zurückgehaltenen Tagen).
Aktualisierung mitten im Überflug#
[midpass] platziert einen Nutzer (Standard 45° N, 10° O), findet den höchsten Überflug über der Maske innerhalb von search_s und plant Nachrichten alle update_period_s. Bei jedem Wechsel innerhalb des Überflugs berichtet es den Positionssprung, den Uhrensprung, den Pseudoentfernungssprung des Nutzers (neue Nachricht minus alte), den größten Sprung, den ein sichtbarer Nutzer sehen könnte (geschlossene Form über den Nadirkegel), den Entfernungsfehler davor und danach sowie PASS oder FAIL gegen threshold_m. scenarios/leo-navmsg-midpass-update.toml (300-s-Anpassungen, alle 150 s aktualisiert):
Der höchste Überflug eines Tages erreicht 43,7° und dauert 455 s. Seine Wechsel:
| Wechsel | Elevation | Positionssprung | Uhrensprung | Entfernungssprung des Nutzers | Sprung bei ungünstigster Geometrie |
|---|---|---|---|---|---|
| IOD 270 → 271 | 12.7° | 0,07 mm | 0,19 mm | -0.17 mm | 0,27 mm |
| IOD 271 → 272 | 37.4° | 0,14 mm | 0,14 mm | -0.24 mm | 0,27 mm |
| IOD 272 → 273 | 28.2° | 0,27 mm | -0.22 mm | 0,35 mm | 0,48 mm |
Größter Entfernungssprung des Nutzers 0,35 mm gegen eine Schwelle von 5 cm: PASS.
Kodieren und Dekodieren#
scenarios/leo-navmsg-encode-decode.toml kodiert die erste von drei Nachrichten, dekodiert sie, prüft die CRC und weist eine beschädigte Kopie zurück, gibt das Quantisierungsbudget aus und schreibt und liest den Block im RINEX-Stil sowie die CSV-Tabelle zurück:
- Rahmen: 171 Bytes (1310 Nutzdatenbits, davon 1045 für Ephemeride und Uhr), 24-Bit-Prüfsumme (zyklische Redundanzprüfung, CRC-24Q)
0x19105F; - größte Halbschrittwirkung eines einzelnen Feldes:
af0, 0,545 mm; - ganze Nachricht nach der Quantisierung: Position innerhalb von 1,126 mm und Uhr innerhalb von 0,185 mm der exakten Nachricht; SISRE 0,113 cm exakt, 0,129 cm dekodiert;
- ein Rahmen mit einem gekippten Bit wird zurückgewiesen: true;
- Hin-und-zurück-Lauf im RINEX-Stil innerhalb von 5.0e-06 m, Hin-und-zurück-Lauf der CSV innerhalb von 0.0e+00 m.
Plattformunabhängigkeit#
Ein Rahmen besteht aus übertragenen ganzen Zahlen, also müssen es dieselben ganzen Zahlen sein, wo und wie auch immer das Szenario läuft: das native Binärprogramm auf jedem Betriebssystem, ein Debug- oder ein Release-Build und der WebAssembly-Build (WASM) in einem Browser. Drei Dinge standen im Weg. Sinus, Kosinus, Arkustangens und Exponentialfunktion der Mathematikbibliothek eines Rechners müssen nicht korrekt gerundet sein und unterscheiden sich zwischen Rechnern in der letzten Stelle. Ein optimierter Build auf macOS nimmt Sinus und Kosinus eines Arguments aus der kombinierten Routine des Systems, die nicht immer den Wert des einzelnen Sinus liefert, sodass sich auch ein Debug- und ein Release-Build unterschieden. Und der übliche Normalverteilungs-Sampler ruft in seinen seltenen Zweigen die Exponential- und Logarithmusfunktion des Rechners auf. Die Anpassung macht aus einem so kleinen Unterschied andere quantisierte Felder. Der gesamte Typ (wahre Bahn und Uhr, Anpassung, Nutzeralgorithmus, Entfernungsfehler im Signal im Raum (SISRE), Codec) berechnet daher jede solche Funktion mit der reinen Rust-Bibliothek libm über src/portable_math.rs, ganzzahlige Potenzen als ausdrückliche Produkte und normalverteilte Abweichungen nach dem Polarverfahren aus der Rohausgabe des Generators. leo_navmsg::tests::the_encoded_frame_is_the_same_bytes_on_every_platform legt den 171-Byte-Rahmen des unten stehenden Szenarios zum Kodieren und Dekodieren fest, dazu einen Prüfwert je Ephemeridenmodell; ein Debug-Build, ein Release-Build und der WASM-Build liefern für alle fünf mitgelieferten leo-navmsg-Szenarien byteidentische Ergebnisdokumente.
Binärformat#
Dies ist Kshanas eigene dokumentierte Kodierung. Sie trägt die Komponenten, die die veröffentlichten Beschreibungen von LEO-Navigationsnachrichten nennen, nach dem Vorbild des Galileo-ICD-Feldsatzes. Sie ist nicht das Bitlayout von Celeste oder eines anderen Systems: keines ist öffentlich.
Rahmen: Präambel 0xA7 (8 Bits), Version 1 (4), Modell (4: 1 kepler16, 2 kepler-rac, 3 liu22, 4 ecef-poly), Nutzdatenlänge in Bytes (12), auf ein Byte mit Nullen aufgefüllte Nutzdaten, CRC-24Q (eine 24-Bit-zyklische Redundanzprüfung, 24 Bits) über jedes vorangehende Byte. CRC-24Q ist die Prüfung des Standards RTCM 10403 der Radio Technical Commission for Maritime Services und des Galileo-ICD (Polynom 0x1864CFB, Anfangswert 0); der Code reproduziert den Katalog-Prüfwert 0xCDE703 für 123456789 und die Prüfbytes des Beispielrahmens RTCM 10403 Nachrichtentyp 1005 (VALIDATED).
Die Schritte des Galileo-ICD wurden für die mittlere Erdumlaufbahn gewählt und sind für eine LEO-Nachricht im Zentimeterbereich zu grob: Crs in Schritten von 2⁻⁵ m (3,1 cm), Cuc 2⁻²⁹ rad (1,3 cm beim LEO-Radius), die Winkel 2⁻³¹ Halbkreise (1,0 cm) und af0 2⁻³⁴ s (1,7 cm). Kshana behält die Einheiten des ICD und die Halbkreiskonvention bei, verfeinert die Schritte so, dass der Halbschrittfehler jedes Feldes über ein 15-Minuten-Fenster unter 1 mm Position oder Entfernung bleibt, und erweitert die Felder, um die Bereiche zu halten, die eine LEO-Anpassung braucht:
| Block | Feld | Bits | Schritt | Einheit |
|---|---|---|---|---|
| Hilfsdaten und Synchronisation | SVID |
8 | 1 | - |
| Hilfsdaten und Synchronisation | IOD |
10 | 1 | - |
| Hilfsdaten und Synchronisation | Band |
4 | 1 | - |
| Hilfsdaten und Synchronisation | Health |
2 | 1 | - |
| Hilfsdaten und Synchronisation | WeekNumber |
13 | 1 | Woche |
| Hilfsdaten und Synchronisation | ToW |
20 | 1 | s |
| Hilfsdaten und Synchronisation | Flags |
4 | 1 | - |
| Uhr (Kennzeichenbit 0) | toc |
20 | 1 | s |
| Uhr (Kennzeichenbit 0) | af0 |
34 | 2^-38 | s |
| Uhr (Kennzeichenbit 0) | af1 |
28 | 2^-50 | s/s |
| Uhr (Kennzeichenbit 0) | af2 |
20 | 2^-62 | s/s^2 |
| Kepler (Modelle 1-3) | toe |
20 | 1 | s |
| Kepler (Modelle 1-3) | M0 |
36 | 2^-35 | Halbkreis |
| Kepler (Modelle 1-3) | e |
32 | 2^-33 | - |
| Kepler (Modelle 1-3) | sqrtA |
36 | 2^-23 | m^0,5 |
| Kepler (Modelle 1-3) | Omega0 |
36 | 2^-35 | Halbkreis |
| Kepler (Modelle 1-3) | i0 |
36 | 2^-35 | Halbkreis |
| Kepler (Modelle 1-3) | omega |
36 | 2^-35 | Halbkreis |
| Kepler (Modelle 1-3) | deltaN |
29 | 2^-43 | semicircle/s |
| Kepler (Modelle 1-3) | OmegaDot |
29 | 2^-43 | semicircle/s |
| Kepler (Modelle 1-3) | iDot |
22 | 2^-43 | semicircle/s |
| Kepler (Modelle 1-3) | Cuc |
26 | 2^-34 | rad |
| Kepler (Modelle 1-3) | Cus |
26 | 2^-34 | rad |
| Kepler (Modelle 1-3) | Crc |
26 | 2^-10 | m |
| Kepler (Modelle 1-3) | Crs |
26 | 2^-10 | m |
| Kepler (Modelle 1-3) | Cic |
26 | 2^-34 | rad |
| Kepler (Modelle 1-3) | Cis |
26 | 2^-34 | rad |
| Korrekturen längs/quer/radial (Modell 2) | degA |
3 | 1 | - |
| Korrekturen längs/quer/radial (Modell 2) | degC |
3 | 1 | - |
| Korrekturen längs/quer/radial (Modell 2) | degR |
3 | 1 | - |
| Korrekturen längs/quer/radial (Modell 2) | racTauExp |
4 | 1 | log2(s) |
| Korrekturen längs/quer/radial (Modell 2) | a_k, c_k, r_k |
22 | 2^-14 | m |
| Zusätze nach Liu et al. 2025 (Modell 3) | aDot |
26 | 2^-20 | m/s |
| Zusätze nach Liu et al. 2025 (Modell 3) | nDot |
30 | 2^-58 | semicircle/s^2 |
| Zusätze nach Liu et al. 2025 (Modell 3) | Crs3 |
26 | 2^-10 | m |
| Zusätze nach Liu et al. 2025 (Modell 3) | Crc3 |
26 | 2^-10 | m |
| Zusätze nach Liu et al. 2025 (Modell 3) | Crs1 |
26 | 2^-10 | m |
| Zusätze nach Liu et al. 2025 (Modell 3) | Crc1 |
26 | 2^-10 | m |
| ECEF-Polynom (Modell 4) | tref |
20 | 1 | s |
| ECEF-Polynom (Modell 4) | degP |
4 | 1 | - |
| ECEF-Polynom (Modell 4) | x0, y0, z0 |
38 | 2^-11 | m |
| ECEF-Polynom (Modell 4) | x_k, y_k, z_k (k >= 1) |
34 | 2^-12 | m |
| Klobuchar (Kennzeichenbit 1) | alpha0 |
8 | 2^-30 | s |
| Klobuchar (Kennzeichenbit 1) | alpha1 |
8 | 2^-27 | s/semicircle |
| Klobuchar (Kennzeichenbit 1) | alpha2 |
8 | 2^-24 | s/semicircle^2 |
| Klobuchar (Kennzeichenbit 1) | alpha3 |
8 | 2^-24 | s/semicircle^3 |
| Klobuchar (Kennzeichenbit 1) | beta0 |
8 | 2^11 | s |
| Klobuchar (Kennzeichenbit 1) | beta1 |
8 | 2^14 | s/semicircle |
| Klobuchar (Kennzeichenbit 1) | beta2 |
8 | 2^16 | s/semicircle^2 |
| Klobuchar (Kennzeichenbit 1) | beta3 |
8 | 2^16 | s/semicircle^3 |
| NeQuick-G (Kennzeichenbit 2) | ai0 |
11 | 2^-2 | sfu |
| NeQuick-G (Kennzeichenbit 2) | ai1 |
11 | 2^-8 | sfu/deg |
| NeQuick-G (Kennzeichenbit 2) | ai2 |
14 | 2^-15 | sfu/deg^2 |
| NeQuick-G (Kennzeichenbit 2) | SF1-5 |
5 | 1 | - |
| UTC (Kennzeichenbit 3) | A0 |
32 | 2^-30 | s |
| UTC (Kennzeichenbit 3) | A1 |
24 | 2^-50 | s/s |
| UTC (Kennzeichenbit 3) | dtLS |
8 | 1 | s |
| UTC (Kennzeichenbit 3) | t0t |
8 | 3600 | s |
| UTC (Kennzeichenbit 3) | WNot |
8 | 1 | Woche |
| UTC (Kennzeichenbit 3) | WNLSF |
8 | 1 | Woche |
| UTC (Kennzeichenbit 3) | DN |
3 | 1 | Tag |
| UTC (Kennzeichenbit 3) | dtLSF |
8 | 1 | s |
Ein Wert außerhalb des Bereichs seines Feldes wird zurückgewiesen, nicht umgebrochen. Die Bereiche wurden durch Kodieren von Anpassungen bei 300 bis 2000 km, Inklinationen von 0° bis 140° und Anpassungsintervallen bis 20 Minuten geprüft: deltaN und OmegaDot sind breit, weil auf einer nahezu äquatorialen Bahn der Knoten schlecht definiert ist und die Anpassung die J2-Drift des Breitenarguments zwischen ihnen aufteilt, und aDot und nDot, weil die 22-Parameter-Anpassung über 20 Minuten einen Teil der kurzperiodischen Schwingung der großen Halbachse aufnimmt. Seit 0,30 ist die 22-Parameter-Anpassung die einfache Methode der kleinsten Quadrate der Veröffentlichung ohne A-priori-Werte, und eine äquatoriale Anpassung bei 800 km braucht dann nDot von etwa 6.3e-10 Halbkreis/s^2, sodass ihre Skala von 2^-60 auf 2^-58 ging. Die Längs-Korrekturen vom Grad 7 von kepler-rac passen in den 22-Bit-Koeffizientenbereich bis 15 Minuten; eine längere Anpassung kann ihn überschreiten und wird dann zurückgewiesen. quantisation_budget berichtet für jedes Ephemeriden- und Uhrenfeld die größte Positions- und Entfernungsänderung, die eine Halbschrittänderung über die Nutzungsdauer bewirkt, sowie die Änderung der ganzen Nachricht nach der Quantisierung.
Textexporte#
RINEX 4,02 definiert keine LEO-Navigationsdatensätze (seine Systembuchstaben sind G, R, E, J, C, I und S; International Global Navigation Satellite System (GNSS) Service (IGS) RINEX 4,02). Der Block, den text.rs schreibt, entlehnt die Form von RINEX 4 — einen Datensatzkopf > EPH, eine Zeile zu Satellit und Epoche mit drei Uhrentermen, Zeilen der Rundsende-Bahn mit je vier D19.12-Feldern — und ist eine dokumentierte Kshana-Erweiterung: Systembuchstabe L, Datensatztypen KP16, KRAC, LU22, APOL und drei Kopfkommentare, die das sagen. Vorarbeiten zu LEO-Bahnen in Navigationsdatensätzen im Stil von RINEX 4: arXiv 2401,17767.
> EPH L04 KRAC
L04 yyyy mm dd hh mm ss af0 af1 af2
IOD Crs deltaN M0
Cuc e Cus sqrtA
toe Cic Omega0 Cis
i0 Crc omega OmegaDot
IDOT Band Week Health
txTOW clock degA degC
degR tau_s a0 a1 then the rest of a_k, c_k and r_k, four per line
Die CSV-Tabelle trägt Nachrichten der Modelle kepler16 und kepler-rac, eine je Zeile. Die Standardspalten verwenden die Namen des Galileo-ICD (SVID, IOD, Band, WeekNumber, ToW, Health, toc, af0, af1, af2, toe, M0, sqrtA, e, deltaN, Omega0, OmegaDot, iDot, i0, omega, Crc, Crs, Cic, Cis, Cuc, Cus, a0…, c0…, r0…, racTau); csv_schema wählt stattdessen die Schreibweise einer Voreinstellung. Beide Formate lassen sich zurücklesen.
Ionosphäre und UTC#
- Klobuchar: das L1-Modell der Engine (
gnss_sim::klobuchar_delay_m, gegen RTKLIB geprüft), durch das Gesetz erster Ordnung(f_L1 / f)²auf den Träger skaliert. - NeQuick-G: Die Koeffizienten reisen in der Nachricht, und
effective_ionisation_levelliefertAz = ai0 + ai1·μ + ai2·μ²für eine modifizierte Neigungsbreiteμ, mit den Regeln des Algorithmus (Koeffizienten, die alle null sind, ergeben 63,7 Solarflusseinheiten, sfu; das Ergebnis wird auf [0, 400] sfu begrenzt). Das NeQuick-Elektronendichtemodell und seine Schrägintegration, dieAzin eine Verzögerung umsetzen, sind nicht implementiert. - Ein Satellit in wenigen hundert Kilometern Höhe fliegt innerhalb der Ionosphäre. Keines der beiden Rundsende-Modelle berücksichtigt den Elektronengehalt oberhalb des Satelliten, und es wird keine Korrektur dafür angewendet.
- UTC:
system_to_utcwendet die drei Fälle des Galileo-ICD §5.1.7 an (vor, innerhalb von sechs Stunden um und nach einem Schaltsekundenereignis); eine eingefügte Sekunde liest 86400.
Voreinstellungen#
Voreinstellungen sind Daten, je eine Datei unter src/leo_navmsg/presets/, mit ihren Quellen. Die Engine und jedes mitgelieferte Szenario außer dem von Celeste laufen ohne sie.
| Schlüssel | Quelle | Bahn | Träger | Nachrichtenmodell |
|---|---|---|---|---|
xona-pulsar |
PUBLIC, arXiv 2509,19551 | 1080 km, 53° | X1 1593,3225 MHz | nicht veröffentlicht |
xona-pulsar-0 |
PUBLIC, arXiv 2509,19551 | 520 km, 97° | X1 | nicht veröffentlicht |
iridium |
PUBLIC, RNTF-Bericht, Beschreibung der Konstellation | 781 km, 86,4° | 1621 MHz (Band 1616–1626 MHz) | nichts rundgesendet |
starlink |
PUBLIC, NAVIGATION 72(1), Beschreibung der Konstellation | 550 km, 53° | Ku-Band, Wert aus der Bandmitte (repräsentativ) | keines (Gelegenheitssignale) |
centispace |
PUBLIC, Sensors 2023, Satellite Navigation 2026 | 700 km, 55° | nahe B1 (in der Quelle maskiert; L1 als Ersatz) | nicht veröffentlicht |
cband-generic |
REPRESENTATIVE | 600 km, 97,8° | 5020 MHz (RNSS-C-Band-Mitte) | nicht veröffentlicht |
atomic |
PUBLIC, InsideGNSS | 500 km (repräsentativ) | L1 (repräsentativ) | ecef-poly, Grad 6, 60 s, alle 30 s aufgefrischt, Zero-Clock, 0,24 m Steuerresiduum |
celeste-iod |
WORKSHOP und PUBLIC | 510 km, 97,4° | 1191,795 MHz | kepler-rac, Grade und Datensatzabstand in der Voreinstellungsdatei |
RNSS ist der Funknavigationssatellitendienst; RNTF die Resilient Navigation and Timing Foundation.
Celeste IOD. Die Voreinstellung für die Celeste-Demonstration im Orbit (IOD) der Europäischen Weltraumorganisation (ESA) ist die einzige, die Material verwendet, das auf dem LEO-PNT-Workshop des ESA-Programms Navigation Innovation and Support Programme (NAVISP), 2026, vorgestellt wurde: die Nachrichtenstruktur (Galileo-Kepler-Satz plus Korrekturpolynome längs/quer/radial, Uhrenpolynom, SVID, Zustand, IOD, ionosphärische und UTC-Parameter), der Datensatzabstand und die CSV-Spaltennamen. Die Bahn (510 km, nahezu polar sonnensynchron) und der Träger stammen aus öffentlichen Quellen, die in der Datei genannt sind. Das Celeste-Bitlayout ist nicht öffentlich und wird nicht wiedergegeben; spätere Celeste-Phasen und das LEO-PNT-System der Europäischen Union (EU) können abweichen. Jeder aus dem Workshop abgeleitete Wert steht im Modul navmsg von src/celeste_iod.rs, verwendet von scenarios/leo-navmsg-celeste-iod.toml. So wird die Voreinstellung zurückgehalten: Jede aus dem Workshop abgeleitete Zahl der Engine steht in einer Datei, src/celeste_iod.rs, die build.rs nur einkompiliert, wenn sie existiert, und in den nur im Repository vorhandenen Szenarien scenarios/*celeste-iod*.toml. Das Löschen dieser Datei und dieser Szenarien hält die Voreinstellung ohne Quelltextänderung zurück; jeder andere Test, jede andere unabhängige Referenz und jedes andere Szenario läuft ohne sie, und die Zählung der Szenariodateien in der README zählt die zurückgehaltenen Dateien weiterhin mit.
Verifikation#
| Zeile | Kennzeichnung | Unabhängige Referenz |
|---|---|---|
| SISRE-Gewichte | VALIDATED | Tabelle von Montenbruck et al. 2018 (GPS, GLONASS, Galileo, BeiDou, geostationär) |
| Nutzeralgorithmus des Galileo-ICD | VALIDATED | RTKLIB eph2pos an vier realen Galileo-Rundsende-Ephemeriden, 1 mm je Achse (tests/leo_navmsg_reference.rs) |
| CRC-24Q | VALIDATED | Katalog-Prüfwert 0xCDE703; Beispielrahmen RTCM 10403 1005 |
| Anpassung und SISRE-Abwägung | MODELLED | Zweikörper-Wahrheit auf 1 mm wiedergewonnen; korrigierte J2–J6-Anpassung auf 1 mm; monotones Wachstum mit dem Intervall |
| Kontinuität mitten im Überflug | MODELLED | Sprungidentität; Kegelschranke in geschlossener Form gegen Abtastung |
| Binärformat und Budget | MODELLED | Hin-und-zurück-Läufe; Halbschritt jedes Feldes unter 1 mm |
| RINEX-Stil und CSV | MODELLED | Hin-und-zurück-Läufe |
| 22-Parameter-Modell und Anpassung nach Liu et al. 2025 | VALIDATED | präzise Bahnen von TU Graz ITSG von vier Satelliten gegen die Tabellen 4, 5, 6 und 8 der Veröffentlichung: Verhältnisse für längs, quer, radial und SISRE von 0,755 bis 1,138 an den Tagen der Veröffentlichung und von 0,683 bis 1,186 an acht zurückgehaltenen Tagen, innerhalb von 1.5x (tests/leo_navmsg_fit_real_orbit_oracle.rs) |
| ATOMIC-Zero-Clock-Polynom und die Tabelle für fünf Höhen | MODELLED | ATOMIC-Fakten aus InsideGNSS; die veröffentlichte Tabelle von Liu neben Kshanas Anpassung der integrierten Bahn gedruckt, nicht festgelegt |
| Ionosphäre und UTC | MODELLED | geschlossene Formen des ICD; das gegen RTKLIB geprüfte Klobuchar-Modell |
Einschränkungen#
- SISRE ist nur der Darstellungsfehler: kein Fehler aus Bahnbestimmung oder Bahnvorhersage.
- Die Wahrheit ist eine Kshana-Integration (ohne dritten Körper, Strahlungsdruck der Sonne oder Gezeiten), nicht die präzise Bahn eines realen Satelliten.
- Das Binärformat und der Block im RINEX-Stil sind Kshanas eigene.
- NeQuick-G wird getragen, nicht zu einer Verzögerung integriert; keine Korrektur für einen Satelliten innerhalb der Ionosphäre.
- Der Vergleich mit Liu et al. unterscheidet sich in Bahnen, Parameterdeutung und Gewichten.