Komunikat nawigacyjny LEO
Rodzaj scenariusza leo-navmsg buduje transmitowany komunikat efemeryd i zegara satelity pozycjonowania, nawigacji i czasu (PNT) na niskiej orbicie okołoziemskiej (LEO) i odpowiada na pytania, które zadaje projektant komunikatu: jak długo może obowiązywać jeden komunikat, co daje każdy dodatkowy parametr, co widzi użytkownik, gdy komunikat zmienia się w środku przelotu, i ile bitów potrzeba, by przenieść go z dokładnością do centymetra.
Jest niezależny od systemu. Dowolna orbita, dowolna nośna i dowolny z czterech modeli efemeryd działają bez żadnego presetu; nazwane presety są danymi opcjonalnymi (zob. Presety).
Wydrukuj dołączony przykład poleceniem kshana example <name> (jedna nazwa na wywołanie) i uruchom go poleceniem kshana scenarios/<name>.toml: leo-navmsg-fit-interval-trade, leo-navmsg-model-comparison, leo-navmsg-midpass-update i leo-navmsg-encode-decode. Ten rodzaj jest też etapem komunikatu w rodzaju leo-pnt-chain (LEO-PNT.md) oraz członkiem kampanii leo-focus-data-services, która składa cztery konfiguracje komunikatu i raportuje długość ramki każdej z nich (146, 154, 159 i 171 bajtów).
Kod: src/leo_navmsg/ — elements.rs (rekordy i algorytm użytkownika), truth.rs (orbita i zegar wzorcowy), fit.rs (dopasowanie), sisre.rs (błąd odległości sygnału w przestrzeni), services.rs (jonosfera i uniwersalny czas koordynowany (UTC)), codec.rs (format binarny), text.rs (eksporty w stylu Receiver Independent Exchange Format (RINEX) i w wartościach rozdzielanych przecinkami (CSV)), presets/ (jeden plik na preset), mod.rs (rodzaj).
Co niesie komunikat#
| Część | Zawartość |
|---|---|
| Pomocnicze | identyfikator pojazdu kosmicznego (SVID), wydanie danych (IOD), identyfikator pasma, status zdrowia sygnału (konwencja Galileo: 0 sprawny, 1 niesprawny, 2 praca rozszerzona, 3 w teście) |
| Synchronizacja | numer tygodnia, czas tygodnia (TOW) nadawania oraz wielomian zegara drugiego rzędu af0 + af1·(t − toc) + af2·(t − toc)² |
| Efemerydy | jeden z czterech modeli poniżej |
| Inne usługi | zestaw transmitowanych parametrów jonosferycznych Klobuchara, współczynniki Galileo NeQuick-G ai0, ai1, ai2 z pięcioma flagami burzy oraz parametry czasu systemowego do UTC A0, A1, ΔtLS, t0t, WNot, WNLSF, DN, ΔtLSF |
Modele efemeryd#
| Kod | Model | Parametry |
|---|---|---|
kepler16 |
zestaw keplerowski z dokumentu kontroli interfejsu sygnału w przestrzeni Galileo Open Service (OS SIS ICD): √A, e, i0, Ω0, ω, M0, Δn, Ω̇, i̇, Cuc, Cus, Crc, Crs, Cic, Cis, toe |
16 |
kepler-rac |
to samo, plus wielomiany korekcji wzdłuż toru, poprzecznej i radialnej (RAC) a0…, c0…, r0… w τ = tk / tau_s, współczynniki w metrach, tau_s to potęga dwójki równa co najmniej połowie przedziału dopasowania lub większa od niej (transmitowana), stopnie ustalane przez rac_degrees (domyślnie 7, 5, 6) |
domyślnie 16 + 21, plus skala czasu |
liu22 |
model 22-parametrowy Liu, Su, Xie, Zhou i Qu (2025, Remote Sensing 17(16):2894, doi 10.3390/rs17162894): 16 plus ȧ, ṅ, Crs3, Crc3, Crs1, Crc1 |
22 |
ecef-poly |
model „zerowego zegara” ATOMIC (Autonomous Time and Orbit Determination for Microsatellite Constellations): wielomian w układzie związanym z Ziemią o początku w jej środku (ECEF) dla każdej osi w τ = (t − t_ref) / 64 s (domyślnie stopień 6), bez składników zegara, ponieważ zegar satelity jest sterowany do czasu systemowego (InsideGNSS) |
domyślnie 22 |
Algorytm użytkownika (elements::sat_state) to sekwencja z ICD Galileo (równanie Keplera, poprawki drugiej harmonicznej, węzeł w układzie związanym z Ziemią), po której dla kepler-rac następują trzy wielomiany w układzie własnym orbity keplerowskiej: radialny wzdłuż obliczonego położenia, poprzeczny wzdłuż normalnej orbity z poprawionej inklinacji i węzła, wzdłuż toru dopełniający trójkę. Zegar dodaje relatywistyczny człon z ICD F·e·√A·sin E; dla ecef-poly jest to postać ogólna −2 r·v / c² z wielomianu i jego pochodnej.
Człony Liu i in. wynikają z algorytmu użytkownika z artykułu (sekcja 2,2, równ. 1-7): A = A0 + ȧ·tk, n = √(μ/A0³) + Δn + ṅ·tk (wydania przed 0,30 stosowały konwencję cywilnej nawigacji Global Positioning System (GPS) ½·ṅ·tk, więc zapisane przez nie ṅ jest dwukrotnością wartości z artykułu), oraz Crs1·sin Φ + Crc1·cos Φ + Crs3·sin 3Φ + Crc3·cos 3Φ dodane do promienia, Φ to nieskorygowany argument szerokości. Konwencja skali ṅ jest przepisana z równ. 1 artykułu; porównanie z artykułem na rzeczywistych orbitach od niej nie zależy (czynnik ½ przy ṅ nie zmienia żadnej dopasowanej wartości), więc znaczenie transmitowanej wartości nDot nie jest tam sprawdzone względem niezależnego wzorca zewnętrznego.
Dwa odczytania są własne dla Kshana i tak je podano:
- Układ RAC i normalizacja
τ = tk / tau_s. Żaden publiczny dokument nie definiuje układu korekcji LEO dla komunikatu transmitowanego. - Zegar komunikatu zerowego zegara jest w sumie równy zeru: przyjmuje się, że pętla sterowania utrzymuje pozorny zegar, łącznie z członem relatywistycznym, na czasie systemowym.
Dopasowanie#
truth.rs całkuje orbitę czterostopniową metodą Rungego–Kutty o stałym kroku w układzie, który przechodzi w osie związane z Ziemią jednym obrotem, θ(t) = θ0 + Ω̇e·t, tym samym pojedynczym obrotem, który stosuje transmitowany algorytm użytkownika. Grawitacja to dwa ciała (gravity_degree = 0), harmoniczne zonalne od J2 do J6 (od 2 do 6) albo pole Earth Gravitational Model 2008 (EGM2008) do stopnia i rzędu od 7 do 70, którego człony tesseralne niosą sygnaturę krótkookresową utrudniającą dopasowanie LEO. Opór jest opcjonalny (statyczna gęstość wykładnicza). Zegar jest swobodnie biegnący (bias, dryf, tempo dryfu i biały szum częstotliwości przy podanym odchyleniu Allana dla jednej sekundy, plus okresowy człon relatywistyczny) lub sterowany (resztka Gaussa–Markowa pierwszego rzędu).
fit.rs dopasowuje zestaw keplerowski metodą Levenberga–Marquardta na elementach niesingularnych (e·cos ω, e·sin ω, λ0 = M0 + ω): orbita LEO jest prawie kołowa, więc same ω i M0 są niemal nierozróżnialne. Zaczyna od stanu oskulacyjnego w toe z tempem węzła od J2. Słabe priory wyśrodkowane na zerze ograniczają tempa i harmoniczne, których krótki łuk nie może rozdzielić; przy wadze obserwacji 1 cm działają one tylko w tych kierunkach zerowych. Dopasowanie liu22 przyjmuje natomiast start i estymator z sekcji 2,3 artykułu: zaczyna od zerowych wszystkich członów korekcji, nie ma priorów (zwykłe najmniejsze kwadraty) i zachowuje limit 100 iteracji z artykułu. Kończy się według własnej reguły zbieżności parametrów Kshana, gdy każdy krok parametru jest mniejszy niż 1e-3 jego formalnego odchylenia standardowego; artykuł kończy natomiast, gdy RMS zmienia się o mniej niż 0,1 mm. Wielomiany RAC są następnie dopasowywane do reszt wzdłuż toru/poprzecznych/radialnych metodą liniowych najmniejszych kwadratów, a wielomian zegara do zegara wzorcowego pomniejszonego o człon relatywistyczny, który użytkownik doda z powrotem.
Wniosek zapisany w wartościach domyślnych: po dopasowaniu keplerowskim metodą najmniejszych kwadratów reszta jest z konstrukcji tym, czego 16 parametrów nie może objąć, więc oscyluje w oknie (kilka przejść przez zero w każdej składowej), zamiast dryfować. Wielomian korekcji usuwa ją tylko wtedy, gdy jego stopień przekracza to, co zestaw keplerowski już obejmuje: wzdłuż toru 7, poprzecznie 5 i radialnie 6 sprowadzają 15-minutową resztę z centymetrów do około milimetra, podczas gdy niższe stopnie poprzeczne nie usuwają prawie nic (reszta poprzeczna jest nieparzysta względem środka okna). System, który część keplerowską wyznacza inaczej, zostawia resztę o innym kształcie, a potrzebne stopnie z niej wynikają. Własne stopnie korekcji presetu Celeste (niższe niż te; istnieją tylko w pliku presetu, src/celeste_iod.rs) działają tutaj na bazie najmniejszych kwadratów Kshana, dlatego jego człony poprzeczne wnoszą w tym silniku niewiele: to stwierdzenie o dopasowaniu Kshana, a nie o jakimkolwiek rzeczywistym systemie. toe i toc są całkowitymi sekundami, tak jak niesie je format binarny.
Każdy komunikat jest używany przez okres wyśrodkowany w jego oknie dopasowania (pierwsza tabela kompromisu używa całego okna). Wartości błędu odległości sygnału w przestrzeni (SISRE) mierzą błąd reprezentacji komunikatu względem wzorca, do którego został dopasowany, jako pierwiastek ze średniej kwadratowej (RMS) i maksimum na przedziale. Błąd wyznaczania i predykcji orbity, który rzeczywisty segment naziemny lub pokładowy dodaje na wierzch, nie jest modelowany.
Błąd odległości sygnału w przestrzeni#
sisre.rs używa globalnie uśrednionego SISRE z pracy Montenbrucka, Steigenbergera i Hauschilda (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²) )
Wagi są średnimi dla użytkowników rozłożonych równomiernie na widocznej czaszy Ziemi z cos² η i ½ sin² η, gdzie η jest kątem nadirowym linii widzenia przy satelicie, obliczonym dla promienia orbity i maski elewacji. Przy masce 0° obliczenie odtwarza tabelę z artykułu dla średniej orbity okołoziemskiej (GPS 0,98 i 1/49, GLONASS 1/45, Galileo 1/61, BeiDou 1/54) i orbity geostacjonarnej (0,99 i 1/126): to jest kontrola VALIDATED. Na LEO to samo uśrednienie daje
| Wysokość | w_R |
1 / w_AC² |
kąt nadirowy horyzontu |
|---|---|---|---|
| 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° |
więc użytkownik LEO, który widzi satelitę daleko od nadiru, odczuwa błędy wzdłuż toru i poprzeczne znacznie silniej niż użytkownik orbity średniej.
Analizy#
analysis = [...] wybiera dowolne z czterech (domyślnie wszystkie).
Kompromis przedziału dopasowania#
[trade] ustawia przedział, przedziały dopasowania, okresy aktualizacji i modele. scenarios/leo-navmsg-fit-interval-trade.toml (550 km, 97,6°, EGM2008 do stopnia 20 i opór, 30 minut komunikatów) daje, przy okresie użycia równym przedziałowi dopasowania:
| Model | Przedział dopasowania | RMS SISRE orbity | Maks. SISRE orbity | RMS SISRE z zegarem | RMS radialny / wzdłuż toru / poprzeczny |
|---|---|---|---|---|---|
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 |
A przy dopasowaniu 300 s, przy zmiennej częstości przejmowania przez nowy komunikat:
| Model | Okres aktualizacji | RMS SISRE orbity | Maks. SISRE orbity |
|---|---|---|---|
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 |
16-parametrowy zestaw keplerowski pogarsza się z 0,04 cm przy 60 s do 9,35 cm przy 900 s: jeden zestaw keplerowski z harmonicznymi dwa razy na obieg nie może przez dłużej niż kilka minut nadążać za grawitacyjnymi członami o wyższej częstotliwości i oporem łuku LEO, a jego reszta z najmniejszych kwadratów oscyluje w oknie. Wielomiany wzdłuż toru/poprzeczne/radialne (stopnie 7, 5, 6) pochłaniają to, co zostaje: 1,01 cm przy 900 s, 0,21 cm przy 600 s. Przy najkrótszych przedziałach wartości keplerowskie są poniżej milimetra i nie są już ściśle uporządkowane (dopasowanie jest wtedy ograniczone uwarunkowaniem, a nie modelem).
Porównanie modeli#
scenarios/leo-navmsg-model-comparison.toml uruchamia cztery modele przy 1, 5 i 10 minutach na tej samej orbicie, z liczbą parametrów i bitami efemerydy i zegara w kodowaniu Kshana:
| Model | Przedział dopasowania | Parametry | Bity efemerydy + zegara | RMS SISRE orbity | RMS SISRE z zegarem |
|---|---|---|---|---|---|
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 (zerowy zegar) |
60 s | 22 | 750 | 0,000 cm | 28,784 cm |
ecef-poly (zerowy zegar) |
300 s | 22 | 750 | 0,005 cm | 28,784 cm |
ecef-poly (zerowy zegar) |
600 s | 22 | 750 | 0,561 cm | 28,774 cm |
Wiersz zerowego zegara jest oceniany względem zegara sterowanego z resztą 0,24 m (wartość ATOMIC), pozostałe względem swobodnie biegnącego zegara, który dopasowują.
Liu i in. 2025, SISRE w funkcji wysokości (MODELLED). Ten sam scenariusz dopasowuje 22-parametrowy model Kshana na 20-minutowych łukach dla pięciu wysokości z artykułu, przy inklinacji każdego satelity:
| Satelita | Wysokość | Inklinacja | Liu i in. 2025 | Kshana (RMS tylko orbity) | stosunek |
|---|---|---|---|---|---|
| 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 |
To nie jest sprawdzenie względem niezależnego wzorca zewnętrznego. Artykuł dopasowywał rzeczywiste precyzyjne orbity naukowe wymienionych satelitów (z pełną historią grawitacji, oporu i sił niegrawitacyjnych); Kshana dopasowuje własną scałkowaną orbitę, oblicza sześć dodanych parametrów w opisany wyżej sposób i używa własnych wag SISRE. Porównanie pokazuje trend i rząd wielkości. Porównanie na tych samych rzeczywistych orbitach, które dopasowywał artykuł, to tests/leo_navmsg_fit_real_orbit_oracle.rs (od 0,30 dopasowanie 22-parametrowe zgadza się tam w ramach ustalonego z góry czynnika 1,5, na dniach z artykułu i na ośmiu dniach wstrzymanych).
Aktualizacja w środku przelotu#
[midpass] umieszcza użytkownika (domyślnie 45° N, 10° E), znajduje najwyższy przelot nad maską w granicach search_s i planuje komunikaty co update_period_s. Przy każdym przełączeniu w trakcie przelotu raportuje skok położenia, skok zegara, skok pseudoodległości użytkownika (nowy komunikat minus stary), największy skok, jaki mógłby zobaczyć dowolny widoczny użytkownik (postać zamknięta po stożku nadirowym), błąd odległości przed i po oraz PASS lub FAIL względem threshold_m. scenarios/leo-navmsg-midpass-update.toml (dopasowania 300 s aktualizowane co 150 s):
Najwyższy przelot w ciągu doby sięga 43,7° i trwa 455 s. Jego przełączenia:
| Przełączenie | Elewacja | Skok pozycji | Skok zegara | Skok odległości użytkownika | Skok w najgorszej geometrii |
|---|---|---|---|---|---|
| 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 |
Największy skok odległości użytkownika 0,35 mm wobec progu 5 cm: PASS.
Kodowanie i dekodowanie#
scenarios/leo-navmsg-encode-decode.toml koduje pierwszy z trzech komunikatów, dekoduje go, sprawdza CRC i odrzuca uszkodzoną kopię, wypisuje budżet kwantyzacji oraz zapisuje i odczytuje z powrotem blok w stylu RINEX i tabelę CSV:
- ramka: 171 bajtów (1310 bitów ładunku, z czego 1045 to efemerydy i zegar), 24-bitowa cykliczna kontrola nadmiarowa (CRC-24Q)
0x19105F; - największy efekt półkroku dla pojedynczego pola:
af0, 0,545 mm; - cały komunikat po kwantyzacji: pozycja w granicach 1,126 mm i zegar w granicach 0,185 mm od komunikatu dokładnego; SISRE 0,113 cm dla komunikatu dokładnego, 0,129 cm dla zdekodowanego;
- ramka z jednym odwróconym bitem zostaje odrzucona: true;
- pełny obieg w stylu RINEX w granicach 5.0e-06 m, pełny obieg CSV w granicach 0.0e+00 m.
Niezależność od platformy#
Ramka to przesyłane liczby całkowite, więc muszą to być te same liczby niezależnie od tego, gdzie i jak scenariusz jest uruchamiany: natywny plik binarny w dowolnym systemie operacyjnym, kompilacja debug lub release oraz kompilacja WebAssembly (WASM) w przeglądarce. Przeszkadziły trzy rzeczy. Sinus, cosinus, arcus tangens i funkcja wykładnicza z biblioteki matematycznej hosta nie muszą być poprawnie zaokrąglane i różnią się między hostami na ostatnim miejscu. Zoptymalizowana kompilacja w systemie macOS pobiera sinus i cosinus tego samego argumentu z łącznej procedury systemowej, która nie zawsze zwraca wartość samego sinusa, więc różniły się także kompilacje debug i release. A zwykły generator rozkładu normalnego wywołuje wykładniczą i logarytm hosta w swoich rzadkich gałęziach. Dopasowanie zamienia tak małą różnicę w inne skwantowane pola. Cały rodzaj (orbita i zegar prawdziwy, dopasowanie, algorytm użytkownika, błąd odległości w sygnale w przestrzeni (SISRE), kodek) oblicza więc każdą taką funkcję za pomocą czysto rustowego crate'a libm przez src/portable_math.rs, potęgi całkowite jako jawne iloczyny, a odchylenia normalne metodą biegunową na surowym wyjściu generatora. leo_navmsg::tests::the_encoded_frame_is_the_same_bytes_on_every_platform przypina 171-bajtową ramkę scenariusza kodowania i dekodowania poniżej oraz jedną wartość kontrolną na model efemeryd; kompilacja debug, kompilacja release i kompilacja WASM dają bajt w bajt identyczne dokumenty wyników dla wszystkich pięciu dołączonych scenariuszy leo-navmsg.
Format binarny#
To jest własne, udokumentowane kodowanie Kshana. Przenosi składniki, które wymieniają opublikowane opisy komunikatów nawigacyjnych LEO, zbudowane na wzór zestawu pól Galileo ICD. To nie jest układ bitów Celeste ani żadnego innego systemu: żaden nie jest publiczny.
Ramka: preambuła 0xA7 (8 bitów), wersja 1 (4), model (4: 1 kepler16, 2 kepler-rac, 3 liu22, 4 ecef-poly), długość ładunku w bajtach (12), ładunek dopełniony zerami do pełnego bajtu, CRC-24Q (24-bitowa cykliczna kontrola nadmiarowa, 24 bity) z każdego poprzedzającego bajtu. CRC-24Q to kontrola ze standardu RTCM 10403 Radio Technical Commission for Maritime Services oraz z Galileo ICD (wielomian 0x1864CFB, wartość początkowa 0); kod odtwarza katalogową wartość kontrolną 0xCDE703 dla 123456789 oraz bajty kontrolne przykładowej ramki RTCM 10403 typu komunikatu 1005 (VALIDATED).
Kroki z Galileo ICD dobrano dla średniej orbity okołoziemskiej i są zbyt zgrubne dla komunikatu LEO o centymetrowej dokładności: Crs w krokach co 2⁻⁵ m (3,1 cm), Cuc 2⁻²⁹ rad (1,3 cm przy promieniu orbity LEO), kąty 2⁻³¹ półkola (1,0 cm) i af0 2⁻³⁴ s (1,7 cm). Kshana zachowuje jednostki ICD i konwencję półkola, zmniejsza kroki tak, by błąd półkroku każdego pola pozostawał poniżej 1 mm pozycji lub odległości w oknie 15 minut, i poszerza pola, aby zachować zakresy potrzebne dopasowaniu LEO:
| Blok | Pole | Bity | Krok | Jednostka |
|---|---|---|---|---|
| pomocnicze i synchronizacyjne | SVID |
8 | 1 | - |
| pomocnicze i synchronizacyjne | IOD |
10 | 1 | - |
| pomocnicze i synchronizacyjne | Band |
4 | 1 | - |
| pomocnicze i synchronizacyjne | Health |
2 | 1 | - |
| pomocnicze i synchronizacyjne | WeekNumber |
13 | 1 | tydzień |
| pomocnicze i synchronizacyjne | ToW |
20 | 1 | s |
| pomocnicze i synchronizacyjne | Flags |
4 | 1 | - |
| zegar (bit flagi 0) | toc |
20 | 1 | s |
| zegar (bit flagi 0) | af0 |
34 | 2^-38 | s |
| zegar (bit flagi 0) | af1 |
28 | 2^-50 | s/s |
| zegar (bit flagi 0) | af2 |
20 | 2^-62 | s/s^2 |
| keplerowskie (modele 1-3) | toe |
20 | 1 | s |
| keplerowskie (modele 1-3) | M0 |
36 | 2^-35 | półkole |
| keplerowskie (modele 1-3) | e |
32 | 2^-33 | - |
| keplerowskie (modele 1-3) | sqrtA |
36 | 2^-23 | m^0,5 |
| keplerowskie (modele 1-3) | Omega0 |
36 | 2^-35 | półkole |
| keplerowskie (modele 1-3) | i0 |
36 | 2^-35 | półkole |
| keplerowskie (modele 1-3) | omega |
36 | 2^-35 | półkole |
| keplerowskie (modele 1-3) | deltaN |
29 | 2^-43 | semicircle/s |
| keplerowskie (modele 1-3) | OmegaDot |
29 | 2^-43 | semicircle/s |
| keplerowskie (modele 1-3) | iDot |
22 | 2^-43 | semicircle/s |
| keplerowskie (modele 1-3) | Cuc |
26 | 2^-34 | rad |
| keplerowskie (modele 1-3) | Cus |
26 | 2^-34 | rad |
| keplerowskie (modele 1-3) | Crc |
26 | 2^-10 | m |
| keplerowskie (modele 1-3) | Crs |
26 | 2^-10 | m |
| keplerowskie (modele 1-3) | Cic |
26 | 2^-34 | rad |
| keplerowskie (modele 1-3) | Cis |
26 | 2^-34 | rad |
| poprawki wzdłuż toru/poprzeczne/promieniowe (model 2) | degA |
3 | 1 | - |
| poprawki wzdłuż toru/poprzeczne/promieniowe (model 2) | degC |
3 | 1 | - |
| poprawki wzdłuż toru/poprzeczne/promieniowe (model 2) | degR |
3 | 1 | - |
| poprawki wzdłuż toru/poprzeczne/promieniowe (model 2) | racTauExp |
4 | 1 | log2(s) |
| poprawki wzdłuż toru/poprzeczne/promieniowe (model 2) | a_k, c_k, r_k |
22 | 2^-14 | m |
| dodatki Liu et al. 2025 (model 3) | aDot |
26 | 2^-20 | m/s |
| dodatki Liu et al. 2025 (model 3) | nDot |
30 | 2^-58 | półkole/s^2 |
| dodatki Liu et al. 2025 (model 3) | Crs3 |
26 | 2^-10 | m |
| dodatki Liu et al. 2025 (model 3) | Crc3 |
26 | 2^-10 | m |
| dodatki Liu et al. 2025 (model 3) | Crs1 |
26 | 2^-10 | m |
| dodatki Liu et al. 2025 (model 3) | Crc1 |
26 | 2^-10 | m |
| wielomian ECEF (model 4) | tref |
20 | 1 | s |
| wielomian ECEF (model 4) | degP |
4 | 1 | - |
| wielomian ECEF (model 4) | x0, y0, z0 |
38 | 2^-11 | m |
| wielomian ECEF (model 4) | x_k, y_k, z_k (k >= 1) |
34 | 2^-12 | m |
| Klobuchar (bit flagi 1) | alpha0 |
8 | 2^-30 | s |
| Klobuchar (bit flagi 1) | alpha1 |
8 | 2^-27 | s/semicircle |
| Klobuchar (bit flagi 1) | alpha2 |
8 | 2^-24 | s/półkole^2 |
| Klobuchar (bit flagi 1) | alpha3 |
8 | 2^-24 | s/półkole^3 |
| Klobuchar (bit flagi 1) | beta0 |
8 | 2^11 | s |
| Klobuchar (bit flagi 1) | beta1 |
8 | 2^14 | s/semicircle |
| Klobuchar (bit flagi 1) | beta2 |
8 | 2^16 | s/półkole^2 |
| Klobuchar (bit flagi 1) | beta3 |
8 | 2^16 | s/półkole^3 |
| NeQuick-G (bit flagi 2) | ai0 |
11 | 2^-2 | sfu |
| NeQuick-G (bit flagi 2) | ai1 |
11 | 2^-8 | sfu/deg |
| NeQuick-G (bit flagi 2) | ai2 |
14 | 2^-15 | sfu/deg^2 |
| NeQuick-G (bit flagi 2) | SF1-5 |
5 | 1 | - |
| UTC (bit flagi 3) | A0 |
32 | 2^-30 | s |
| UTC (bit flagi 3) | A1 |
24 | 2^-50 | s/s |
| UTC (bit flagi 3) | dtLS |
8 | 1 | s |
| UTC (bit flagi 3) | t0t |
8 | 3600 | s |
| UTC (bit flagi 3) | WNot |
8 | 1 | tydzień |
| UTC (bit flagi 3) | WNLSF |
8 | 1 | tydzień |
| UTC (bit flagi 3) | DN |
3 | 1 | doba |
| UTC (bit flagi 3) | dtLSF |
8 | 1 | s |
Wartość spoza zakresu pola jest odrzucana, a nie zawijana. Zakresy sprawdzono, kodując dopasowania dla 300 do 2000 km, nachyleń od 0° do 140° i przedziałów dopasowania do 20 minut: deltaN i OmegaDot są szerokie, ponieważ na orbicie prawie równikowej węzeł jest słabo określony, a dopasowanie dzieli między nie dryf J2 argumentu szerokości, natomiast aDot i nDot dlatego, że 22-parametrowe dopasowanie w ciągu 20 minut pochłania część krótkookresowych oscylacji wielkiej półosi. Od wersji 0,30 22-parametrowe dopasowanie to zwykła metoda najmniejszych kwadratów z pracy, bez rozkładów a priori, a równikowe dopasowanie dla 800 km wymaga wtedy nDot około 6.3e-10 półkola/s^2, więc jego skala zmieniła się z 2^-60 na 2^-58. Poprawki wzdłuż toru stopnia 7 dla kepler-rac mieszczą się w 22-bitowym zakresie współczynników do 15 minut; dłuższe dopasowanie może go przekroczyć i wtedy jest odrzucane. quantisation_budget podaje dla każdego pola efemeryd i zegara największą zmianę pozycji i odległości, jaką powoduje zmiana o półkrok w okresie użytkowania, oraz zmianę całego komunikatu po kwantyzacji.
Eksporty tekstowe#
RINEX 4,02 nie definiuje rekordów nawigacyjnych LEO (jego litery systemów to G, R, E, J, C, I i S; International Global Navigation Satellite System (GNSS) Service (IGS) RINEX 4,02). Blok zapisywany przez text.rs zapożycza kształt RINEX 4 — nagłówek rekordu > EPH, wiersz satelity i epoki z trzema składnikami zegara, wiersze orbity rozgłaszanej z czterema polami D19.12 — i jest udokumentowanym rozszerzeniem Kshana: litera systemu L, typy rekordów KP16, KRAC, LU22, APOL oraz trzy komentarze nagłówka, które o tym mówią. Wcześniejsze prace o orbitach LEO w rekordach nawigacyjnych w stylu 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
Tabela CSV zawiera komunikaty kepler16 i kepler-rac, po jednym w wierszu. Domyślne kolumny używają nazw z 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 wybiera zamiast tego zapis z gotowego ustawienia. Oba formaty można odczytać z powrotem.
Jonosfera i UTC#
- Klobuchar: model L1 silnika (
gnss_sim::klobuchar_delay_m, sprawdzony względem RTKLIB) skalowany do nośnej prawem pierwszego rzędu(f_L1 / f)². - NeQuick-G: współczynniki są przesyłane w komunikacie, a
effective_ionisation_levelzwracaAz = ai0 + ai1·μ + ai2·μ²dla zmodyfikowanej szerokości inklinacji magnetycznejμ, z regułami algorytmu (współczynniki równe zeru dają 63,7 jednostek strumienia słonecznego, sfu; wynik jest obcinany do [0, 400] sfu). Model gęstości elektronowej NeQuick i jego całkowanie wzdłuż drogi sygnału, które zamieniająAzna opóźnienie, nie są zaimplementowane. - Satelita na wysokości kilkuset kilometrów leci wewnątrz jonosfery. Żaden z modeli rozgłaszanych nie uwzględnia zawartości elektronów nad satelitą i nie stosuje się dla niej żadnej poprawki.
- UTC:
system_to_utcstosuje trzy przypadki z Galileo ICD §5.1.7 (przed zdarzeniem sekundy przestępnej, w ciągu sześciu godzin od niego i po nim); wstawiona sekunda ma wartość 86400.
Gotowe ustawienia#
Gotowe ustawienia to dane, po jednym pliku w src/leo_navmsg/presets/, wraz ze źródłami. Silnik i każdy dołączony scenariusz poza scenariuszem Celeste działają bez nich.
| Klucz | Źródło | Orbita | Nośna | Model komunikatu |
|---|---|---|---|---|
xona-pulsar |
PUBLIC, arXiv 2509,19551 | 1080 km, 53° | X1 1593,3225 MHz | nieopublikowany |
xona-pulsar-0 |
PUBLIC, arXiv 2509,19551 | 520 km, 97° | X1 | nieopublikowany |
iridium |
PUBLIC, raport RNTF, opis konstelacji | 781 km, 86,4° | 1621 MHz (pasmo 1616–1626 MHz) | brak rozgłaszania |
starlink |
PUBLIC, NAVIGATION 72(1), opis konstelacji | 550 km, 53° | pasmo Ku, wartość ze środka pasma (reprezentatywne) | brak (sygnały okazji) |
centispace |
PUBLIC, Sensors 2023, Satellite Navigation 2026 | 700 km, 55° | w pobliżu B1 (zamaskowane w źródle; L1 jako zastępnik) | nieopublikowany |
cband-generic |
REPRESENTATIVE | 600 km, 97,8° | 5020 MHz (środek pasma C RNSS) | nieopublikowany |
atomic |
PUBLIC, InsideGNSS | 500 km (reprezentatywne) | L1 (reprezentatywne) | ecef-poly, stopień 6, 60 s, odświeżany co 30 s, zerowy zegar, 0,24 m reszty sterowania |
celeste-iod |
WORKSHOP i PUBLIC | 510 km, 97,4° | 1191,795 MHz | kepler-rac, stopnie i odstęp rekordów w pliku gotowego ustawienia |
RNSS to służba nawigacji radiowej przez satelity (radionavigation-satellite service); RNTF to Resilient Navigation and Timing Foundation.
Celeste IOD. Gotowe ustawienie demonstracji na orbicie (IOD) Celeste Europejskiej Agencji Kosmicznej (ESA) jest jedynym, które wykorzystuje materiały przedstawione na warsztatach LEO-PNT programu ESA Navigation Innovation and Support Programme (NAVISP), 2026: strukturę komunikatu (zestaw keplerowski Galileo plus wielomiany poprawek wzdłuż toru/poprzecznych/promieniowych, wielomian zegara, SVID, stan zdrowia, IOD, parametry jonosferyczne i UTC), odstęp rekordów oraz nazwy kolumn CSV. Orbita (510 km, prawie biegunowa, heliosynchroniczna) i nośna pochodzą z publicznych źródeł podanych w pliku. Układ bitów Celeste nie jest publiczny i nie jest odtwarzany; późniejsze fazy Celeste i system LEO-PNT Unii Europejskiej (UE) mogą się różnić. Każda wartość pochodząca z warsztatów znajduje się w module navmsg w src/celeste_iod.rs, używanym przez scenarios/leo-navmsg-celeste-iod.toml. Jak to ustawienie jest wyłączane: każda liczba silnika pochodząca z warsztatów mieści się w jednym pliku, src/celeste_iod.rs, który build.rs kompiluje tylko wtedy, gdy istnieje, oraz w scenariuszach dostępnych tylko w repozytorium scenarios/*celeste-iod*.toml. Usunięcie tego pliku i tych scenariuszy wyłącza gotowe ustawienie bez zmian w kodzie źródłowym; każdy inny test, każda wyrocznia i każdy scenariusz działają bez niego, a liczba plików scenariuszy w README nadal liczy pliki wyłączone.
Weryfikacja#
| Wiersz | Etykieta | Wyrocznia |
|---|---|---|
| Wagi SISRE | VALIDATED | tabela Montenbruck et al. 2018 (GPS, GLONASS, Galileo, BeiDou, geostacjonarne) |
| algorytm użytkownika Galileo ICD | VALIDATED | RTKLIB eph2pos dla czterech rzeczywistych efemeryd rozgłaszanych Galileo, 1 mm na oś (tests/leo_navmsg_reference.rs) |
| CRC-24Q | VALIDATED | katalogowa wartość kontrolna 0xCDE703; przykładowa ramka RTCM 10403 1005 |
| Dopasowanie i kompromis SISRE | MODELLED | prawdziwy ruch dwóch ciał odtworzony z dokładnością 1 mm; poprawione dopasowanie J2–J6 do 1 mm; monotoniczny wzrost wraz z przedziałem |
| Ciągłość w środku przejścia | MODELLED | tożsamość skoku; granica stożka w postaci zamkniętej wobec próbkowania |
| Format binarny i budżet | MODELLED | pełne obiegi; półkrok każdego pola poniżej 1 mm |
| W stylu RINEX i CSV | MODELLED | pełne obiegi |
| 22-parametrowy model i dopasowanie Liu et al. 2025 | VALIDATED | precyzyjne orbity TU Graz ITSG czterech satelitów wobec tabel 4, 5, 6 i 8 z pracy: stosunki wzdłuż toru, poprzeczne, promieniowe i SISRE od 0,755 do 1,138 w dniach z pracy oraz od 0,683 do 1,186 w ośmiu dniach wstrzymanych, w granicach 1.5x (tests/leo_navmsg_fit_real_orbit_oracle.rs) |
| wielomian zerowego zegara ATOMIC i tabela pięciu wysokości | MODELLED | fakty ATOMIC z InsideGNSS; opublikowana tabela Liu wydrukowana obok dopasowania orbity scałkowanej przez Kshana, nieprzypięta |
| Jonosfera i UTC | MODELLED | postacie zamknięte z ICD; model Klobuchar sprawdzony względem RTKLIB |
Ograniczenia#
- SISRE to wyłącznie błąd reprezentacji: bez błędu wyznaczania orbity ani predykcji.
- Wzorcem prawdy jest całkowanie Kshana (bez trzeciego ciała, ciśnienia promieniowania słonecznego i pływów), a nie precyzyjna orbita rzeczywistego satelity.
- Format binarny i blok w stylu RINEX są własnością Kshana.
- NeQuick-G jest przenoszony, a nie całkowany do opóźnienia; brak poprawki dla satelity wewnątrz jonosfery.
- Porównanie z Liu et al. różni się orbitami, odczytem parametrów i wagami.