Dziennik zmian
Wszystkie istotne zmiany w Kshana są udokumentowane tutaj.
Format opiera się na Keep a Changelog, a ten projekt stosuje Semantic Versioning. Dopóki projekt jest przed wersją 1.0, publiczny schemat scenariuszy i wyników może się jeszcze zmieniać; zmiany niezgodne wstecz są wyraźnie wskazywane.
Niewydane#
[0.40.0] - 2026-10-29#
0,40 dodaje wątek misji klasy Artemis i jego segment księżycowy, etykietę dowodową przy każdej wartości i tabeli zapisywanej przez przebieg, wczytywanie i dopasowywanie zmierzonych zegarów, sprawdzanie zgłoszeń partnerów danych, szacowany obszar emitera na podstawie raportów ADS-B lub AIS, ponowną kampanię benchmarku 0,40 oraz wiersz poleceń, raporty i Studio w siedemnastu językach obok angielskiego (dokumenty maszynowe pozostają po angielsku). Macierz weryfikacji rośnie z 388 do 401 wierszy: 176 VALIDATED (bez zmian), 221 MODELLED (było 208) i 4 PARTNER. Żaden wiersz nie został awansowany do VALIDATED. Rodzaje scenariuszy rosną z 87 do 92. Każdy próg, którego porównanie zarejestrowane wstępnie nie osiągnęło, jest podany poniżej i pozostaje przypięty; żaden nie został poluzowany. Oświadczenie doradcze pozostaje bez zmian: Kshana jest oprogramowaniem wyłącznie doradczym, nie jest sprzętem nawigacyjnym z zatwierdzeniem typu ani certyfikacją; za nawigację odpowiada nadal operator.
Znane ograniczenia#
- Przebiegi w językach innych niż angielski trwają około dwa razy dłużej, ponieważ scenariusz jest uruchamiany dwukrotnie (raz po angielsku dla plików maszynowych, raz w wybranym języku dla człowieka).
- Niektóre zdania Studio są składane z fragmentów i w językach z rodzajem gramatycznym mogą brakować w nich rodzajników.
- Tłumaczenia są tłumaczeniami maszynowymi, których nie zweryfikował żaden rodzimy użytkownik języka; wzorcem jest angielski.
Dodano#
- Siedemnaście języków obok angielskiego dla tekstu silnika przeznaczonego dla człowieka oraz dla serwisu i Studio: nl, pl, pt-BR, pt-PT, fi, sv, da, nb, cs, uk, ru, de, fr, es, et, ja, zh-Hans (
--lang,KSHANA_LANG, zmienne ustawień regionalnych;langw wywołaniach biblioteki, Pythona, WebAssembly i MCP). Komunikaty i błędy wiersza poleceń, podsumowania przebiegów, tekst wykresów,report.html, opisy rodzajów i oświadczenia doradcze są tłumaczone; dokumenty maszynowe (JSON, CSV, kody błędów, macierz weryfikacji) pozostają po angielsku, a przebieg w języku innym niż angielski wykonuje scenariusz raz po angielsku dla plików maszynowych i raz w wybranym języku dla człowieka (docs/i18n.md). Tłumaczenia są tłumaczeniami maszynowymi, niezweryfikowanymi przez rodzimych użytkowników języka; wzorcem jest angielski;REVIEW.mdkażdego języka wymienia, co recenzent powinien sprawdzić najpierw, a strony serwisu zawierają informację o tym. Słowa werdyktów, poziomy dowodowe i zakres oświadczenia doradczego („nie jest to sprzęt z zatwierdzeniem typu”, „nie jest to certyfikacja”, „operator nadal ponosi odpowiedzialność”) są zachowane w każdym języku. kshana interference-map locate: szacowany obszar emitera na podstawie raportów ADS-B lub AIS. Rozkład a posteriori tego, gdzie może znajdować się źródło pogorszonych raportów pozycji (łączność radiowa w linii wzroku na promieniu 4/3 Ziemi, wysokość anteny emitera i moc zmarginalizowane, dotknięte statki powietrzne przyciągają, a niedotknięte z linią wzroku odpychają), zapisany jako obszary na poziomach 50, 90 i 95%, centroid z jego elipsą niepewności (nigdy goły punkt), sesje w czasie (początek, koniec, czas trwania, obszar dotknięty, odrębne statki powietrzne powyżej minimum publikacji), profil pory dnia i godziny na dobę, z opcjonalnym połączeniem pozycji TDOA zgeolocation. Wyniki: GeoJSON, podsumowanie JSON, CSV sesji i rysunek SVG, każdy z licencją, atrybucją, identyfikatorem metody, założeniami, ograniczeniami i swoją etykietą dowodową. Bibliotekainterference_map::api::emitter_regions_from_*, Python i WebAssemblyinterference_emitter_regions. MODELLED (wiersz rejestruVM-bc70cb57; macierz ma teraz 401 wierszy, 176 VALIDATED, 221 MODELLED, 4 PARTNER); skalibrowane tylko na danych syntetycznych, a porównanie z lokalizacjami nadajników Jammertest 2025 zostało zarejestrowane wstępnie i uruchomione raz: ADS-B i AIS oba NOT ASSESSABLE (zbyt mało zaplanowanych sesji w otwartych danych), więc wiersz pozostaje MODELLED (docs/emitter-region/RESULTS.md). Neutralne sformułowania, tylko zbiorczo; publikowanie obszarów emiterów w publicznym obserwatorium pozostaje wyłączone. Przykład syntetyczny znajduje się wexamples/emitter-region/(docs/INTERFERENCE-MAP.md).- Zmierzone dzienniki zegara.
src/clock_log.rsodczytuje zmierzony dziennik zegara do jednej serii fazy: osiem formatów (RINEX clock, TimeLab, TICC, linuxptpptp4l,phc2sysits2phc, chrony tracking i statistics), każdy jako udokumentowany podzbiór; wszystko spoza niego jest odrzucane z błędem, który nazywa to, co znaleziono. Używa gotelecom-timing([series.clock_log]) i rodzaj zegara ([clock_log], który dodaje blokmeasuredz SHA-256 dziennika oraz nakładającymi się ADEV, TDEV i MTIE), z dołączonym scenariuszemclock-measured-log(docs/CLOCK-LOG-FORMATS.md). Porównanie z allantools na rzeczywistych danych publicznych względem progów zarejestrowanych wstępnie: pierwszy przebieg nie osiągnął B1 (5 z 11 przypadków, wszystkie znaczniki czasu TICC przechowywane jakof64), B2, B3 (7 z 24 przypadków) i B4 (nie sprawdzano wersji nagłówka); po poprawkach B1, B3 i B4 są osiągnięte, a B2 jest osiągnięty z wyjątkiem jednej pary MTIE, która jest przypięta i nie jest defektem silnika (allantools 2024,6 usuwa średnią częstotliwość przed całkowaniem; względem jego MTIE w trybie fazy silnik zgadza się z dokładnością do 1e-10). Wiersz pozostaje MODELLED (tests/fixtures/clock_log_real/RESULTS.md). - Holdover sterowany dopasowaną zmierzoną serią:
[clock_fit]rodzaju zegara dopasowuje szum zmierzonej serii i steruje na jego podstawie holdover (src/clock_fit.rs, dołączony scenariuszclock-fitted-log). Porównanie zarejestrowane wstępnie: F1(b), F3 i F4 osiągnięte; F1(a) (odzyskanie zarejestrowanego szumu FM typu błądzenie losowe) NOT MET na zapisach C3 (z założenia nieidentyfikowalne) i na dwóch z trzech zapisów C4 (FM typu błądzenie losowe pochłonięty przez FM typu flicker i dryf); F2 (identyfikacja szumu względem allantools) osiągnięte na jedenastu z dwunastu zapisów i D3 oraz NOT MET na D2 w zarejestrowanej postaci (osiągnięte w porównaniu jednakowym). Wszystkie niespełnione progi są przypięte (tests/clock_fit_known_noise.rs); blokfittedi sterowany nim holdover pozostają MODELLED (tests/fixtures/clock_fit/RESULTS.md). - Ponowna kampania benchmarku 0,40, zarejestrowana wstępnie z zatwierdzeniem właściciela przed jakimkolwiek przebiegiem: A3 (EXPLORATORY, AUC z bootstrapu skupionego po folderach dla
agc_k_sigma, kwantyl 2,5 % 0,8502 wobec 0,80), D3 (EXPLORATORY, trzy z pięciu detektorów przekraczają lukę optymizmu 0,05 przy skali 0,25), R3 (AUC 1,0) i R4 (P_fa 0,0, P_d 1,0): wszystkie MET, wszystkie MODELLED. A2, D1 i R1 pozostają nietknięte i nadal NOT MET; nic tu ich nie zamyka (xval/bench/RESULTS-0.40.md, Bench). kshana partner check <submission.toml>: sprawdza format i metadane zgłoszenia partnera danych (kshana.partner-submission/1: urządzenie, plik danych i SHA-256, sposób zebrania, wiersze MODELLED, dla których jest oferowane, licencja, oświadczenia) i odczytuje dane własnymi czytnikami silnika dzienników zegara lub IMU. Niczego nie ocenia i niczego nie waliduje. Przykład syntetyczny znajduje się wexamples/partner-submission/.docs/PARTNER-DATA.md: które wiersze rejestru MODELLED mogłyby awansować dzięki zmierzonym danym, jakie formaty są przyjmowane, jak zgłoszenie jest sprawdzane, oceniane względem progu zarejestrowanego wstępnie i zaliczane oraz co oznaczają PARTNER i VALIDATED; szkic notatki dla właściciela wdocs/drafts/PARTNER-OUTREACH.md(nic nie jest wysyłane).- Drugie kampanie dla niespełnionych progów
gnss-ssvilunar-infrastructure, przeprowadzone zgodnie z rejestracją wstępną (xval/gnss-ssv/PREREGISTRATION-v2.md,xval/lunar-infra/PREREGISTRATION-v2.md; zatwierdzone przed jakimkolwiek przebiegiem). Każde pierwotne niespełnienie pozostaje NOT MET i przypięte.gnss-ssv: kontrola odtwarza przebieg 1 komórka po komórce; pięć ablacji pojedynczego odczytu doprowadza 2 z 78 niespełnionych komórek do tolerancji (EXPLORATORY, bez progu); nowy próg S7b (kształt nadawania z opadaniem i podłogą dopasowany na panelach Classic IIR) jest NOT MET na panelach IIR-M przy 3,83 do 3,95 dB wobec 3 dB; kampania zapieczętowanych opublikowanych odbiorów nie została uruchomiona (nie przypięto źródła) (xval/gnss-ssv/RESULTS-v2.md).lunar-infrastructure: nowe progi C3a, C3b (granica detekcji około 3e-9 m/s2), Q3a, Q3b (dokładna dystrybuanta normalna usuwa różnicę 1.7e-6) i G3'' są osiągnięte jako własne progi, a G3' z ilustracyjnymi rozkładami a priori jest osiągnięty i oznaczony jako EXPLORATORY (xval/lunar-infra/RESULTS-v2.md). Wszystko pozostaje MODELLED. Nowe elementy publiczne:kshana::lambda::{erfc_accurate, normal_cdf_accurate, bootstrap_success_rate_accurate}. - Etykieta dowodowa przy każdej wartości i tabeli zapisywanej przez przebieg. JSON wyniku ma klucz
evidence, SVG wykresu element metadanych i wiersz pod wykresem, a tabela CSV# evidence:wierszy komentarza: poziom (VALIDATED,MODELLEDlubPARTNER, według najsłabszego z wierszy) oraz identyfikatory wierszy macierzy weryfikacji, na których opiera się przebieg. Wiersze i statusy są odczytywane z macierzy, a nie wpisywane; identyfikatory są stabilne (VM-i osiem cyfr szesnastkowych, nowa kolumnaIDwdocs/VERIFICATION-MATRIX.md, zamrożona lista wtests/fixtures/evidence_ids.txt). Także przy receiver-trust,jammertest score,iq acquire/sweep/track/monitor, raporcie ekspozycji trasy oraz, wewnątrz podpisanegoconfig.json, w każdym pakiecie dowodowym (config_version1,1;kshana evidence verifypodaje poziom; pakiety wykonane przed 0,40 weryfikują się bez zmian).tests/evidence_labels_doc_sync.rskończy się niepowodzeniem, jeśli wartość nie ma etykiety, etykieta nie zgadza się z macierzą albo nowy zapisujący pliki nie jest ani oznaczony, ani wymieniony z podaniem powodu. Wyniki, które jej nie mają, są wymienione wdocs/SURFACES.md. Trzy wykresy demonstracyjne z README zostały wyrenderowane ponownie z etykietą (jej usunięcie przywraca dawne bajty;docs/revisions/STUDIO15-evidence-label-0.40.md). Żadne twierdzenie się nie zmieniło. - Rodzaj scenariusza
mission-thread(scenarios/mission-thread-artemis-class.toml,docs/MISSION-THREAD.md): budżet błędu nawigacji i czasu łańcucha faz od startu do wejścia w atmosferę, każda liczba MODELLED i każde wejście podane. Osiem rodzajów faz:launch-ascent,leo-rendezvous(kowariancja względna Clohessy'ego-Wiltshire'a na odcinkach czujników, okno połączenia),tli-and-cruise(propagacja Cowella z macierzą przejścia stanu liczoną różnicą skończoną, błąd impulsu, aktualizacjegnss-ssvi śledzenia naziemnego, Księżyc z opcjonalnego wycinka jądra DE440),entry(sigma kąta toru lotu, prawdopodobieństwo korytarza, szczytowe opóźnienie na brzegach korytarza, obszar lądowania) oraz cztery rodzaje księżycowe. Zasady przekazania (carry,inflate,reacquire), konwersje układów odniesienia i skal czasu jako osobne wiersze budżetu, opcjonalna nakładka sieci naziemnej ustalająca cykl śledzenia każdej fazy, margines względem podanych wymagań i najsłabsze ogniwo. Przykład podąża za sekwencją z publicznego zestawu slajdów koncepcji operacji NASA z liczbami ILLUSTRATIVE: kompletny przykład klasy Artemis w 11 fazach, segmenty ziemski i księżycowy. Propagację cislunarną porównano z publiczną trajektorią Artemis I na łuku 72 h względem progu ustalonego wxval/mission-thread/PREREGISTRATION.mdprzed przebiegiem: NOT MET (45,3 km i 0,25 m/s wobec 5 km i 0,05 m/s). Diagnostyka lokalizuje chybienie w pięciu małych zdarzeniach impulsowych we wzorcu; między nimi model sił odtwarza godzinowe stany z medianą 0,4 m. Wiersz pozostaje MODELLED (xval/mission-thread/RESULTS.md). - Segment księżycowy wątku misji klasy Artemis: cztery rodzaje scenariuszy, każdy także rodzajem fazy interfejsu
mission-thread(src/mission_thread/lunar/), wszystkie MODELLED.lunar-orbit-rendezvous: nawigacja względna do połączenia na kołowej orbicie polarnej o wysokości 100 km albo na eliptycznej orbicie polarnej 100 km na 3000 km (scenarios/lunar-orbit-rendezvous.toml,...-elfo.toml). Wsadowe oszacowanie Gaussa-Newtona na łuku łączy pozycję bezwzględną każdego pojazdu z ilustracyjnego zestawu przekaźników klasy LCNS, trwały błąd sygnału w przestrzeni (wspólny dla obu pojazdów i niezależny) oraz odległość międzypojazdową, w modelu sił księżycowych biblioteki. Podaje położenie i prędkość względną w lokalnych osiach celu, dostępność pozycji, średni znormalizowany kwadrat błędu oszacowania wobec jego wartości oczekiwanej, koszt zignorowania harmonicznych grawitacji, modele końcowych czujników względnych obok wartości wyłącznie z sygnałów oraz przekazywaną kowariancję 6x6.lunar-descent: budżet rozrzutu lądowania w miejscu przy biegunie południowym (scenarios/lunar-descent.toml;lunar-descent-lola.tomlodczytuje DEM LOLA z kopii repozytorium): pięciostanowy model błędu inercjalnego na oś, pozycja AFS (samodzielna lub różnicowa, z użyciem reszty łącza korekcji zlunar-differential-pnt), pozycja względem terenu (dopasowanieterrain-navna jego syntetycznej rzeźbie albo ograniczenie Craméra-Rao dopasowania do DEM LOLA) oraz czas księżycowy przez zegar pojazdu (lunar-time-offset). Podaje elipsę lądowania 3-sigma, każdą kombinację wspomagań i kalibrację elipsy metodą Monte Carlo.lunar-surface: dostępność pozycjonowania i czasu według miejsca i pory roku (scenarios/lunar-surface.toml;lunar-surface-terrain.tomldodaje horyzont LOLA śledzony promieniem): wartość pozycjonowania dla jednego miejsca równa się wartości zmoonlight-service-volumeco do bitu; zmienia się z porą roku widoczność Ziemi i Słońca z efemeryd analitycznych.lunar-ascent: wznoszenie na orbitę spotkania i kowariancja pozycji i prędkości przenoszona z powrotem na orbitę (scenarios/lunar-ascent.toml), z rozrzutem przy wyłączeniu silnika podanym obok.docs/MISSION-THREAD-LUNAR.md; rejestracja wstępna, jej poprawki i każdy wynik, także niespełnione, wxval/mission-thread-lunar/.
Dowody#
- Zarejestrowane wstępnie w
xval/mission-thread-lunar/PREREGISTRATION.mdprzed jakimkolwiek przebiegiem, z sześcioma datowanymi poprawkami (każda wprowadzona przed pobraniem danych, z wyjątkiem poprawki 6, która koryguje błąd arytmetyczny w liczbie stanów po pobraniu i przed jakimkolwiek wynikiem A2; każda poprawka jest ujawniona w pliku). Żaden próg nie został poluzowany. - A1 (propagator względem odtworzonej trajektorii LRO z JPL Horizons, 24 h): MET, maksymalna różnica 3-D 33 m wobec progu 500 m i różnica promieniowa RMS 2,4 m wobec 60 m.
- A2 (ten sam propagator względem NRHO CAPSTONE na jednym obiegu trwającym 6,5 doby): NOT MET, różnica pozycji końcowej 136,8 km wobec progu 25 km i różnica promienia oskulacyjnego perycentrum 28,4 km wobec 10 km. Wiersz pozostaje MODELLED, a niespełnienie jest przypięte przez
tests/mission_thread_lunar_oracles.rs. - B1 (zgodność oszacowania spotkania z jego własnym modelem) jest MET przy czwartym projekcie estymatora, średnie NEES od 5,85 do 5,93 wobec pasma [5,2, 6,8]; trzy wcześniejsze projekty, rozszerzony filtr Kalmana w trzech wariantach, go nie osiągnęły. Piąta zmiana, wprowadzona po stwierdzeniu, że dostarczony scenariusz 2 h wprowadza 4 z 50 prób w minimum lokalne (średnie NEES 1e9), uruchamia dopasowanie Gaussa-Newtona na rosnącym łuku z połowieniem kroku; B1 nie zmienia się przez to, a dostarczone scenariusze dają 6,51 i 6,33. Historia jest w
xval/mission-thread-lunar/RESULTS.md. - Nic tu nie jest VALIDATED: wiersze wyroczni testują wspólny propagator, a nie filtr nawigacyjny, sygnał ani budżet.
[0.39.0] - 2026-10-22#
Bez nowych funkcji: jedna poprawka wiersza poleceń, aktualizacje zależności w narzędziach walidacji krzyżowej i dokumentacja. Wyniki silnika są bez zmian względem 0.38.0.
Poprawiono#
- Wiersz poleceń kończy się po cichu ze statusem 141, gdy jego standardowe wyjście zostaje zamknięte (
kshana kinds | head), zamiast zgłaszać panikę z komunikatem „failed printing to stdout: Broken pipe”. 141 to 128 plus SIGPIPE, status, który powłoka zgłasza dlayes | head. Obsługiwany jest tylko zamknięty potok: pełny dysk lub każdy inny błąd zapisu nadal się zgłasza, a żywy strumień zapisujący do zamkniętego gniazda nadal otrzymuje swój błąd zapisu.tests/cli_closed_pipe.rszamyka czytnik przed uruchomieniem programu, więc pierwszy zapis kończy się niepowodzeniem w każdym przebiegu.
Bezpieczeństwo#
Jedna aktualizacja zależności w dostarczanej bibliotece (pierwszy wpis), pozostałe w narzędziach do walidacji krzyżowej (xval/).
p256,p384ip521z 0,13 do 0,14 (wraz zelliptic-curve0.14.3,ecdsa0.17.0 icrypto-bigintz 0.5.5 do 0.7.10; także bezpośrednia zależnośćcrypto-bigint, obecnie 0,7) usuwają RUSTSEC-2026-0387, zmienność czasu wykonania wcrypto-bigint0.5.5. Kshana używa tych crate'ów wyłącznie do weryfikacji podpisów publicznych (klucz główny Galileo OSNMA i tokeny znaczników czasu RFC 3161), a podpisuje tylko w testach jednorazowymi kluczami, więc praktyczne narażenie było zerowe; aktualizacja usuwa ostrzeżenie bez wpisu ignorowania. Pliki blokad biblioteki i MCP zmieniają się oba; żaden wynik weryfikacji się nie zmienia (testy wektorowe OSNMA i znaczników czasu przechodzą bez zmian).- Minimalna obsługiwana wersja Rust to teraz 1,88 (wymagana przez poprawkę RUSTSEC-2026-0387).
memmap20.9.10 do 0.9.11 (RUSTSEC-2026-0186) w plikach lock kontroli krzyżowej ANISE (xval/anise-lunar-od,xval/anise-mars-od); pliki lock synchronizują też ponownie zależność ścieżkowąkshanaw repozytorium.pillow12.3.0 do 13.0.0 orazcertifi2026.7.22 do 2026.10.19 w przypięciach środowiska wyroczni (xval/oracles/requirements.lock,requirements.frozen.txt): wydania z poprawkami dla ośmiu zaleceń dotyczących pillow i jednego dotyczącego certifi.
Dokumentacja#
docs/BENCH.md, README i ten plik wymieniają każdy próg kshana-bench, który jest NOT MET, zgodnie z zapisem wxval/bench/RESULTS-v2.md: A2 (agc_k_sigmaAUC 0,766 wobec co najmniej 0,80 na podziale testowym), D1 (największa różnica 0,0301) oraz zadanie (b) R1 (przeniesione, nie uruchomione ponownie). Żaden próg nie został złagodzony.- Przegląd kompletności README: spis treści; rodzaje scenariuszy uporządkowane w rodziny, każdy ze stroną w
docs/kinds/by-kind/(opis i pola silnika, wejścia i wyniki przykładowego przebiegu, wiersze rejestru i wyrocznie, ograniczenia podawane w raporcie przebiegu oraz wykres zapisywany przez silnik), arkusz poglądowy dla każdej rodziny, wszystko indeksowane przezdocs/KINDS.md; każde polecenie wdocs/COMMANDS.md; każda powierzchnia, polecenie wtyczki, umiejętność i strona Studio wdocs/ALL-SURFACES.md; każda dziedzina możliwości wdocs/CAPABILITY-DOMAINS.md; osadzone diagramy Mermaid (przegląd systemu, powierzchnie, pętla wewnętrzna, zaufanie do odbiornika, obieg laboratoryjny, Studio, przepływ testów i wydań, mapa modułów, dystrybucja). Zapisywane przeztools/gen_kinds_index.py,tools/gen_readme_blocks.pyitools/gen_figures_038.py; audytowane przeztools/readme_audit.py; strzeżone przeztests/readme_completeness_doc_sync.rs, który przypina też opis i pola każdego wpisu do silnika. tools/render-diagram-chromium.sh: renderuje diagram Mermaid do SVG i PNG w systemie Linux i aktualizuje zapis renderowania.- README: rysunki dotyczące użytkowników kosmicznych i Księżyca używały ścieżek względnych do
docs/, więc nie wczytywały się z README; jedno łącze wskazywało na../../docs/JAMMERTEST.md. - Usunięto dwa nieaktualne, ręcznie skopiowane pliki wykresów (
docs/assets/clock-ensemble-band.svg,sweep-clock-stability.svg), których nie używała żadna strona i które nie zgadzały się już z silnikiem;docs/KINDS.mdzawiera aktualne wykresy.
[0.38.0] - 2026-10-19#
Dodano#
- GNSS poza konstelacją (
gnss-ssv). Nowy rodzaj scenariusza dla statków kosmicznych powyżej, wokół i poza orbitami GNSS (docs/SSV.md): dostępność jednego i czterech sygnałów, czasy trwania przerw, C/N0, DOP oraz łącza listka głównego i listków bocznych dla GPS, GLONASS, Galileo, BDS, QZSS i NavIC na powłoce lub wzdłuż trajektorii LEO, MEO, GEO, HEO i transferu księżycowego; wzorce nadawcze z broszury, parametryczne lub dostarczone przez użytkownika; model jonosfery, plazmosfery i atmosfery z promieniem stycznym; projekt odbiornika słabych sygnałów; pokładowy rozszerzony filtr Kalmana GNSS dla HEO i transferu księżycowego; oraz nawigacja względna formacji. Porównane z broszurą ICG Space Service Volume według wstępnej rejestracji zatwierdzonej przed przebiegiem: stałe minimalnej mocy promieniowanej i próg księżycowy są zgodne, pozostałe progi nie są spełnione przy odczytaniu zarejestrowanym z góry (prawie wszystkie przez niespójny kąt wiązki GLONASS w broszurze), a parametryczny zastępnik listków bocznych nie odtwarza zmierzonych wzorców paneli GPS. Wszystko pozostaje MODELLED (xval/gnss-ssv/RESULTS.md). - Orbita i powierzchnia Księżyca jako infrastruktura nawigacyjna i geodezyjna (
lunar-infrastructure). Nowy rodzaj scenariusza z pięcioma badaniami wybieranymi przezstudy(docs/LUNAR-INFRASTRUCTURE.md): spójność pokładowego wyznaczania orbity z Ziemi przez GNSS na prawie prostoliniowej orbicie halo względem niezależnego naziemnego wyznaczania odległości i prędkości zmiany odległości; wspólna podwójnie różnicowana faza nośnej stacji powierzchniowej i orbitera z całkowitoliczbowym ustalaniem LAMBDA; informacja Fishera siedmioparametrowego datum księżycowego z odległościami orbiter-powierzchnia i bez nich; różnice międzytechnikowe GNSS, VLBI i pomiaru laserowego względem lokalnego powiązania; oraz czułość na h2, k2, l2 i libracje fizyczne. MODELLED, z wejściami ILLUSTRATIVE: obliczenia sprawdzono względem niezależnych programów numpy i scipy i nic nie porównano z pomiarem wielkości księżycowej. Progi ustalono wxval/lunar-infra/PREREGISTRATION.mdi dwóch ujawnionych poprawkach. Trzy są NOT MET i każdy jest przypięty testem, który stwierdza chybienie: C3 (wstrzyknięty błąd siły nie jest wykrywany z zarejestrowaną z góry częstością), Q3 (bootstrapowa częstość powodzenia różni się od wyroczni numpy o 1.7e-6 przy progu 1e-9, z powodu przybliżenia dystrybuanty normalnej w LAMBDA) oraz połowa dotycząca śladu w G3 (dodanie rodziny odległości nie zawsze obniża ślad pseudoodwrotności). Pozostałe są spełnione (xval/lunar-infra/RESULTS.md). - Szósta praca w tabeli Badania. „Cislunar navigation is an observability problem: arc-length thresholds, Gramian conditioning, and the Doppler lever” (arXiv:2610,23871, eess.SP) pokazuje, że rozmycie dokładności jest niezdefiniowane dla śledzenia cislunarnego wyłącznie przez odległość, i zamiast tego używa grammianu obserwowalności na czterech płaskich dalekich orbitach wstecznych: sama odległość daje rząd 2 z 4 w jednej chwili i wymaga łuku około 2,09 h, prędkość zmiany odległości (Doppler) daje rząd 4 natychmiast, a współestymacja stacji ze stanami satelitów i zegarami pozostaje o jeden niedoborowa rzędem bez zewnętrznej obserwabli interferometrycznej. Jej liczby są regenerowane przez rodzaj
cislunar-observability(kshana scenarios/cislunar-observability.toml);cislunar-arc-recoverytestuje próg niezależnym estymatorem. Niosą ją karta badań w README, README crate, npm i PyPI oraz generator. - Neutralny arbiter, uczyniony mierzalnym.
kshana jammertest importodczytuje opublikowany katalog testów i plan transmisji NPRA Jammertest jako zaplanowaną prawdę odniesienia (identyfikatory katalogowe zachowane), akshana jammertest scoreocenia log odbiornika względem niego dla każdego testu (opóźnienie detekcji, niewykryte alarmy, fałszywe alarmy, czas do powrotu do normy), opcjonalnie jako podpisany pakiet dowodowy (docs/JAMMERTEST.md). Progi oceny zarejestrowano z góry przed jakimkolwiek ocenianym przebiegiem (xval/jammertest-score/). Na zbiorze danych JammerTest 2024 (pobieranym, nigdy nie dołączanym) zarejestrowana z góry reguła minimalnej ilości danych nie została spełniona zarówno w pierwszym przebiegu, jak i w rewizji obsługi danych, więc żaden próg nie podlega ocenie i niczego się nie twierdzi; oba przebiegi są zapisane i przypięte. MODELLED: harmonogram to zapisane w zbiorze danych okna, a nie zarejestrowane czasy emisji. Zbiór NMEA SimulaMet z 2025 roku nie jest adaptowany (brak podanej licencji na jego stronie). - Własne flagi odbiornika, obok flag Kshana. UBX-NAV-STATUS
spoofDetStatei UBX-SEC-SIG są odczytywane doself_reportw każdej epoce, a porównaniereceiver_self_reportw wyniku zestawia je z monitorami Kshana (oba, tylko odbiornik, tylko Kshana, żaden); nie wywołuje alarmu i nie zmienia żadnej oceny. Czytnik Septentrio SBF (PVTGeodetic, MeasEpoch, RFStatus, wyłącznie do odczytu, na cratesbf-toolsna licencji MIT) orazreceiver-trust live --serial(kanał NMEA szeregowy lub USB, wyłącznie do odczytu; nigdy nie zapisuje do odbiornika) dołączają do nich. - Synchronizacja czasu i bezpieczeństwo sprzętu (
docs/TIMING-HIL.md,docs/HARDWARE-SAFETY.md). Rodzaj scenariuszaholdover-testocenia test holdover systemu synchronizacji czasu (GNSS usunięty przez operatora, holdover, powrót) na podstawie zmierzonego zapisu błędu czasu, mierzony względem masek ITU-T z tabel publicznych.clock_logodczytuje logi linuxptp (ptp4l,phc2sys,ts2phc) i chrony (tracking,statistics).iq scene --format sdrxzapisuje metadane ION GNSS SDR, aiq monitor --followmonitoruje nagranie SigMF w trakcie jego powiększania się (tylko odbiór).compliance-reportzyskuje Foundational PNT Profile NIST IR 8323r1 (15 sparafrazowanych wierszy, dostarcza dowodów na (supports evidence for)). Pakiet dowodowy może zapisaćlab-attestationoperatora w swoim podpisanym manifeście, nigdy nie weryfikowane; etapy sprzętowe od 0 do 4 i uwagi prawne są wHARDWARE-SAFETY.md(oczekują na przegląd prawny). Nie ma żadnej ścieżki nadawczej. - kshana-bench v1 (
kshana bench,bench/SPEC.md,docs/BENCH.md): stałe zadania, podziały i metryki dla detekcji zakłóceń GNSS w logach odbiornika (JammerTest 2024) i IQ, predykcji holdover synchronizacji czasu (zegary IGS) oraz luki optymizmu poza rozkładem; manifesty podziałów z przypiętymi skrótami i skrypty pobierania (bez dołączania danych), zapieczętowany holdout przez commit i ujawnienie, schemat pliku wyników i statyczna strona rankingu. Punkty odniesienia według progów zarejestrowanych z góry wxval/bench/PREREGISTRATION.md: progi oceniającego spełnione, C1 do C3 spełnione, D2 spełnione; A2 NOT MET (agc_k_sigmaAUC 0,766 wobec co najmniej 0,80 na podziale testowym), D1 NOT MET (największa różnica 0,0301) i zadanie (b) R1 NOT MET (przeniesione, nie uruchomione ponownie), każdy przypięty (xval/bench/RESULTS-v2.md). Każda ocena jest MODELLED. Pythonbench_score,bench_leaderboard; WebAssembly tak samo; MCPscore_benchmark,render_leaderboard. - Obserwatorium zakłóceń (
kshana interference-map daily,sensitivity,docs/observatory/METHOD.md): odtwarzalne dzienne GeoJSON, PNG i JSON raportu incydentów z trzema stanami (pogorszone, niepogorszone, nieobserwowane), minimalnym opóźnieniem 24 h, komórkami o rozmiarze 0,5 stopnia lub grubszymi, bez przypisywania przyczyny i z odrzucaniem danych OpenSky; badanie czułości parametrów zarejestrowanych z góry; 30-dniowy bałtycki katalog wsteczny z adsb.lol. - Wejścia maszynowe i czujnikowe dla
receiver-trust(docs/MACHINE-INPUTS.md). Nowe wartości[log] format, wszystkie wyłącznie do odczytu, MODELLED, z samodzielnie napisanymi fixtures i bez dołączania danych:rtklib-pos(pliki rozwiązań RTKLIB.pos),novatel(OEM7 ASCII i binarneBESTPOS,RANGEC/No iRXSTATUS; flaga zagłuszacza odbiornika staje sięself_reportepoki, zestawianym z alarmami Kshana przez porównaniereceiver-self-report),rtcm3(C/N0 MSM4 i MSM7 dla GPS, GLONASS, Galileo, SBAS, QZSS, BeiDou i NavIC; układy z tabel pyrtcm na licencji BSD, których zawiadomienie jest wNOTICE, a nie z normy RTCM) orazgnss-sdr(komunikaty GNSS-SDR Monitor i monitora PVT jako linie JSON, przekazywane przezintegrations/gnss-sdr/relay.py). - Logi IMU jako drugi czujnik.
[log.imu](csvlubeuroc) całkuje prędkość kątową odchylenia z żyroskopu do kursu, który odczytuje monitorheading-course; wbudowane na każdej powierzchni i przenoszone przez pakiety dowodowe.kshana imu-fit(Pythonimu_fit, WebAssemblyimu_fit, MCPfit_imu_log, wtyczka/kshana-fit-imu, akcja JetBrains) dopasowuje parametry akcelerometru i żyroskopu scenariuszyhybridifusionna podstawie logu w spoczynku metodą odchylenia Allana i drukuje tabelę[accel_classical]z SHA-256 logu w jej pochodzeniu. - Integracje: pakiet ROS 2 (
integrations/ros2/kshana_trust: NavSatFix iublox_ubx_msgsna wejściu, tematy zaufania na wyjściu; jego most niezależny od ROS jest testowany z prawdziwym silnikiem, sam węzeł nie był uruchamiany na działającym grafie ROS), mostgnss_lib_py(integrations/gnss_lib_py, zależność MIT, opcjonalna) oraz przekaźnik GNSS-SDR. - Eksporter MQTT Home Assistant dla telemetrii zaufania:
kshana trust-telemetry --print-mqtti--mqtt-tcp <host:port>(komunikaty wykrywania i dokument stanu JSON; tylko publikacja, bez poświadczeń i TLS) orazformat = "mqtt"jako tekst w Pythonie, WebAssembly i MCP. - Siedem wierszy rejestru MODELLED dla powyższego. Nic tu nie jest VALIDATED: nie odczytano żadnego zapisu z prawdziwego odbiornika, stacji bazowej, IMU, przebiegu GNSS-SDR, grafu ROS ani brokera MQTT.
- Margines łącza optycznego w czasie. Rodzaj
optical-atmosphereprzyjmuje opcjonalną tabelę[timeseries](duration_h,step_s,seed), a następnie zapisuje też, dla każdej lokalizacji, jedną zasianą realizację podanego modelu lokalizacji w czasie: epizody zachmurzenia, kolumnę wody ciekłej dla każdego epizodu, jedną próbkę scyntylacji gamma-gamma na krok, a z nich margines łącza, zaniki chmurowe i scyntylacyjne oraz flagę działania łącza, z zrealizowaną dostępnością, udziałem zachmurzenia, liczbą przerw i najdłuższą przerwą. MODELLED (jedno losowanie z modelu, a nie klimat; brak zewnętrznej wyroczni). Bez tej tabeli wynik jest dokumentem 0,37. Dwa dołączone scenariusze optyczne zawierają tę tabelę (336 h, 600 s, ziarno 37). Progi zarejestrowane z góry wxval/optical-atmosphere/PREREGISTRATION-timeseries.mdprzed pierwszym przebiegiem. - Specyfikacja warunków testu i obieg laboratoryjny round-trip.
kshana.test-conditions/1jest publikowane jakodocs/spec/TEST-CONDITIONS.mdze schematem JSON i zyskujerecording.kind = "receiver-log".kshana bench-exportzapisuje także<base>.conditions.json.kshana evidence round-tripbuduje podpisany pakiet łączący skrót scenariusza, skrót podanych warunków, skrót logu odbiornika i ocenę względem podanych zdarzeń oraz odmawia przyjęcia warunków niezgodnych ze zdarzeniami oceny. Przykład opracowany z gps-sdr-sim zapisującym wyłącznie plik; odtwarzanie jest odpowiedzialnością operatora i nigdy nie jest automatyzowane. Pythonevidence_round_trip, MCPcreate_round_trip_pack, wtyczka/kshana-evidence-pack. - Pakiety norm (
kshana standards-pack,standards/): profile testów ram DHS Resilient PNT dla poziomów od 1 do 4, poziomy dokładności i ocena integralności IMO MSC.1/Circ.1575 oraz ICAO Doc 9849 Appendix F monitorowanie, ocena i łagodzenie, każdy będący zestawem scenariuszy ocenianych względem progów ustalonych przed przebiegiem, z wierszami compliance-report, na które dostarczają dowodów (supports evidence for). Chybienia są zapisane i przypięte: DHS L4-T1 i cztery testy dokładności IMO. Samego Doc 9849 nie czytano (płatny); pakiet ICAO opiera się na własnej prezentacji ICAO dotyczącej planu łagodzenia RFI.compliance-reportzyskuje sekcję standards-pack. Wszystko MODELLED. - LunaNet Augmented Forward Signal (
docs/LUNANET-AFS.md): kody Golda AFS-I i Weila AFS-Q dla PRN od 1 do 210, sygnałylunanet-afs-iilunanet-afs-qwkshana iq, kod SB1 BCH, CRC-24Q i przeplatacz orazkshana lunanet-afs-check(spec,symbols,generate), przypięte do LNIS V5 Applicable Document 1 Volume A (LSIS-AFS V1.0, 29 stycznia 2025). Kody VALIDATED względem drukowanych tabel dokumentu (które oznacza jako TBC); jedna drukowana kolumna kodu trzeciorzędowego (PRN 147) jest prawdopodobnie błędem druku, a chybienie jest przypięte. Kodowanie LDPC podramek od 2 do 4 nie jest zaimplementowane. - Notebooki kursu (
notebooks/course/): jamming, spoofing, holdover, integralność, OSNMA i mapa zakłóceń, każdy z ćwiczeniami. - Badanie maksymalnego URA w Kamieniu Milowym 3 ARAIM grupy EU-US WG-C (
xval/araim-m3/,src/bin/gen_araim_m3_study.rs), zastępujące wycofany plan „Table A-3”; MODELLED przy podanych odstępstwach. - Szkice do zatwierdzenia przez właściciela w
docs/drafts/: artykuł JOSS, poprawka do karty TSC, proces rejestru wyroczni i propozycja podziałuLICENSES/. Nic z tego nie zostało przyjęte. - Widoki Studio dla funkcji 0,38 (kshana.dev/studio/). Odtwarzanie mostu (dwa przebiegi syntetyczne na jednym zegarze: tor, wskaźnik zaufania, satelity słyszane przez log i werdykt, z własnymi flagami odbiornika obok alarmów Kshana); Optical PNT (dwa scenariusze
optical-atmosphere, z opcjonalną zasianą realizacją[timeseries], MODELLED); test holdover (wynikholdover-testmierzony względem masek ITU-T, narysowany z własnegorecord.serieswyniku); przeglądarka obserwatorium zakłóceń, która otwiera pliki wytworzone przez użytkownika i żadnych nie dostarcza; na stronie Narzędzia ocena Jammertest, dopasowanie IMU i MQTT jako format telemetrii; oraz w Zaufaniu wybór formatu logu (RTKLIB.pos, NovAtel OEM7, RTCM 3, GNSS-SDR, Septentrio SBF) z opcjonalnym plikiem IMU. Każdy widok odczytuje pliki w przeglądarce i niczego nie wysyła; każda wartość zachowuje etykietę, którą ma dla niej rejestr, a każdy niesie oświadczenie doradcze. Strona witryny/benchmarkpokazuje fragmentkshana bench leaderboard.
Poprawiono#
- Zgłoszenie #36: warstwy przypięć co do bajtu. Warstwy przypięć co do bajtu działają tylko na hoście zadeklarowanym jako punkt odniesienia (
KSHANA_EXACT_PINS=1, ustawiane przezscripts/gate.sh), a nie na każdym Macu z Apple silicon, ponieważ biblioteka matematyczna Apple różni się między wydaniami macOS; warstwa przenośna działa wszędzie, atests/exact_pin_gate_guard.rspowstrzymuje ponowne bramkowanie warstwy co do bajtu wyłącznie według platformy. Same porównania z wyrocznią przechodzą na macOS. Nie pobrano ponownie żadnego literału i nie zmieniono żadnej tolerancji.scripts/oracle-triage.shidocs/LOCAL-ORACLE-TESTS.mdmówią, jak zbadać różnicę;.github/workflows/oracle-macos.ymljest ręczną i cotygodniową diagnostyką, a nie bramką. - CodeQL: niezakotwiczony wzorzec w pomocniku trust-open Studio dopasowuje teraz cały nagłówek (
web/studio/lib/trust-open.mjs). - CI: dysk runnera. Zadanie
checkbuduje profile dev i test bez informacji debugowania, więc linkowanie nie zapełnia już dysku. - Strażnicy źródeł. Każdy plik źródłowy zawierający fixtures testowe z przypięciami deklaruje zakres swoich przypięć, a testy zapisujące pliki tymczasowe używają unikalnej ścieżki przy każdym wywołaniu, więc przebiegi równoległe nie mogą kolidować.
docs/SCENARIOS.mdjest regenerowany dla opcjonalnego pola optical-atmospheretimeseries.- Wtyczka JetBrains: brak użycia przestarzałego lub przeznaczonego do usunięcia API platformy. IntelliJ Plugin Verifier (
verifyPlugin) względem IntelliJ IDEA w wersji 263 (2026,3: 263.6800.24 i 263.7031.23) znalazł jedno przestarzałe wywołanie,FileEditorManager.openFile, w Insert Example; teraz otwiera ono nowy plik przezOpenFileDescriptor. Wtyczka jest zgodna z 2024,3 (since-build, bez zmian) i obydwoma buildami 263 i jest na nich czysta. CI uruchamia terazverifyPlugini kończy się niepowodzeniem przy problemach ze zgodnością oraz przy każdym użyciu API przeznaczonego do usunięcia.
[0.37.0] - 2026-10-17#
Dodano#
- Optical PNT przez atmosferę (rodzaj scenariusza
optical-atmosphere,docs/OPTICAL-ATMOSPHERE.md, notatka projektowadocs/design/optical-atmosphere-0.37.md). Dla łącza optycznego i zbioru stacji naziemnych podaje zależną od długości fali i elewacji stratę w czystym powietrzu, stan turbulencji Hufnagela-Valleya (wariancja Rytova, wskaźnik scyntylacji, zaniki gamma-gamma, uśrednianie apertury), dostępność względem marginesu łącza z podanego klimatu zachmurzenia, margines potrzebny dla docelowych dostępności i pułap, którego żaden margines nie podnosi, rozkład czasów trwania przerw, błąd czasu i odległości na przerwę przez model holdover zegara, różnorodność stacji skorelowaną odległością oraz zyski what-if dla zmiany długości fali, większej apertury, redukcji scyntylacji przez optykę adaptacyjną i dodatkowego marginesu.optical_linkbudgetzyskuje budżet uwzględniający atmosferę; bez niego jego wyjście jest identyczne bit w bit z 0,36 (próg A5). Dwa dołączone scenariusze niosą klimaty zachmurzenia ILLUSTRATIVE. MODELLED: trzy wiersze rejestru. Obliczenia spełniają progi A1 do A6 zarejestrowane z góry wxval/optical-atmosphere/PREREGISTRATION.mdwzględem niezależnego programu mpmath; to sprawdza implementację podanych wzorów, a nie atmosferę, i nie porównano żadnego zmierzonego zapisu dostępności, więc żaden wiersz nie jest VALIDATED. Próg A4 został najpierw chybiony o 3e-9, ponieważ używana dystrybuanta normalna była przybliżeniem 1.5e-7; dystrybuantę wymieniono, a próg pozostawiono jak zarejestrowany. Buildy natywny i WebAssembly zwracają dokumenty identyczne bajt w bajt dla obu dołączonych scenariuszy (A7, uruchomione na commicie integracyjnym 0.37.0).
[0.36.0] - 2026-10-16#
Dodano#
ROC detekcji monitorów IQ (PRO-32,
docs/design/DETECTION-ROC.md). Kampania z monitorami zachowuje maksimum każdej statystyki testowej w oknach podanych zdarzeń (dodatnie) i w kafelkowanych oknach poza zdarzeniami (ujemne,roc_window_s). Raport łączy je dla każdego rodzaju alarmu w ROC z jego AUC i punktem pracy przy skonfigurowanym progu, jakoroc.jsoni sekcja raportu. Na kampaniach syntetycznych kontrola poziomu przypadkowego jest spełniona. Próg AUC dla C/N0 (0,95) nie jest spełniony (0,79), ponieważ okna ujemne tuż po zdarzeniu dziedziczą po detekcji zanikanie CUSUM; jest to zapisane. MODELLED.Monitory IQ w kampanii lab-replay (PRO-31,
docs/design/MONITORS-IN-CAMPAIGN.md). Opcjonalna tabela[monitors]w pliku kampanii uruchamia monitory IQ w pojedynczym przejściu runnera: mocy i widmowy po każdym łańcuchu front-endu oraz C/N0, SQM i blokady dla każdego śledzonego kanału. Ich alarmy są oceniane względem podanych zdarzeń: wykryto lub niewykryto, czas do detekcji i fałszywe alarmy na godzinę ekspozycji. Dla każdego testu podano wzór zamknięty na fałszywy alarm, w tym nową dwustronną wartość gaussowską dla testów SQM (2Q(k)). Bez tabeli nic się nie zmienia. Na kampaniach syntetycznych progi fałszywych alarmów dla mocy i SQM oraz próg fałszywych alarmów dla C/N0 są spełnione; wykryto 18 z 18 tłumień, ale ograniczenie czasu do detekcji, z konstrukcji poniżej jednej próbki detektora, nie jest spełnione i jest zapisane. MODELLED; wiersz rejestru „Monitory IQ oceniane w kampaniach lab-replay”.Dopasowanie laboratoryjne z kampanii IQ, kontynuacja (
tests/iq_labfit_followup.rs, zadanie CIlabfit-iq-followup). Testuje dwie hipotezy, które §13,6 zdocs/design/LABFIT-FROM-IQ.mdzostawił otwarte, względem progów zarejestrowanych z góry w 1e532f84. Dodaje dwie kampanie syntetyczne: S, ze schodkowym J/S (ziarno 2026_1014), oraz R, nową rampę (ziarno 2026_1015). Wyniki są wdocs/design/evidence/labfit-followup/RESULTS.md.- S1 spełnione: przy utrzymanym każdym poziomie J/S
δ_effjest odtwarzane w granicach +0,185 dB. Błąd −1,1 dB w kampaniach z rampą to opóźnienie estymatora. - S2 niespełnione, przypięte testem stwierdzającym chybienie: (d) w brzmieniu zapisanym, na kampanii schodkowej, zachodzi dla modelu pętli śledzenia (0,45 dB), ale nie dla modelu empirycznego (6,42 dB).
- R1 spełnione: na nowej kampanii z rampą (d) z dopasowanymi czasami przebywania spadku razy szybkość rampy każdego zdarzenia mieści się w granicach 1 dB dla obu modeli.
- Chybienia (a′) i (d) powtarzają się w R.
- Kampania może teraz podawać swoje J/S jako profil
stepw zestawie testowym. - Żaden werdykt z §13 się nie zmienia, a wiersz rejestru pozostaje MODELLED.
- S1 spełnione: przy utrzymanym każdym poziomie J/S
Ograniczone wciąganie FLL, opcjonalne (DS-LOOP-05): nowy klucz projektu pętli
[design.carrier] fll_pull_in_max_s(s), w RustLoopConfig::fll_pull_in_max_s. Przyfll_assist = "pull-in"wymusza przejście z FLL na PLL po tym czasie, niezależnie od PLI. Domyślnie nieustawione, a wtedy poza skrótem projektu; projekt domyślny i jego skrót są bez zmian.- Sprawdzone względem progów zarejestrowanych z góry w 58789af0, na wprowadzonej prawdzie odniesienia. Kontrola jest spełniona: ustawienie domyślne nigdy nie przekazuje sterowania w 9 z 10 ziaren przy 33 dB-Hz.
- Niespełnione: przy ograniczeniu 1,0 s 16 z 20 przebiegów utrzymuje blokadę przy 33 dB-Hz, a 8 z 20 przy 31 dB-Hz; pozostałe krążą między wymuszonymi przekazaniami a powrotem FLL. Jitter fazy jest 1,8× większy niż samego PLL przy 33 dB-Hz.
- Próg wciągania ~35 dB-Hz pozostaje udokumentowanym ograniczeniem ustawienia domyślnego.
- MODELLED; wiersz rejestru „Ograniczone wciąganie FLL poniżej progu przejścia z FLL na PLL w projekcie domyślnym (opcjonalne)”.
Histereza akwizycji i kwantyzator front-endu w rodzaju jamming (CAP-06c): dwie opcjonalne sekcje dla scenariusza
jamming.[acquisition]:acquisition_threshold_dbhz(dB-Hz, na progu śledzenia lub powyżej) ireacquisition_delay_s(s, domyślnie 0). Satelita jest akwizycjonowany na progu akwizycji lub powyżej, gdy był nieakwizycjonowany przez czas opóźnienia. Jest utrzymywany, dopóki jest na progu śledzenia lub powyżej. Wyjścia:epochs[].sats[].acquired(true/false),epochs[].acquired(liczba) ifom.availability_acquired(1).[front_end]:adc_bits(od 1 do 16) ibandwidth_mhz(MHz, domyślnie dwukrotność szybkości chipów). Wyprowadza blokfront_end:agc_gain_reduction_db(dB,10·log10(1 + J/N)),quantiser_loss_db(dB, odejmowane od efektywnego C/N0 każdego łącza) iloss_model. Strata dotyczy wejścia gaussowskiego i jest oznaczona jako nieważna dla zagłuszaczy CW, wąskopasmowych i przemiatanych.- Bez tych sekcji każde wyjście jest identyczne bajt w bajt.
- Sprawdzone względem progów zarejestrowanych z góry w 70c72fcc. Strata kwantyzatora mieści się w granicach 0,0007 dB od niezależnego Monte Carlo, a odczyt AGC w granicach 0,012 dB od pętli AGC warstwy IQ.
- Zarejestrowane przebiegi histerezy były nieinformatywne (każde łącze utracone), więc ten próg jest NOT MET. Dodatkowy zestaw przebiegów zarejestrowany przy 37793290 go spełnia: każda flaga równa się niezależnemu przeliczeniu, a 732 z 1824 łączy wykazuje histerezę.
- Ustalenie: przy zagłuszaczu CW 1-bitowy ADC traci około 5 dB więcej niż wartość gaussowska.
- MODELLED; wiersz rejestru „Histereza akwizycji i kwantyzator front-endu w rodzaju jamming względem niezależnych przeliczeń”.
Zacienianie terenu zagłuszacza w rodzaju jamming (CAP-06b): opcjonalna sekcja
[terrain]w scenariuszujammingz zagłuszaczem. Pola:dem_hgt: kafelek SRTM.hgt, względem katalogu roboczego;samples_per_side,ll_lat_degill_lon_deg(deg): rozmiar i narożnik kafelka;geoid_undulation_m(m, domyślnie 0),k_factor(domyślnie 4/3) iprofile_step_m(m, domyślnie 30).
Silnik próbkuje profil terenu po ortodromie między zagłuszaczem a odbiornikiem i znajduje dominującą krawędź nożową. Moc odbierana zagłuszacza, a więc każde J/S, jest obniżona o stratę pojedynczej krawędzi nożowej według ITU-R P.526-15 §4,1.
- Wynik zyskuje blok
jammer_terrain:nu_max(1),diffraction_loss_db(dB),obstacle_distance_m(m),obstacle_terrain_m(m),path_length_m(m) iprofile_points(liczba). - Bez tej sekcji każde wyjście jest identyczne bajt w bajt.
- Sprawdzone względem progów i dziesięciu rozmieszczeń zarejestrowanych z góry w 92cd2bfd, na zatwierdzonym prawdziwym kafelku SRTM Doliny Śmierci, względem niezależnego przeliczenia w numpy. Wszystko spełnione: najgorsza różnica 1.6e-10 dla
νi dla straty (próg 1e-9), strata monotoniczna względem wysokości zagłuszacza, a strata obniżająca J/S dokładnie o siebie. - MODELLED; wiersz rejestru „Zacienianie terenu zagłuszacza w rodzaju jamming względem niezależnego przeliczenia w numpy na prawdziwym kafelku SRTM”.
Wzmocnienia anten CRPA w rodzaju jamming (CAP-06a): opcjonalna sekcja
[crpa]w scenariuszujamming. Pola:elements_enu_m(położenia elementów w lokalnym układzie wschód-północ-góra, m),weighting("null-steering"lub"mvdr") orazbandwidth_mhz(pasmo szumu MVDR, MHz, domyślnie dwukrotność szybkości chipów).- Każdy kanał tworzy wiązkę bez zniekształceń w stronę swojego satelity. Szum łącza jest skalowany przez
‖w‖², a zagłuszacz przez|wᴴa_j|²przed istniejącym równaniem C/N0 odpornego na zagłuszanie. - Każde łącze zyskuje blok
crpa:array_noise_gain_db(dB) ijammer_gain_db(dB). - Bez tej sekcji każde wyjście jest identyczne bajt w bajt.
- Nieprawidłowa sekcja (pusta lista elementów, nieznane ważenie, niedodatnie pasmo) jest błędem, zarówno przez
kshanaiapi::run_toml, jak i przezjamming::run_jamming. - Sprawdzone względem progów zarejestrowanych z góry w 08d83b4d. Spełnione: addytywność (po poprawce: pierwszy build dodał nowe jednostki do tabeli jednostek każdego przebiegu jamming); jeden element to brak macierzy; wzmocnienie szumu i efektywne C/N0 względem niezależnego przeliczenia w numpy w granicach 1e-9 dB; MVDR dąży do zera przy wysokim JNR.
- Niespełnione: wzmocnienie zagłuszacza MVDR na 194 z 456 łączy na 0,36 przenośnej matematyce (202 na matematyce hosta;
docs/revisions/STUDIO15-batch4-rebaseline.md) (najgorzej 1.7e-6 dB). Reszty od −100 do −188 dB są poniżej rozdzielczości float64 przy tym progu, a numpy nie zgadza się sam ze sobą w tym samym rzędzie wielkości. - MODELLED; wiersz rejestru „Wzmocnienia anten CRPA w rodzaju jamming względem niezależnego przeliczenia w numpy”.
- Każdy kanał tworzy wiązkę bez zniekształceń w stronę swojego satelity. Szum łącza jest skalowany przez
Silnik śledzenia IQ względem GNSS-SDR 0.0.19 (PRO-33):
kshana iq tracki GNSS-SDR śledzą te same niezależne nagrania numpy GPS L1 C/A przy 30 do 45 dB-Hz.- Progi zarejestrowane z góry w 48edd4a5. Zarejestrowana kalibracja nie powiodła się z powodu błędnego przekazania w GNSS-SDR (F3), więc Poprawka 1 (1e4288c4) dodaje do obu odbiorników FLL tylko do wciągania, zatwierdzony przed jakimkolwiek nagraniem testowym.
- Spełnione: jitter nośnej i kodu oraz Doppler zgadzają się w granicach 5 % przy każdym C/N0.
- Niespełnione: C/N0 NWPR silnika odczytuje się o 2,3–7,1 dB poniżej SNV GNSS-SDR (F4, znana granica estymatora; M2M4 jest w granicach 0,06 dB od prawdy odniesienia); wskaźniki blokady różnią się z definicji (F5); jedna niezgodność co do zgubienia cyklu przy 30 dB-Hz (F6).
- MODELLED; wiersz rejestru „Silnik śledzenia IQ względem GNSS-SDR 0.0.19 na niezależnych nagraniach”.
Dwa wiersze VALIDATED dla kodów warstwy IQ (DS-GIQ-06b, PRO-39).
- BeiDou B1I. Wszystkie 63 kody podstawowe B1I zgadzają się z niezależnym generatorem GNSS-SDR v0.0.19 chip po chipie (próg zarejestrowany z góry w 911106d1). Zatwierdzone jest tylko wyjście tego programu: kody PRN B1I, które definiuje publiczny ICD, jako prefiks i skrót.
- GPS L1C. Wszystkie 126 kodów L1CP/L1CD i 63 nakładek L1CO zgadza się z kolumnami kontrolnymi, które drukuje IS-GPS-800J, a obliczony ciąg Legendre'a zgadza się z jego Tabelą 6.2-1 (progi zarejestrowane z góry w fe372e26).
- Wiersze: „Podstawowe kody dalmiercze BeiDou B1I względem niezależnego generatora” i „Kody dalmiercze i nakładkowe GPS L1C względem drukowanych kolumn kontrolnych IS-GPS-800J”.
Pasma GLONASS, BeiDou i Galileo E6 w modelu widma (CAP-12, sygnały): nowe nazwy pasm
glonass-l1ofiglonass-l2of(dowolny kanał FDMA jakoglonass-l1of-k<K>, K = −7 do 6),beidou-b1i,beidou-b1c,beidou-b2a,beidou-b3iigalileo-e6. Każde niesie swoją nośną, modulację i minimalną moc odbieraną z ICD. Są opcjonalne według nazwy: domyślny zestaw pasm i każde istniejące wyjście są bez zmian.- Sprawdzone względem progów zarejestrowanych z góry w 5806f28b: wartości ICD, zera widma, złożona B1C i ścieżka C/N0 są spełnione.
- Dwa progi nie zostały spełnione. Próg jednostkowego pola był nieosiągalny w brzmieniu, w jakim go zapisano (F1). Przebiegi B1I i B1C warstwy IQ zgadzają się z modelem tylko po uśrednieniu po paśmie, z powodu nierównomiernych widm liniowych ich kodów (F2).
- MODELLED; wiersz rejestru „Model widma: pasma GLONASS, BeiDou i Galileo E6 (opcjonalne)”.
Opcja CFAR z uśrednianiem komórek w akwizycji IQ (PRO-37):
iq::acq::ca_cfarica_cfar_cellsrozstrzygają na siatce akwizycji, porównując każdą komórkę ze średnią komórek odniesienia w jej wierszu Dopplera. Próg wynika ze wzoru zamkniętego na prawdopodobieństwo fałszywego alarmu CA-CFAR dlaMblokowań niekoherentnych (ca_cfar_pfa,ca_cfar_alpha), więc decyzja nie zależy od normalizacji mocy próbki. Jest opcjonalna; detektor domyślny i każde istniejące wyjście są bez zmian.- Sprawdzone względem progów zarejestrowanych z góry w 3724aefa: wzór zamknięty względem Monte Carlo (18 z 18 przypadków) oraz projektowana częstość 1 % zmierzona jako 0,97–1,01 % na szumie gaussowskim i skwantowanym do 2 bitów.
- Jeden próg nie został spełniony: na pozbawionym szumu sygnale 2-bitowym 1,28 % komórek poza szczytem przekracza próg detekcji, w listkach bocznych korelacji kodu (ustalenie F1).
- MODELLED; wiersz rejestru „Opcja CFAR z uśrednianiem komórek w akwizycji IQ”.
Model scyntylacji względem danych zmierzonych (PRO-34): model scyntylacji Cornell kanału IQ porównano ze zmierzoną intensywnością i fazą GPS L1 50 Hz z równikowej nocy scyntylacji (rekord Zenodo 16941224, INGV, Malindi, CC BY 4,0), według progów zarejestrowanych z góry w b6ccb499. Spełnione: rozkład intensywności i scyntylacja fazy powiązana z S4. Niespełnione: model zanika 2,4 razy częściej poniżej −10 dB i 3,5 razy dłużej (ustalenie F1). Zarejestrowane przetwarzanie odczytuje zawiniętą fazę modelu (ustalenie F2); wynik dla fazy utrzymuje się po jej rozwinięciu.
scripts/fetch_scint_malindi.shpobiera dane. Wiersz pozostaje MODELLED: „Kanał scyntylacji jonosferycznej IQ (model Cornell) względem zmierzonej scyntylacji GPS L1 50 Hz”.Poprawiony czytnik próbek LuGRE (MR-09):
realdata::lugre::parse_iqs_sdrxodczytuje partię IQ LuGRE z I w górnym półbajcie i poziomami mid-rise2v + 1(SdrLayout::mid_rise), co usuwa średnią −½, jaką gołe liczby całkowite w kodzie uzupełnień do dwóch niosą na I i Q.run_acq.py --correcteddaje GNSS-SDR ten sam odczyt. Ogólny czytnik ION i każde istniejące wyjście są bez zmian: 149 wyników scenariuszy i badanie są identyczne bajt w bajt przed i po, a przypięte ustalenia LuGRE odczytują się jak zarejestrowane (xval/lugre-reader/RESULTS.md). Żaden wiersz rejestru się nie zmienia.Opcjonalne śledzenie BOC(1 1) (CAP-07 (a)):
LoopConfig::bocprzeskalowuje dyskryminatory DLL dla głównego szczytu sinusoidalnego BOC(1 1) i dodaje monitor bump-jump (korelatory bardzo wczesny i bardzo późny przy ±0,5 chipa, liczniki w górę/w dół,N = 8), który odsuwa NCO kodu od bocznego szczytu;Channel::bump_jumpswymienia skoki. Domyślnie wyłączone, a każde istniejące wyjście jest bez zmian. Sprawdzone względem progów zarejestrowanych z góry w 6b68f6cc na syntetycznym sygnale BeiDou B1C: start na bocznym szczycie, który bez tej opcji pozostaje 0,55 chipa od szczytu, jest z nią ściągany na główny szczyt jednym skokiem przy 0,08 s, a z głównego szczytu nie zaobserwowano fałszywego skoku. Jeden próg nie został spełniony: siatka testów jednostkowych dla skalowania sięga poza zakres liniowy dyskryminatorów (ustalenie F1 wdocs/design/evidence/boc-bump-jump/RESULTS.md). MODELLED; wiersz rejestru „Śledzenie BOC(1 1): skalowanie DLL i rozwiązywanie niejednoznaczności bump-jump (opcjonalne)”.Dopasowanie laboratoryjne z kampanii IQ (B7.1,
docs/design/LABFIT-FROM-IQ.md).[input] campaign = "<out-dir>"scenariusza labfit dopasowuje folder wyjściowykshana iq campaignw wierszu poleceń (kshana iq labfit), w Pythonie (kshana.iq_labfit) i w narzędziu labfit MCP (wyłącznie foldery w jego katalogu roboczym). Dopasowuje jedną jednostkę dla każdego sygnału, projektu pętli, łańcucha front-endu i typu zagłuszacza:- model C/N0 względem podanego J/S, z cenzurowaniem;
- próg śledzenia, bezpośrednio i we wzorze zamkniętym;
- modele blokady pętli śledzenia i empiryczny, sprzężone przez model C/N0, z ich czasami przebywania;
- zasiany bootstrap klastrowy po nagraniach, przedziały predykcji 90 % oraz zbiory wyłączone metodą pomiń-jedno-nagranie;
- zarejestrowana z góry tabela
[validation], z haszem, z PASS/FAIL dla każdego progu.
Raport to
kshana.labfit-iq/1jako JSON, CSV i Markdown, z blokiem jednostek.Q_effnie jest identyfikowalne z danych C/N0 bez niezależnego pomiaru mocy. Jest podawane, nigdy nie dopasowywane, a dopasowywanym parametrem jestdelta_eff = delta - 10 log10 Q(poprawka projektu 2026-10-12). Nieznany typ zagłuszacza przyjmuje najbardziej szkodliwe podaneQ(cw, 1). Na kampaniach syntetycznych z własnych scen Kshana próg pokrycia zbiorów wyłączonych (c) przechodzi. Progidelta_eff(a') i (b') (0 z 50 kampanii pokrytych) oraz próg (d) dla progu śledzenia we wzorze zamkniętym nie są spełnione: zapisano je wraz z ich wartościami. MODELLED; wiersz rejestru „Kalibracja modeli C/N0 i blokady otwartego odbiornika do wyników kampanii IQ, z podanym błędem predykcji”. Ścieżka labfit logów odbiornika i jej wyjścia są bez zmian.solar-systemna jądrze JPL (CAP-31):planetary_kernel_pathbierze każde ciało, które SPK zawiera (z de440s: Merkury, Wenus, Ziemię, Księżyc) z jądra, etykietaKERNEL, i dodaje blokkerneltylko po ustawieniu. Nowy wiersz, VALIDATED względem SPICE (zarejestrowane z góry f8e946ea; najgorzej 3.3e-5 m, 1.0e-11 m/s). Raport domyślny jest bez zmian.Porkchop na efemerydach DE440 (CAP-20b):
maneuver::porkchop_kernelprzeszukuje C3 i V∞ przylotu na stanach heliocentrycznych z SPK DE440. Nowy wiersz, VALIDATED względem stanów SPICE- pykep 3.0.1 (zarejestrowane z góry 2d857fb1; Ziemia–Mars 2026-2028, 304 komórek, najgorzej 2.6e-14, ta sama komórka o minimalnym C3).
Makromodel sił niegrawitacyjnych LRO: NOT MET (DS-LRO-10, zarejestrowane z góry e82047e2).
lunar_od::LunarMacroModel(opcjonalny przezLunarForceModel::macro_model): płaskie płyty z bezpośrednim promieniowaniem słonecznym z cieniem Księżyca, panel śledzący Słońce oraz albedo Księżyca i promieniowanie termiczne w podczerwieni;LunarMacroModel::lro_genericto oznaczone, ogólne przybliżenie LRO z opublikowanych faktów (bez płyt korpusu: tabeli płyt nie udało się uzyskać). Na 4-godzinnym łuku LRO pozostawia RMS reduced-dynamic na poziomie 6,668 m, a dynamiczny na 11,94 m, z nieprawdopodobnym współczynnikiem promieniowania (około +21 / −22), więc wszystkie trzy progi są chybione. Ustalenie jest przypięte testem i żadne wyjście domyślne się nie zmienia (docs/design/evidence/ds-lro-10-macro-model/RESULTS.md). Opcjonalne księżycowe SRP kuli armatniej używa teraz stożkowego cienia Księżyca zamiast Ziemi (forces::conical_shadow_body).Lunar OD: opcjonalny pływ stały k2 i selenocentryczna względność (DS-LRO-11), domyślnie wyłączone (
LunarForceModel::lunar_tide,::relativity); przełącznikKSHANA_LRO_DEGREEdla walidacji krzyżowej ANISE (DS-LRO-04); fixture łuku LRO o długości 24 h i wyłącznie informacyjne dopasowanie długiego łuku (DS-LRO-09). Przebiegi informacyjne są zapisane wdocs/design/evidence/ds-lro-09-11-longer-arc/RESULTS.md; żadna opublikowana liczba się nie zmienia.NRHO CR3BP 9:2 względem CAPSTONE (CAP-29d): nowy wiersz MODELLED mierzący kołową ograniczoną NRHO silnika względem lotnej orbity CAPSTONE (JPL Horizons, marzec 2023; zarejestrowane z góry 4e868170): okres 1,07 %, apoluna 0,05 %, peryluna 4,1 % względem średnich CAPSTONE, w granicach zarejestrowanych progów 3 / 5 / 20 %. Pomiar, a nie walidacja.
Stany obracające się CR3BP do ICRF o środku w Księżycu (RM-34, FUT-06):
cr3bp::to_moon_centred_icrf/from_moon_centred_icrf/to_moon_centred_icrf_de440odwzorowują bezwymiarowy obracający się stan Ziemia–Księżyc na chwilową linię Ziemia–Księżyc DE440, wraz z pozapłaszczyznową prędkością układu. Nowy wiersz, VALIDATED względem dwuwektorowego układu SPICE (zarejestrowane z góry 2313eb1b, poprawione przed jakimkolwiek przebiegiem d5ef79b3; 72 przypadków, najgorzej 1.8e-7 m i 1.2e-9 m/s).Człony rodzin CR3BP względem API okresowych orbit trzech ciał JPL: NOT MET (RM-35, zarejestrowane z góry a9074f65).
cr3bp_family(korekcja halo, NRHO i DRO, wskaźnik stabilności monodromii, kontynuacja pseudołukowa) zgadza się z 54 z 58 członów API według każdego progu (stan, okres i Jacobi w granicach 1e-10 wszędzie). Jeden wskaźnik stabilności halo L1 (9.5e-2) i trzy zamknięcia małych DRO (od 1.5e-8 do 3.3e-8 wobec 1e-8) są chybione, więc moduł jest#[doc(hidden)]i żaden wiersz go nie dotyczy. Wyniki:docs/design/evidence/cr3bp-families/RESULTS.md.Opcjonalna orientacja i środowisko księżycowe DE440 (FUT-05, DS-LRO-08; ustawienia domyślne bez zmian):
lunar_frame::try_icrf_to_moon_pa_de440,lunar::try_mci_to_mcmf_de440/try_mcmf_to_mci_de440(zakotwiczone w epoce, osie główne DE440) orazlunar_od::De440LunarEnvironment(wbudowana orientacja PA DE440 oraz geocentryczne Słońce i Księżyc z dostarczonego przez użytkownika SPK DE440). Względem ANISE (zarejestrowane z góry ea537710): orientacja w granicach 3.5e-7 rad, a dopasowania LRO w granicach 1 mm, ale odnoga efemeryd chybiła swój próg (Słońce 30,7 m, Księżyc 1,1 m, przesunięcie czasu ~1 ms po stronie ANISE), więc nie jest to wiersz sprawdzony względem wzorca zewnętrznego. Wyniki:docs/design/evidence/fut05-de440-lunar-env/RESULTS.md.Datum kampanii układu księżycowego, próg NumPy skalowany uwarunkowaniem: NOT MET (zarejestrowane z góry b887eb05; pozostaje MODELLED). Krok 0 wyklucza zapasowe użycie pseudoodwrotności jako przyczynę luki 0,30 przy szacowanych stacjach; NumPy zgadza się w granicach progu w sześciu z ośmiu scenariuszy, ale stations_estimated go chybia (6.8e-6 wobec 5.9e-7), a w nowej dacie 2026-12-01 nieobserwowana radiolatarnia na biegunie południowym czyni informację radiolatarni niedoborową rzędem, czego niezmieniona wyrocznia nie potrafi ocenić. Wyniki:
docs/design/evidence/mr05-lunar-datum-cond/RESULTS.md.Datum układu księżycowego z prawdziwej kampanii obserwacyjnej (analityczny Księżyc) VALIDATED na nowych punktach normalnych EDC z 2025 roku (zarejestrowane z góry 31f5283 przed pobraniem jakiegokolwiek): niezmieniona wyrocznia SPICE i NumPy zgadza się co do księgowania, rzędów i zerowego sprzężenia oraz w granicach 1.11e-3 dla sigm (próg 1e-2), 8.95e-4 dla uwarunkowania i 1.79e-3 dla stosunków poprzecznych/wzdłużnych (próg 2e-2). Kontrola biblioteczna samego obliczenia kowariancji; progi nie rozróżniają modeli Księżyca. Wyniki:
docs/design/evidence/mr06-llr-analytic-fresh/RESULTS.md.Orientacja IAU i GM czternastu dodanych ciał Układu Słonecznego wydzielone z wiersza „Stałe fizyczne każdego ciała Układu Słonecznego” do wiersza VALIDATED (zarejestrowane z góry 154bc54):
Body::iau_rotation_etzgadza się z SPICEpxformna pck00011 w granicach 1e-9 rad na 574 macierzach w pierwotnych epokach i na 574 w 41 nowych epokach nigdy wcześniej niporównywanych (najgorzej Fobos 1.38e-10 rad), aBody::mujest równe gm_de440 dla wszystkich czternastu ciał. Reszta pierwotnego wiersza (J2, promień średni, raport) pozostaje MODELLED. Wyniki:docs/design/evidence/mr08-body-orientation/RESULTS.md.Lambert wieloobrotowy (
maneuver::lambert_multirev): każde rozwiązanie z co najwyżej trzema obrotami, obie gałęzie. Nowy wiersz rejestru, VALIDATED względem pykep 3.0.1 (zarejestrowane z góry a75de851; 382 przypadków, 1058 rozwiązań, najgorsza różnica prędkości 1.6e-13 wobec 1e-8). Wewnętrzny strażnik lądowania Keplera znalazł jedno ograniczeniemaneuver::kepler_universalna łuku o e = 0,994; jest ono zapisane wdocs/design/evidence/lambert-multirev/RESULTS.md.Ciśnienie promieniowania słonecznego box-wing i ECOM2 (DS-PA-14), opcjonalne.
srp_boxwing: płaskopłytowy model box-wing z tabelami Galileo FOC/IOV z metadanych satelitów GSC, w nominalnym sterowaniu odchyleniem GNSS, z pochodnymi cząstkowymi współczynnika promieniowania i dla każdego panelu, oraz empiryczny model ECOM2 z jego pochodnymi cząstkowymi. Wybierany przezForceModel::box_wing_srp/PreciseForceModel::box_wing_srp(polasrp_boxwing, domyślnieNone: ścieżka kuli armatniej i każdy golden są bez zmian); przy zestawie box-wingcrjest jego współczynnikiem promieniowania. Porównane z Orekit 12,2 według wstępnej rejestracji (xval/srp-boxwing-orekit/): każdy próg spełniony, około 1e-15 względnie; VALIDATED jako ewaluacja modelu, predykcja SRP Galileo pozostaje MODELLED.Cień SRP spłaszczonej Ziemi i pociemnienie brzegowe tarczy Słońca (FUT-09, RM-11). Nowy moduł
srp_shadow:oblate_conical_shadow(elipsoida zasłaniająca WGS-84),limb_darkened_shadow(prawo Eddingtona) orazShadowModel, wybierane przezForceModel::srp_shadow(domyślnie: istniejący sferyczny cień stożkowy, bez zmian);forces::srp_accel_with_lit_fraction. Cień spłaszczonej Ziemi zgadza się ze współczynnikiem oświetlenia Orekit 12,2 w granicach 7.4e-9 na 2400 geometriach (VALIDATED,xval/srp-oblate-shadow-orekit/); pociemnienie brzegowe nie ma zewnętrznej wyroczni (MODELLED).Termosfera NRLMSISE-00 (FUT-08, RM-10, DS-PA-13).
nrlmsise00: portgtd7igtd7d(przełączniki, tryby dziennego Ap i 3-godzinnej tablicy ap) z wersji C w domenie publicznej oryginalnego Fortranu NRL. Jest identyczny bit w bit z tym portem C i w granicach 1.9e-6 względnych od pymsis 0.13.0 (Fortran NRL, pojedyncza precyzja) na siatce 720 punktów oraz odtwarza 17 opublikowanych przypadków testowych (VALIDATED;xval/nrlmsise00-pymsis/). To potwierdza port, a nie dokładność modelu względem zmierzonej gęstości.Opcjonalny poziom gęstości oporu NRLMSISE-00.
forces::DensityModel::{Exponential, Nrlmsise00 { f107a, f107, ap }},forces::drag_accel_with_density,density_atipropagator::ForceModel::drag_density. Statyczny model wykładniczy pozostaje domyślny, bit w bit. Pogoda kosmiczna jest stała dla każdego modelu. VALIDATED na poziomie orbity względem własnego oporu NRLMSISE-00 w Orekit 12,2 w ciągu 24 h (najgorzej 0,03 m wobec do 142 km przemieszczenia od oporu;xval/drag-tier-orekit/).Opcjonalne Słońce i Księżyc z DE440 w propagatorze Cowella (RM-33, FUT-10).
propagator::ForceModel::with_ephemerisprzyjmuje dowolnyEphemerisProvider(np.KernelEphemerisDE440) dla członów trzeciego ciała i SRP; odmawia dostawcy, który nie może obsłużyć epoki, zlicza przejścia awaryjne do szeregu analitycznego i jest domyślnie wyłączone.EphemerisProvider::relative_position_jd2zachowuje dwuczęściową precyzję. Względem Orekit 12,2 na jego własnym czytniku DE440 orbity 24 h zgadzają się do 0,017 m; zarejestrowany z góry próg położenia Słońca/Księżyca został chybiony (6,4 m / 0,24 m; SPICE pokazuje tę samą lukę), więc MODELLED (xval/propagator-de440-orekit/).Opcjonalny pływ atmosferyczny S1 (DS-PA-03).
tides::atmospheric_tide_s1is1_air_tide_acceleration(Biancale & Bode 2006, GFZ STR06/01 Tabela 1 model N1, stopnie od 2 do 6), włączane przezair_tide_s1()wpropagator::ForceModeliprecise_od::PreciseForceModel; domyślnie wyłączone. MODELLED (współczynniki ponownie sprawdzone względem opublikowanej tabeli; brak zewnętrznej wyroczni dla efektu siły).Wsadowe wyznaczanie orbity z prędkości zmiany odległości i azymutu/elewacji z maską elewacji (RM-36, FUT-13).
orbit_determination::determine_orbit_batch_tracking,simulate_tracking,predict_tracking,propagate_with_stm(wariacyjne STM z analitycznymi pochodnymi cząstkowymi dwóch ciał + J2),is_visible,measurement_with_partials;batch_ls::gauss_newton_analytic. Ścieżka wyłącznie z odległością jest bez zmian. Porównane z wsadową metodą najmniejszych kwadratów Orekit 12,2 na 8 zarejestrowanych z góry scenariuszach: każdy próg spełniony, z wyjątkiem zgodności stanu bez szumu (≤ 1 cm), chybionej w 2 z 4 scenariuszy przy 1,46 i 1,74 cm, przy czym kshana mieści się w granicach 1e-8 m od prawdy odniesienia; zapisane, MODELLED.Ważenie dokładnością SP3 (DS-PA-06).
sp3::parse_sp3_accuracyiSp3Accuracy::position_sigma_modwzorowują kody dokładności z nagłówka i z każdego rekordu na sigmy obserwacji; wariant dopasowania Galileo ważony SP3 (RMS 3D Poziomu 2 0,035 m wobec 0,070 m bez ważenia) dodano obok niezmienionych zapisanych przebiegów. MODELLED.Zadanie dispatch pełnego łuku Swarm-A (DS-PA-08) w
.github/workflows/agency-od-validation.yml.Grawitacja planetarna z tabel PDS SHADR (CAP-30, część CAP-31).
SphericalHarmonicField::from_shadr(src/gravity_pds.rs) odczytuje Mars GMM-3 (d/o 120) i GRAIL GL0660B (d/o 660);Body::with_gravity_fielddołącza dowolne wczytane pole (ustawienia domyślne bez zmian). Przycięcia do stopnia 20 są dołączone (NASA PDS, domena publiczna;tests/fixtures/planetary_gravity/NOTICE.md); pełne pliki pobieraxval/planetary-gravity-pyshtools/fetch_data.sh. VALIDATED względem pyshtools 4.14.1 (w granicach 4e-15 całkowitej grawitacji przy d/o 120 na całej sferze, 5e-14 przy d/o 660 dla |lat| ≤ 60°); okablowanie układu ciała pozostaje MODELLED (natywny układ każdego pola nie jest używanym układem IAU).Grawitacja wysokiego stopnia do stopnia 2190 (RM-14, FUT-07).
SphericalHarmonicField::acceleration_hf/potential_hf(zmodyfikowana kolumna w przód Holmesa–Featherstone'a, bez niedomiaru, bez osobliwości biegunowej),prepare_high_degree, strumieniowy ładowacz ICGEMfrom_gfc_file/from_gfc_reader(kontrole normy i maksymalnego stopnia, zapisany system pływów, człony zmienne w czasie odrzucane) orazscripts/fetch_egm2008.sh(pełne EGM2008, SHA-256 przypięty, niedołączane; testy bramkowane przezKSHANA_EGM2008_GFC).propagator::FieldEvaluatorwybiera je w opcjonalnymGeopotential. Zgadza się z Orekit 12,2 do 7.3e-17 m/s² do stopnia 2190, a orbita 24 h 200×200 zgadza się do 0,13 m. MODELLED: pyshtools chybił zarejestrowany z góry próg w pobliżu bieguna (przypisane pyshtools), a kontrola czułości orbity na stopień 70 została chybiona (0,73 m < 1 m); oba zapisano wxval/.Integrator DOP853 (FUT-11).
integrator::integrate_dop853,integrate_dop853_checked,integrate_dop853_dense(gęste wyjście 7. rzędu),dop853_step,dop853_initial_step, ze strażnikiem kroku zamykającym się bezpiecznie przy błędzie;propagator::Integrator::Dop853,propagate_dop853,propagate_dop853_checked. Sterownik domyślny jest bez zmian. VALIDATED względem SciPy 1.18.1solve_ivp(method="DOP853"): pojedyncze kroki w granicach 5.6e-15, zgodne ciągi kroków, stany końcowe w granicach 1.6e-12 (xval/dop853-scipy/).Solidny rozwiązywacz Keplera (FUT-12). Nowy moduł
kepler:solve_kepler_markley(starter Markleya 1995, rezyduum bez kasowania) dla wszystkich 0 ≤ e < 1, opakowany przezpropagator::solve_kepler_robust. VALIDATED względem 50-cyfrowych pierwiastków mpmath do 0,9 ε·|E| aż do e = 0,999999 (xval/kepler-mpmath/).Opcjonalna tesseralna grawitacja Ziemi w propagatorze Cowella (RM-09).
propagator::ForceModelzyskujegeopotential: Option<Geopotential>(with_geopotential,with_egm2008(nmax)). EwaluujeSphericalHarmonicField(dołączone EGM2008 do stopnia/rzędu 70 lub dowolny.gfcICGEM) w układzie związanym z Ziemią osiąganym przez kąt obrotu Ziemi (EarthFixedFrame::Era) lub łańcuch CIO GCRS-do-ITRS (EarthFixedFrame::Cio). DomyślnieNone: żadne istniejące wyjście się nie zmienia. VALIDATED względem Orekit 12,2 Holmes–Featherstone w ciągu 24 h (6 przypadków, najgorzej 0,036 m), z progami zarejestrowanymi z góry wxval/cowell-tesseral-orekit/PREREGISTRATION.md.Dwuczęściowe daty juliańskie przez obrót Ziemi na ścieżce orbity:
jd2::gmst82,cio::gcrs_to_itrs_matrix_jd2,frames::teme_to_itrf_jd2/itrf_to_teme_jd2,orbit::Propagator::position_in_frame_jd2iown_jd2_utc, konwersjeFrommiędzyjd2::Jd2atimescales::TwoPartJdoraz opcjonalnetwo_part_jd = truedla scenariuszaephemeris(ECEF, ślad na powierzchni i widok ze stacji; domyślnie wyłączone i bez zmian, a klucz jest pomijany w skrócie scenariusza, gdy jest wyłączony). Nowy wiersz rejestru, VALIDATED względem pyerfagmst82/c2t06a(zarejestrowane z góry b10475ee; 40 dat: GMST identyczne bit w bit, macierz w granicach 2.7e-14, obrót w krokach 1 µs w granicach 1.1e-14 rad, gdzie ścieżka pojedynczegof64je chybia). Epoka modelu sił Cowella pozostaje pojedynczymf64; powód jest w jej dokumentacji.Predykcja EOP poza tabelą (
EopSeries::with_ls_ar_prediction,EopSeries::last_mjd): opcjonalne rozszerzenie szeregu orientacji Ziemi IERS predyktorem LS+AR wystawionym w jego ostatnim wierszu, tak aby argumenty układów dla późniejszej epoki podążały za prognozą zamiast przycinać się do ostatniego wiersza. Odpowiedzi w obrębie tabeli są identyczne bit w bit (przetestowano); szereg nadal się przycina, chyba że to wywołano. Dokładność prognozy pozostaje istniejącym ustaleniem LS+AR względem Bulletin A (MODELLED).Przesunięcia bieguna niebieskiego dX, dY w łańcuchu CIO (
cio::gcrs_to_cirs_matrix_with_offsets) oraz bezpośrednie kontrole wektorowe ERFA dlaprecession_matrix,teme_to_gcrs_matrixi nowej funkcji. Nowy wiersz rejestru, VALIDATED względem pyerfa (zarejestrowane z góry 979c1e39; 40 epok 1950–2100: precesja i CIO identyczne bit w bit, TEME→GCRS w granicach 1.1e-10 rad, przewidywany efekt dwuczłonowego szeregu równania równonocy). Istniejące funkcje są bez zmian.UTC sprzed 1972 na dwuczęściowej ścieżce czasu (
timescales::tai_minus_utc_on_dateorazJd2::from_utc_calendar,jd2::utc_to_taiijd2::tai_to_utcod 1960-01-01): epoka dryfującej szybkości („rubber-second”), z tabelą dryfu SOFA, ułamkowymi skokami na koniec doby i skalowaniem UTC do SI części ułamkowej doby. Nowy wiersz rejestru, VALIDATED względem pyerfadtf2d/utctai/taiutc(zarejestrowane z góry 23c40661; 117 chwil 1960–1971, najgorzej 2.9e-11 s wobec progu 1 µs). Każdy wynik od 1972 jest identyczny bit w bit (suma kontrolna przypięta przed zmianą). Przed 1960 TAI − UTC wynosi 0, jak w SOFA. Pojedynczef64timescales::tai_minus_utcjest bez zmian.Zegar satelity GLONASS z depeszy nawigacyjnej (
GlonassEphemeris::sv_clock_bias_s):−τn + γn·(t − tb)z rekordu RINEX, w czasie odczytanym na zegarze satelity (dwie iteracje stałoprzecinkowe, konwencja RTKLIB). Sparsowane−τniγnbyły wcześniej nieużywane. Nowy wiersz rejestru „Zegar satelity GLONASS z depeszy nawigacyjnej i propagacja orbity z depeszy nawigacyjnej”, VALIDATED względem RTKLIB 2.4.2-p13geph2clk/geph2pos(zarejestrowane z góry e099c42a; 292 przypadków na prawdziwym pliku depesz z 2013 roku: różnica zegara 0 s, najgorsze położenie 1,1 mm wobec progu 1 cm). Funkcja biblioteczna; żadne wyjście scenariusza się nie zmienia. Nie stosuje się żadnej transformacji PZ-90.11 → ITRF, i moduł to mówi.Rozwiązanie czasu PPP względem zegara stacji IGS (0,36, FUT-19): zegar odbiornika filtru PPP z liczbami rzeczywistymi na WTZR zgadza się z końcowym połączonym zegarem IGS dla stacji do 0,075 ns (odchylenie standardowe) ze stałym przesunięciem −0,66 ns w ciągu zbieżnych dwóch godzin. Progi zarejestrowano z góry w
xval/ppp-time/. VALIDATED (nowy wiersz rejestru). Nowy fixtureigs_2025055_WTZR_05m_0006.clk, zapisy zegara stacji z końcowego pliku zegarów IGS, używanego już dla zegarów satelitów.Zgodność PPP z gLAB (0,36, WP-07, RM-31): gLAB 6.0.0 uruchomiono na tych samych wejściach WTZR jako osobne narzędzie (rdzeń Apache-2.0; suma kontrolna pobrania sprawdzona względem opublikowanej listy), z wierszem poleceń z procedurowej poprawki zatwierdzonej przed przebiegiem. W pierwszym zarejestrowanym przebiegu PPP z liczbami rzeczywistymi Kshana i gLAB zgadzają się w granicach 0,05 m w 240 z 240 epok i do 5,0 mm w ostatniej. Próg SPP został chybiony (mediana 1,187 m wobec 0,50 m) i jest zapisany jako ustalenie: własne rozwiązania SPP gLAB i RTKLIB różnią się od siebie o 0,852 m. Zarejestrowana reguła pozostawia więc odnogi obu narzędzi jako niespełnione w całości, podczas gdy zgodność PPP zachodzi.
Odczyt depesz nawigacyjnych RINEX 4 (0,36, WP-07, PRO-41):
rinex::parse_navodczytuje pliki nawigacyjne RINEX 4.00-4.02 (> EPHGPS LNAV, Galileo I/NAV i F/NAV, BeiDou D1/D2, QZSS LNAV; inne rekordy pomijane do następnego nagłówka rekordu), aparse_nav_withprzyjmuje opcje. VALIDATED względem scalonego pliku IGS RINEX 3 z tego samego dnia: każde zdekodowane pole identyczne i 0 m w położeniu. Odczyt RINEX 2/3 jest bez zmian.Położenia GEO BeiDou z depeszy nawigacyjnej (opcjonalne):
NavParseOptions::include_beidou_geoiRinexEphemeris::sv_position_ecef_bds_geo(BDS ICD, nachylenie −5 deg).parse_navnadal pomija GEO. MODELLED: zarejestrowane z góry porównanie z precyzyjną orbitą jest uzależnione od danych i jeszcze nie uruchomione.Pliki obserwacyjne RINEX 4: prawdziwy plik obserwacyjny RINEX 4,00 MGEX jest odczytywany w testach (MODELLED, zgodność formatu).
RTK z LAMBDA na prawdziwym RINEX (0,36, WP-07 ★):
rtk_real::run_rtk, podwójne różnice krótkiej bazy kodu i fazy GPS dwuczęstotliwościowego z filtrem Kalmana z liczbami rzeczywistymi i całkowitoliczbowym ustalaniem LAMBDA (test ilorazu). VALIDATED na stacjach IGS WTZR i WTZZ (odległych o 1,4 m) względem ich bazy ITRF2020 według progów zarejestrowanych z góry: ustalone w każdej epoce po pierwszych dziesięciu minutach, błąd bazy mediana 4,5 mm i 95. percentyl 5,5 mm.Zgodność z RTKLIB dla PPP na prawdziwych danych (RM-31):
xval/ppp-parity/run.shitests/ppp_parity_glab_rtklib.rsz progami zarejestrowanymi z góry. PPP RTKLIB v2.4.2-p13 na tych samych wejściach WTZR zgadza się z Kshana w granicach 5 cm w każdej epoce ostatnich dwóch godzin (9,7 mm na końcu) w trzeciej rejestracji; pierwsze dwa przebiegi, zapisane jako ustalenia, miały wyłączony pływ stały i antenę odbiornika w bazowym slocie RTKLIB. Próg zgodności pozycji pojedynczego punktu został chybiony (mediana 1,09 m wobec 0,5 m). Odnoga gLAB nie została uruchomiona (uzależniona od danych).Kodery komunikatów nawigacyjnych poza LNAV (0,36, WP-07, PRO-40):
gnss_navmsgkoduje GPS CNAV (typy komunikatów 10, 11, 30; CRC-24Q; ciągłe kodowanie o szybkości 1/2 K=7), Galileo I/NAV (typy słów 1-5 w parzystych/nieparzystych stronach nominalnych; przeplatacz 30x8; synchronizacja0101100000) i Galileo F/NAV (typy stron 1-4; przeplatacz 61x8; synchronizacja101101110000), z dekoderami testowymi. MODELLED: obiegi tam i z powrotem oraz znane odpowiedzi ICD; zarejestrowana z góry kontrola, że efemerydy Galileo z depeszy leżą na siatce LSB kodera, powiodła się (najgorzej 3.6e-3 LSB), ale chybiła próg liczby satelitów (15 z 20), co zapisano. Kodery są funkcjami bibliotecznymi; podłączenie do sceny nie jest częścią tej zmiany.Czytnik plików IONEX (0,36, WP-07):
ionex::parse_ionex_filezIonexFile,IonexHeader,IonexEpoch,IonexFileMapiIonexTimeInterp: ścisły czytnik IONEX 1,0 o stałych kolumnach z epokami liczonymi od dnia pierwszej mapy,9999odczytywane jako brak danych, mapami RMS oraz interpolacjami czasowymi formatu: najbliższą, kolejną i obróconych map; ukośne TEC na wysokości powłoki z nagłówka. Sprawdzone na zatwierdzonej mapie syntetycznej oraz, uzależnione od danych (pobierane w czasie testu z przypiętym SHA-256, niedołączane), na wycinku prawdziwego CODE GIM: każdy węzeł dokładny; interpolacja zgadza się ze wzorcem wzoru do 4e-13 TECU.iontecRTKLIB zgadza się do 3.6e-13 TECU w 6885 punktach (zarejestrowane z góry B6). VALIDATED na dowodzie uzależnionym od danych (decyzja właściciela, 2026-10-13): test kończy się niepowodzeniem na każdej mapie innej niż przypięta przez SHA.Wygładzanie nośnej Hatcha (0,36, WP-07):
hatch::HatchFilteripvt::assemble_epoch_precise_smoothed, forma bez dywergencji (bez jonosfery) w precyzyjnym składaniu pojedynczego punktu. MODELLED z zapisanym ustaleniem: na stacji IGS WTZR obniża medianę błędu pojedynczego punktu z 1,55 m do 1,12 m, a 95. percentyl z 3,47 m do 3,21 m, poniżej zarejestrowanej z góry redukcji o 40 % (pozostały błąd jest typu bias, a nie szumu).PPP z liczbami rzeczywistymi na prawdziwym RINEX (0,36, WP-07):
ppp_real::run_ppp, statyczny filtr precyzyjnego pozycjonowania punktowego z liczbami rzeczywistymi na prawdziwym dwuczęstotliwościowym kodzie i fazie GPS z końcowymi produktami IGS (przesunięcia i wariacje anten, pływ stały Ziemi, wind-up fazy, opóźnienie Shapiro, szacowane opóźnienie mokre, detekcja zgubień cykli), zparse_antex_receiver. VALIDATED na wyłączonej z dopasowania stacji IGS WTZR względem jej współrzędnej ITRF2020 według progów zarejestrowanych z góry: po 6 h błąd wynosi 1,5 mm w poziomie i 2,9 cm w pionie, a każda epoka ostatnich dwóch godzin mieści się w granicach 10 cm.Interpolacja precyzyjnych zegarów SP3 (0,36, WP-07):
Sp3File::clock_siclock_nodesinterpolują liniowo tabelaryczne zegary satelitów SP3 między dwoma obejmującymi poprawnymi węzłami (wartość wartownik złego zegara pomijana), aClockRinex::from_sp3przekazuje je doPreciseProducts, więc łańcuch precyzyjny działa z samego SP3. VALIDATED względem końcowych zegarów IGS 30 s z 2025-02-24 według progów zarejestrowanych z góry: 32 satelity GPS, RMS w punkcie środkowym 0,121 ns (próg 0,15 ns), 95. percentyl 0,265 ns (próg 0,30 ns).RAIM obok wskaźników jakości holdover zegara (CAP-05b): opcjonalna sekcja
[integrity]w rodzaju clock podaje osobny blokintegrity_fom(migawkowy RAIM na zadanym niebie z podanej lokalizacji: werdykt i poziomy ochrony dla każdej epoki, dostępność; niedostępny, gdy GNSS jest odmówiony, nigdy nie ekstrapolowany). Wskaźniki holdover są bez zmian; bez tej sekcji wyjście jest identyczne bajt w bajt. MODELLED.Progi receiver-trust skalibrowane na JammerTest 2024 (CAP-13): zarejestrowana z góry kalibracja monitorów spadku C/N0, AGC i wskaźnika zagłuszania na publicznym zbiorze danych JammerTest 2024 (pobieranym w czasie działania, nigdy nie dołączanym;
examples/jammertest_trust_calibration.rs), dostarczana wyłącznie jako opcjonalny[monitors] profile = "jammertest-2024-calibrated"(1,5 dB, 3,5 sigma, 29). Na zbiorze wyłączonym: progi AGC, wskaźnika zagłuszania i sumy przechodzą; próg fałszywych alarmów C/N0 nie przechodzi (0,023 wobec 0,02), więc wiersz jest MODELLED (xval/jammertest-trust/RESULTS.md). Ustawienia domyślne i wyjścia bez profilu są bez zmian.Hipotezy usterek ARAIM z wieloma satelitami (CAP-05a): reguła podzbiorów ADD v4.2 uogólniona poza pary (
add_v42_subset_plan,add_v42_protection_levels_to_order; rząd 2 to dokładnie istniejąca ścieżka sprawdzona przez MAAST) oraz opcjonalny zaawansowany RAIM dla tych hipotez (araim_subset_raim), który zgłasza podzbiór największego rozdzielenia, gdy wykryto usterkę. Założenia a priori wymagające głębszych podzbiorów są odrzucane, nigdy nie obcinane. MODELLED.Linia horyzontu w receiver trust (FUT-01): sesja receiver-trust może podać
[skyline]; satelity za nią są tracone dla nieba (sky-blocked,behind_skyline,open_fraction), a ich straty są klasyfikowane jakogeometry, nigdyenvironment; bez niej rozwiązanie zapasowe z luką w azymucie i każde wyjście są jak dotąd. Generator szkoleniowy załóg zyskuje zdarzenienatural-degradation(zablokowane niebo, a nie zakłócenia) i scenariuszscenarios/training/fjord-natural-degradation.toml. Monte Carlo UERE x DOP zyskuje dwie zamaskowane geometrie linii horyzontu z notatki projektowej, zarejestrowane z góry osobno: wszystkie 26 kontrole przechodzą.Weryfikacja znacznika czasu RFC 3161 (CAP-14):
kshana::evidence::tsa::verify_tokensprawdza podpis tokenu znacznika czasu (RSA PKCS#1 v1.5, RSA-PSS, ECDSA P-256 i P-384), wiązanie certyfikatu podpisującego ESS, użycie timeStamping przez podpisującego i jego łańcuch do zaufanej kotwicy w genTime tokenu, offline;kshana evidence verify --tsa-ca <anchors.pem>stosuje to dotimestamp.tsrpakietu (opcjonalnie; bez tego raport jest bez zmian). VALIDATED, wąsko: wszystkie 27 samodzielnie wygenerowanych przypadków zgadza się z OpenSSL 3.0.13 co do werdyktu i genTime, według porównania zarejestrowanego z góry przed napisaniem weryfikatora. Unieważnienie nie jest sprawdzane.Poziomy weryfikacji dla każdej wartości w każdym rodzaju (RM-04): wynik każdego rodzaju scenariusza kończy się teraz blokiem
figure_tierswskazującym jego główne wartości, wiersz macierzy weryfikacji, który każdą z nich posiada, i poziom odczytany z tego wiersza (wartości, których żaden wiersz nie posiada, są wymienione jako bez poziomu). Blok jest dołączany po przebiegu i cofa się do poprzedniego dokumentu bajt w bajt (api::without_figure_tiers).lunar-station-coveragenie mafigure_tiers, dopóki nowa datowana predykcja nie zastąpi swojej zamrożonej;leo-ppp,solar-system,sweepisweep-ndnie mają skalarnej głównej wartości, alunar-attack-surfacezapisuje zwarty JSON. Członkowie kampanii zachowują swoje dokumenty bez poziomu.Preset kwantowy
quantum-cai-coast(CAP-08c): dołączony scenariusz inercyjny, w którym akcelerometr z interferometrem zimnych atomów, określony przez fizykę interferometru ([accel_quantum.cai]z podanym poziomem drgań platformy), pracuje w wybiegu na tle akcelerometru kwarcowego klasy nawigacyjnej podczas 110-minutowej przerwy w GNSS. MODELLED.Dokładna liczba stopni swobody Greenhalla (CAP-03):
allan::edf_greenhall, pełny algorytm Greenhalla i Rileya (2003) (rzędy różnic od 1 do 3, wykładniki szumu od +2 do -4, z nakładaniem i bez, zmodyfikowane i niezmodyfikowane, z tablicami dla dużego J), z nakładkami ADEV, MDEV i HDEV. VALIDATED w ramach wstępnie zarejestrowanego porównania z allantools 2024,6: 4 876 punktów siatki w granicach 6.0e-13 względem wartości; allantools zawodzi w 32 dalszych punktach, które zapisano bez wartości z wyroczni. Przedziały ufnościassurance::uncertaintypozostają bez zmian co do bitu.Człony błędów interferometru zimnych atomów (RM-26/27/28): szum fazy lasera Ramana (z członem opóźnienia retroreflekcji), obciążenie od krzywizny czoła fali chmury termicznej (czysty defokus, z promieniem detekcji) oraz rozwiązywanie niejednoznaczności prążków (wspomagane klasycznie i z dwoma czasami interrogacji), jako funkcje biblioteki w
src/inertial/cai_error_terms.rs, każda w postaci zamkniętej sprawdzona kwadraturą lub metodą Monte Carlo. MODELLED; jeszcze nieosiągalne z rodzaju scenariusza (docs/QUANTUM-MODELS.md).Formaty dzienników zegara (RM-03):
src/clock_log.rsodczytuje pliki zegarowe RINEX, dzienniki fazy lub częstotliwości ASCII w stylu TimeLab oraz dzienniki liczników TAPR TICC do jednego znormalizowanego szeregu fazy (tau0 podane lub wykryte, luki policzone, polityka luk). Opcjonalnie: szereg synchronizacji telekomunikacyjnej może wskazać dziennik ([series.clock_log]), a tabela[clock_log]scenariusza zegara dodaje blokmeasured(ADEV, TDEV, MTIE). Bez tej tabeli oba rodzaje są identyczne co do bajta (docs/CLOCK-LOG-FORMATS.md). Wstępnie zarejestrowane porównanie na trzech syntetycznych dziennikach spełniło progi dla fazy i okablowania; estymatory zgadzają się z allantools w granicach 2.5e-14 wszędzie tam, gdzie ten je oblicza, a punktu MTIE dla całego zapisu nie oblicza (odnotowano). MODELLED.Maski wander dla synchronizacji częstotliwości (RM-01): rodzaj
telecom-timingzyskuje siedem masek wander MTIE i TDEV w stałej temperaturze: ITU-T G.811 PRC, G.812 Typy I do III, G.8262 EEC Opcje 1 i 2 oraz G.8262.1 eEEC, z fragmentami potęgowymi zapisanymi w tabelach, a także scenariusz odniesieniascenarios/telecom-synce-eec.toml(swobodnie pracujący OCXO wobec masek EEC: nie spełnia ich przy 1 000 s, gdzie pracę musi wykonać pętla). Każdy wiersz ponownie odczytano z tekstu na itu.int; G.812 (06/2004) zastąpiono wstępnie opublikowanym wydaniem 08/2026, którego nie dało się odczytać. MODELLED (transkrypcja); istniejące maski i wyniki pozostają bez zmian.Wskazówki dotyczące priora filtra dla rodzaju
gnss-ins(0,36, WP-09, ustalenie RM-21): domyślny prior filtra w pakiecie odpowiada IMU klasy taktycznej. Przy IMU klasy nawigacyjnej wartość domyślna może pogorszyć wybieg z fuzją względem swobodnego INS: 52 m wobec 11 m dla profilu samolotu przy 70 m/s. Ustaw[imu_*.filter_prior]zgodnie z klasą czujnika, jak w nowych pakietach morskim, kolejowym i lotniczym. Żaden dołączony scenariusz nie łączy IMU klasy nawigacyjnej z domyślnym priorem: każdy, który używa wartości domyślnej, ma resztkowe obciążenia akcelerometrów wynoszące co najmniej 0,015 m/s². Tylko dokumentacja; wyniki bez zmian.Eksport do test bench sprawdzony własnymi czytnikami symulatora (0,36, WP-09, CAP-16): pliki ruchu
kshana bench-exportz 8 dołączonych scenariuszy odczytano z powrotem czytnikami NMEA, szerokości/długości/wysokości i ruchu w układzie związanym z Ziemią z gps-sdr-sim (MIT, commit 28ca29a6, użytego jako osobne narzędzie przezxval/testbench-gpssdrsim/; nie jest wywoływana żadna funkcja sygnałowa). Zwracają one wyeksportowaną trajektorię z dokładnością do 1,2 mm, 0,15 mm oraz dokładnie. USTALENIE: czytnik ruchu w układzie związanym z Ziemią w tym symulatorze nie przyjmie pełnoszerokiego pliku CSV, ponieważ jego 100-znakowy bufor linii dzieli każdy wiersz.docs/TEST-BENCH.mdpodaje teraz cięcia kolumn, których należy użyć, oraz limit 300 s tego symulatora. VALIDATED (nowy wiersz rejestru); bajty eksportu bez zmian.GNSS/INS na zbiorze danych KF-GINS (0,36, WP-09, FUT-17): ładowarki i program uruchomieniowy
fusion::kfginsoraz model pomiarowy ramienia dźwigni w zamkniętopętlowym EKF. Na demonstracyjnym zbiorze danych KF-GINS (pobieranym w czasie testu, niedołączonym do repozytorium) poziomy RMS Kshana względem trajektorii odniesienia wynosi 1,09 cm wobec 1,11 cm własnego KF-GINS, a każdy wstępnie zarejestrowany próg został dotrzymany. VALIDATED na dowodach zależnych od danych (decyzja właściciela, 2026-10-13): zbiór jest pobierany z przypięciami SHA-256, a ścieżka odtworzenia znajduje się wxval/kfgins/PREREGISTRATION.md.Sprzężony filtr PNT w pakiecie fuzji (0,36, WP-09, FUT-16): rodzaj
fusionprzyjmuje opcjonalną tabelę[coupled], która uruchamia jeden zbiorczy filtr na pseudoodległościach ze stanem obciążenia akcelerometru (fusion::coupled::CoupledPntBiasFilter), afusion::coupled::CoupledPnt3djest 3-wymiarową wersją o 8 stanach. Nowy dołączony scenariuszfusion-pnt-coupled: przy obciążonych akcelerometrach tryb sprzężony utrzymuje pozycję zestawu kwantowego w granicach 18,7 m (95. percentyl) z pełną integralnością, gdzie filtry rozprzężone osiągają 430 m. Bez tabeli zarównofusion, jak ihybridpozostają bez zmian (przypięte);hybridodrzuca tę tabelę. MODELLED.Pakiety GNSS/INS: morski, kolejowy i lotniczy (0,36, WP-09, RM-21): dołączone scenariusze
gnss-ins-maritime,gnss-ins-railignss-ins-aviationw bibliotece trajektorii oraz opcjonalna tabela[tight]dla rodzajugnss-ins, która łączy pseudoodległości z konstelacji Walkera SGP4 (wszystkie satelity w stanie nominalnym, kilka najwyższych w stanie pogorszonym). W pakiecie kolejowym ścisłe sprzężenie utrzymuje rozwiązanie klasy nawigacyjnej na poziomie 5,3 m w przekopie i tunelu, wobec 12,9 m przy sprzężeniu luźnym. Bez[tight]pakiet pozostaje bez zmian (przypięty). MODELLED.Ścisłe sprzężenie z fazą nośnej (0,36, WP-09, RM-25 / FUT-17):
fusion::carrier_tc, EKF stanu błędu z jawnym dwustanowym zegarem odbiornika i zmiennoprzecinkowymi niejednoznacznościami nośnej, sterowany konstelacją Walkera SGP4 z poprawkami Klobuchara i Saastamoinena w pętli pomiarowej, detekcją poślizgów z różnicowanej w czasie nośnej i ponowną inicjalizacją niejednoznaczności, oraz przebiegiem wyłącznie na kodzie na tych samych pomiarach dla porównania. MODELLED: na przejeździe po trasie w kształcie 8 rozwiązanie z nośną wynosi 2,5 cm wobec 47 cm tylko na kodzie, a NIS/NEES są spójne dla różnych ziaren.Biblioteka trajektorii GNSS/INS (0,36, WP-09, RM-24): rodzaj
gnss-insprzyjmuje opcjonalną tabelę[trajectory]zprofile = "straight" | "figure8" | "stop_go" | "aircraft" | "uas" | "csv". Profile zadają prędkości kątowe Eulera i przyspieszenie wzdłuż toru na podstawie stanu prawdziwego i wyprowadzają prawdziwe IMU z kinematyki bryły sztywnej (zakręty skoordynowane, wznoszenia, Coriolis);csvimportuje trajektorię prawdziwą (t, lat, lon, alt, vn, ve, vd, roll, pitch, yaw) i wylicza IMU, które ją odtwarza. Bez tabeli pakiet wykonuje swój historyczny przejazd, co do bitu (przypięty). MODELLED.Kafle DEM szerokości/długości dla horyzontu księżycowego:
[terrain] dem_tile_pathodczytuje kafel tekstowyrealdata::lola_dem(wysokości nad średnią sferą na siatce szerokości/długości) zamiast biegunowego stereograficznegodem_path, zarówno dlalunar-station-coverage, jak imoonlight-service-volume; raport odtwarza kafel (terrain.dem_tile, z jego SHA-256).realdata::lola_demjest teraz podłączony do przemiatania promienia horyzontu. Kafel przepróbkowany z dołączonego wycinka daje stacji horyzont wycinka z dokładnością do 0,22 deg. MODELLED.Teren w miejscu eksportu objętości usługi: przy sekcji
terrainkażdy wiersz eksportu geometrii poszczególnych satelitówmoonlight-service-volumezawieraclears_terrain(satelita wychodzi ponad płaską maskę i horyzont miejsca eksportu w swoim azymucie), raport zawiera horyzont tego miejsca (export_site_terrain), a CSV środowiska wykonawczego zyskuje tę kolumnę. Bez terenu eksport pozostaje bez zmian. MODELLED.Pola nagłówkowe z silnika (0,36, STUDIO-06):
kshana::api::HEADLINE_FIELDS,field_importance_json()i WebAssemblyfield_importance()wskazują dla dwunastu rodzajów, które pola scenariusza odpowiadają na jego pytanie, od najlepszego, jako ścieżki z kropkami (jammers[].eirp_dbw). Studio odczytuje je przed własnym rankingiem. Wyłącznie metadane wyświetlania: silnik ich nigdy nie czyta, żaden plik scenariusza ich nie potrzebuje, żaden wynik od nich nie zależy.tests/field_importance.rskończy się niepowodzeniem, jeśli rodzaj nie jest dyspozycyjny albo ścieżka nie występuje w żadnym z dołączonych scenariuszy tego rodzaju (wykrył dwie ścieżki, które spłaszczone identyfikatory Studio zapisały bez nawiasów tablicy).Tabela rodzaj–moduł z silnika (0,36, STUDIO-05):
kshana::api::KIND_MODULES,kind_modules_json()i WebAssemblykind_modules()podają, dla każdego rodzaju scenariusza, którego wiersze macierzy weryfikacji wymieniają inny moduł niż jego własny, nazwy modułów. Mapa możliwości Studio używała własnej, ręcznie napisanej kopii;tests/kind_modules.rskończy się niepowodzeniem, jeśli rodzaj z tabeli nie jest dyspozycyjny albo moduł nie występuje w żadnym wierszu macierzy. Wyniki bez zmian.Krótki przebieg IQ w wersji przeglądarkowej (0,36):
iq_signals()iiq_run_short(fs_hz, duration_s, signal, ids, dopplers_hz, cn0_dbhz, seed)w module WebAssembly budują scenę syntetyczną, akwizycjonują każdego satelitę i śledzą te, które udało się zdobyć, wszystko w pamięci, z ograniczeniem do 0,25 s, 1 000 000 próbek i 8 satelitów. Budowniczy sceny i wyszukiwanie sygnału po nazwie przeniesiono ziq::cli, dostępnego tylko w wersji natywnej (doiq::scene::syntheticiiq::signals::by_name), aby obie wersje z nich korzystały; wynik wiersza poleceń jest bez zmian. Test natywny iweb/smoke.mjsporównują to samo żądanie z jednym wzorcem (tests/fixtures/iq_short_golden.json), bajt po bajcie: od zmiany na przenośną matematykę (STUDIO-15, poniżej) wersja przeglądarkowa i natywna dają te same bity.Typowane API dla Pythona i TypeScriptu (CAP-34):
kshana.pyitypuje zamknięte słowniki (ScenarioKind, każda nazwa rodzaju;ErrorKind;ProvenanceClass) oraz słownikiKindMetaiFieldUnit;scenario_kinds()ierror_kind()je zwracają. Pakiet WebAssembly dodajerun_typed(jeden przebieg jako typowany obiektRunOutputze sparsowanym dokumentem jakodata) orazscenario_kinds(sparsowaneKindMeta[]), a jegokshana.d.tszawiera ten sam słownik;error_kindjest typowany jakoErrorKind | "".tests/typed_api_sync.rsutrzymuje obie listy równe tym z silnika.Jednostki dla każdej kolumny
sweep-nd(FUT-28): wyniksweep-ndzawiera terazkey_unitsimetric_units, czyli jednostkę każdego przemiatanego klucza i każdej zapisanej metryki, odczytaną z własnej tabeli jednostek przemiatanego pakietu. Oś może zadeklarowaćunitdla klucza, którego pakiet nie powtarza; zadeklarowana jednostka sprzeczna z jednostką pakietu jest odrzucana, a jednostka, której nie podaje żadne z nich, tonull, nigdy zgadywana.points[].coords[]ipoints[].metrics[]są opisane, więc każdy z 76 rodzajów jest teraz w pełni objęty bramką jednostek pól (pułap rodzajów nieobjętych 1 -> 0).Tablice NumPy z
RunOutput(FUT-26):RunOutputw Pythonie zyskujearray(path),columns(path)iseries(), które zwracająnumpy.ndarraydla listy liczbowej, kolumn liczbowych listy rekordów albo każdego szeregu rekordów w dokumencie. Każda tablica jest równanumpy.asarraytych samych wartości zdata()(dtype i bity). NumPy jest importowany tylko wtedy, gdy wywoła się któreś z nich, i nie należy do wymagań środowiska uruchomieniowego. Typowane wkshana.pyii sprawdzane przez stubtest.Optymalizator kampanii (CAP-32): nowa, opcjonalna sekcja
[optimize]rodzajucampaignprzeszukuje od jednego do trzech kluczy scenariusza w podanych granicach w poszukiwaniu najlepszej wartości jednej metryki: minimalizacja, maksymalizacja albo trafienie w wartość docelową. Przeszukuje wyczerpująco na siatce albo deterministycznym, ograniczonym sympleksem Neldera–Meada. Każde obliczenie jest rzeczywistym przebiegiem wskazanego rodzaju i jest wymienione wtracewyniku. Przykład:scenarios/campaign-optimize-link-budget.toml. Progi zarejestrowano wstępnie (docs/design/evidence/cap32-optimize/):- funkcja Rosenbrocka jest spełniona (f* = 1.7e-20);
- rozwiązanie zadania 1-D z wartością docelową w postaci zamkniętej jest spełnione (6e-15 względem wartości);
- siatka jest równa co do bitu niezależnemu przeszukaniu wyczerpującemu;
- sympleks radzi sobie co najmniej tak dobrze jak siatka 41 × 41 w 177 przebiegach.
Próg 1-D rundy 1 zapisano jako NOT MET, ponieważ wstępnie zarejestrowane pudełko wykluczało rozwiązanie. MODELLED; wiersz rejestru "Bounded optimisation of one metric over campaign parameters". Dodatek: kampanie bez tej sekcji pozostają bez zmian.
Zespoły kalibracyjne (CAP-10): trzy kontrole z pojedynczym ziarnem powtórzone dla 200 niezależnych ziaren względem wstępnie zarejestrowanych progów, w
docs/CALIBRATION-ENSEMBLES.md(wygenerowane przezgen_calibration_ensembles; wartości dla poszczególnych ziaren wdocs/data/calibration-ensembles.csv).- Przedział 95 % z bootstrapu Monte Carlo kampanii obejmuje prawdziwą średnią w 192 z 200 zespołów, a jego kontrola chi-kwadrat jest zaliczona w 196.
- Tolerancja percentyla dla pojedynczego ziarna jest zaliczona tylko w 183 z 200: NOT MET, zgodnie z przewidywaniem. To próg rzędu 2 sigma, zapisany i niezluzowany.
- Kalibracje ADEV dla białego FM są zaliczone dla każdego ziarna, a ich najgorszy błąd mieści się daleko w granicach tolerancji.
MODELLED.
Rodzaje wbudowane przez cechę
Scenario(FUT-27, w toku): cechaBuiltinKind(api::BuiltinKind, z haczykiem poziomu dowodowego dla każdej wartości iappend_figure_tiers) oraz pierwsze rodzaje przeniesione na nią (inertial,spoof,passes,link-budget,jamming). Wynik jest bez zmian: manifest całego katalogu z SHA-256 każdego wyniku jest identyczny przed zmianą i po niej (tests/scenario_output_manifest.rs).Kontrola braku pobierania w Playground (RM-07):
tests/playground_no_fetch.rssprawdza trzy rzeczy:- każdy scenariusz biblioteki Studio znajduje się w pakiecie przeglądarkowym;
- pakiet jest identyczny co do bajta z
scenarios/; - każdy scenariusz przeglądarkowy uruchamia się z pustego katalogu roboczego.
Mapy Alt-PNT: rzeczywiste pole grawitacyjne, Monte Carlo błędu mapy, SRTM w pełnej rozdzielczości (0,36, WP-10). Rodzaj
gravity-mapprzyjmuje opcjonalną sekcję[reference]: anomalię grawitacyjną zsyntetyzowaną z dołączonych współczynników EGM2008 (albo z pliku ICGEM.gfcprzezgfc_path, tylko w wersjach natywnych). Ta synteza zgadza się z ICGEM Calculation Service do około 1e-8 mGal na 794 węzłach w dwóch regionach, wobec wstępnie zarejestrowanych progów 0,005 mGal RMS i 0,02 mGal maks. (VALIDATED; wiersz rejestru "Gravity-anomaly synthesis from a spherical-harmonic model"). Nowy dołączony scenariuszgps-denied-gravity-nav-egm2008uruchamia 60-minutowy benchmark na tym rzeczywistym polu stopnia 70. Wynik zarejestrowany wstępnie: błąd dopasowania 3106 m, więc próg < 500 m jest NOT MET, zgodnie z przewidywaniem (stopień 70 jest zbyt gładki), a dziesięciokrotne zmniejszenie dryfu jest MET (MODELLED). Opcjonalna sekcja[map_error_mc]powtarza benchmark dla ziarnowanych, gaussowsko skorelowanych błędów mapy i podaje rozkład błędu dopasowania (dołączony scenariuszgravity-map-error-mc). Eksploracyjnie i bez wstępnej rejestracji: przy błędzie mapy 2 mGal skorelowanym na 0,2 deg (rozmiar, który uwzględnia własny budżet sigma dopasowywacza) w granicach 500 m mieści się 1 z 20 realizacji (mediana 2,9 km, p95 14,7 km), wobec 144 m przy idealnej mapie. Syntetyczny benchmark z poprawką poniżej 500 m zakłada, że mapa jest dokładna. Bez żadnej z tych opcji dokument jest identyczny co do bajta z wcześniejszymi wydaniami.combined-altpntprzyjmuje opcjonalną tabelę[magnetic_grid](csv_path,column), która odczytuje kanał magnetyczny z pliku CSV w formacie EMAG2v3. EMAG2 nie jest dołączony, ponieważ jego warunki nie są jednoznaczne:tools/fetch_emag2_tile.pypobiera go z przypiętym SHA-256 i przycina obszar. Nie twierdzi się żadnego wyniku nawigacyjnego na rzeczywistej siatce EMAG2. Wspólna estymacja mapy (SLAM terenowy, RM-18):altpnt::sequential::run_sequential_trn_on_mapprowadzi sekwencyjny nawigator terenowy nad zapisaną mapą, która różni się od prawdziwej, albo jej ufając, albo estymując poprawkę mapy dla każdej komórki filtrem Rao-Blackwella w stylu FastSLAM. Wstępnie zarejestrowano względem SITAN ze znaną mapą przy skorelowanym błędzie mapy 15 m dla 20 ziaren: średni zysk 1,5 %, lepiej w 10 z 20, więc oba progi poprawy są NOT MET (10 % i 12 z 20), bez szkody na idealnej mapie (MET). Pojedynczy przelot bez powrotów nie pozwala nauczyć się mapy (xval/terrain-slam-rbpf/, MODELLED). Dokumentyterrain-slamsą identyczne co do bajta. Testy z rzeczywistym SRTM działają teraz w CI na dwóch zatwierdzonych wycinkach w pełnej rozdzielczości; wszystkie wstępnie zarejestrowane progi są spełnione, a najbliższy węzeł jest równy GDAL 3.8.4 w 8 z 8 punktów (xval/srtm-ungate/).Interoperacyjność, WP-08 (0,36; każdy punkt zarejestrowany wstępnie i zatwierdzony osobno przed uruchomieniem wyroczni, każdy jako nowy wiersz rejestru VALIDATED, z wyjątkiem punktu telemetrii, który rozszerza istniejący wiersz):
- Komunikaty danych orbitalnych CCSDS (
src/odm.rs): OPM 3.0/2.0, OMM 3.0/2.0 i OCM 3,0 (bloki TRAJ, PHYS, COV, MAN, USER) zapisywane i odczytywane w KVN oraz NDM/XML, a także OMM w pełnej precyzji z zestawu elementów SGP4 (OmmMessage::from_omm_file); wynikOmmFile::to_omm_kvnjest bez zmian. Względem Orekit 13.1.8 w obu kierunkach: 27 z 30 komunikatów Kshana daje się sparsować w Orekit, a Kshana odczytuje każdy komunikat zapisany przez Orekit, z wartościami w granicach 1e-14 względem wartości i epokami w granicach 1e-9 s; przypięto cztery ustalenia (Orekit wymagaELEMENT_SET_NO, odrzucaCOMMENTw parametrach zdefiniowanych przez użytkownika w XML, nie zapiszeBTERMbezBSTARi odczytuje względne epoki OCM w TDB w sekundach SI). Starszy zapis OMM zMETA_STARTjest odrzucany przez Orekit (odnotowano). Wiersz "CCSDS Orbit Data Messages (OPM, OMM, OCM)". - Komunikaty danych orientacji CCSDS (
src/adm.rs,src/ndm_xml.rs): AEM 2.0/1.0 i APM 2,0 w KVN i XML względem Orekit 13.1.8, każdy próg spełniony; zapis APM w Orekit odrzuca manewr bezMAN_DELTA_MASS(przypięte). Wiersz "CCSDS Attitude Data Messages (AEM, APM)". - Eksport SPICE SPK (
src/spk_writer.rs): zapis i odczyt SPK typów 9 i 13 oraz eksport z OEM do SPK; względem CSPICE N0067 jądra są identyczne co do bajta z jądrami SPICE i dają identyczne co do bitu wyniki obliczeń. Wiersz "SPICE SPK export (types 9 and 13)". - SPICE SPK typów 3 i 21 (
src/spk_writer.rs): segmenty typu 3 (Czebyszewa) i typu 21 (rozszerzone linie różnic) zapisane z podanych rekordów i obliczane tak jak w SPICE; względem CSPICE N0067 jądra są identyczne co do bajta z jądrami SPICE, a każde obliczenie zgadza się co do bitu w obu kierunkach. Wiersz "SPICE SPK types 3 and 21 (Chebyshev, extended difference lines)". - Rozszerzenia Space Packet (
src/space_packet.rs): nagłówek wtórny z kodami czasu CUC/CDS, kontrola błędów pakietu, segmentacja i kontrole strumienia, względem ccsdspy 2.0.1, spacepackets-rs 0.18.0, spacepackets-py 0.32.0 i CPythoncrc_hqx, zero niezgodności. Wiersz "CCSDS Space Packet secondary header, packet error control and segmentation". - Schemat telemetrii 1,3 przez rzeczywistych konsumentów: ekspozycja Prometheus i JSON OTLP/HTTP syntetycznego strumienia w schemacie 1.3, w tym szereg geometrii i etykieta
class, odczytane dokładnie przez prometheus_client i proto OTLP, zaakceptowane przez promtool 3.5.0check metricsbez problemów lintera i przepuszczone bez zmian przez OpenTelemetry Collector contrib 0.135.0 (zależne od danych: narzędzia pobrane z przypiętym SHA-256, wyniki zatwierdzone).
- Komunikaty danych orbitalnych CCSDS (
Wyznaczanie orbity Marsa, przebieg 2 (0,36, WP-14, CAP-30):
mars_od::fit_dampedskaluje macierz normalną jej przekątną i tłumi krok (Levenberg-Marquardt), po tym jak zarejestrowane dopasowanie Gaussa-Newtona zawiodło na macierzy, której surowa przekątna obejmuje osiem rzędów wielkości. Zarejestrowane osobno (xval/mro-od/PREREGISTRATION-RUN2.md, ten sam łuk, progi i redakcja). Na ocenianych przelotach MRO orbita mieści się w 0,36 km RMS (0,53 km maksimum) od rekonstrukcji nawigacyjnej MRO, progi spełnione. Doppler po dopasowaniu wynosi 48,6 mHz wobec progu 30 mHz, niespełniony (ustalenie przypięte). Poprawkę dotyczącą wyłącznie oceny, R2-A1, ujawniono wdocs/revisions. Wiersz pozostaje MODELLED.Model Dopplera 2-way z rampą dla Marsa i wyznaczanie orbity (0,36, WP-14, część CAP-30, etap 2):
mars_odprzewiduje Doppler 2-way DSN z rampą w paśmie X na podstawie tablic rampy ODF (czas światła, Shapiro, troposfera, czas stacji, stacje DSN przez łańcuch CIO i IERS EOP) i dopasowuje orbiter Marsa (GMM-3, ciała trzecie, SRP, opór).naif_kernelodczytuje SPK typu 1 (sprawdzone względem CSPICE), agravity_sh::from_shadrodczytuje pola PDS SHADR. Zarejestrowane wstępnie względem rekonstrukcji nawigacyjnej MRO na rzeczywistych przelotach MRO (zależne od danych,scripts/fetch_mro_od.sh, comiesięczne CI): przewidziany Doppler zgadza się z obserwacjami do 12,5 mHz (próg 30 mHz, spełniony); zarejestrowane dopasowanie orbity zawiodło na ocenianym łuku i nie dało orbity (ustalenie przypięte). Wiersz pozostaje MODELLED.Czytnik plików danych orbitalnych DSN (0,36, WP-14, część CAP-30):
odf::parse_odfodczytuje ODF TRK-2-18. Na rzeczywistym ODF Mars Reconnaissance Orbiter (NASA PDS, dołączonym) czytnik zgadza się z liczbą rekordów, pozycjami grup, stacjami i czasami z etykiety PDS, a wszystkie jego typy danych są znane. Tabela końca pliku w etykiecie jest o jeden wiersz krótsza niż plik, co jest niespójnością etykiety odnotowaną jako ustalenie. MODELLED. Wyznaczanie orbity na tych danych nie zostało jeszcze wykonane.Budżet TWSTFT i stabilność transferu czasu: rodzaj
time-transfer-budget(0,36, WP-14, FUT-19).- Równanie dwukierunkowe:
twstft_budgetrozwiązuje je względem T_A − T_B z opóźnieniami aparatury stacji, asymetrią jonosferyczną w górę i w dół w paśmie Ku, różnicą opóźnień transpondera i członami Sagnaca oraz odtwarza model w przód z dokładnością do 1e-15 s. - Budżet niepewności: składany kwadraturowo, z TDEV łącza jako składnikiem typu A.
- Szum łącza: szereg dwukierunkowy zyskuje podłogę szumu fazy typu flicker, dobową nierecyprokalność i stałą resztę recyprokalności. Pakiet
timetransferz białym jitterem pozostaje bez zmian. - Rzeczywiste szeregi: stabilność dostarczonych szeregów BIPM Circular T, CSV
MJD,nslub zegara stacji IGS.
MODELLED. Nowy dołączony scenariusz
time-transfer-budget. Rozwiązanie czasu PPP jest osobno VALIDATED względem zegara stacji IGS w gałęzi rzeczywistych danych GNSS.- Równanie dwukierunkowe:
Nagrzewanie przy wejściu w atmosferę, radiometria EO i straty wynoszenia (0,36, WP-14, CAP-28): trzy nowe rodzaje.
entry-heating: wejście w atmosferę jako masa punktowa o 3 stopniach swobody nad wirującą Ziemią lub Marsem z nagrzewaniem punktu stagnacji według Suttona-Gravesa.eo-radiometry: SNR obrazowania, MTF przy Nyquiście, względna odpowiedź krawędziowa i NIIRS GIQE 4.ascent-losses: wielostopniowe wynoszenie po zakręcie grawitacyjnym ze stratami na grawitację, opór, sterowanie i przeciwciśnienie, sprawdzane dokładną tożsamością idealnego dv minus straty.
Maksymalne opóźnienie przy wejściu w atmosferę sprawdzono względem opublikowanego nominału Stardust w ramach wstępnie zarejestrowanego progu: 35,44 g wobec 33,4 g (+6,1 %, próg 10 %). Ten wiersz jest VALIDATED. Nagrzewanie, radiometria i wynoszenie są MODELLED. Nowe są też:
reentry::us76_pressure, dołączone scenariuszeentry-heating-stardust,eo-radiometryiascent-lossesorazdocs/ENTRY-EO-ASCENT.md.Sterowanie orientacją za pomocą kół reakcyjnych: rodzaj
aocs(0,36, WP-14, CAP-21). Zwrot w inercyjnym ukierunkowaniu sztywnego korpusu z trzema lub więcej zrównoważonymi kołami reakcyjnymi ze sprzężeniem zwrotnym MRP, z momentami kół o minimalnej normie obciętymi do limitu każdego silnika (aocs). Może też zamknąć pętlę na multiplikatywnym EKF z symulowanego żyroskopu i śledzika gwiazd (aocs_mekf). Pętlę prawdziwego stanu porównano z Basilisk 2.9.1 na trzech przypadkach zarejestrowanych wstępnie, zanim powstał kod (trzy ortogonalne koła, piramida czterech kół, przypadek z nasyceniem). Każda składowa MRP, prędkość kątowa korpusu, prędkość koła i moment silnika zgadzały się w każdej próbce, w najgorszym przypadku 2.4e-14 w sigma i 2.9e-11 rad/s w prędkości koła. Ten wiersz jest VALIDATED; MEKF jest MODELLED (spójność NEES). Nowe dołączone scenariuszeaocs-slewiaocs-slew-mekforazdocs/AOCS.md.Planowanie kontaktów z naziemnymi stacjami i ACM DVB-S2 (0,36, WP-14, CAP-22/23): dwa nowe rodzaje scenariuszy.
acm-linkpodaje dla jednego satelity nad jedną stacją Es/N0 każdego przelotu oraz wybrany wzdłuż niego MODCOD DVB-S2 (progi z ETSI EN 302 307-1, tabela 13, plus margines). Podaje też wolumen danych, jaki ACM przenosi względem punktu odniesienia ze stałym kodowaniem.contact-schedulerobi to samo dla kilku satelitów nad kilkoma stacjami i buduje bezkonfliktowy plan kontaktów (zawracanie anteny, jedna stacja na satelitę, dostarczanie ważone priorytetem, ograniczone do każdej zaległości). Zgłasza zachłanny plan wartości krańcowej, punkt odniesienia typu kto pierwszy, ten lepszy oraz dokładne optimum na małych zbiorach, wraz z luką optymalności planu zachłannego. Okna dostępu pochodzą z VALIDATED predyktora pozornych przelotów. Nowe dołączone scenariuszeacm-linkicontact-schedule(dane wejściowe poglądowe) orazdocs/CONTACT-SCHEDULING.md. MODELLED (dwa nowe wiersze rejestru).Pozycjonowanie Dopplerowskie Starlink na tle opublikowanego eksperymentu (0,36, WP-14, część CAP-11, MODELLED). Jest to wstępnie zarejestrowane porównanie zastępcze trybu Dopplera
leo-pvtz presetemstarlink-sopwzględem percentyli zbioru danych 3 z "Unveiling Starlink for PNT" (NAVIGATION 72(1), 2025, doi:10.33012/navi.685). Model użył 3 satelitów (maska 47 deg wybrana stałą regułą), bez wspomagania wysokością i z sigma Dopplera 30 Hz, dla 200 ziaren. Jego 90. percentyl błędu 3-D wynosi 92,2 m przy 20 s i 870 m przy 8 s, wobec opublikowanych 2 m i 10 m, więc oba progi dwukrotności są NOT MET. Model jest pesymistyczny, a nie optymistyczny, jak przewidywano: trzy stałe satelity dają znacznie mniejszą różnorodność geometryczną niż 63 satelitów eksperymentu w ciągu 10 minut z przełączaniem kanału co 15 s. Oba niedociągnięcia są asercjami (tests/starlink_doppler_published_proxy.rs).Optymalizator transferów impulsowych na DE440 (0,36, WP-14, CAP-20c/d):
maneuver::optimise_transfer_kernelznajduje daty odlotu i przylotu balistycznego transferu dwuimpulsowego o jednym obiegu, które minimalizują C3 odlotu albo V-infinity przylotu w obrębie Typu I lub Typu II. Przeszukuje siatkę 2-dniową, a następnie dopracowuje metodą Neldera-Meada 2-D, na stanach heliocentrycznych z jądra DE440; opiera się naporkchop_kernel. Porównanie zarejestrowano wstępnie (bf0439e8) względem niezależnego optymalizatora SPICE + pykep 3.0.1 + SciPy 1.18.1 na okazji Ziemia-Mars z 2026: wszystkie cztery optymalizacje zgadzają się do 8.7e-13 względem wartości, z datami w granicach 1e-5 doby (VALIDATED, nowy wiersz rejestru). Jako dodatkowy opublikowany punkt odniesienia NASA/TM-2010-216764 (poradnik Ziemia-Mars na lata 2026-2045) zgadza się dla minimalnego C3 Typu II (9,182 wobec 9,144) i minimalnego V-infinity przylotu Typu II (2,564 wobec 2,565). Minimalne C3 Typu I się nie zgadza: 10,535 wobec 11,11 (-5.18 %), przy czym wyrocznia biblioteczna zgadza się z Kshana. To niedociągnięcie jest odnotowane i objęte asercją.Badanie księżycowej stacji referencyjnej (0,36, zainspirowane opublikowanymi materiałami o planowanej księżycowej stacji referencyjnej na biegunie południowym; źródła w
docs/LUNAR-REFERENCE-STATION.md): rodzajlunar-station-coverage, przemiatanie Monte Carlo modelu księżycowego różnicowego PNT po siatce użytkowników na biegunie południowym i dobie epok, podające dla każdego punktu i dla całego regionu percentylowy błąd skorygowany i nieskorygowany, dostępność wraz z przyczynami, pokrycie względem podanego progu, poziomy ochrony, promień pokrycia dla każdego azymutu oraz budżet łącza poprawek. W jednym punkcie, jednej epoce i jednej próbie redukuje się dokładnie dolunar-differential-pnt; jego arytmetykę przeliczono ponownie w numpy wobec wstępnie zarejestrowanego progu (pozycje i percentyle spełnione; poprawki stacji nie spełniły swojego progu z powodu zaokrągleń podwójnej precyzji, odnotowano). MODELLED; wiersz rejestru "Lunar reference-station coverage and accuracy map". Bez powiązań z jakąkolwiek agencją ani jej poparcia; bez twierdzeń o działaniu jakiegokolwiek rzeczywistego systemu.Wstępnie zarejestrowana prognoza: pokrycie księżycowej stacji referencyjnej (nie jest to walidacja; MODELLED).
docs/predictions/lunar-reference-station.mdzamraża, w commicie c05dac1d, wynikilunar-station-coverageprzy publicznie podanych założeniach, wraz z haszami SHA-256 danych wejściowych i wyników oraz protokołem oceny ustalonym teraz (współczynnik 2 dla dokładności i poziomów ochrony, 10 punktów procentowych dla dostępności i pokrycia; zmienione założenie dostaje nową, datowaną prognozę, nigdy edycję; pudło publikuje się równie wyraźnie jak trafienie). Każda wartość zależy głównie od niepublikowanego zestawu elementów orbitalnych czteroelementowej konstelacji satelitów, który jest ILLUSTRATIVE i tak to deklaruje.tests/prediction_frozen.rsgo pilnuje;docs/VALIDATION.mdzyskuje sekcję "Pre-registered predictions". Bez wiersza rejestru.Rozszerzenia księżycowej stacji referencyjnej (0,36; ograniczenia 2 i 3 badania stacji oraz styl rozwiązania z publikacji źródłowych), każde opcjonalne w
lunar-station-coveragei domyślnie nieobecne, więc każdy istniejący dokument, łącznie z zamrożoną prognozą, pozostaje bez zmian:[receiver](wielodrogowośća + b exp(-el / el0)u użytkownika i na stacji, na stacji opcjonalnie Gaussa-Markowa w epokach, szum kodu DLL z C/N0, obciążenia międzykanałowe; wartości ILLUSTRATIVE na Księżycu);orbit_err_growth_m_per_s(liniowy wzrost błędu orbity rozgłaszanej w czasie opóźnienia poprawek, ILLUSTRATIVE);[solution](ograniczenie wysokości, przy nim minimum trzech satelitów, okno użytkownika nieruchomego w epokach). Dwa uzupełnienia porównania z opublikowanymi twierdzeniami, każde zarejestrowane wstępnie osobno przed swoim uruchomieniem, znajdują się obok niezmienionego zapisanego przebiegu: K5 ze wzrostem zawodzi przy każdej szybkości; ze stylem rozwiązania z publikacji źródłowych K1 do K5 zawodzą, a K6 przechodzi (1 z 6), przy czym skorygowany błąd 3-D p95 dla R300 spada z 280,6 m do 2,11 m. MODELLED; trzy wiersze rejestru.Maski horyzontu terenu księżycowego (0,36; pierwsze ograniczenie badania księżycowej stacji referencyjnej): opcjonalna sekcja
[terrain]wlunar-station-coverage(stacja i każdy punkt użytkownika) orazmoonlight-service-volume(każdy punkt siatki) nadaje każdemu miejscu zależny od azymutu horyzont w formacie tabeli skyline z 0,36, z podanego profilu opatrzonego źródłem (station_horizon,user_horizon) i/lub przemiatania promienia nad polarnym DEM (dem_path) wzdłuż kół wielkich sfery księżycowej z dokładną krzywizną. Dołącza wycinek o rozmiarze 0,98 MB publicznego, należącego do domeny publicznej południowobiegunowego DEM LRO LOLALDEM_75S_240M, przepróbkowany uśrednianiem bloków 5 x 5 do 1200 m (data/lunar-dem/, z jego NOTICE, SHA-256 iscripts/make_lola_south_polar_crop.py), oraz scenariusz tylko dla repozytoriumscenarios/lunar-station-coverage-terrain.toml. Sprawdzone względem horyzontów w postaci zamkniętej (gołej sfery, krateru na płaskowyżu, rasteryzowanego stożka); MODELLED, wiersz rejestru "Lunar terrain horizon masks from a stated profile or a polar DEM". Bez tej sekcji każdy dokument, z blokiem jednostek włącznie, jest identyczny co do bajta.Zaufanie uwzględniające geometrię (nota projektowa o geometrii z 0,36, sekcja 4). Każda epoka
receiver-trust, statyczna lub statku, wsadowa lub na żywo, niesie geometrię swoich satelitów:good,degraded(przyczynyfew-satellites,high-pdop,high-hdoporaz informacyjnasky-blocked) albounknown, gdy dziennik nie podaje geometrii satelitów, wraz z HDOP, PDOP, VDOP i użytymi satelitami. Jest wyprowadzana z elewacji i azymutów podawanych przez odbiornik (NMEA GSV, UBX NAV-SAT) przez istniejące jądroorbit::dopalbo brana z NMEA GSA. Każda epoka niesie też etykietę,good,fairlubpoor, zawsze zgłaszaną i nigdy nieoceniającą, oraz uwagę z HDOP, PDOP, VDOP, liczbą satelitów i utratą sygnału opisaną słowami. Wskaźnik statku zyskuje monitorgeometry, który nic nie odejmuje, dopóki geometria nie jest słaba (HDOP powyżej 4, PDOP powyżej 6 lub mniej niż 5 użytych satelitów), po czym narasta do limitu 15 punktów; sama geometria osiąga co najwyżej pasmo pogorszone, nigdy nieufne (bez alarmu). Każde odjęcie dostaje klasę,geometry,environmentlubinconsistency, aby słabe niebo nie było odczytywane jako atak.loss-of-lockjestgeometry, gdy utracone satelity były wszystkie poniżej 15 stopni w ostatnim raporcie; odjęcie za słabą geometrię jestinconsistency, gdy HDOP podany przez odbiornik różni się od jego podanego nieba o więcej niż max(1,0, 25 % wyprowadzonego HDOP), więc sfałszowane słabe niebo nie może kupić etykiety. Nowa tabela[geometry]podaje każdy próg wraz z pochodzeniem (HDOP 4, PDOP 6, co najmniej 5 użytych, sigma_UERE 1,5 m, tolerancja HDOP max(1,0, 25 % wyprowadzonego HDOP), przy czym 25 % jest wyborem reprezentatywnym dla odbiorników z zegarami dla poszczególnych konstelacji lub rozwiązaniami z podzbioru, 15 stopni; wartości IEC 61108-1 i GPS SPS jak cytowano, do sprawdzenia z tekstem norm). Całkowita utrata sygnału nie jest opisywana jako niebo: gdy satelity w widoczności nie są śledzone, a DOP satelitów w widoczności jest dobry (i nieśledzone nie są ograniczone do jednej połowy horyzontu), epoka niesiesignal_loss, a odjęcie za geometrię ma klasęenvironment. Podane HDOP lub PDOP równe 99 albo większe, jakość GGA 0 i tryb GSA 1 są odczytywane jako brak rozwiązania, a nie jako DOP. Limit (cap_points15), koniec narastania (full_ratio1,5) i dolna granica (floor, domyślniedegraded_minwskaźnika) znajdują się w[geometry], podobnie jak dobre poziomy etykiety (HDOP 2, PDOP 3, 6 satelitów, reprezentatywne); obowiązujący limit tomin(cap_points, 100 - floor), więc tabela[score], która podnosidegraded_min(również taka z 0,35), obniża limit zamiast być odrzucona, a dolna granica poniżejdegraded_minjest odrzucana. MODELLED; oprogramowanie wyłącznie doradcze, nie jest to sprzęt nawigacyjny z zatwierdzeniem typu (IEC 61108, IEC 61162): za nawigację statku odpowiada nadal operator.Geometria dociera do każdej powierzchni: wyniku JSON (
epochs[].geometry,classprzy każdym odjęciu,geometry_model,geometry_summary), linii JSON na żywo (schemat 1,3),receiver_trustw Pythonie i WebAssembly,assess_vessel_logireceiver_trust_replay, narzędzi MCPassess_*, pakietów dowodowych (epochs.json,config.json, ścieżka geometrii na stronie podsumowania) oraztrust-telemetry(Prometheuskshana_trust_geometry*i etykietaclasswkshana_trust_reason_active, OTLPkshana.geometry.*, pola niestandardowe CEFcs6(stan i klasy geometrii),cfp3(HDOP) icfp4(PDOP), sprawdzone względem obu parserów wyroczni CEF, oraz LEEFgeoStatus,geoHdop,geoClass). Eksportowana jest także etykieta geometrii, dołączana po każdym wcześniejszym szeregu i polu i tylko dla danych wejściowych, które ją niosą: Prometheuskshana_trust_geometry_label{label}ikshana_trust_geometry_vdop, OTLPkshana.geometry.labelikshana.geometry.vdop, LEEFgeoLabel,geoPdop,geoVdop,geoUsed, a w CEF trzecie polecs6(etykieta) icn1(użyte satelity); VDOP nie ma w CEF (pola niestandardowe zmiennoprzecinkowe są zajęte). Oba parsery wyroczni CEF odczytują przypadki etykiet z powrotem tak, jak je zapisano (poprawka 5: 176 linii, 172 sparsowanych przez pycef, 176 przez Logstash). Podany HDOP, którego podane niebo nie wyjaśnia, jest oznaczany przy każdej epoce i liczony (geometry_summary.hdop_mismatch, wiersz na stronie podsumowania dowodów), oceniany tylko wtedy, gdy geometria jest słaba. Utrata sygnału jest eksportowana osobno, ponieważ stan geometrii pozostajedegraded, dopóki ona trwa: Prometheuskshana_trust_geometry_signal_loss, OTLPkshana.geometry.signal_loss, LEEFgeoSignalLoss=1; w CEF widać ją jako klasęenvironmentwcs6.orbit::dop_cofactor: współczynnik kowariancji(HᵀH)⁻¹stojący zaorbit::dop, wyodrębniony z niego z tą samą arytmetyką.Wiersz rejestru "Position error from geometry: RMS error = sigma_UERE x DOP" (MODELLED, spójność wewnętrzna): ziarnowane Monte Carlo rozwiązania najmniejszych kwadratów silnika na 8 geometriach DOP zgodnych z gnss_lib_py względem współczynnika kowariancji sprawdzonego jądra DOP, z tolerancjami zarejestrowanymi wstępnie przed pierwszym uruchomieniem i dwiema kontrolami negatywnymi, które zawodzą zgodnie z wymaganiem; obok wcześniejsza kontrola na czterech ręcznie dobranych niebach z przedziałami ufności chi-kwadrat, zgłoszona jako wykonana przed wstępną rejestracją.
Maski skyline zależne od azymutu (
src/skyline.rs,docs/SKYLINE.md, punkt 1 noty projektowej): odcięcie elewacji zależne od azymutu, maksimum punktowe tabel (każda interpolowana osobno, zawijana przy 360°), kanion uliczny w postaci zamkniętej (z opcjonalnymi otwartymi końcami), sektory o ostrych krawędziach i profil terenu z krzywizną Ziemi; efektywne odcięcie tomax(mask_deg, skyline). Cztery presety REPRESENTATIVE z podanym pochodzeniem (city-street,harbour-approach,fjord,container-terminal), z możliwością nadpisania pole po polu. Opcjonalna sekcja[skyline]w plikach szkoleniowychgnss-sim,jamming,leo-pvt(każdy tryb, z przemiataniem polarnym włącznie),leo-passinmea-scenariooraz worbitiintegrityprzez nowego użytkownika w miejscu naziemnym,user_site = { lat_deg, lon_deg, height_m }(geodezyjne kąty widzenia na wirującej Ziemi, z geodezyjnym zenitem dla podziału ARAIM na poziomy i pionowy; każda próbka to jeden bezwzględny moment,epoch + t, do którego zestawy elementów, efemerydy rozgłaszane i pliki SP3 są przesuwane od swoich własnych epok, datowane od najnowszej epoki satelity, gdy nie podanoepoch; orbitującyuserodrzuca skyline). Wyniki zyskująskyline { source, open_fraction, provenance }i dla każdej próbkimasked_by_skyline. Bez tej sekcji każdy scenariusz jest identyczny co do bajta z 0.35.0, co sprawdzono względem skrótów z commitu wydania. Sześć dołączonych przykładów:orbit-urban-canyon-skyline,integrity-harbour-approach,gnss-sim-container-terminal-skyline,jamming-harbour-approach-skyline,leo-pvt-fjord-skylinei kampanialeo-vertical-autonomous-vehicle-skyline(kanion pojazdu autonomicznego jako płaskie odcięcie i jako ulica; istniejąca kampania pozostaje bez zmian). MODELLED.Funkcje geometrii nieba (
src/geometry.rs, punkt 2 noty projektowej):sky_geometry(satelity widoczne i zamaskowane z miejsca, czasu i presetów konstelacji, dwuwierszowych zestawów elementów (tle, co najwyżej 4 MiB, propagowanych przez SGP4 silnika doepochw UTC) lub podanych satelitów;sky_sourceisky_statementmówią, czy niebo jest reprezentatywne, czy jest niebem, jakie zestawy elementów dają w tej epoce, a nie pomiarem;tle_skippedwymienia każdą nieużytą linię wraz z przyczyną; limity wejścia 2000 satelitów nad horyzontem, sprawdzane przed zbudowaniem tabeli systemu, oraz 16 zegarów odbiornika; pięć współczynników DOP; kofaktor i kowariancja ENU z jednym zegarem na system albo jednym wspólnym; poziomą elipsę błędu przy jednym sigma i przy podanym poziomie ufności),sky_monte_carlo(ziarnowane błędy najmniejszych kwadratów, co najwyżej 5000),skyline_presets,skyline_profileiskyplot_svg.orbit::dop_covudostępnia kowariancję stojącą zaorbit::dop, które jest teraz jej redukcją (sprawdzone wartości skalarne bez zmian). Powierzchnie:kshana skyikshana skyline, funkcje Pythona i WASM o tych samych nazwach, narzędzie MCPsky_geometry(40 narzędzi) oraz notatniknotebooks/geometry.ipynb(z lustrem.md; uruchamiany przeztests/python/test_notebooks.py). Każdy wynik niesie etykietę MODELLED, oświadczenie o modelu błędu i uwagę doradczą.Rejestr: pięć wierszy dotyczących skyline i geometrii nieba. VALIDATED, każdy w porównaniu zarejestrowanym wstępnie przed uruchomieniem jego wyroczni: Azimuth-dependent skyline mask: visible set, azimuth and elevation, and DOP under the mask względem Orekit 12,2 (
TopocentricFrame,ElevationMask) i gnss_lib_py 1.0.4 (get_dop), najgorsze różnice kątów widzenia i masek 1.1e-12° wobec 1e-9°, identyczne zbiory widocznych, DOP 3.3e-13 względem wartości (xval/orekit-skyline/); Horizontal error ellipse and per-system cofactor from the geometry covariance względem numpylinalg.invilinalg.eigh(standardowe P2), 270 przypadków, osie 5.1e-13 względem wartości (xval/numpy-ellipse/). MODELLED: redukcje kanionu, sektora i terenu; presety; złożenie geometrii nieba (niebo z presetu, chmura Monte Carlo).Z wierszami o zaufaniu geometrycznym, skyline i księżycowej stacji referencyjnej rejestr liczy 274 wierszy: 134 sprawdzonych względem niezależnego wzorca zewnętrznego, 136 obliczonych z modelu, 4 partnerskich.
Księżycowa stacja referencyjna: laboratorium czasu stacji (MODELLED). Opcjonalny blok
[time_lab]wlunar-time-budget(src/lunar_time_lab.rs). Modeluje zegar stacji (domyślnie klasy miniRAFS, dowolna nazwana klasa albo karta urządzenia dopasowana do podanych punktów stabilności) sterowany do LTC, a następnie swobodnie pracujący lub ponownie sterowany co N sekund. Wystawia krzywą błędu czasu x(t), czas do 1, 10 i 100 ns (bisekcja obok postaci zamkniętej) oraz dominujący człon dla każdego horyzontu, wszystko z jednostkami. Reszta sterowania jest ILLUSTRATIVE. Tempo LTC nie jest wyprowadzane na nowo i zachowuje swój własny wiersz VALIDATED. Docelowy poziom nanosekund z publicznych materiałów ICG WG-B o księżycowym PNT (czerwiec 2024) jest przytoczony jako stwierdzenie źródła, a nie twierdzenie. Uporządkowanie zegarów optyczny < PHM < RAFS < miniRAFS obowiązuje od 1 s do 7e5 s, a test przypina przecięcie krzywych PHM i RAFS w pobliżu 7.5e5 s. To przecięcie jest własnością modeli zegarów z pojedynczym typem szumu (czysty flicker FM wobec czystego białego FM), a nie wynikiem fizycznym. Bez tego bloku raport, jego tabela i jego podsumowanie pozostają bez zmian. Przykład:scenarios/lunar-station-time-lab.toml. Dodaje jeden wiersz rejestru z etykietą MODELLED.Księżycowa stacja referencyjna: geodezja stacji (MODELLED). Opcjonalne dane wejściowe
extra_reflectorsiextra_beaconswlunar-llr-datumdodają blokstation_geodesy. Informacja o datum w pięciu tablicach z zarchiwizowanego wycinka laserowych pomiarów odległości jest łączona z tym, co wniosłyby dodany retroreflektor i dodana latarnia VLBI w podanych miejscach. Odległość do reflektora mierzy się w zarchiwizowanych epokach, w których jest on widoczny, z ich zarchiwizowanymi wagami. Latarnia używa sieci i harmonogramulunar-frame-campaign, ze stałymi stacjami. Blok podaje 1-sigma każdego parametru Helmerta przed i po oraz ich stosunek. Są to granice Craméra-Rao dla zredukowanego zestawu parametrów, na harmonogramie i miejscu ILLUSTRATIVE. Nieobecne lub puste dane wejściowe pozostawiają raport identyczny co do bajta. Przykłady:scenarios/lunar-station-geodesy-baseline.tomli-with-station.toml. Dodaje jeden wiersz rejestru z etykietą MODELLED.Księżycowa stacja referencyjna: porównanie z opublikowanymi twierdzeniami (MODELLED). Każde twierdzenie liczbowe z pięciu publicznych źródeł jest wymienione z dokładnym brzmieniem, stroną i podanymi założeniami oraz sklasyfikowane jako porównywalne, częściowo porównywalne lub nieporównywalne (
tests/fixtures/lunar_station_published/CLAIMS.md; źródła z adresem URL, datą pobrania, SHA-256 i licencją wtests/fixtures/lunar_station/SOURCES.md). Twierdzenia częściowo porównywalne oceniono według sześciu jednostronnych progów zarejestrowanych wstępnie przed uruchomieniem (PREREGISTRATION.md, rewizja 2, 05bf9a19): 1 z 6 twierdzeń mieści się w wstępnie zarejestrowanym progu (zarejestrowane wstępnie 05bf9a19). Pokrycie wynosi 0,00 wobec >= 0,95 na obu kołach południowobiegunowych, a skorygowane p95 wynosi 280,6 m wobec <= 1,5 m. Przyczyną są elementy orbit satelitów, których żadne źródło nie publikuje: przy elementach ILLUSTRATIVE z repozytorium cztery satelity są we wspólnej widoczności w 8 % epok, przy geometrii bliskiej osobliwej. Przebieg nie odtwarza tych twierdzeń na tych elementach i nie jest dowodem, że twierdzenia są błędne. Przypięte wtests/lunar_station_published_oracle.rs. Jeden wiersz rejestru, z etykietą MODELLED i ustaleniem.Księżycowa stacja referencyjna: gotowość danych plików zegarowych.
realdata::clk::rinex_clock_seriespodaje teraz system czasu swoich epok. Jest to wartośćTIME SYSTEM IDalbo, gdy jest nieokreślona, wartość domyślna dla systemu satelitarnego z nagłówka. Wynik mówi też, czy system został zadeklarowany. Funkcja odrzuca nieznany system czasu (na przykład księżycową skalę czasu), plik o niezadeklarowanym mieszanym systemie oraz pliki, które się nie zgadzają, zamiast odczytywać je jako czas GPS. Dostarcza syntetyczny przykład zegara stacji. Nie zdefiniowano formatu pliku poprawek, ponieważ żaden publiczny nie istnieje.
Zmienione#
Dokumentacja modułów
fusion::ukf,fusion::tightly_coupledifusion::gnss_ins_ekfnie nazywa już 17-stanowego nawigatora UKF, ścisłego sprzężenia pełnego INS ani jawnego stanu zegara przyszłą pracą; odsyła dohybrid_ukf,tightly_coupled17icarrier_tc.RINEX 4 nie jest już odrzucany (0,36, WP-07): plik nawigacyjny RINEX 4 był wcześniej celowo odrzucany; teraz jest odczytywany (zob. Dodano). Dla plików obserwacji w wersji 4 i nowszych etykiety nagłówka są dopasowywane tylko w kolumnach 61-80, aby nowe rekordy dowolnego tekstu nie mogły uchodzić za etykiety.
ionex::parse_ionexodczytuje rzeczywiste pliki IONEX (0,36, WP-07): pełny rekord 16 wartości wypełnia kolumny 61-80, które czytnik brał za etykietę, więc zwracałNonedla każdego rzeczywistego pliku IONEX. Teraz odczytuje rekord, którego pole etykiety jest liczbowe, jako wartości. Żaden dostarczany wynik z tego nie korzystał.Moce odbierane Galileo E1 i E5a według OS SIS ICD Issue 2,1 (rewizja, 2026-10-14). Pasma widma
galileo-e1igalileo-e5aoraz ofiary GNSS wśród sygnałów LEO, które biorą z nich swoją moc, używają teraz minimalnych mocy odbieranych z tabeli 12 Galileo OS SIS ICD Issue 2,1: −157,25 dBW (było −157,0) i −155,25 dBW (było −155,0).- Dziewięć wyników scenariuszy się zmienia: przykłady widma, kampania widma, trzy pionowe zastosowania odporności LEO i trzy projekty sygnałów LEO. Efektywne C/N0 zmienia się o −0,25 dB, a J/S o +0,25 dB w tych pasmach.
- Każda zmieniona wartość (1766, stara → nowa) jest wymieniona w
docs/revisions/CAP12-galileo-icd21-power-changes.mdi jego CSV wraz z tabelami dokumentacji, które się zmieniły. Żaden wiersz rejestru nie zmienia statusu. - Druga część, tego samego dnia: ofiary wśród sygnałów LEO
galileo-e5b(−155,0 → −155,25 dBW, tabela 12 E5b) igalileo-e5-altboc(−152,0 → −152,24 dBW). ICD nie ma wiersza dla pełnego pasma E5, więc wartość AltBOC jest sumą mocy sum E5a i E5b z tabeli 12, zbudowaną tak, jak dawną wartość. Trzy wyniki projektów sygnałów LEO się zmieniają (64 wartości: te moce odbierane i degradacja C/N0 z LEO do GNSS na dwóch ofiarach), wymienione w tej samej rewizji (§5) i CSV. Nic więcej się nie zmienia.
Poprawka pływu atmosferycznego S2 (
tides::atmospheric_tide). Harmoniczne ciśnienia powietrza S2 według Raya (2001) są współczynnikami nieznormalizowanegoP_nmz opóźnieniami fazy w kosinusie; używano ich jako w pełni znormalizowanych, z opóźnieniem jako wyprzedzeniem sinusowym IERS. Teraz wchodzą podzielone przezN_nmzε = 90° − ψ; nowetides::s2_air_wavesodtwarza model A2 z GFZ STR06/01, tabela 5, dla wszystkich 21 fal (najgorzej 0,0005 cm, 0,05°; VALIDATED). Zmieniają się tylko wyniki z włączonymi pływami: dopasowanie CI Galileo 0,132 → 0,133 m, składowe Swarm-A o 1–2 mm (zarejestrowane wstępnie wxval/s2-air-tide-fix/).Tylko dokumentacja:
propagator::solve_kepler_checked,orbit::solve_kepleriephem::solve_keplersą opisane jako starsze rozwiązania, liczbowo bez zmian, z odesłaniem dokepler::solve_kepler_markley.Stan rundy 3 D9 (
utck_bound). BIPM Circular T 465 ukazał się 2026-10-12. Wstępnie zarejestrowana ocena prospektywna nadal nie została uruchomiona: wydanie 465 zawiera około 285 wartości testowych, a reguła zatrzymania wymaga 1000, więc około wydań 465–468. Uruchomienie wymaga też zarchiwizowanych plików poszczególnych laboratoriów z 2026-09-30, ponieważ BIPM od tego czasu przepisało 87 z 113. Wiersz rejestru i nagłówek testu to mówią; test, jego progi i jego podział są bez zmian.Przegląd rzetelności dokumentacji (0,36). Mapa drogowa, wiersze możliwości, wiersze statusu dokumentów projektowych i komentarze modułów dostosowano do kodu; wyniki bez zmian. Pozycje już zbudowane, ale nadal wymienione jako otwarte, są teraz oznaczone jako zrobione: kontrole masek ITU-T, scenariusz holdover 24 h i wczytywanie dzienników zegara (synchronizacja czasu w telekomunikacji), szybkie starty na pierwszą minutę, Lense–Thirring i porównanie krzyżowe propagatora Orekit, łańcuch GCRS z precyzyjnym ITRF, skróty wzorcowe i międzyplatformowe, pochodzenie, ARAIM z wieloma błędami (ADD v4.2), FDE dla pojedynczego satelity, biblioteka CRPA, granica niejednoznaczności prążków CAI, wymiarowanie streets-of-coverage i widok orbity 3-D, dynamika orientacji bryły sztywnej, zapisywacz OMM i czytnik jąder NAIF, libracja księżycowa DE440, zdanie o znaczeniu przebiegu w playground,
PositioningFom, 17-stanowy nawigator ze ścisłym sprzężeniem i rodzaj mapy grawitacyjnej. Wiersze podają też dokładnie, co nadal jest otwarte (na przykład dwuczęściowa JD worbit::Propagator, czytniksrc/ionex.rswzględem rzeczywistego produktu i wykluczanie wielu satelitów wraim). Brakującydocs/design/evidence/cn0-m2m4/RESULTS.mdnapisano na podstawie świeżego uruchomienia jego testów (M1–M4 zaliczone), a robocza wersja walidacji IQ skierowana do partnerów ma aktualne liczby wierszy rejestru.Kody pamięci Galileo E1 nie są już dołączane.
data/galileo-os-sis-icd/C7_E1B.txtiC8_E1C.txt(załącznik C.7/C.8 do ICD) zostały usunięte z repozytorium i pakietów. Warunki ICD (zacytowane wLICENSING.md) pozwalają użytkownikowi przechowywać kody z podaniem źródła i używać ich w produkcie, ale zezwalają na redystrybucję tylko do celów niekomercyjnych, a Kshana jest oferowana także na licencji komercyjnej.galileo::e1b_table/e1c_tablezwracają terazResulti odczytują własną kopię użytkownika zKSHANA_GALILEO_E1B/KSHANA_GALILEO_E1Calbo, w kopii źródeł, zdata/galileo-os-sis-icd/, gdzie nowyscripts/fetch_galileo_e1_codes.shwyodrębnia je z PDF-a ICD (ze sprawdzeniem skrótu).galileo::E1B_TABLE_TEXT/E1C_TABLE_TEXTzostały usunięte. Bez tablic sygnały Galileo E1 (galileo-e1b,galileo-e1c) zwracają błąd, który mówi, jak je dostarczyć, a testy E1 są pomijane z komunikatem. Przy obecnych tablicach każdy wynik E1 jest bez zmian. Żaden scenariusz, wzorzec ani wynik widma nie używa tablic kodów. Wzorce testowe E5a z załączników C.3/C.4 (wyrocznia LFSR wtests/iq_signals.rs) są traktowane tak samo: pobierane tym samym skryptem, ignorowane przez git, a test jest pomijany bez nich.Przenośna matematyka wszędzie (0,36, STUDIO-15): każda funkcja przestępna
f64w bibliotece oraz próbniki rozkładu normalnego, gamma i wykładniczego zrand_distrliczą teraz przez czysto rustowelibm(portable_math::PortableFloat,portable_distr), więc wersja natywna i wersja WebAssembly zwracają identyczne co do bajta wynikowe JSON dla wszystkich 141 dołączonych scenariuszy oraz dla krótkiego przebiegu IQ. Kosztem jest to, że ostatnie bity wyników liczonych biblioteką matematyczną hosta się zmieniły: zmieniło się 98 ze 141 dołączonych scenariuszy, 43 się nie zmieniło; 5 zmieniło się o więcej niż 1e-3 w swoim największym polu, a pozostałe o mniej. Każda zmieniona wartość jest wymieniona jako stara -> nowa wdocs/revisions/STUDIO15-portable-math-rebaseline.md(wraz z CSV wszystkich 136 127 zmienionych liczb); żaden próg, tolerancja ani wartość graniczna się nie zmieniły. Opublikowane liczby, które się zmieniły: dostępnośćeuropa-surface-pntprzy zasięgu Ziemi 0,719 -> 0,713 i błąd RMS 86,147 -> 86,499 m (jedna epoka na krawędzi dostępności rozstrzyga się teraz wszędzie tak samo; na macOS arm64 wypisywała 0,725 / 85,800 m); błąd stacjilunar-joint-od-clock3,541350 -> 3,536885 m z VLBI i 2183,558 -> 2184,021 m bez;paper/crossover/inertial.json, osiem wartościvibration_psdo 3 jednostki na ostatnim miejscu (erratum w raporcie technicznym); wydany dokumentcislunar-observabilityw wielkościach na poziomie podłogi zaokrągleń (osiem wartości poza sześcioma cyframi znaczącymi, do 6.8e-5 względem wartości; żadna ranga ani próg się nie zmieniły). Przypięte skróty strażników identyczności co do bajta (skyline_scenarios,geometry_corpus_identity,geometry_trust_no_change) przeliczono na nazwany punkt odniesienia "0,36 portable", a wartości z 0.35.0 zachowano jako zapis historyczny; zamrożona prognoza księżycowej stacji referencyjnej jest nietknięta, a jej przenośne ponowne uruchomienie zapisano obok (docs/predictions/*.portable-0.36.json).tests/lunar_joint_od_numpy_oracle.rs(sprawdzony wiersz księżycowego wspólnego OD): wzorce wyeksportowano ponownie, a porównanie z numpy powtórzono z numpy 2.4.6, zarejestrowaną wersją, skryptem i progiem bez zmian; wszystkie sześć sieci jest zaliczonych (docs/revisions/STUDIO15-lunar-joint-od-oracle-rerecord.md). Praca z partii 2-3 włączona po STUDIO-15 również korzysta z przenośnej matematyki (457 miejsc wywołań w 62 plikach); to, co to zmieniło, jest wdocs/revisions/STUDIO15-batch4-rebaseline.md: 12 dołączonych scenariuszy (największa zmiana względna 5.2e-8, żadna wypisana wartość się nie zmienia), 28 wierszy strażnika skyline zatwierdzonych na nowo, skrót M2M4 wiq_campaign, starsze skróty prawdygnss-ins, sigma datum nieobserwowanej latarni (632,3769 -> 632,3772 m) oraz dwa zapisane ustalenia (domknięcia DRO w CR3BP; CRPA A3, 194 z 456 łączy). Dokładne edf Greenhalla zachowuje swój sprawdzony próg dzięki logarytmowi double-double w jądrze (docs/revisions/STUDIO15-greenhall-edf-portable.md), a wyrocznię test bench gps-sdr-sim uruchomiono ponownie na zmienionych eksportach NMEA, przy czym każdy próg został dotrzymany (docs/revisions/STUDIO15-testbench-gpssdrsim-rerun.md).README: wiersz zestawu księżycowego podaje poziom dowodowy każdego elementu (wcześniej głosił, że wszystkie są MODELLED).
realdata::clk::rinex_clock_serieszwracaRinexClockSeries(szereg, dziennik siatkowania, system czasu, informację, czy został zadeklarowany, typ rekordu) zamiast krotki(PhaseSeries, GriddingLog). Teraz przechodzi z rekordów satelitarnych (AS) do rekordów odbiornika/stacji (AR) o żądanej nazwie.Żaden wskaźnik się nie zmienia, chyba że geometria jest słaba; etykieta jest zawsze zgłaszana. Przy dobrej lub przyzwoitej geometrii (w tym otwartego nieba tylko GPS z 8 satelitami) albo nieznanej geometrii (monitor nie działa) każdy wskaźnik jest taki jak w 0,35:
tests/geometry_trust_no_change.rstrzyma wyniki obu przykładowych sesji, atests/geometry_corpus_identity.rskażdy zatwierdzony korpus NMEA statku (także jako otwarte niebo tylko GPS) i scenariusze szkolenia załóg przy bajtach z 0.35.0 po usunięciu dołączonych kluczy; w dwóch scenariuszach szkoleniowych, w których zagłuszanie pogarsza geometrię, słabe epoki różnią się wyłącznie odjęciem za geometrię. Dziennik ze słabą geometrią traci do 15 punktów, których nie tracił w 0,35. Poza tym zamierzone zmiany, wszystkie addytywne: powyższe klucze w wynikowym JSON i pakietach dowodowych (score_model.weightsbez zmian); schemat linii JSON na żywo przechodzi z 1,2 na 1,3 (geometrydołączone,classw każdym odjęciu); podsumowanie fragmentu zyskujegeometry; telemetria zyskuje szeregi geometrii, pola i etykietęclasstylko dla danych wejściowych, które je niosą, więc strumień lub wynik z 0,35 renderuje się co do bajta tak jak wcześniej.geometryjest 17. nazwą monitora; jest wymieniana jako ostatnia wmonitors_run, gdy podjął decyzję (statek, którego dziennik podaje geometrię; lista z 0,35 zachowuje swoją kolejność, a liczba monitorów w podsumowaniu rośnie o jeden) i nie ma wpisu[score.weights](ustawienie go jest odrzucane: jego odjęcie ustawia się w[geometry]).tests/fixtures/dop/NOTICEnazywał licencję gnss_lib_py Apache-2.0; wydanie 1.0.4 jest na licencji MIT.Czytnik NMEA odczytuje teraz GSA (krótkie GSA jest ignorowane, nie liczone jako pominięte) i zachowuje elewacje i azymuty GSV, także dla satelitów wymienionych bez sygnału; czytnik UBX zachowuje elewację i azymut NAV-SAT. C/N0 jest odczytywane dokładnie tak jak przedtem.
Zmiana wyniku: zagłuszacze szerokopasmowe i przemiatane używają teraz Q = 2. Równanie odporności na zagłuszanie używa dla tych zagłuszaczy podręcznikowej poprawki widma rozproszonego Q, tam gdzie używało 1. Q = 2 to biały szum nad listkiem głównym z unormowaną mocą sygnału w paśmie; w testach jest przypięte do postaci zamkniętej z
navsignal.- Bez zmian: zagłuszacze CW i wąskopasmowe (Q = 1), nierozpoznany typ zagłuszacza (Q = 1, wartość najbardziej szkodliwa) oraz
q_override. - Skutek: tam, gdzie działa zagłuszacz szerokopasmowy lub przemiatany, efektywne C/N0 rośnie nawet o 3,0103 dB, wyprowadzone progi J/S rosną o 3,0103 dB, a promienie odmowy w wolnej przestrzeni maleją o czynnik 0,7071.
- Zmienione dołączone scenariusze: zmienia się 12 ze 144, wszystkie zgodnie ze wstępną rejestracją (
xval/jammer-q/PREREGISTRATION.md, wyniki wxval/jammer-q/RESULTS.md):jamming-demo: C/N0 +3,01 dB;jamming-harbour-approach-skyline:min_tracking6 → 7;lunar-jamming: utracone satelity 26 → 0, mediana odległości utraty synchronizacji 27,4 → 19,4 km;tracking-loop: promień odmowy dla dynamiki pętli 75,2 → 53,2 km;- oraz kampanie i kontrole krzyżowe widma, które je zawierają.
- Dotknięci odbiorcy: rodzaje
jamming,lunar-jamming,tracking-loopiimpairment-eval,jamming_kind_cross_checkrodzajów widma, krzywa odniesienia MODELLED kampanii IQ i domyślne Q w labfit oraz eksport sceny interop.
- Bez zmian: zagłuszacze CW i wąskopasmowe (Q = 1), nierozpoznany typ zagłuszacza (Q = 1, wartość najbardziej szkodliwa) oraz
Wtyczka JetBrains: brak przestarzałego lub przeznaczonego do usunięcia API platformy. Pięć okien wyboru używa małego
DialogWrapperz listą rozwijaną zamiast przestarzałegoMessages.showChooseDialog; selektory pojedynczego pliku używają konstruktoraFileChooserDescriptorzamiast przestarzałegoFileChooserDescriptorFactory.createSingleFileDescriptor(); animacja otwiera się przezBrowserUtil.browse(Path)zamiastbrowse(File), które platforma 2026,3 przewiduje do usunięcia. Since-build pozostaje 243. IntelliJ Plugin Verifier zgłasza Compatible, bez użycia przestarzałych lub przeznaczonych do usunięcia elementów, dla 2024,3 (IC-243.21565.193), 2025,2 (IC-252.23892.409), 2026.2.3 (IU-262.10968.63) i 2026,3 EAP (IU-263.6259.32);verifyPlugindomyślnie sprawdza 2024,3 oraz każdą listę podaną wKSHANA_VERIFY_IDES.gnss_sim::run_gnss_simijamming::run_jammingzwracająResult: nieprawidłowa sekcja[skyline]jest błędem przy wywołaniu bezpośrednim, jak już było przezapi::run_toml, zamiast cichego powrotu do płaskiej maski. Zmiana łamiąca dla wywołujących te dwie funkcje z Rusta.
Poprawiono#
Punktacja kampanii: rzeczywisty fałszywy zaczep trackera nigdy nie był liczony (
iq::campaign). Kontrola fałszywego zaczepu trackera przenosi kanał z LOCKED do LOST w chwili zadziałania. Punktacja oznaczała natomiast następną aktualizację kanału, która była już niezaczepiona i dlatego nigdy nie była liczona. Zdarzeniefalse-lockzgłoszone z LOCKED jest teraz jednym epizodem w swoim czasie, w przebiegu i w każdym podanym zdarzeniu, które je zawiera. Zdarzenie znalezione podczas wciągania albo powtórzone przez kanał już LOST nie jest nowym epizodem. Nowy test wymusza rzeczywisty fałszywy zaczep: prawidłowa nośna GPS L1 C/A przesuwana skokiem o 1/(2T) w stanie zaczepienia (tests/iq_campaign_false_lock.rs).- W kampanii odniesienia z
tests/iq_campaign.rszmienia się tylko PRN 11 dla ramp/agc-3bit (epizody fałszywego zaczepu 0 → 1, 426 i 437 na godzinę zaczepienia). - Jego DIGESTy komórek zostały przypięte na nowo.
- Wstępnie zarejestrowane przypięcie ocenionych wyników pozostaje aktywne i nadal odtwarza się dokładnie: w jego haszu tylko te sześć pól, zmienionych przez tę poprawkę wprowadzoną po rejestracji, jest odwzorowanych z powrotem na wartości sprzed poprawki. Poprawione wartości są przypięte osobno.
- Żaden próg nie został zmieniony i żaden wiersz VALIDATED, żadna wartość ani liczba w sieci się nie zmieniły.
- W kampanii odniesienia z
lunar-frame-campaign: latarnia bez obserwacji jest teraz zgłaszana (znaleziono w MR-05). Raport zyskuje
unobserved_beaconsiwarningtylko wtedy, gdy jakaś latarnia nie ma obserwacji, a wtedy sigmy obserwowanych latarni pochodzą z ich własnej informacji zamiast być wszystkie puste. Datum jest bez zmian i żaden domyślny, dołączony ani opublikowany wynik się nie zmienia (docs/revisions/BEACON-unobserved-cell-changes.md).Księżycowy układ osi głównych (
lunar_frame::icrf_to_moon_pa, używany przezlunar_odi dopasowanie LRO): przesunięcie DE421 od średniej Ziemi do osi głównych zmoon_080317.tfbyło zastosowane w złym kierunku i z błędną kolejnością kątów Eulera, więc analityczny układ PA leżał około 208″ od PA zamiast na nim. Jest teraz przepisane tak, jak definiuje je Frames Required Reading SPICE, i zgadza się z SPICEpxform('MOON_ME','MOON_PA')do 2.6e-16 rad; analityczny układ PA jest 6″ do 8″ od PA z DE440 (zarejestrowane wstępnie e1ead19b, zarejestrowane ponownie be33382e po tym, jak pierwsza proponowana zmiana nie spełniła progu 1e-12;docs/design/evidence/fut05b-me-pa-offset-sign/). Opublikowane liczby, które się zmieniają: dopasowanie LRO (tests/agency_lro.rs) nakładanie surowe 53,8 → 39,9 m, dynamiczne 12,6 → 12,05 m, zredukowane dynamicznie 6,65 → 6,67 m (progi bez zmian). Stos analityczny zgadza się teraz z walidacją krzyżową ANISE klasy DE (12,0 / 6,67 m) na obu poziomach; wcześniejsza luka na poziomie dynamicznym była tym błędem.Serwer MCP odrzuca
[terrain] dem_hgt(dalszy ciąg CAP-06b). Ścieżka kafla terenu dla rodzaju jamming jest teraz winline_only::FILE_SOURCE_KEYS. Powierzchnia wbudowana odrzuca scenariusz, który ją wskazuje, komunikatem niezawierającym ani ścieżki, ani błędu systemu operacyjnego. Test strażnika źródeł plikowych oznacza teraz także pola kończące się na_hgt.Jd2::from_partsz ułamkową częścią dnia gubiło ułamek w konwersjach UTC, TAI, UT1 i obrotu Ziemi (jedna godzina części dnia obracała Ziemię błędnie o 15°); część dnia jest teraz normalizowana do liczby całkowitej. Nie dotknęło to żadnego wywołującego z silnika: każdy przekazuje dzień całkowity, a każdy dostarczany wynik jest identyczny co do bitu.
Planowane#
- Geometria z podanego skyline (0,36, punkt 1, teraz w silniku jako
src/skyline.rs):sky-blockediopen_fractionze skyline, gdy dane wejściowe go podają (luka azymutu jako rozwiązanie zastępcze), zdarzenie naturalnej degradacji (fiord lub terminal) wnmea-scenariooraz dwie zamaskowane geometrie z noty projektowej w wierszu sigma_UERE x DOP, zarejestrowane wstępnie jako uzupełnienie. - Geometria dla dzienników RINEX z nawigacją (z własnego rozwiązania silnika) i dzienników Androida (z wierszy
Status); oba odczytują dziśunknown. Geometria w$PKSHT(wersja 1 bez zmian w 0,36) oraz integracje z Signal K i OpenCPN. - Istniejąca wcześniej luka, niewprowadzona w 0,36: gdy pole SNR każdego satelity jest puste, nie zadziała ani
loss-of-lock, ani odjęcie za C/N0; całkowita utrata sygnału jest widoczna tylko przezsignal_lossmonitora geometrii (klasaenvironment). Odjęcie za nią jest planowane. - Strumień schematu 1,3 w zewnętrznych wyroczniach telemetrii (parser formatu tekstowego Prometheus i kolektor OTLP), które dziś obejmują tylko strumienie 1,2.
- Przeszkoda dwustronna (kanion lub wąski fiord) jest odczytywana jako utrata sygnału, a nie zablokowane niebo, dopóki skyline nie zostanie zintegrowany.
[0.35.0] - 2026-10-12#
Fragment wymieniający klientów AI osób trzecich pominięto tutaj; znajduje się w CHANGELOG.md na GitHubie.
Weryfikator Galileo OSNMA#
- Nowy moduł
kshana::osnmaikshana osnma verify <input>: otwarty, czysto rustowy weryfikator OSNMA Galileo po stronie odbiornika. Odczytuje strony I/NAV i zgłasza, dla każdego satelity i epoki, czy dane nawigacyjne są uwierzytelnione, wraz z przyczyną każdej porażki lub opóźnienia: parsowanie HKROOT i MACK, ponowne składanie DSM-KROOT i DSM-PKR, weryfikacja klucza publicznego drzewem Merkle'a, weryfikacja łańcucha kluczy TESLA, weryfikacja MACSEQ i znaczników dla ADKD 0, 4 i 12 z uwierzytelnianiem krzyżowym oraz wynik w kształcie$PKSOSdla monitora zaufania do odbiornika. Wynik niesie uwagę doradczą, że status nie jest usługą integralności nawigacji.docs/OSNMA.mdpodaje, co jest, a co nie jest weryfikowane, wymóg czasowy oraz to, że Kshana nie przyznaje żadnych praw w ramach IPR ICD OSNMA UE (użytkownicy opierają się na autoryzacji z załącznika E do ICD). Zaimplementowane względem SIS ICD Issue 1,1 i Receiver Guidelines Issue 1,3. Strony są sprawdzane CRC, a strumień bajtów UBX-RXM-SFRBX z u-blox można odczytać bezpośrednio (--format ubx). Testy domyślne używają danych syntetycznych i opublikowanych testów znanych odpowiedzi dla prymitywów; opcjonalny test odczytuje lokalnie pobraną kopię oficjalnych wektorów. Po niezależnym przeglądzie weryfikator bierze czas tylko ze zweryfikowanych kluczy TESLA (sfałszowana podramka z dalekiej przyszłości nie może już skasować porażki), pozwala uwierzytelnieniu wygasać i podążać za używanym IODnav, uwzględnia zweryfikowane komunikaty alarmowe (których liść Merkle'a obejmuje teraz losowe pole NPK) i status NMA "don't use", trzyma znaczniki zastępcze poza statusem satelity, prowadzi łańcuchy według CID z unieważnianiem i odnawianiem, sprawdza hasz dopełnienia KROOT oraz ogranicza długości ramek UBX i nakład weryfikacji TESLA. Satelita jest uznawany za uwierzytelnionego tylko dopóty, dopóki najnowsze dane efemeryd i zegara, które nadaje, są co do bitu danymi, które zostały uwierzytelnione (nie tylko pod tym samym IODnav), status lub unieważnienie z nieuwierzytelnionego nagłówka NMA liczy się tylko wtedy, gdy zgadzają się dwa satelity albo niesie je zweryfikowany KROOT, odtworzony starszy KROOT nie może zastąpić łańcucha, a zatrzymany strumień kluczy jest zgłaszany.
Dodano (kanały serwera MCP)#
kshana-mcp --http <addr>, strumieniowy HTTP, hostowany samodzielnie. Domyślnie pętla zwrotna; adres inny niż pętla zwrotna wymaga--allow-remotei tokenu bearer wKSHANA_MCP_HTTP_TOKEN; żadne narzędzie nie czyta ani nie zapisuje ścieżki (narzędzia plików IQ są wyłączone); limity rozmiaru żądania, czasu i współbieżności; brak nagłówka CORS; kontrole Host i Origin. Kshana nie hostuje żadnego punktu końcowego (docs/deploy/mcp-http.md, z szablonami dla Dockera, Fly.io i Cloud Run).
Fragment wymieniający klientów AI osób trzecich pominięto tutaj; znajduje się w CHANGELOG.md na GitHubie.
Dodano (powierzchnie)#
osnma_verifyw Pythonie i WebAssembly. Weryfikator stojący zakshana osnma verifyna bajtach w pamięci, zwracający JSON, który wypisuje--json(uwaga doradcza w poluadvisory; tylko status uwierzytelnienia, nie usługa integralności nawigacji). Te same odmowy co w wierszu poleceń. Nie w MCP: dane wejściowe to długi surowy strumień odbiornika, lepiej obsługiwany przez CLI i Pythona. Mówią o tymdocs/SURFACES.mdidocs/OSNMA.md.trust_telemetryw WebAssembly, Pythonie i MCP, z poleceniem wtyczki i akcją JetBrains. Renderuje strumień zaufania lub wynikreceiver-trustjako tekst Prometheus, linie syslog CEF lub LEEF albo ładunek JSON OTLP, kodekami, których używakshana trust-telemetry(kshana::surface::trust_telemetry); bez gniazda i bez zegara. Wtyczka:/kshana-trust-telemetryi umiejętnośćtrust-telemetry. JetBrains: Render Trust Telemetry. Funkcjewasmipythonoraz serwer MCP włączają teraz takżeotlp, co nie dodaje żadnego crate'a.Przegląd parytetu. Akcje JetBrains Validate Scenario, List Scenario Kinds i Assess Receiver Stream;
kshana --helpwymienia terazreceiver-trust evidence,evidence,trust-telemetryinmea-scenario; notatnikcompliance-and-test-bench(mapowanie compliance i eksport test bench); a każda pozostała komórka JetBrains "CLI only" wdocs/SURFACES.mdjest teraz jawnym N/A z uzasadnieniem.
Fragment wymieniający klientów AI osób trzecich pominięto tutaj; znajduje się w CHANGELOG.md na GitHubie.
Dodano (pakiety dowodowe)#
kshana receiver-trust evidenceikshana evidence verify: podpisane, weryfikowalne pakiety dowodowe dla zdarzenia zaufania do GNSS. Pakiet zawiera surowy fragment dziennika i SHA-256 całego dziennika, konfigurację z każdym progiem, wyniki i przyczyny dla poszczególnych epok, wersję silnika, manifest powiązany łańcuchem haszy i samodzielne podsumowanie HTML, podpisane Ed25519 (kluczem zkshana evidence keygenalbo z własnego pliku; klucze nigdy nie są przechowywane w pakiecie, a*.evidence-keyjest ignorowane przez git).verifysprawdza każdy hasz, łańcuch i podpis i wskazuje dokładnie, co zawodzi; z--pubkeyprzypina podpisującego. Można dołączyć token RFC 3161, który jest odczytywany i wiązany z manifestem (własny podpis urzędu nie jest sprawdzany przez tę wersję; obejmuje goopenssl ts -verify). Fragment dziennika to dokładne bajty okna tam, gdzie czytnik zgłasza zakresy źródła (NMEA, UBX, RINEX 3, Android), a w przeciwnym razie cały dziennik, i manifest mówi, który przypadek zachodzi. Tworzenie i weryfikacja to czyste funkcje publiczne (kshana::evidence), które budują się dlawasm32. Pakiety stwierdzają, że są zapisem technicznym, a nie opinią prawną. Nowe zależności to drzewoed25519-dalek(BSD-3-Clause i Apache-2.0/MIT, minimalne funkcje) oraz bezpośredniezeroize(już w tym drzewie) do zerowania materiału kluczowego. Zob.docs/EVIDENCE-PACKS.md.
Dodano (telemetria zaufania)#
kshana trust-telemetry: zaufanie do GNSS jako źródło telemetrii bezpieczeństwa. Czyta strumień zaufania dla poszczególnych epok (linie JSON: wskaźnik 0-100, pasmo, przyczyny) albo wynik wsadowyreceiver-trusti zasila punkt końcowy Prometheus/metrics(domyślnie localhost), zdarzenia syslog w CEF lub LEEF w kopercie RFC 5424 (UDP lub TCP) oraz, za domyślnie wyłączoną funkcjąotlp, eksport JSON OTLP/HTTP. Dostarczanie działa na wątkach roboczych z limitami czasu połączenia i zapisu, ograniczonym wycofywaniem ponownych połączeń i licznikiemkshana_trust_syslog_send_failures_total, więc martwy lub zawieszony kolektor nie może zatrzymać oceny na żywo ani zamrozić/metrics; etykiety przyczyn są ograniczone do 64 szeregów. Bez nowych zależności. Przykładowy pulpit Grafana jest wdeploy/grafana/. Nazwy metryk, etykiety i odwzorowanie pól CEF/LEEF są wdocs/TRUST-TELEMETRY.md. Format strumienia jest wyizolowany wsrc/telemetry/sample.rs.
Dodano#
- Zaufanie morskie: wskaźnik zaufania 0-100 na żywo dla pozycji poruszającego się statku, z NMEA 0183, które odbiornik już wysyła, z opcjonalną bramką.
kshana receiver-trustprzyjmuje tabelę[platform](kind = "static"lub"vessel", maksymalna prędkość statku, przyspieszenie i prędkość zwrotu, wysokość anteny nad linią wodną i opcjonalny czujnik kursu; każda wartość domyślna udokumentowana wraz z uzasadnieniem). Dla statku statyczny monitor skoku pozycji, który mierzy odległość od średniej kalibracyjnej i jest błędny na płynącym statku, zostaje zastąpiony przyczynowymi monitorami platformy w ruchu: spójnością kinematyczną pozycji względem zgłoszonej prędkości i kursu oraz względem limitów statku, kursem żyrokompasu względem kursu nad dnem, logiem prędkości względem prędkości nad dnem, wysokością anteny względem podanej wysokości nad linią wodną, zapadaniem się i jednoczesnym wzrostem rozrzutu C/N0 względem punktu odniesienia z kalibracji oraz spójnością czasu (w trybie na żywo także względem zegara tego komputera). Odczytuje też zgłoszony status uwierzytelnienia, ogólny lub dla poszczególnych satelitów (tylko zgłoszony status: bez kryptografii OSNMA). Każdy próg jest podany w tabeli[maritime]przed uruchomieniem. Każda epoka dostaje wtedy wskaźnik od 0 do 100 według deterministycznego, wstępnie zarejestrowanego odwzorowania (bez uczenia, nic nie jest dopasowywane do zdarzeń; wagi, granice pasm i dowody zawiera tabela[score]), odwzorowany na istniejące stany zaufania, wraz z monitorami, które odjęły punkty, i ich punktami. Scenariusze statyczne są bez zmian i mają te same skróty co wcześniej.kshana receiver-trust live <session.toml>czyta stdin, dopisywany plik, TCP lub UDP i zapisuje jedną linię JSON na epokę oraz własnościowe zdanie$PKSHT; z--gateprzepuszcza strumień bez zmian, dopóki pozycja jest zaufana, a oznacza pozycję jako nieważną (jakość GGA 0, status RMC i GLLV, tryb GNS i VTGN), gdy nie jest. Bramka jest wyłączona, chyba że się o nią poprosi;--listen tcp:<port>udostępnia strumień po bramce dowolnej liczbie klientów TCP (domyślnie pętla zwrotna, wolny klient jest odrzucany, zamiast blokować innych). To oprogramowanie wyłącznie doradcze, nie jest to sprzęt nawigacyjny z zatwierdzeniem typu (IEC 61108, IEC 61162); operator nadal ponosi odpowiedzialność.examples/maritime-trust/to syntetyczny dziennik Tallinn–Helsinki, zapisany tylko jako tekst, z oderwaniem pozycji w połowie drogi, podczas którego odbiornik nadal zgłasza ważną pozycję; jego oczekiwany wynik jest przypięty testem. Przewodnik:docs/MARITIME-TRUST.md. Kontrole nie widzą spoofera, którego pozycja jest spójna ze wszystkim na magistrali; przewodnik to mówi.
Mapa zakłóceń#
kshana interference-mapikshana route-exposure: publiczny obraz tego, gdzie statki powietrzne i statki zgłaszały pogorszone dane nawigacyjne, i jak duży fragment trasy to obejmuje. Dane wejściowe to lokalne pliki CSV sporządzone z otwarcie licencjonowanych danych ADS-B (adsb.lol, ODbL 1,0) i AIS (NOAA MarineCadastre, Kystverket na NLOD 2,0); każdy plik wyjściowy to jedno źródło i jedna doba UTC w GeoJSON z metodą, jej progami, licencją danych, atrybucją i obciążeniem pokrycia źródła. Metoda ADS-B agreguje NIC i NACp na stałej siatce i uznaje komórkę za pogorszoną na podstawie udziału odrębnych statków powietrznych, z zabezpieczeniami dla sprzętu, który nigdy nie zgłasza dokładności, dla niskiej wysokości i dla przyczyn o szerokim zasięgu. Metoda AIS uruchamia pięć detektorów: pozycje na lądzie (względem linii brzegowej dostarczonej przez użytkownika), tory kołowe, nieprawdopodobne skoki, nieprawdopodobne prędkości i wiele statków w jednej pozycji. Progi są wstępnie zarejestrowanymi stałymi nazwanej wersji metody. Tylko agregaty: identyfikatory są haszowane w pamięci i nigdy nie zapisywane, a komórki z mniej niż 5 odrębnymi statkami powietrznymi lub statkami nie są publikowane. Pogorszona komórka nie jest stwierdzeniem zakłóceń. Polecenia domyślne nie używają sieci; opcjonalny pomocnikfetch-land --allow-networkpobiera wielokąty lądu Natural Earth z adresu przypiętego do commitu i zachowuje plik tylko wtedy, gdy jego SHA-256 się zgadza. Dane ADS-B to CSV albo bezpośrednio pliki historii readsb z adsb.lol (nowa zależność:flate2z czysto rustowym backendem, dla gzip). Obie metody są w wersji 2: wywołanie pogorszone lub anomalne wymaga co najmniej 5 statków powietrznych lub statków (minimum publikacji), każda liczba w komórce poniżej 5 jest wstrzymywana jakonull, a doba, której tła nie da się oszacować, wstrzymuje swoje wywołania. Pliki wyjściowe są nazywane<source>-<dataset>-<date>.geojsoni nigdy nie są nadpisywane; dane wejściowe są strumieniowane linia po linii; ekspozycja trasy obsługuje antypołudnik. Testy używają wyłącznie danych syntetycznych. Zob.docs/INTERFERENCE-MAP.mdoraz przegląd licencji wdocs/data/INTERFERENCE-DATA-SOURCES.md.
Dodano (strumienie szkoleniowe)#
kshana nmea-scenario: syntetyczne NMEA 0183 mostka do szkolenia załóg w rozpoznawaniu zagłuszania i spoofingu GNSS. Ze scenariusza TOML zapisuje plik albo nadaje strumień przez TCP lub UDP (unicast lub broadcast; w czasie rzeczywistym, przyspieszonym albo tak szybko, jak się da), pełny zestaw mostka GGA, RMC, VTG, GSV, GSA, GNS, ZDA, HDT i VBW dla toru statku z ograniczeniami prędkości zwrotu, przyspieszenia i prądu, z geometrią satelitów z własnych nominalnych konstelacji silnika. Zdarzenia skryptowane na osi czasu: zagłuszanie, oderwanie pozycji (ważne rozwiązanie, które się oddala), spoofing czasu i opóźnienie odtwarzania, każde z rampami narastania i ustępowania. Dziennik instruktora (JSON i tekst) zapisuje, co i kiedy wprowadzono, z torem prawdziwym obok zgłoszonego. Biblioteka wscenarios/training/(zagłuszanie na otwartym morzu, oderwanie przy brzegu, spoofing czasu przy podejściu do portu, połączony) zawiera notatki dla trenera. Wynik ma poprawne sumy kontrolne i jest deterministyczny dla każdego ziarna; testy przypinają wzorcowy fragment dla każdego scenariusza i odczytują każde zdanie czytnikiem NMEA zreceiver-trust. Tylko tekst: bez wyniku RF, IQ ani przebiegu; strumienie służą do szkolenia i testów i nigdy nie wolno ich podawać do działających systemów nawigacyjnych statku. Zob.docs/NMEA-TRAINING.md.
Integracje morskie (0.35.0, ścieżka robocza B)#
- Wtyczka Signal K (
integrations/signalk/, nieopublikowana w npm): uruchamiakshana receiver-trust livealbo się z nim łączy (własne wejście NMEA serwera, niestandardowe argumenty wejścia, kanał TCP z liniami JSON albo zdania$PKSHTze strumienia bramki), publikuje wskaźnik zaufania, pasmo, przyczyny, alarmy i stan bramki podnavigation.gnss.kshana.*(w tym pozycję zgłaszaną przez odbiornik jako kontekst, nigdy jakonavigation.position) i podnosi powiadomienie Signal K (warnprzy pogorszeniu,alarmprzy braku zaufania, z progami utrzymania, zniesienia i nieaktualności, wszystkimi w schemacie konfiguracji). Bez zależności npm. Przetestowano na zarejestrowanym wyniku syntetycznym. - OpenCPN: NMEA w trybie bramki jest udostępniane bezpośrednio przez
kshana receiver-trust live --gate --listen tcp:10110(zalecane); przekaźnik TCP bez zależności (integrations/opencpn/nmea-tcp-relay.mjs) to opcjonalna alternatywa. Tak czy inaczej OpenCPN widzi nieważną pozycję, gdy zaufanie się załamuje, i$PKSHTw swoim oknie debugowania NMEA; testy odtwarzają syntetyczny strumień po bramce przez prawdziwe gniazdo TCP i sprawdzają, co otrzymuje odbiorca. Natywna wtyczka panelu wskaźnika (integrations/opencpn/plugin/, API wtyczek 1,18, CMake) czyta$PKSHTz własnego strumienia NMEA OpenCPN i alarmuje w paśmie braku zaufania; buduje się, jej logikę przetestowano jednostkowo i uruchomiono ją w OpenCPN 5.8.4 na wirtualnym ekranie (dowody i skrypt odtworzenia wintegrations/opencpn/evidence/); nie jest spakowana dla menedżera wtyczek. - Budowa referencyjna (
deploy/reference-build/): ogólna lista części, konfiguracja systemu operacyjnego, jednostki systemd dla monitora doradczego i opcjonalnej bramki (sprawdzane przezsystemd-analyze verifyza pomocącheck-units.sh), opcja kontenera, okablowanie Signal K. - Wtyczka Signal K przyjmuje schemat JSON na żywo 1,2 (dołączony klucz
position, potemadvisory; nieznane dołączone klucze są ignorowane), sprawdzona na rzeczywistym wyniku 1,2 i względem rzeczywistego signalk-server. - Poprawki po przeglądzie: jednostki systemd zawsze się restartują i działają w piaskownicy (bez powłoki, bez sieci tam, gdzie nie jest potrzebna), fragment logrotate,
check-units.shkończy się niepowodzeniem przy każdym znalezisku; kontener uruchamia bramkę ze zmiennych środowiskowych z kontrolą stanu i obrazami bazowymi przypiętymi skrótem; metadane wskaźnika Signal K, nieaktualne powiadomienie jest zastępowane po wznowieniu danych, błędy procesów potomnych są zachowywane, a zabijanie eskaluje, niebezpieczneinputArgssą odrzucane, a powiadomienie jest podnotifications.navigation.gnss.kshana.trust; przekaźnik ogranicza przechowywaną niepełną linię; parsery$PKSHTodrzucają wskaźniki spoza zakresu od 0 do 100; kontrola odnośników w dokumentacji; przepływ CI (marine-integrations.yml) uruchamiający to wszystko, łącznie z prawdziwym plikiem binarnym od końca do końca. docs/MARINE-INTEGRATIONS.md. Oprogramowanie wyłącznie doradcze, nie jest to sprzęt z zatwierdzeniem typu; operator nadal ponosi odpowiedzialność. Wyłącznie oprogramowanie: nic nie nadaje i nie podaje się żadnej wartości detekcji ani fałszywych alarmów.
Dodano: mapowanie compliance i eksport test-bench#
docs/compliance/ikshana compliance-report. Odwzorowanie wyników Kshana na pięć ram i norm odporności (amerykański DHS Resilient PNT Conformance Framework v2.0, wytyczne IMO dla statków, wytyczne EASA dla lotnictwa, NIS2 art. 21, EN 16803, płatna norma cytowana według części i kilku numerów klauzul widocznych w tekście katalogu), jedna tabela na ramę: odniesienie, czego wymaga w naszym streszczeniu, wyniki, które dostarczają dowodów na (supports evidence for) to wymaganie, oraz luka. Wersje źródeł, adresy URL i to, co przeczytano, a czego nie, są zapisane.kshana compliance-report <result.json>...wypełnia odwzorowanie z podanych przebiegów i oznacza każdy wiersz jakoevidenced,partly-evidenced,not-evidencedlubout-of-scope, w Markdown i JSON, z luką zachowaną w każdym wierszu. Sformułowanie to „dostarcza dowodów na” (supports evidence for); nic nie jest oceniane ani zatwierdzane. Testy używają przebiegów syntetycznych i kończą się niepowodzeniem, gdy zatwierdzona tabela rozjeżdża się z kodem.kshana bench-export <scenario.toml>. Zapisuje ruch pojazdu i zdarzenia scenariuszagnss-ins,jamminglubgnss-simdla laboratoryjnego symulatora GNSS: plik CSV ruchu użytkownika z udokumentowanymi układami i plik metadanych obok, NMEA 0183GGA/RMC, tekst punktów trasy oraz zdarzenia jako CSV i jako blokireceiver-trust[[events]](src/interop/testbench.rs). Tylko ruch i zdarzenia: nie zapisuje się żadnego sygnału. Każdy plik jest odczytywany z powrotem wtests/interop_testbench.rsi porównywany w granicach podanej tolerancji.docs/TEST-BENCH.mdpodaje metodę odtwarzania eksportu przez symulator i oceniania dziennika odbiornika za pomocąkshana receiver-trust.- Co liczy się jako dowód. Wynik liczy się dla danej możliwości tylko wtedy, gdy niesie pola, które zapisuje jego rodzaj; sama etykieta rodzaju nie znaczy nic. Nieznane rodzaje, wynik niezgodny ze swoim scenariuszem siostrzanym, hasze nieszesnastkowe i źle sformowane liczby zaufania do odbiornika są wymienione jako niewykorzystane, wraz z przyczyną. Raport ucieka komórki Markdown i nie może spanikować na haszu spoza ASCII.
compliance::run_from_textiassess_textsprzyjmują teksty, a nie ścieżki. - Eksport test-bench.
--epochjest sprawdzane pod kątem zakresu (UtcEpoch::parse_iso); plik punktów trasy sprawdza każdy przedział, a polecenie podaje przyczynę, gdy go pominie; dokumentacja stwierdza, że kursgnss-insto odchylenie korpusu, a nie kurs nad dnem, pola zastępczeGGAoraz własną zmianę wysokości scenariusza.bench-exporticompliance-reportsą w tekście użycia. fusion::pack::truth_trajectoryudostępnia historię prawdziwego stanu profilu jazdygnss-ins(ten sam krok, którego używa własna prawda tego rodzaju), aUtcEpochzyskuje pola daty i czasu NMEA.
Walidacja mapy zakłóceń#
- Semantykę dekodowania i geometrię mapy zakłóceń sprawdzono względem niezależnych implementacji na danych syntetycznych. Znaczenia kodów NIC i NACp względem dekodowania syntetycznych ramek ADS-B przez pyModeS, wartości „niedostępne” AIS względem dekodowania syntetycznych zdań AIVDM przez pyais, przypisanie komórek siatki względem shapely, długość trasy w komórce według stanu względem shapely i GeographicLib oraz maskowanie lądu względem shapely i pyproj, każde do tolerancji ustalonej przed pierwszym porównaniem (
tests/fixtures/interference_map_ref/PREREGISTRATION.md). To sprawdza, jak odczytywane są kody i wartości pól oraz geometrię, a nie to, że oznaczona komórka jest zakłóceniem. Czytnik wielokątów lądu zamyka teraz pierścień, który nie powtarza swojego pierwszego wierzchołka, a który wcześniej odczytywał bez ostatniej krawędzi. Dokumentacja podaje niskie progi dokładności NACp i NIC jako granicę, którą reprezentuje każdy kod (NACp 6 to granica EPU 556 m, NIC 5 to granica zawierania 1 NM).
Dodano (walidacja formatów telemetrii i pakietów dowodowych)#
- Zewnętrzne kontrole kryptografii pakietów dowodowych, weryfikatora pakietów i formatów przewodowych telemetrii. Wektory testowe Ed25519 z RFC 8032, sekcja 7,1 (1, 2, 3 i 1024) oraz przykłady SHA-256 z FIPS 180-4 przechodzą przez własne funkcje podpisywania, weryfikowania i haszowania pakietu, do dokładnej równości. Weryfikator napisany w Pythonie wyłącznie na podstawie części normatywnej
docs/EVIDENCE-PACKS.md(hashlib icryptography) zgadza się z weryfikatorem w Ruście na 71 nienaruszonych i naruszonych pakietach: werdykt, zbiór błędów, werdykt podpisu i oba nagłówki łańcucha. Nasza ekspozycja Prometheus jest odczytywana przez parser oficjalnego klienta Pythona, a nasz JSON OTLP przez oficjalny komunikatopentelemetry-proto, ściśle, i oba zgadzają się ze stanem, z którego powstały. CEF i LEEF nie mają niezależnego otwartego walidatora i pozostają tylko obliczone z modelu.docs/EVIDENCE-PACKS.mdzyskało normatywny format pakietu i procedurę weryfikacji, z których napisano weryfikator w trybie clean-room;VerifyReportzyskałosignature_valid. Wyrocznie i wzorce:scripts/gen_ed25519_rfc8032_ref.py,scripts/gen_evidence_pack_ref.pyzscripts/evidence_verify_cleanroom.py,scripts/gen_telemetry_formats_ref.py; testyevidence_crypto_reference,evidence_pack_referenceitelemetry_formats_reference. CI nie potrzebuje Pythona.
Dodano (walidacja zdarzeń CEF)#
- Zdarzenia CEF telemetrii są poprawnie odczytywane z powrotem przez dwa niezależne parsery open source.
pycef1,11 i kodek CEF Logstash (logstash-codec-cef6.2.7 w Logstash 8.15.3) parsują 157 linii CEF (każdą zmianę pasma i każdą epokę zatwierdzonego strumienia telemetrii, a także tekst przeciwnika zawierający=, ukośniki wsteczne, kreski pionowe, podziały wierszy, tabulatory i tekst wielobajtowy) i odzyskują każde pole nagłówka, ważność, dokładny zbiór kluczy rozszerzenia i każdą wartość dokładnie. Kodek Logstash odczytuje też cztery linie, których tekst nagłówka wymaga ucieczki, czegopycefnie potrafi. Próg zarejestrowano przed uruchomieniem któregokolwiek parsera (tests/cef_reference.rs); wzorce wtests/fixtures/cef/, skrypty wyroczniscripts/gen_cef_ref.pyiscripts/gen_cef_logstash_ref.py; CI nie potrzebuje ani Pythona, ani Logstash. LEEF nie ma utrzymywanego otwartego parsera i pozostaje tylko obliczony z modelu. Zdarzenia CEF niosą teraz wskaźnik zaufania i przesunięcie epoki w polach niestandardowych zmiennoprzecinkowych ze słownika CEF (cfp1,cfp2) zamiast w polach całkowitychcn1icn2, które nie pasowały do żadnej z tych wartości; CEF jest nowy w tym wydaniu, więc nic z dostarczonego się nie zmienia.
Zmienione#
- MCP:
assess_receiver_logprzyjmuje dziennik jakotextlubbase64; dane wejściowe narzędzia są ograniczone do 4 MiB. - Wykres zagłuszania również bierze kolory z palety.
src/jamming.rsbył jedynym modułem, który rewizja palety Observatory zostawiła przy własnych kolorach, gdy lądowały prace nad Q zagłuszacza; jego*.chart.svg(scenariusze rodzajówjamming,maritime-strait-jammingi innychjamming) odczytuje terazsrc/palette.rs, a lista dozwolonych wtests/palette_sync.rsjest pusta. Tylko kolory i czcionka: wykresyjamming-demoimaritime-strait-jammingsą równe swoim wcześniej zarejestrowanym renderom po znormalizowaniu koloru,font-familyi stopki z wersją. Żadna wykreślona wartość się nie zmieniła. Zarejestrowane kopie Studio wweb/studio/recorded/zarejestrowano ponownie przy portowaniach 0.33.0 i 0.34.0 (tylko stempel wersji): nadal niosą dawne kolory wykresu zagłuszania i przejmą kolory z palety przy następnym portowaniu.
Poprawiono#
- Granica 3-sigma zespołu zegarów obejmuje teraz podłogę flicker, a kontrola stanu filtra ją widzi. Przy
flicker_floorzegar prawdziwy niósł flicker FM, ale dwustanowy filtr dostarczający granicę integralności nie, więc pokrycie 3-sigma dla dostarczanego scenariuszaclock-ensemblewynosiło 0,41 (klasyczny) i 0,33 (kwantowy), a kontrola NIS/NEES, która czerpała swoją prawdę z modelu filtra, zgłaszała identyczne wartości z podłogą i bez niej. Granica to teraz wariancja dwustanowa plus dokładna wariancja fazy flicker zgromadzonej od ostatniej synchronizacji, obliczona z tego samego banku, z którego korzysta zegar prawdziwy; kontrola NIS/NEES czerpie prawdę z modelu rozszerzonego z tym bankiem i uruchamia dopasowany filtr rozszerzony (a filtr dwustanowy wobec prawdy z flickerem zgłaszaconsistent = false). Zmiana wyniku, tylko dla zegarów z niezerowymflicker_floor:integritywclock-ensembleprzechodzi z 0,40866 / 0,33026 na 0,99970 / 1,0 (klasyczny / kwantowy), a NIS/NEES zfilter_healthzawierają teraz flicker; błąd czasu,holdover_sitiming_p95_nssą bez zmian, a scenariusze bez podłogi są identyczne co do bajta.scenarios/orbit-gnss-challenged.toml(rodzaj orbity, ziarno 7, podłogi 1e-16 / 2e-11) także się zmienia:fom.integrityklasyczny 0,7734 na 1,0 i kwantowy 0,9796 na 1,0, a NIS/NEES zfilter_healthi ich pasma się zmieniają. Jego kwantowefilter_health.consistentprzechodzi ztruenafalse: zdarzenie próbkowania zespołu flicker 16 ziaren na 60 kroków (NIS 0,8815 wobec pasma [0,9125, 1,0914]), a nie wada. Pasmo jest pasmem 95 %, więc około 5 % ziaren z założenia oznacza dopasowany filtr (40 nowych ziaren tego scenariusza: kwantowy 1 i klasyczny 2 oznaczone); przy 64 na 200 to samo ziarno mieści się w paśmie dla obu zegarów (NIS 0,990 i 1,001). Znana kontynuacja: rodzaj fusion ma tę samą lukę (integralność klasyczna 0,80 z podłogą); rodzaj hybrid pozostaje powyżej 0,99.
[0.34.1] - 2026-10-10#
Bezpieczeństwo#
- Utwardzono dane wejściowe serwera MCP. Narzędzia scenariuszy serwera MCP przyjmują teraz tylko treść wbudowaną i odrzucają pola ze źródłem plikowym; rozmiar danych wejściowych jest ograniczony. Biuletyn bezpieczeństwa: GHSA-8wpf-hqg5-6xjr.
[0.34.0] - 2026-10-09#
Odtwarzanie laboratoryjne: silnik śledzenia, monitory detekcji i program uruchamiający kampanie dla nagrań IQ z GNSS, z projektami pętli, estymatorami C/N0 i wskaźnikami, które do nich należą. Klasa dowodowa: wszystko poniżej jest MODELLED albo sprawdzone pod kątem spójności wewnętrznej względem postaci zamkniętych i ziarnowanej symulacji; nic z tego nie dodaje wiersza VALIDATED, a rejestr weryfikacji jest bez zmian (251 wierszy: 124 sprawdzonych względem niezależnego wzorca zewnętrznego, 123 obliczonych z modelu, 4 partnerskie). To programowa warstwa analityczna: nic tu nie syntetyzuje przebiegu zagłuszacza ani spoofera i nic nie nadaje.
Dodano#
Odtwarzanie laboratoryjne: warunki testu, program uruchamiający kampanie i ocena (0.34.0).
kshana iq campaign <campaign.toml>odtwarza nagrania × łańcuchy układu wejściowego × projekty pętli (kshana.loop-design/1) i ocenia każdą komórkę względem pliku warunków testu dla nagrania (kshana.test-conditions/1, TOML lub JSON). Ten plik podaje, co laboratorium wie o nagraniu: oczekiwane satelity, a dla każdego zdarzenia jego etykietę typu, początek i koniec, dotknięte satelity oraz podany profil J/S lub mocy zagłuszacza. To wyłącznie metadane. Wskaźniki dla każdego satelity, dla całego przebiegu i dla każdego zdarzenia, to:- dostępność, czas do utraty synchronizacji i podane J/S w chwili utraty;
- czas ponownego zdobycia, liczony od końca zdarzenia i od utraty;
- zmierzona degradacja C/N0 dla każdego przedziału podanego J/S;
- epizody fałszywego zaczepu na godzinę zaczepienia (flaga trackera albo Doppler względem pliku prawdy);
- jitter dyskryminatorów PLL i DLL.
Obok każdej zmierzonej krzywej degradacji rysowana jest analityczna krzywa odniesienia separacji widmowej (
jamming::effective_cn0_dbhzzQdanego typu) i wszędzie, gdzie się pojawia, jest opisana jako MODELLED.Komórki działają równolegle przez maszynę stanów zaczepienia sesji śledzenia, a każda jest zapisywana atomowo pod kluczem będącym haszem zawartości. Klucz obejmuje SHA-256 nagrania, hasze warunku, układu wejściowego, projektu, przebiegu i oceny, wymagane
data_class(synthetic|client-confidential) oraz wersję silnika. Przy ustawionymrun.epochsstrumieńkshana.track-epoch/1każdej komórki i zdarzenia zaczepienia są także zachowywane, nazwane kluczem komórki i zhaszowane w komórce.cell_keyireport::digestsą publiczne, więc odbiorca może wyprowadzić ponownie każdy klucz i skrót. Ponowny przebieg pomija więc ukończone komórki, a wyniki nigdy nie zależą od liczby wątków roboczych. Przebieg zapisujescorecard.csv/.json, samodzielnyreport.htmliDIGEST. Progi zaliczenia i niezaliczenia ([scoring.bars], z możliwością nadpisania dla nagrania) są stosowane przy budowie raportu.[scoring] cn0_estimator = "m2m4" | "nwpr"(domyślnie"m2m4", część haszu oceny) wybiera C/N0 stojące za zgłaszanym C/N0 i krzywą degradacji. Obie estymaty są zawsze oceniane i zgłaszane (mediany dla całego przebiegu i punktu odniesienia oraz dla każdego przedziału J/S), a komórka i karta wyników zapisują estymator. NWPR odczytuje zaniżenie o około 8 dB × Bn·T przy własnym jitterze pętli; M2M4 nie.
Nowe jest także:
kshana iq campaign report <dir>odbudowuje karty wyników, raport i skrót z komórek;kshana iq conditions <file>sprawdza plik warunków testu względem jego schematu;events_from_sigmf = trueimportuje adnotacjekshana:test_eventnagrania SigMF jako zdarzenia;- Python zyskuje
iq_test_conditions,iq_campaigniiq_campaign_report; kshana-mcpzyskujeiq_campaign, które jest przyrostowe i wznawialne w ramach budżetu próbek na wywołanie, z każdym plikiem ograniczonym do katalogu roboczego, oraziq_campaign_status.
Testy:
tests/iq_campaign.rsuruchamia syntetyczną kampanię z 3 nagrań × 2 układów wejściowych × 2 projektów. Jej sceny niosą podane profile C/N0 i obejmuje ona:- każdą metrykę sprawdzoną względem wstrzykniętej prawdy;
- wznowienie po częściowym przebiegu jednego wątku roboczego z uszkodzoną komórką, identyczne co do bajta z nieprzerwanym przebiegiem czterech wątków;
- pliki epok dla każdej komórki;
- regresję ponownego zdobycia trzech satelitów przez 20 s: przy włączonym
reacquirekażdy kanał wraca w ciągu 2 s od przerwy trwającej 2 s; wynik przy wyłączonymreacquirejest przypięty; - progi oceniane ponownie bez ponownego uruchamiania;
- CLI;
- ignorowane kontrole przepustowości i pamięci w trybie release, w tym nagranie 4 GB (5,45× czasu rzeczywistego, szczytowa pamięć 2 MB ponad początkowe RSS; pomiary na jednej maszynie, a nie progi).
Wyłącznie oprogramowanie: nic nie nadaje i nie syntetyzuje się żadnego przebiegu zakłócenia ani spoofingu. Notatki projektowe i wykonawcze:
docs/design/LAB-CAMPAIGN.md.Silnik śledzenia do odtwarzania laboratoryjnego (0.34.0: B3.1, B3.2, B3.3, B6.1).
Pliki projektów pętli: TOML
kshana.loop-design/1(docs/design/LOOP-DESIGN-TOML.md; parseriq::track::design). Jeden lub więcej nazwanych projektów ustawia każde pole pętli:- rodzaj nośnej (PLL, FLL albo PLL wspomagana FLL), rzędy i pasma;
- dyskryminatory PLL/FLL/DLL i wspomaganie nośnej;
- odstęp i całkowanie;
- progi zaczepienia i okna C/N0 oraz synchronizację bitów;
- maszynę stanów zaczepienia;
- akwizycję przekazania (
"auto"albo jawną).
Projekty mogą się wzajemnie
extends. Nieznane klucze są odrzucane. Każdy rozstrzygnięty projekt ma hasz SHA-256 z kanonicznej postaci JSON (klucze posortowane na każdym poziomie, stałe formatowanie liczb), więc hasz nie zależy od kolejności pól; każdy wynik go zapisuje. Powierzchnie:kshana iq track --design <file> [--design-name], gdzie jawne flagi nadpisują projekt i są zapisywane;kshana iq sweep --design <file>, które uruchamia każdy projekt z pliku;- Python
iq_track(design=, design_name=, reacquire=),iq_loop_designs; - MCP
iq_trackdesign/design_name.
C/N0 M2M4 (
EpochOutput.cn0_m2m4_dbhz, kolumna epoki śledzeniacn0_m2m4_dbhzpocn0_beaulieu_dbhz; słowniki epok w Pythonie). Estymata z momentów drugiego i czwartego rzędu w tych samych oknach co NWPR, wyłącznie z mocy prompt: NWPR odczytuje zaniżenie przy własnym jitterze nośnej pętli (około 8 dB × Bn_PLL·T), a M2M4 nie. Na GPS L2C CM (20 ms, nominalnie 40 dB-Hz, PLL od 1 do 10 Hz) odczytuje 39,93 dB-Hz przy każdym paśmie, podczas gdy NWPR spada z 39,55 do 38,22; na L1 C/A przy 45 dB-Hz odczytuje 45,34. NWPR i każdy inny wynik są bez zmian (przypięcie co do bitu). Rekord binarny pozostaje 184 bajtów (wartość zajmuje zarezerwowany float i bit flagi 6).Dodatkowe odczepy korelatora (wielokorelatorowe / SQM).
[design.integration] extra_taps_chips = [..](przesunięcia w chipach od prompt, dodatnie dla early; co najwyżej 16, każde w granicach ±2) koreluje dodatkowe repliki obok E/P/L i zwraca je jakoEpochOutput.extra((offset, value)w kolejności projektu). Pętle nigdy z nich nie korzystają. Klucz jest pomijany w kanonicznym JSON, gdy jest pusty, więc hasz domyślnego projektu i każdy wynik bez odczepów są bez zmian (kshana.track-epoch/1pozostaje; CSV/JSONL/binarny bez odczepów są identyczne co do bitu). Z odczepami: kolumny CSV/JSONL oraz rekord binarny o184 + 16 × tapsbajtach, którego nagłówek niesieextra_taps_chips, więc stary czytnik odrzuca plik zamiast go źle zinterpretować.--extra-taps(CLI),extra_taps(Python) iextra_taps_chips(MCPiq_track). Projekty jednego przebiegu muszą się zgadzać co do odczepów.Kanały równoległe (
iq track/iq sweep --threads <N|auto>; RustTrackSession::with_threads). Kanały każdego fragmentu działają na co najwyżej N wątkach (std::thread::scope;wasm32pozostaje szeregowe). Korelacja i maszyna stanów zaczepienia kanału dotykają tylko tego kanału; jego epoki i zdarzenia są buforowane i zapisywane do ujść w kolejności kanałów, więc wynik (CSV, JSONL, binarny, zdarzenia, podsumowanie) jest identyczny co do bajta z przebiegiem szeregowym dla dowolnego N. Domyślnie pozostaje 1 wątek. Zmierzone na nagraniu z 12 kanałami, 4 s, 4,092 MHz na 4 rdzeniach: 19,5 s szeregowo, 11,5 s przy 2 wątkach, 6,3 s przy 4 (3,1×; akwizycja początkowa jest szeregowa).Eksport powierzchni akwizycji (
kshana.acq-surface/1;iq::acq_surface,docs/design/ACQ-SURFACE.md).iq acquire --surface <path>(jeden PRN; CSV, JSON lub binarny),iq_acq_surfacew Pythonie oraziq_acquiresurface_outw MCP zapisują całą powierzchnię mocy korelacji Doppler × faza kodu, którą oblicza wyszukiwanie (jej komórki są komórkamiacquire, co do bitu), ze szczytem i dwoma dopracowaniami drobnego Dopplera: estymatą paraboliczną i drobnym wyszukiwaniem w 1/16 przedziału (≈5 Hz przy 4 ms koherentnie, wobec przedziałów 167 Hz). Samoacquirei każda wartość domyślna są bez zmian.Strumieniowe wyjście epok (
kshana.track-epoch/1;iq::track::sink). Każda aktualizacja pętli niesie:- korelatory early/prompt/late;
- wszystkie trzy wyjścia dyskryminatorów;
- stany NCO PLL/FLL/DLL i fazę nośnej;
- flagi PLI i zaczepienia;
- obie estymaty C/N0 i bity;
- stan zaczepienia.
Jest zapisywane na bieżąco, jako CSV, JSON Lines albo wersjonowana postać binarna z czytnikami w Ruście (
BinaryEpochReader) i Pythonie (iq_read_epochs).iq trackzyskuje--epochs,--eventsi--summary(kshana.track-summary/1), aiq sweepzyskuje--epochsi--events. MCPiq_trackzyskujeepochs_out/events_outi buduje swoją odpowiedź z podsumowania o ograniczonej pamięci.- Sterta przebiegu nie rośnie już wraz z długością nagrania:
tests/iq_track_memory.rsmierzy ją licznikiem alokacji (6× długość, ten sam szczyt w granicach 64 KiB), z kontrolą pokazującą, że ścieżka w pamięci rośnie. - Dane wyjściowe przesyłane strumieniowo są bitowo identyczne z odtworzeniem w pamięci.
Automat stanów blokady (
iq::track::lock,TrackSession): wciąganie → zablokowany → utracony → ponowne pozyskanie → wciąganie, albo wycofanie, gdy utrata trwa dłużej niżreacq_window_s(domyślnie 30 s). Nieudane wyszukiwania są ponawiane coreacq_interval_s(0,1 s), w równych odstępach, więc harmonogram ponowień dodaje co najwyżej 0,1 s do zmierzonego czasu ponownego pozyskania. Opcjonalne wydłużanie odstępów (reacq_max_interval_spowyżejreacq_interval_s) jest domyślnie wyłączone, amax_reacq_attemptsto opcjonalny limit (0, domyślnie brak). Zanik sygnału trwający 2 s na trzech PRN przy 4,092 MS/s kończy się teraz ponownym pozyskaniem i zablokowaniem każdego kanału. Przy limicie 3 prób każdy kanał został wycofany w ciągu 0,2 s od utraty.- Progi (
loss_dwell_s,pull_in_max_s, okno Dopplera ponownego pozyskania) wynikają z projektu. Każde przejście jest zdarzeniem z podaną przyczyną. - Kontrola fałszywej blokady szuka śledzonego Dopplera względem jego aliasu FLL/PLL ±1/(2T). Wychwytuje fałszywą blokadę zmierzoną w PR #38 (−2400 Hz śledzone 500 Hz od wartości właściwej). Przy włączonym ponownym pozyskaniu kanał kończy zablokowany na wprowadzonym Dopplerze.
- Przerwa w sygnale trwająca 0,8 s jest uznawana za utratę i ponownie pozyskiwana w ciągu 0,3 s od powrotu sygnału.
--summaryfinal_state(oraz kolumna tabeli) to stan po ostatnim przejściu, więc kanał wycofany po ostatniej aktualizacji pętli ma wartośćRETIRED.- Wspomaganie FLL tylko podczas wciągania (
[design.carrier] fll_assist = "pull-in", wartość domyślna;"always"zachowuje wcześniejsze działanie bit w bit). FLL przekazuje sterowanie do PLL, gdy wygładzony PLI utrzymuje się na poziomie co najmniejfll_off_pli(0,8) przezfll_gate_dwell_s(0,1 s), i wraca do działania, gdy spadnie poniżejfll_on_pli(0,6). Po pozostawieniu FLL włączonego tor FLL 10 Hz zrywał blokadę fazy poniżej około 38 dB-Hz na czystych sygnałach: przy 35 dB-Hz odsetek blokady fazy wynosił 10–16 %, a prawdziwy błąd fazy 38–41°. Z bramkowaniem wartość domyślna utrzymuje 100 % przy 35 dB-Hz z błędem 4,5°, tak samo jak sama PLL. Wciąganie z błędu przekazania 100 Hz pozostaje bez zmian. Dowody ze wstępnie zarejestrowanymi progami:docs/design/evidence/carrier-lock/. Domyślne pętle nie są zatem zgodne bit w bit z wcześniejszymi przebiegami domyślnego projektu. Aby je odtworzyć, użyjfll_assist = "always". Znane ograniczenie: przy 35 dB-Hz przekazanie następuje 1,9–2,6 s po rozpoczęciu śledzenia, a przy 33 dB-Hz FLL 10 Hz utrzymuje PLI poniżej progu przekazania, więc wciąganie nigdy się nie kończy. - Nowe klucze projektu pętli i nowe API, wymienione poniżej:
[design.carrier]:fll_assist,fll_off_pli,fll_on_pli,fll_gate_dwell_s;[design.lock]:reacq_window_s,reacq_interval_s,reacq_max_interval_s, przy czymmax_reacq_attemptszmieniono z wartości domyślnej 3 na opcjonalny limit (domyślnie 0);- Rust:
LoopConfig.fll_assist(FllAssist,FllGate),LoopCore::set_fll_enabled,EpochOutput.fll_active,ChannelSummary.final_state.
- Skrót projektu jest liczony z kanonicznej postaci JSON, a skrót wbudowanego projektu domyślnego to
33261cd171a53803a6c262686e878e01f37d902a93d5918c20a44297b8ef8e80(zapisany w teście). - Uwagi o zgodności danych wyjściowych:
- tabela
iq trackma końcową kolumnęfinal_state; - plik CSV z
iq sweepma końcową kolumnędesign_hash, a jego JSON madesign_hashiwarnings; - wartość
mean_cn0_dbhzw przeglądzie jest teraz średnią ze wszystkich aktualizacji, które mają estymatę NWPR (podsumowanie o ograniczonej pamięci), a nie już z drugiej połowy przebiegu.
- tabela
- Ponowne pozyskanie jest wyłączone we wbudowanym projekcie domyślnym, gdzie automat stanów tylko obserwuje, a pętle działają bit w bit tak, jak bez niego. (Same domyślne pętle jednak się zmieniły: zob. wspomaganie FLL powyżej.) Włącza się je w projekcie (
[design.lock] reacquire = true), przez--reacquirelub przezreacquire=True. - Ostrzeżenie
commensurate_sampling: gdy fs różni się o mniej niż 1e-6 od wielokrotności połowy częstotliwości chipów (iq::track::commensurate_samples_per_chip),iq track/iq sweep(dane wyjściowe,--summary, JSON przeglądu), odpowiedź MCPiq_tracki wynik Pythonaiq_trackostrzegają, że jitter i błąd systematyczny pętli kodu nie są reprezentatywne. Przyczyna źródłowa jest opisana ze wstępnie zarejestrowanymi progami wdocs/design/evidence/dll-jitter/. Przy dokładnie 2 próbkach na chip i odstępie 0.5 chipa krzywa S pętli DLL jest pojedynczym schodkiem i pętla oscyluje: ≈ 0,09 chipa RMS błędu kodu (≈ 26 m) przy 45 dB-Hz, wobec ≈ 0,004 chipa przy częstotliwości niewspółmiernej. Zaniżenie NWPR C/N0 o ~2 dB przy tej częstotliwości ma tę samą przyczynę. Przy dokładnie 0 Hz Dopplera kodu i 4 próbkach na chip kod nigdy nie przekracza martwej strefy ±0.21 chipa, więc błąd systematyczny fazy kodu do około 0,2 chipa może się utrzymywać bez widocznego wpływu na jitter (zmierzono: odstęp 0.5 chipa daje 2,0× błędu kodu próby kontrolnej przy średniej +0,011 chipa; odstęp 0.25 chipa daje +0,125 chipa); ostrzeżenie obejmuje tę częstotliwość. - Znane ograniczenie: projekt domyślny nie przekazuje FLL→PLL poniżej około 35 dB-Hz (próg wciągania ~35 dB-Hz; zob. wspomaganie FLL powyżej oraz
docs/design/evidence/carrier-lock/). - Wyszukiwanie fałszywej blokady lub ponownego pozyskania, którego nie można wykonać (częstotliwość bez całkowitej liczby próbek na okres kodu), nie zatrzymuje już śledzenia.
- Testy:
tests/iq_track_engine.rs,tests/iq_cli.rs,iq::track::design::tests,tests/pythonoraz pełny obieg IQ przez MCP.
- Progi (
Profile C/N0 w scenach syntetycznych (0.34.0).
iq::channel::cn0_profileplanuje zmienne w czasie C/N0 dla każdego satelity we własnych scenach Kshana, jako przesunięcia w dB względem C/N0 sceny. Kształty: skok, rampa, odcinkowo liniowy oraz generowane z ziarna zaniki Rice'a podobne do scyntylacji, z podanym S4 i czasem dekorelacji. Stosuje się je przez istniejący punkt zaczepienia kanału sceny (Cn0ProfileChannel, w połączeniu z efektami jonosfery, troposfery, scyntylacji i wielodrogowości), bez zmian w rdzeniu sceny.cn0_dbhzw pliku prawdy odpowiada profilowi.- Interfejsy:
kshana iq scene … --cn0-profile <toml>ikshana.iq_scene(…, cn0_profile="<toml>"). - Do czego służy: pętle, monitory i punktowanie kampanii można testować obciążeniowo względem znanej prawdy. Zmienia ono wyłącznie moc sygnałów prawidłowych.
- Kontrole (
tests/iq_cn0_profile.rs). Progi: średnia intensywność zaniku w granicach 5 % od 1, S4 w granicach 8 % wartości docelowej (przy S4 = 0,3, 0,7 i 1), korelacja intensywności powyżej 0,9 przy 0,05 τ i poniżej 0,05 przy 5 τ; prawda dokładnie równa podanemu C/N0 plus profil; spadek śledzonego NWPR C/N0 w granicach 0,7 dB od skoku 6 dB. Zmierzono: S4 w granicach 1,3 % wartości docelowej oraz spadek śledzony 6,26 dB.
- Interfejsy:
Monitory detekcji na ścieżce IQ (0.34.0 „Lab replay”). Nowy moduł
iq::monitor, poleceniekshana iq monitori powiązaniekshana.iq_monitor(path, ...). Obserwują nagranie i raportują szeregi czasowe oraz oznaczone zdarzenia (czas początku, alarmu i końca, wartość szczytowa, próg). Tylko wykrywają i mierzą; nic tu nie generuje sygnału.- Moc całkowita / AGC: moc bloku i wzmocnienie, które zastosowałby idealny AGC; oznacza wzrosty i spadki.
- Widmo przed korelacją: PSD Welcha na blok względem wyuczonej linii bazowej. Próg nadwyżki wynika z docelowego poziomu fałszywych alarmów. Także kurtoza zespolona i detektor impulsów. Detektor impulsów zlicza próbki powyżej progu w każdym bloku i zgłasza zdarzenie, gdy dokładny górny ogon rozkładu dwumianowego dla tej liczby jest poniżej
pulse_pfa(domyślnie 1e-4 na blok), a nie gdy wynik z przekroczy limit: przy małych oczekiwanych liczbach w krótkich blokach pojedyncza próbka jest już kilka sigma od średniej. - C/N0 dla każdego kanału: dwa jednostronne detektory zmian CUSUM (spadek i wzrost), zasilane niezależnymi estymatami (krok wynika z okna C/N0 pętli).
- SQM z korelatorów: delta
(I_E − I_L)/I_Pi iloraz(I_E + I_L)/(2 I_P), a także testy asymetrii z dodatkowych korelatorów, gdy kanał je dostarcza. - Szereg wskaźników blokady: PLI i wskaźnik blokady częstotliwości z kolejnych próbek prompt, jako sygnały surowe. Decyzje o blokadzie i utracie blokady pozostają przy automacie stanów blokady silnika śledzenia.
Jeden przebieg strumieniowy (
iq::monitor::run::run_monitors) uruchamia wszystko, z plikiem ustawień TOML/JSON (MonitorConfig); moduł kampanii używa tego samego punktu wejścia. Wszystkie MODELLED. Każda statystyka jest sprawdzana względem swojej postaci zamkniętej przez symulację z ziarnem (tests/iq_monitor.rs):- przekroczenia mocy bloku względem ogona rozkładu Gamma;
- średnia kurtozy 2 i rozrzut
2/√N; - ułamek impulsów
e^{−t}; - długości przebiegów CUSUM względem przybliżenia Siegmunda (zmierzono 330 i 8,46 próbek wobec 338 i 8,34);
- wskaźnik blokady fazy względem średniej dla fazy o rozkładzie Rice'a;
- na śledzonym sygnale C/A rozrzut delty i ilorazu SQM wynosi około 6 % względem postaci zamkniętych pierwszego rzędu (zmierzono 5,97 %; próg testu 12 %).
Wzór na fałszywy alarm nadwyżki widmowej jest przybliżeniem; zmierzony poziom wynosił 1,3× wartości ze wzoru. W pełnym torze monitory oznaczają:
- skok C/N0 o 6 dB (czas zmiany w granicach jednej estymaty);
- ścieżkę odbitą pojawiającą się w trakcie nagrania (test ilorazu);
- zanik sygnału (w jego trakcie PLI spada z 0,999 do −0,3, a FLI z 0,93 do 0,03);
- ton wąskopasmowy i rzadkie próbki o dużej amplitudzie (testy widmowy, impulsowy i kurtozy). To ogólne wejścia testowe DSP, a nie modele zakłóceń.
Zmienione#
iq track/iq sweepdziałają strumieniowo przez nową sesję (zob. Dodano).--csvzachowuje swoje kolumny z wersji 0,32, ale jest teraz przesyłany strumieniowo, więc wiersze kilku kanałów przeplatają się w kolejności czasu zamiast być pogrupowane według kanału.--jsonzachowuje swój kształt z wersji 0,32 i nadal trzyma w pamięci każdą epokę: do długich nagrań użyj--epochs.iq sweepmierzy jitter na aktualizacjach z drugiej połowy czasu trwania przebiegu (wcześniej z drugiej połowy liczby aktualizacji), a jego CSV/JSON zyskują kolumnędesign_hash.- Tabela śledzenia zyskuje kolumnę
final_state. - Tekst pomocy nie twierdzi już, że
iq trackprzyjmuje flagi toru wejściowego; stosuje je tylkoiq acquire. - Parametry
acq_noncoherentidoppler_maxw Pythonowymiq_trackmają teraz domyślnie wartośćNone(wartości z projektu, 1 i 5000 Hz we wbudowanym projekcie). Jego epoki zyskują korelatory wczesny/późny,carrier_phase_cycles,bit_edge,bitistate, a wynik zyskujedesignievents.
Poprawiono#
Domyślny krok akwizycji nie przekazuje już śledzeniu Galileo E1 reszty, której FLL nie potrafi wciągnąć. Krok
2 / (3 · N · T_code)pozostawia przy przekazaniu do1 / (3 · N · T_code)błędu Dopplera, ale domyślna dwukwadrantowa FLL wciąga tylko1 / (4 T_track). Dla każdego kodu o długości 4 ms lub większej (N = 1), w tym Galileo E1-B i E1-C, reszta (83,3 Hz przy 4 ms) wykraczała poza wciąganie 62,5 Hz, a śledzenie łapało fałszywą blokadę przy +125 Hz, ze wskaźnikiem blokady fazy 0,97, który ją ukrywał. Domyślny krok jest teraz dodatkowo ograniczony do0.2 / T_track(kshana::iq::acq::default_step_hz), czyli 0,8 zakresu wciągania, więc przekazanie mieści się w nim, nawet gdy wygra sąsiedni przedział. (0,4 wypróbowano najpierw: dawało fałszywą blokadę w 1 przebiegu na 42 na E1-B, a koherentne wyszukiwanie GPS L1 C/A 1 ms wybrało przedział 350 Hz obok i zablokowało się przy +500 Hz; 0,25 i 0,2 nie dały żadnej w tych samych przebiegach.) Koszt: Galileo E1-B/E1-C przechodzą z przedziałów 166,7 Hz na 50 Hz, czyli 201 przedziałów w zakresie ±5 kHz zamiast 61; kody 1 ms (166,7 Hz,N = 4) pozostają bez zmian."auto"w projekcie pętli oznacza właśnie to; jawnie podanedoppler_step_hzlub--doppler-stepjest używane tak, jak zapisano, aiq acquire(bez przekazania do śledzenia) zachowuje krok podręcznikowy. Nagłówek epoki i--summaryzapisują teraz rozstrzygnięty krok i szerokości pasma pętli dla każdego kanału (resolved). Skrót projektu domyślnego pozostaje bez zmian. Zmiana danych wyjściowych: detekcje dla kodów o długości 4 ms i większej mogą trafiać w inne przedziały Dopplera.GPS L2C CM (aktualizacja pętli co 20 ms) utrzymuje blokadę z projektem domyślnym. Domyślna PLL 15 Hz i FLL 10 Hz mają
Bn · Trówne 0,3 i 0,2 przy T = 20 ms, a pętla traciła blokadę nawet przy idealnym starcie (PLI −0,08, M2M4 15,8 dB-Hz). Nowy klucz projektucarrier.bn_t_max(domyślnie 0,1) ogranicza szerokości pasma szumów PLL i FLL dobn_t_max / T, gdy czas aktualizacji pętli jest dłuższy niż 4 ms (Design::loop_config_for): 5 Hz i 5 Hz przy 20 ms, 10 Hz i 10 Hz przy 10 ms dla BeiDou B1C; kody 1 ms i 4 ms zachowują 15 i 10 Hz. Dotyczy to także jawnie podanych szerokości pasma;bn_t_max = 0to wyłącza. Klucz jest pomijany w postaci kanonicznej przy wartości domyślnej, więc skrót projektu domyślnego pozostaje bez zmian; projekt ustawiający jakąkolwiek inną wartość ma inny skrót. Przy 45 dB-Hz L2C CM daje teraz PLI 0,996, błąd Dopplera 0,00 Hz i M2M4 42,71 dB-Hz. Znana otwarta kwestia: NWPR C/N0 jest tam zaniżone o 1,76 dB (i o 2,45 dB na B1C przy 10 ms), więc T5 macierzy dla L2C pozostaje ignorowanym ustaleniem.Plik
docs/assets/clock-ensemble-band.svgwygenerowano ponownie: zatwierdzony rysunek był nieaktualny względem własnego scenariusza (zmiana danych, nie przemalowanie). Wykres narysowano 2026-06-02 zscenarios/clock-ensemble.toml; dwa dni później 67fed19e ustawił w tym scenariuszu progi szumu flicker-FM (kwantowyflicker_floor = 1e-16, CSACflicker_floor = 2e-11), a rysunku nigdy nie narysowano ponownie. Pokazywał przebieg sprzed progów: oś y od 0 do 47 ns, p95 zaniku dla przebiegu CSAC od 10,5 do 47,6 ns (średnia 25,2 ns), holdover klasyczny 4050 s średnio. Scenariusz w wersji dostarczonej (jak podają już samouczek i podsumowanie CLI) daje oś y od 0 do 407 ns, p95 dla przebiegu CSAC od 40,8 do 374,0 ns (średnia 167,0 ns), holdover klasyczny 844 s [220 do 2130 s]; linia specyfikacji 20 ns leży przy tych samych 20 ns na osi wyższej około dziewięć razy. Silnik jest niezmieniony: dzisiejszy silnik na czerwcowym pliku scenariusza dokładnie odtwarza oś starego rysunku. Rysunek nie jest przywoływany w README ani w dokumentacji.
Znane ograniczenia#
- NWPR C/N0 jest zaniżone przy wysokim C/N0·T na próbkę prompt, a BOC(1 1) przy 5 MS/s traci około 1 dB. NWPR jest nieobciążone na idealnych próbkach prompt, ale własny jitter PLL pętli kosztuje około dopasowanych 8 dB × Bn·T (jedna scena, cztery punkty: −0.24/−0.44/−0.77/−1,58 dB przy 1/2.5/5/10 Hz i 20 ms; około −1 dB przy domyślnym
bn_t_max = 0.1); M2M4 jest niewrażliwe. Dane BeiDou B1C przy 5 MS/s tracą też około 1 dB mocy prompt na ograniczeniu pasma (użyj 10 MS/s lub więcej). Żadne z tych zjawisk nie jest wadą estymatora; wiersze T5 macierzy sygnałów dla GPS L2C i BeiDou B1C pozostają ignorowanymi ustaleniami z tymi przyczynami.
[0.33.1] - 2026-10-08#
Bezpieczeństwo#
- Utwardzono tekst wykresów i przyjmowanie wykresów w Studio. Tekst, który scenariusz przenosi do wygenerowanego wykresu, jest teraz spójnie escapowany przez jedną wspólną procedurę, a Studio przyjmuje z wykresu wyłącznie znaczniki rysunku. Parametry adresu Studio, wyszukiwania według rodzaju i pobieranie scenariuszy są ograniczone do znanych wartości. Dołączone wykresy, zapisane wyniki i opublikowane liczby pozostają bez zmian. Zaleca się aktualizację każdemu, kto otwiera w Studio pliki scenariuszy z niezaufanych źródeł lub osadza wygenerowane wykresy na stronach internetowych. Biuletyn: GHSA-h25h-cg9f-v2cg.
[0.33.0] - 2026-10-08#
Dokumentacja#
- Zakres zakłóceń i spoofingu w warstwie IQ, opisany dokładnie. Wpisy 0.31.0 i 0.32.0 poniżej mówią, że warstwa IQ dodaje „brak syntezy przebiegów zakłóceń ani spoofingu”. Jest to prawdą o samej warstwie IQ (
iq::scenegeneruje wyłącznie prawidłowe sygnały GNSS), ale brzmiało to jak stwierdzenie o całym silniku, a takim nie jest: od 0.29.0 sekcja[iq]rodzajuspectrumzapisuje migawkę SigMF swojego modelu analitycznego wraz ze skonfigurowanymi zagłuszaczami (zagłuszacze szumopodobne przedział po przedziale, tony i chirpy jako przebiegi), aspoof_capturesumuje w pamięci sygnał prawdziwy i replikę spoofera, by testować przechwycenie pętli (suma nigdy nie jest zapisywana). Silnik zawiera też programowy odbiornik GNSS od 0.20.0 (sdr: akwizycja i śledzenie; od 0.31.0 takżeiq::acqiiq::track). Nic w Kshana niczego nie nadaje ani nie steruje sprzętem radiowym. Wiersz stanu w README,docs/POSITIONING.md,docs/SPECTRUM.mdi notatki projektowe IQ mówią to teraz wprost; wydane wpisy pozostawiono w postaci, w jakiej opublikowano. Zachowanie się nie zmienia. - Znane ograniczenie: próbkowanie współmierne. Przy częstotliwości próbkowania będącej całkowitą lub półcałkowitą wielokrotnością częstotliwości chipów próbki leżą w każdym chipie w tych samych fazach chipa, a dyskryminator kodu staje się schodkiem. Na syntetycznym sygnale GPS L1 C/A przy 45 dB-Hz i odstępie 0.5 chipa 2,046 MHz (2 próbki na chip) daje ≈ 0,09 chipa (≈ 26 m) RMS błędu kodu i błąd systematyczny −0,09 chipa, wobec ≈ 0,003 chipa przy częstotliwości niewspółmiernej. NWPR C/N0 jest tam zaniżone o ≈ 2,4 dB. Przy 4,092 MHz zależy to od odstępu i Dopplera kodu. Przy 0,5 chipa jest nieszkodliwe przy Dopplerze 1500 Hz, ale daje 2× przy błędzie systematycznym 0,011 chipa przy 0 Hz, a przy 0,25 lub 0,1 chipa błąd kodu jest 8–10× większy. Śledzenie nośnej nie jest dotknięte. Pomiary zawiera
docs/design/iq-notes/receiver.md.
Dodano#
Warstwa IQ GNSS na serwerze MCP (faza B.1).
kshana-mcpzyskuje sześć narzędzi, które z poziomu agenta obsługują warstwękshana iq:iq_signals(akceptowane nazwy sygnałów i konfiguracja IQ),iq_info(opis nagrania),iq_scene(generowanie sceny o podanym profilu lub z efemerydami nadawczymi, z opcjonalnym kanałem na poziomie sygnału),iq_acquire(akwizycja FFT, opcjonalnie za stopniami toru wejściowego),iq_track(akwizycja, a następnie zespół pętli DLL/PLL/FLL) iiq_frontend(filtr pasmowy, notch, wygaszanie, wycinanie, AGC, kwantyzator). Próbki IQ nigdy nie przechodzą przez protokół: każde narzędzie przyjmuje ścieżki plików w jednym katalogu roboczym ustawionym przezKSHANA_MCP_IQ_DIR(brak ustawienia wyłącza narzędzia plików IQ i nie wpływa na żadne inne), odrzuca ścieżki wskazujące poza niego oraz wyjścia, które już istnieją, chyba że ustawionooverwrite, egzekwuje limit próbek na wywołanie (KSHANA_MCP_IQ_MAX_SAMPLES, domyślnie 50 000 000) przed jakąkolwiek pracą, odrzuca nieznane argumenty i odpowiada zwięzłym podsumowaniem JSON (detekcje, C/N0, stan blokady oraz każdy zapisany plik z liczbą bajtów). Dane wyjściowe dla każdej epoki trafiają tylko do plików wskazanych przez wywołującego. Narzędzia uruchamiają tę samą ścieżkę kodu co CLI przez nowy publiczny punkt styku,kshana::iq::cli::execute, który zwraca komunikat CLI zamiast go drukować (stdout jest kanałem JSON-RPC MCP);iq::cli::build_codeiiq::cli::signal_namessą teraz również publiczne. Wyłącznie programowe i addytywne: warstwa IQ nie dodaje syntezy zakłóceń ani spoofera, nic nigdy nie jest nadawane i nie ma nowych zależności.server.jsondeklaruje dwie zmienne środowiskowe. Testy obiegu wmcp/kshana-mcp/tests/iq_round_trip.rsgenerują krótką scenę z dwoma satelitami i sprawdzają akwizycję względem własnego pliku prawdy sceny, blokadę śledzenia i C/N0, tor wejściowy, zapis SigMF, limit, ograniczenie ścieżek i stan wyłączony.Warstwa IQ GNSS w rejestrze walidacji. Wstępnie zarejestrowana kontrola krzyżowa względem gps-sdr-sim (niezależnego generatora pasma podstawowego GPS L1 C/A, MIT, commit 28ca29a6) jest teraz częścią zawsze włączonego zestawu testów (
tests/iq_gpssdrsim_cross_generator.rs). Jej zatwierdzone dane odniesienia (tests/fixtures/iq_gpssdrsim_cross_generator/: 20 ms własnego 8-bitowego I/Q gps-sdr-sim, jego lista kanałów i stan kanałów, który za nim stoi, z modułu zlinkowanego z tym samym buildem) są generowane ponownie przezscripts/gen_iq_gpssdrsim_ref.sh. Podczas testu nic nie wymaga sieci ani zewnętrznego narzędzia. Dodano dwa wiersze rejestru (251 wierszy: 124 sprawdzonych względem niezależnego wzorca, 123 obliczonych z modelu, 4 partnera):- Geometria sygnału sceny IQ GNSS względem niezależnego generatora pasma podstawowego: sprawdzone względem niezależnego wzorca. Prawda sceny (zbiór widocznych satelitów, pseudoodległość, faza kodu, Doppler, kąty widzenia) dla sceny z efemerydami nadawczymi zgadza się ze stanem kanałów gps-sdr-sim na wszystkich 11 kanałach: w najgorszym przypadku 1,6 mm, 5.5e-6 chipa, 7.4e-5 Hz, 4e-9 stopnia, wobec progów 0,05 m, 2e-4 chipa, 0,02 Hz i 1e-4 stopnia ustalonych przed przebiegiem.
- Akwizycja IQ GNSS na niezależnie wygenerowanych próbkach I/Q: obliczone z modelu, z ustaleniem.
iq::acqznajduje każdy symulowany satelita w próbkach gps-sdr-sim w granicach zarejestrowanych progów (faza kodu w granicach 0,195 chipa, Doppler w granicach 72 Hz). Zarejestrowany próg „nie wykryto żadnego innego PRN” jednak nie zostaje spełniony: na wolnym od szumu wyjściu gps-sdr-sim próg dla szumu gaussowskiego jest przekraczany przez korelację wzajemną pozostałych satelitów dla wszystkich 21 nieobecnych PRN. Test ścisły pozostaje, ignorowany wraz z ustaleniem, a przypięty test je rejestruje. Kod silnika ani publiczne API się nie zmieniają. Próbki I/Q nie są porównywane próbka po próbce: całkowitoliczbowa tablica sinusa gps-sdr-sim, wzmocnienia, zerowa początkowa faza nośnej i obcięte pola LNAV nie są wielkościami, co do których odbiornik musi się zgadzać. Porównanie wykonuje się na obserwablach, które mierzy odbiornik.
Zmienione#
iq trackdomyślnie przekazuje z akwizycji ≈4 ms (zmiana zachowania). Akwizycja inicjalizująca każdy kanał śledzenia całkuje teraz koherentnieceil(4 ms / T_code)okresów kodu zamiast jednego, gdzieT_codeto pełny okres kodu (iloczyn długości kodu podstawowego i wtórnego dla kodu warstwowego, jednostka, po której całkuje akwizycja). Niewarstwowe kody 1 ms (GPS L1 C/A, BeiDou B1I, GLONASS L1OF) przeszukują teraz 4 okresy (4 ms), więc domyślny krok Dopplera2 / (3 · N · T_code)wynosi ~167 Hz zamiast ~667 Hz. Każdy kod, którego pełny okres wynosi już 4 ms lub więcej, zachowuje 1 okres: Galileo E1-B (4 ms), BeiDou B1C (10 ms) oraz warstwowe GPS L5-I/L5-Q, Galileo E5a-I/E5a-Q i E1-C (od 10 do 100 ms z kodami nakładkowymi), a także GPS L2C. Każdy sygnał całkuje więc co najmniej ~4 ms. Wyszukiwanie jednookresowe mogło przekazać kanał z błędem do ~333 Hz, poza wciąganiem FLL, a kanał śledził wtedy fałszywą blokadę ~500 Hz dalej, zgłaszając czyste śledzenie. W przeglądzie z ziarna obejmującym 180 kanałów GPS L1 C/A (Doppler w zakresie ±5 kHz, od 38 do 47 dB-Hz, połowa z danymi nawigacyjnymi;docs/design/evidence/iq-track-acq-default/, do ponownego uruchomienia) fałszywe blokady spadają z 27 na 180 do 1 na 180, a chybione akwizycje ze 102 do 11, kosztem ~40 ms dłuższego wyszukiwania na PRN w GPS L1 (11 → 52 ms). Jedyna pozostała fałszywa blokada występuje przy 38 dB-Hz, 36 Hz od wartości właściwej. Wszystkie interfejsy są zgodne:kshana iq trackikshana iq sweep(--acq-coherent), Pythonowekshana.iq_track(acq_coherent=Nonejest teraz automatyczne; stub zaktualizowany) i narzędzie MCPiq_track. Kto polegał na dawnej wartości domyślnej, może podaćacq_coherent=1(--acq-coherent 1). Własna wartość domyślna--coherentwkshana iq acquirepozostaje 1. Nowe publiczneiq::acq::auto_coherent_periodsiiq::acq::AUTO_COHERENT_S; test regresjitests/iq_cli.rs::track_default_handoff_does_not_false_lock_where_one_period_did.- Każda generowana grafika podąża teraz za motywem Observatory witryny: zmieniają się bajty każdego wykresu. To celowa korekta wyłącznie opublikowanych rysunków, kolorów i krojów pisma; żadna wykreślana wartość, współrzędna ani etykieta się nie przesunęła. Każdy
*.chart.svgscenariusza (a więc eksporty wykresów w Studio i wykresy demonstracyjne w README), raport z przebiegu w HTML (*.report.html), animacja osi czasu (--animate), strony HTML wyników scenariuszy i badań, podsumowanie walidacji oraz rysunki i diagramy w dokumentacji używały ciepłej ciemnej lipcowej palety (tło#0c0b08, złoto#e0bd84) i ciepłego papierowego motywu raportu. Teraz biorą każdy kolor i krój z jednego modułu,src/palette.rs, który odzwierciedlaweb/theme.css: wykresy są rysowane w stylu ciemnego przyrządu na tle Observatory (#060A14) w zestawie kroju Geist; raport, odtwarzacz animacji i strony wyników podążają za preferencją jasnego/ciemnego motywu przeglądarki z jasnymi i ciemnymi tokenami Observatory. Sześć dziedzin awarii zachowuje po jednym kolorze (zakłócenia koralowy, spoofing magenta, synchronizacja czasu niebieski, orbity cyjan, integralność limonkowy, nawigacja bursztynowy), a poziomy dowodowe czytają się: sprawdzone limonkowy, obliczone z modelu bursztynowy, partnera magenta. Rampy wodospadu zachowują swoją percepcyjną kolejność (inferno), zakotwiczoną ponownie na nowym tle.tests/palette_sync.rsutrzymuje moduł zgodny zweb/theme.cssw obu motywach, sprawdza, czydocs/assets/palette.jsonidocs/diagrams/mermaid-config.json(oba generowane z modułu, dla narzędzi rysunków w Pythonie i mermaid-cli) są aktualne, i kończy się błędem, jeśli wsrc/poza paletą pojawi się literał koloru szesnastkowego.tests/published_figures_still_reproduce.rszyskuje trzecią diagnozę, „przesunęły się tylko kolory i kroje pisma”, aby odróżnić korektę palety od przesuniętej wykreślanej wartości. Każdy ponownie wyrenderowany wykres README został sprawdzony jako równy swojemu poprzednikowi po tej normalizacji.tools/gen_validation_figures.pyczyta paletę, a teraz także generuje trzy rysunki wyników w README, które nie miały zatwierdzonego generatora (domain-coverage-map,scenario-fom,sgp4-regime-bars), z prawdziwymi elementami tekstowymi, zweb/capabilities.json, wynikuclock-holdoveritests/fixtures/sgp4_comparison.md.tools/gen_readme_assets.pyczyta tę samą paletę, co poprawia jego odchylenie jasnego motywu względem witryny. Wartościsgp4-regime-barsto kolumna najgorszego przypadkukshana↔refz tego pliku wzorcowego (7.31e-9, 8.05e-9, 8.18e-9 i 4.12e-6 km), bez zmian względem rysunku z Matplotlib, atests/figures_doc_sync.rskończy się teraz błędem, jeśli zatwierdzony rysunek i plik wzorcowy się różnią.
docs/assets/figures/domain-coverage-mapodświeżono do aktualnych danych (zmiana danych, nie przemalowanie). Rysunek podawał 28 możliwości w 8 dziedzinach (11 sprawdzonych względem niezależnego wzorca, 17 obliczonych z modelu), co było nieaktualne względem jego własnego podanego źródła; narysowany teraz przez nowy generator zweb/capabilities.json, podaje 46 możliwości w 8 dziedzinach (17 sprawdzonych względem niezależnego wzorca, 29 obliczonych z modelu).
Poprawiono#
Q zagłuszacza CW/wąskopasmowego wynosi teraz 1,0, a nie 1,5. Wartość podręcznikowa dla tonu na nośnej to 1 (ton zachowuje szczyt widmowy sygnału,
κ = T_c,Q = 1/(R_c κ)); dawne 1,5 sprawiało, że ton był mniej szkodliwy niż szum szerokopasmowy przy równym J/S. Zmiana danych wyjściowych: około −1,8 dB efektywnego C/N0 pod zagłuszaczami CW/wąskopasmowymi przy wysokim J/S w rodzajachjamming,lunar-jammingi interop (ton w dołączonym przykładziespectrum: 17,98 dB-Hz z tabeli, było 19,74). Q szerokopasmowe pozostaje 1,0 (ostrożnie, około 3 dB poniżej podręcznikowego ~2) do przeglądu w 0,34. Ustawq_override, aby zachować dawne 1,5.Wyjście całkowitoliczbowe
kshana iq scenewykorzystuje zakres całkowitoliczbowy. Przy szumie o mocy jednostkowej i skali zapisu 1 scenyci8/ci16wychodziły jako około {-1, 0, 1}, a sceny 2-bitowe miały progi przy 2,8 sigma. Formaty całkowitoliczbowe są teraz skalowane tak, aby oczekiwane RMS na składową wynosiło jedną czwartą pełnej skali (31,75 LSB w ci8, 8191,75 w ci16) lub 2 LSB w formacie 2-bitowym. Skala i liczba obciętych elementów są drukowane i zapisywane w pliku towarzyszącym. Wyjście zmiennoprzecinkowe pozostaje bez zmian.Osiem przypięć wzorców w siedmiu plikach testowych nie zawodzi już na macOS z powodu różnic na ostatnim bicie (część zgłoszenia #36). Przypięcia sprawdzające, że silnik nadal buduje zatwierdzone dane wejściowe wyroczni (jakobiany, tablica stanów, azymuty startu), porównywane bit w bit, zawodziły na macOS arm64 o 2 do kilku tysięcy jednostek na ostatnim miejscu. Teraz porównują w granicach 1e-12 skali wziętej z pliku wzorcowego; liczby całkowite, klucze i długości nadal porównuje się dokładnie, a test mutacyjny pokazuje, że zmiana względna 1e-6 nadal powoduje błąd. Przypięcie azymutu startu porównuje
sin azi gałąź wstępującą/zstępującą zamiast samego azymutu, ponieważasinwzmacnia jedną ulp argumentu do około 3e-9 rad tam, gdzie nachylenie równa się kodoszerokości miejsca. Żadna tolerancja wyroczni ani wstępnie zarejestrowany próg się nie zmieniły. Dwa testy (łączne OD księżycowe, obserwowalność księżycowa) nie są objęte: na macOS ich wstępnie zarejestrowane porównania same się przesuwają, co pozostawiono do dalszych prac.kshana iq trackikshana iq sweepstosują flagi toru wejściowego. Tekst pomocy reklamował--bandpass/--notch/--blank/--excise/--agc/--bitsprzytrack, aletrackisweepnigdy nie budowały łańcucha: flagi były po cichu ignorowane, a flaga bez wartości, taka jak--notch, pochłaniała następującą po niej flagę. Oba polecenia parsują je teraz tak jakiq acquirei umieszczają świeży łańcuch toru wejściowego przed przebiegiem akwizycji i przebiegiem śledzenia. Wynik jest równy uruchomieniu polecenia na pliku, który zapisujeiq frontenddla tych samych flag.Dane sceny IQ są umieszczane osobno dla każdego sygnału.
kshana iq scene --data(orazNavData::Seeded) umieszczały bity 50 bit/s na każdym sygnale, także pilotach, i z szybkością GPS LNAV na Galileo i BeiDou. Dane podążają teraz za własnym taktowaniem symboli każdego sygnału, podanym przez noweSpreadingCode::data_modulation()(DataModulation, ustawiane przez każdy konstruktor wiq::signals). To 10 ms dla L5-I5, 4 ms dla E1-B, 2 ms dla BeiDou B1I GEO (D2) oraz bity 20 ms z meandrem 10 ms dla GLONASS L1OF. Dane są odrzucane na pilotach, na GPS L2C jako jednym strumieniu CM/CL, aNavData::Lnavna wszystkim poza L1 C/A. Kody własne zachowują domyślnie poprzednie taktowanie 20 ms. ProgramowaScene, która żądałaNavData::Lnavna kodzie innym niż L1 C/A alboNavData::Seededna pilocie, generowała po cichu, a teraz zwraca błąd przy pierwszym odczycie.Kanały GLONASS L1OF są pozyskiwane i śledzone na własnej nośnej FDMA.
iq::acq::acquirei kanały śledzenia mieszały każdy kod w dół wyłącznie odif_hz. W wielokanałowym nagraniu GLONASS wyszukiwanie kanału +3 znajdowało więc sygnał kanału 0 (wszystkie kanały dzielą jeden kod dalmierczy) i nigdy nie szukało 1,6875 MHz wyżej. Oba używają terazSampleSpec::baseband_hz(carrier) = if_hz + (carrier − center_hz). Składnik nośnej jest zerowy dla każdego nagrania wyśrodkowanego na własnej nośnej sygnału i jest pomijany, gdy środek jest nieznany, więc przetwarzanie CDMA jest bez zmian. Jeśli obchodziłeś dawne zachowanie, wpisująccarrier − centerdoif_hzw pliku towarzyszącym, usuń ten składnik: przesunięcie jest teraz stosowane z nośnej i środka, więc pozostawienie go stosuje je dwukrotnie. Znane ograniczenie, tu bez zmian: scena GLONASS identyfikuje każdy satelita po jego kanale częstotliwościk, a identyfikator satelityu32zawija kanał ujemny. Plik prawdy zapisujek = -7jakosat_id4294967289 (k + 2^32). Odczytaj to z powrotem jakokz rzutowaniemi32.
[0.32.0] - 2026-10-05#
Dodano#
- Warstwa IQ GNSS w CLI i Pythonie (faza A wersji 0.32.0). Istniejący moduł
iqmożna teraz używać bez pisania w Ruście. Pięć nowych poleceńkshana iqdołącza do grupy obsługi danych:scenegeneruje długą wielosatelitarną scenę IQ do pliku z plikiem prawdy;acquirewykonuje akwizycję FFT jednego lub więcej PRN na nagraniu i raportuje każdą detekcję (PRN, Doppler, faza kodu, statystyka, próg);trackpozyskuje, a następnie uruchamia zespół pętli DLL/PLL/FLL na nagraniu i wypisuje dane śledzenia dla każdej epoki (CSV/JSON) z konfigurowalnymi szerokościami pasma pętli, czasem całkowania i odstępem korelatorów;sweepodtwarza jedno nagranie przez kilka projektów pętli i raportuje wynikowy jitter i wskaźniki blokady dla każdego projektu; alabfitdopasowuje model utraty blokady pętli śledzenia do osi czasu zaufania do odbiornika. Ten sam rdzeń jest udostępniony w Pythonie (kshana.iq_scene,iq_acquire,iq_track,iq_labfit,iq_signals), zwracając listy i słowniki przyjazne dla NumPy. Wyłącznie programowe i addytywne: brak nowych zależności, brak nadawania, brak syntezy przebiegów zakłóceń czy spoofingu; silnik, akwizycja, śledzenie i projekty pętli są własne dla crate, więc wywołujący z CLI lub Pythona otrzymuje te same bity co testy w Ruście. Nowy modułiq::cli; własny plik prawdy sceny jest niezależną wyrocznią wtests/iq_cli.rs(akwizycja odzyskuje każdą wprowadzoną fazę kodu i Doppler, śledzenie zbiega do wprowadzonego Dopplera). Żadna opublikowana liczba rodzajów scenariuszy ani wiersz macierzy weryfikacji się nie zmienia. - Pozostałe możliwości biblioteki IQ GNSS w CLI
iqi Pythonie (faza A.2 wersji 0.32.0). Rozbudowuje fazę A, udostępniając resztę warstwyiqbez pisania w Ruście:- Kanał propagacyjny w
iq scene(i w Pythonowymiq_scene): jonosfera pierwszego rzędu (--iono-stec/--iono-vteclub--iono-klobuchar), troposfera Saastamoinena/Niella (--tropo), model scyntylacji Cornella (--s4,--scint-tau0,--sigma-phi), zwierciadlana wielodrogowość od gruntu (--multipath-height/--multipath-ground), trójstanowy kanał lądowo-ruchomy (--land-mobile) oraz blok bez linii widzenia (--nlos) działają na każdy satelita przez nowy wewnętrzny mostek crate (iq::channel::SceneChannelAdapter), który przekształca bezwzględne ścieżki z modeli kanału do postaci nadmiaru ponad geometrię używanej w scenie. - Wyjście SigMF w
iq scene(--format sigmf): zapisuje próbki jako parę.sigmf-data/.sigmf-metaz przechwyceniem i adnotacjami dla każdego satelity;acquire/trackjuż czytają SigMF, więc scena przechodzi pełny obieg. - DSP toru wejściowego: nowe polecenie
iq frontend <in> <out>i te same flagi wacquire/track(--bandpass,--notch,--blank,--excise,--agc,--bits1/2/3/8/14) uruchamiają stopnieiq::frontend(filtr FIR pasmowy, adaptacyjny notch, wygaszanie impulsów, wycinanie w dziedzinie częstotliwości, AGC, kwantyzator); odzwierciedlone w Pythonie jakoiq_frontend. - Sceny z efemerydami nadawczymi:
iq scene --nav <rinex_nav> --rx-pos lat,lon,alt(z--start/--window/--prn) umieszcza każdego sprawnego satelitę GPS w jego prawdziwej geometrii nadawczej, używając czytnika RINEX silnika, więc plik prawdy zawiera rzeczywistą odległość, Doppler i fazę kodu dla każdego satelity; odzwierciedlone w Pythonie jakoiq_scene_broadcast. Wyłącznie programowe i addytywne: brak nowych zależności, brak nadawania, brak syntezy przebiegów zakłóceń czy spoofingu (efekty propagacji kanału działają tylko na sygnał prawidłowy). Każde twierdzenie liczbowe jest testowane względem niezależnego wzorca (postać zamknięta lub wprowadzona prawda) w testach jednostkowych kanału i toru wejściowego oraz wtests/iq_cli.rs.
- Kanał propagacyjny w
[0.31.0] - 2026-10-04#
Dodano#
- Warstwa IQ GNSS: symulacja na poziomie sygnału i przetwarzanie programowego odbiornika. Nowy moduł
iqprzenosi Kshana od jednosatelitarnego toru wejściowego L1 C/A z krótkim blokiem do pełnej warstwy na poziomie sygnału, dostępnej z grupy poleceńkshana iq. Generuje długie, wielosatelitarne surowe sceny IQ z plikiem prawdy dla każdej epoki (iq::scene); stosuje propagację na poziomie sygnału — jonosferę z rozbieżnością kod-nośna, troposferę, scyntylację amplitudy i fazy (model Cornella), wielodrogowość Fresnela i trójstanowy kanał lądowo-ruchomy, z brakiem linii widzenia (iq::channel); pozyskuje i śledzi za pomocą akwizycji FFT i wielokanałowego zespołu pętli DLL/PLL/FLL, odtwarzając jedno nagranie przez wiele projektów pętli (iq::acq,iq::track); modeluje tor wejściowy — filtrowanie FIR/IIR, kwantyzację od 1 do 14 bitów, AGC, notch, wygaszanie impulsów i wycinanie w dziedzinie częstotliwości (iq::frontend); przesyła strumieniowo duże zarejestrowane zbiory danych w ograniczonej pamięci — formaty int8/int16/float32/spakowane 2-bitowe i rzeczywiste IF, wieloplikowy SigMF, resampling, inwentarz zbioru danych z SHA-256 dla każdego pliku i moduł wsadowy (iq::io); dodaje kody rozpraszające dla GPS L5/L2C, Galileo E1 (CBOC, rzeczywiste kody pamięciowe ICD) i E5a, BeiDou B1C/B1I oraz GLONASS L1OF, każdy sprawdzony względem swojego dokumentu kontroli interfejsu (iq::signals); a także dopasowuje model utraty blokady pętli śledzenia do obserwowanego zachowania prawdziwego odbiornika w przebiegach laboratoryjnych, z błędem zbioru wyłączonego metodą leave-one-run-out i ekstrapolacją oznaczoną jako predykcja (iq::labfit). Każde twierdzenie liczbowe jest testowane względem niezależnego wzorca (tablica ICD, postać zamknięta lub niezależny odbiornik odzyskujący wprowadzoną prawdę); fizyczne modele kanału i pętli pozostają MODELLED. To wyłącznie warstwa programowa: zapisuje pliki IQ dla odbiorników programowych i nie syntetyzuje przebiegów zakłóceń ani spoofingu, ani nie steruje sprzętem radiowym. Żadna opublikowana liczba rodzajów scenariuszy ani wiersz macierzy weryfikacji się nie zmienia. Projekt:docs/design/GNSS-IQ-PLAN.md. - Zaufanie do odbiornika: ocena rzeczywistego logu odbiornika GNSS.
kshana receiver-trust <scenario.toml>wczytuje log u-blox UBX, RINEX 3 (z opcjonalnym plikiem nawigacyjnym nadawczym), Android GnssLogger lub NMEA 0183 do jednej osi czasu ze znacznikami czasu i uruchamia na niej monitory zaufania: spadek stosunku nośnej do gęstości szumu (C/N0), utratę blokady, automatyczną regulację wzmocnienia (AGC), wskaźnik zagłuszania u-blox, skok pozycji oraz, z RINEX i nawigacją, własne rozwiązanie jednopunktowe silnika z autonomicznym monitorowaniem integralności przez odbiornik (RAIM) pod względem parzystości i monitor wspomagany zegarem. Każda epoka jest nominalna, degraded lub nieufna, a wynik podaje kiedy i dlaczego. Zdarzenia i przewidywane spadki C/N0 podane w scenariuszu są oceniane względem tolerancji podanych w tym samym pliku: wykryte, spóźnione lub pominięte oraz zgodne lub niezgodne. Wynikami są JSON wyniku, plik CSV dla każdej epoki i wykres; wynik zawiera SHA-256 logu i każdy próg. Dostępne także z Pythona (kshana.receiver_trust), pakietu WebAssembly (receiver_trust, logi wbudowane) i nowego narzędziaassess_receiver_logserwera Model Context Protocol (MCP). Przewodnik:docs/RECEIVER-TRUST.md; przykład:examples/receiver-trust/. Na logach spoofingu JammerTest 2024 ścieżka silnika odtwarza pierwszy alarm wstępnie zarejestrowanego potoku wyroczni przy każdym opublikowanym początku (tests/receiver_trust_jammertest.rs). Monitory pozostają MODELLED; żaden wiersz macierzy weryfikacji się nie zmienia.
0.30.0 - 2026-10-03#
Wydanie pomocnicze. Rundy walidacji 2 i pakiety fali 1 zwiększają macierz weryfikacji z 223 wierszy (93 VALIDATED) w 0.29.3 do 249 wierszy (123 VALIDATED, 122 MODELLED, 4 PARTNER); każde podniesienie sprawdzono względem niezależnej wyroczni przy tolerancji ustalonej przed przebiegiem, a każda niezgodność jest publikowana jako ustalenie. Nowe: natywny czytnik jąder NAIF i ścieżka DE440, jedna zwalidowana ścieżka propagacji i czasu SGP4 do ITRS, zmierzona biblioteka zegarów, generator odniesienia LunaNet AFS, solwery o rozszerzonej precyzji i pierwiastkowe solwery informacyjne oraz rzeczywiste przetwarzanie IQ księżycowego na danych LuGRE. Opublikowane liczby, które się zmieniły, są wymienione poniżej jako korekty.
Dwadzieścia siedem wierszy macierzy weryfikacji uzyskuje status VALIDATED po tym, jak niezależna wyrocznia zgodziła się w granicach tolerancji ustalonej przed pierwszym porównaniem (reguła podniesienia w docs/VALIDATION.md): dziesięć w pierwszej rundzie walidacji i siedemnaście w drugiej. Pięćdziesiąt jeden wierszy MODELLED poddano zewnętrznej wyroczni w pierwszej rundzie, a pozostałe możliwe do skierowania wiersze w drugiej; każda niezgodność jest poniżej odnotowana jako ustalenie, a nie dostrajana. Trzy wiersze podzielono tak, aby część sprawdzona względem niezależnego wzorca nie niosła niesprawdzonej reszty, co zwiększa macierz z 223 do 226 wierszy; pakiety walidacji włączone od tego czasu zwiększają ją do 249. Liczby są odczytywane z wygenerowanego docs/VERIFICATION-MATRIX.md.
| 0.29.0 | po rundzie 1 | Niewydane | |
|---|---|---|---|
| Wiersze macierzy weryfikacji | 223 | 223 | 249 |
| w tym VALIDATED względem zewnętrznej wyroczni | 83 | 93 | 123 |
| w tym MODELLED | 136 | 126 | 122 |
| w tym PARTNER | 4 | 4 | 4 |
Skróty użyte w tym wpisie
| Skrót | Znaczenie |
|---|---|
| ADD, ARAIM, MAAST | Airborne Design Document (dla ARAIM); zaawansowane autonomiczne monitorowanie integralności przez odbiornik; Matlab Algorithm Availability Simulation Tool Uniwersytetu Stanforda |
| ADEV, VRW, ARW | odchylenie Allana; błądzenie losowe prędkości; błądzenie losowe kąta |
| ANISE, SPICE, NAIF, PCK | otwartoźródłowy zestaw narzędzi astrodynamicznych (Nyx Space); zestaw narzędzi NASA Spacecraft, Planet, Instrument, C-matrix, Events z jej Navigation and Ancillary Information Facility; jądro stałych planetarnych |
| BCRS, TDB, TT | Barycentryczny Niebieski Układ Odniesienia; barycentryczny czas dynamiczny; czas ziemski |
| BIPM, UTC(k) | Międzynarodowe Biuro Miar i Wag; realizacja uniwersalnego czasu koordynowanego przez laboratorium |
| CCSDS, OEM, LTC, TCL | Consultative Committee for Space Data Systems; Orbit Ephemeris Message; księżycowe systemy czasu zapisywane w polu TIME_SYSTEM komunikatu |
| CRLB | dolna granica Craméra–Rao |
| CW | ruch względny Clohessy'ego–Wiltshire'a |
| DE440 | Development Ephemeris 440 Jet Propulsion Laboratory |
| DOP, PDOP | rozmycie dokładności; rozmycie dokładności pozycji |
| EKF, UKF, INS, GNSS, IMU | rozszerzony filtr Kalmana; filtr Kalmana typu unscented; system nawigacji inercyjnej; globalny system nawigacji satelitarnej; inercyjna jednostka pomiarowa |
| EMT, VPL, HPL | efektywny próg monitora; pionowy i poziomy poziom ochrony |
| EOP, IERS, PCC, MAE | parametry orientacji Ziemi; Międzynarodowa Służba Ruchu Obrotowego Ziemi i Układów Odniesienia; Prediction Comparison Campaign; średni błąd bezwzględny |
| ERFA, SOFA | Essential Routines for Fundamental Astronomy; Standards of Fundamental Astronomy |
| GMAT | General Mission Analysis Tool NASA |
| NTN, SSB | sieć nieziemska (3GPP); blok sygnału synchronizacji |
| IGS, ILRS, ITRF2020 | Międzynarodowa Służba GNSS; Międzynarodowa Służba Pomiarów Laserowych; Międzynarodowy Ziemski Układ Odniesienia 2020 |
| ILS, LAMBDA | całkowitoliczbowa metoda najmniejszych kwadratów; Least-squares AMBiguity Decorrelation Adjustment |
| ISB | błąd międzysystemowy |
| LEO | niska orbita okołoziemska |
| MHSS, PL, TPL | rozdzielenie rozwiązań dla wielu hipotez; poziom ochrony; poziom ochrony czasu |
| PSD, IQ, SigMF | widmowa gęstość mocy; próbki w fazie i kwadraturze; Signal Metadata Format |
| QPN | kwantowy szum projekcji |
| RAIM | autonomiczne monitorowanie integralności przez odbiornik |
| SBAS, WAAS, DFMC, GEO | system wspomagania oparty na satelitach; amerykański Wide Area Augmentation System; dwuczęstotliwościowy wielokonstelacyjny; geostacjonarny satelita SBAS |
| RMS, SISRE | pierwiastek ze średniej kwadratowej; błąd odległości sygnału w przestrzeni |
| RTKLIB | otwartoźródłowa biblioteka pozycjonowania GNSS |
| TCXO | kwarcowy oscylator z kompensacją temperaturową |
| VLBI | interferometria o bardzo długiej bazie |
Sprawdzone względem niezależnego wzorca#
Każdy wiersz poniżej podaje rodzaj swojej wyroczni (Biblioteka: niezależna biblioteka zewnętrzna obliczająca jednoznacznie określoną wielkość; Dane pomiarowe: rzeczywiste dane zmierzone; P2: niezależna biblioteka numeryczna przeliczająca wielkość algebry liniowej na zatwierdzonych danych wejściowych), wyrocznię, tolerancję ustaloną przed przebiegiem i wynik. Każde podniesienie powtórzył drugi recenzent, który wygenerował plik wzorcowy ponownie bajt w bajt i wykazał, że celowa mutacja silnika zmienia test na czerwony.
- Fuzja sensorów GNSS/INS (biblioteka), ograniczona do luźno sprzężonego 15-stanowego EKF stanu błędu: NaveGo v1.4 (LGPL-3.0, uruchamiany w GNU Octave) na jego własnym rzeczywistym przejeździe z Ekinox IMU/GNSS. RMS poziomy, pionowy i innowacji pozycji w Kshana wynoszą 0,912, 0,940 i 0,861 wartości NaveGo (próg 1,2), a jej średnia znormalizowana innowacja wynosi 0,395 (próg 1,5). GNSS jest obecny przez cały przejazd, więc nie testowano żadnego zaniku. Ściśle sprzężony UKF i sprzężony filtr zegara pozostają poza twierdzeniem.
- Budżet błędu orientacji 3-DOF i celowania (biblioteka), zawężony do szczytu momentu gradientu grawitacyjnego: Basilisk 2.9.1 GravityGradientEffector, 40 przypadków, w granicach 1e-12 względnie (najgorszy 2.1e-15). Budżet celowania RSS jest sumą liczb podanych przez wywołującego i pozostaje poza nim.
- Łączna geometria księżycowej komunikacji i nawigacji (biblioteka), zawężona do umiejscowienia miejsca, azymutu, elewacji i odległości: ANISE 0.10.2, 768 próbek, w granicach 1e-6 stopnia i 1 mm (najgorszy 2.2e-12 stopnia i 5.6e-9 m). Parametr dokładności dalmierczej jest daną projektową spoza twierdzenia.
- Swobodna od momentów dynamika orientacji ciała sztywnego (biblioteka): hub statku Basilisk 2.9.1, 1e4 s na dwóch ogólnych tensorach bezwładności, kwaternion i prędkości w granicach 1e-9 (najgorsze 3.3e-11 i 3.4e-12 rad/s).
- Rozwiązywanie całkowitoliczbowej niejednoznaczności fazy nośnej GNSS (LAMBDA) (biblioteka), zawężone do rozwiązania ILS i jego dwóch najlepszych norm: RTKLIB v2.4.2-p13
lambda(), 300 kowariancji, 0 niezgodności całkowitoliczbowych, normy w granicach 1e-9 względnie (najgorsza 5.6e-13). Współczynnik powodzenia metodą bootstrap pozostaje sprawdzany tylko wewnętrznie. - Złożony PL czasu, skalarny MHSS (P2): numpy 2.3.5 i scipy 1.18.1 na 300 zatwierdzonych danych wejściowych, PL w granicach 1e-9 względnie (najgorszy 1.2e-10), podzbiór sterujący identyczny.
- Wybielanie wspólnego trybu GLS i tożsamość Mahalanobisa (P2): numpy 2.3.5 LAPACK na 201 zatwierdzonych kowariancjach, w granicach 1e-12 względnie (najgorszy 7.9e-16); liczby uwarunkowania do 19,3.
- Dostawca orientacji osi głównych Księżyca z DE440 (biblioteka): SPICE
pxformna binarnym PCK w 2 000 epokach poza węzłami, w granicach 1.7e-5 rad (najgorszy 1.7e-6 rad, około 3 m na powierzchni), po poprawce wymienionej w „Fixed”. - Wejście i wyjście nagrań SigMF oraz widma Welcha (biblioteka), zawężone do odczytu i zapisu SigMF oraz
welch_psd: scipy 1.18.1signal.welchw granicach 1e-12 względnie na przedział (najgorszy 6.0e-14); nagrania sigmf-python 1.13.0 zdekodowane bit w bit; metadane crate zgodne ze schematem SigMF v1.2.6. Synteza IQ i jej porównania modelowe pozostają poza nim. - Dopasowanie efemeryd nadawczych LEO i SISRE względem przedziału dopasowania (dane pomiarowe), zawężone do 16-parametrowego dopasowania keplerowskiego i jego SISRE wyłącznie orbitalnego: precyzyjne orbity TU Graz ITSG czterech satelitów względem statystyk Liu et al. 2025, składowe w granicach 1.5x (0,804 do 1,087) i SISRE w granicach 1.5x (0,716 do 0,809).
Ustalenia#
Wyrocznia nie zgodziła się z tymi wierszami, więc pozostają MODELLED. Każde ustalenie jest też zapisane w tekście wyroczni wiersza (a więc w docs/MODELLED-RATIONALE.md), z testem, który je przypina.
- Estymacja stanu zegara pokładowego: na zbiorze wyłączonym zegarów IGS 11 satelitów GPS Block IIF filtr trójstanowy jest spójny o jeden krok naprzód, ale zbyt pewny siebie przy jednej godzinie dla 9 z 11 (składniki okresowe i flicker nie są w modelu).
- Detekcja spoofingu: na JammerTest 2024 żaden monitor na poziomie obserwabli nie zaalarmował w ciągu 10 s od żadnego z 8 opublikowanych początków, a trzy okna przed początkiem zawierały fałszywe alarmy.
- Poziom ochrony czasu przy spoofingu: zmierzony niewykryty błąd czasu przekracza TPL przy 3 z 8 wykrytych początków (1.9x do 5.3x); kalibracja zegara 60 s nie obejmuje wędrowania TCXO odbiornika.
- Okno startowe i geometria wznoszenia: względem Orekit 12,2 geometria zgadza się do zaokrągleń, ale prędkość miejsca wynikająca z obrotu Ziemi nie mieści się w 1e-6 względnie przy szerokości 62,9 stopnia (1.12e-6, ruch bieguna pomijany przez model sferyczny). Runda 2: prędkość dla prawdziwego bieguna z epoką się zgadza, domyślna prędkość bez epoki nadal się nie mieści (zob. poniżej).
- Korytarz wejścia balistycznego (Allen–Eggers): przewidywane szczytowe opóźnienie dla wejścia Stardust wynosi 61,8 g wobec zrekonstruowanych 32,89 g (+88 %, tolerancja 15 %).
- Łączny błąd UT1 i ruchu bieguna: względem wzoru na dokładność wydrukowanego w 178 wydaniach IERS Bulletin A biegun zgadza się w granicach 1.5x, ale UT1 nie (0,48 przy 10 dniach, 1,59 przy 40 dniach). Zastąpione w rundzie 2: wiersz ma teraz status VALIDATED (zob. poniżej).
- Domyślne wejście orientacji Ziemi w trybie offline: astropy potwierdza spis wierszy, ale 12 wierszy, które crate nazywa predykcjami Bulletin A, jest oznaczonych jako zmierzone (I), a nie przewidywane (P). Liczby zgodności wiersza operacyjnego predyktora dotyczyły więc wierszy zmierzonych. Zastąpione w rundzie 2: silnik klasyfikuje wiersze według flagi, a wiersz ma status VALIDATED.
- Błąd predykcji orientacji Ziemi w stylu operacyjnym: błąd UT1 predyktora wynosi od 2.4x do 12.6x błędu Bulletin A przy 1 do 10 dniach i 5,32 ms przy 10 dniach, poza zakresem 0,36 do 3,13 ms w 2nd EOP PCC.
- Księżycowe geodezyjne VLBI: względem czasów światła ANISE przez DE440 żadne opóźnienie nie mieści się w 1 ps; największa różnica to 24 µs, głównie z powodu analitycznego środka Księżyca (około 200 km od DE440). Runda 2: ścieżka jąder ma status VALIDATED we własnym wierszu; ta ścieżka analityczna pozostaje MODELLED.
- Księżycowy eksport interoperacyjny: Orekit 12,2 odrzuca systemy czasu LTC i TCL, więc wymiana księżycowych plików OEM z drugim czytnikiem nie jest ustalona.
- Ruch względny Clohessy'ego–Wiltshire'a: względem nieliniowego ruchu w Orekit przy 100 m różnica wynosi od 1,2 do 6,3 mm, powyżej 1 mm; skaluje się jak pominięty człon drugiego rzędu, więc wstępnie zarejestrowana tolerancja leżała poniżej błędu linearyzacji. Zastąpione w rundzie 2: poprawka drugiego rzędu ma status VALIDATED względem tego samego progu.
- Wzrost błędu dryfu INS/TRN: względem swobodno-inercyjnego Monte Carlo NaveGo prawa wzrostu zgadzają się w granicach 5 % do 600 s i zawyżają poza nimi (2.2x do 8x po godzinie), ponieważ pomijają sprzężenie zwrotne Schulera. Zastąpione w rundzie 2: model błędu Schulera ma status VALIDATED.
- Księżycowa objętość usługi z rzeczywistej geometrii konstelacji: 4 z 12 opublikowanych statystyk dostępności różni się o więcej niż 2 punkty procentowe (do 22,5).
- Górne ograniczenie obciążenia identyfikowalności heterogenicznego UTC(k): na 105 024 wierszach BIPM ograniczenie jest przekroczone w 50,8 % wierszy; opublikowana niepewność ogranicza pomiar przesunięcia przez BIPM, a nie samo przesunięcie.
- Klasyfikacja przestrzeni zerowej księżycowego datum: na opublikowanej geometrii pięciu reflektorów korelacja wynosi -0.78 wobec -0.97, a CRLB początku układu jest o 96 do 98 % niższe niż w artykule.
- Podłoże geometrii datum księżycowego LLR: względem 192 normalnych punktów księżycowych ILRS z 2024 RMS reszty jednokierunkowej wynosiło 96 m przy wcześniejszej interpolacji orientacji, a po poprawce poniżej wynosi 22,7 m, nadal powyżej progu 10 m (zaokrąglone współrzędne stacji, brak ruchu bieguna). Szereg orientacji po cichu przycina wartości poza 2024-2025. Runda 2: model zmierzonej odległości ma status VALIDATED we własnym wierszu (2,81 m); szereg obejmuje teraz 2014-2030 i zgłasza błąd poza nim.
- Sprzężenie względnościowego tempa zegara z układem odniesienia: człon potencjału własnego jest 3.18e-4 powyżej wartości opublikowanej (tolerancja 1e-4); artykuł oblicza inny potencjał, więc nie istnieje opublikowana wartość tej postaci zamkniętej. Zastąpione w rundzie 2: równikowy potencjał stopnia 2 ma status VALIDATED względem tego samego artykułu.
- Stałe fizyczne każdego ciała Układu Słonecznego: 12 z 84 stałych dodanych ciał różni się od NAIF pck00011 i gm_de440 (starsze elementy księżyców Marsa; inne rozwiązania GM dla Urana, Neptuna i Plutona). Runda 2: stałe podążają teraz za NAIF (transkrypcja, nieliczona), a obliczona orientacja zgadza się z SPICE; wiersz pozostaje MODELLED.
- Wybieralne modele efemeryd LEO: dopasowanie 22-parametrowe pozostawia 1.71x i 1.86x opublikowanego błędu wzdłuż toru na łukach 20 min, powyżej 1.5x. Zastąpione w rundzie 2: model 22-parametrowy i jego dopasowanie mają status VALIDATED we własnym wierszu.
- Łączne pozycjonowanie GNSS i LEO: błąd międzysystemowy zgadza się z RTKLIB, ale 93,2 % epok mieści się w 3 m od ITRF2020 wobec 95 %; sam RTKLIB osiąga na tych danych 88,2 % (93,6 % po poprawce opóźnienia grupowego z rundy 2).
- Ślepota integralności w trybie wspólnym i mapy pokrycia i DOP: oba porównania przeszły, ale odrzucono je w przeglądzie, ponieważ celowo błędny silnik też je przechodzi (pierwsze sprawdza tylko tożsamość wewnętrzną; opublikowane dolne granice drugiego nie widzą podwojonego PDOP). Runda 2: ślepota integralności w trybie wspólnym ma status VALIDATED na danych wejściowych z parzystością; mapy pokrycia pozostają ustaleniem (zob. poniżej).
Runda walidacji 2#
Druga runda objęła każdy wiersz, który pierwsza runda pozostawiła możliwym do skierowania, ze świeżymi wstępnymi rejestracjami zatwierdzonymi przed pobraniem jakiegokolwiek pliku wzorcowego lub uruchomieniem wyroczni, z adwersaryjnym drugim recenzentem, który powtórzył każde porównanie, i celową mutacją silnika, która musi zmienić każdy test na czerwony. Właściciel zaakceptował poprawione sformułowanie wiersza ograniczenia poza Omega w dniu 2026-10-02, zanim go podniesiono (jego stary tekst przeczył kodowi).
Podniesione do VALIDATED (17). Rodzaj wyroczni w nawiasach; tolerancja ustalona przed przebiegiem.
- Sprzężenie względnościowego tempa zegara z układem odniesienia (odniesienie): Ashby i Patla 2024 L_m w granicach 2.8e-6 (próg 1e-4) z równikowego potencjału stopnia 2 obu pól cytowanych przez artykuł; grawitacja pyshtools stopnia 350 dla wejścia radialnego (8.3e-5); prędkość księżycowa DE441 (2.5e-3).
- Domyślne wejście orientacji Ziemi w trybie offline (biblioteka): astropy 8.0.1 i IERS Bulletin A nr 039 potwierdzają 30 wierszy ostatecznych, 54 szybkich i 90 przewidywanych ponownie wyciętego wyciągu.
- Łączny błąd UT1 i ruchu bieguna (biblioteka): pełne rotacje astropy i pyerfa odtwarzają tablicę łączną (UT1 i biegun w granicach 6e-16, kombinacja w granicach 1.9e-7); zrealizowane błędy z IERS Annual Report 2019 dają ilorazy od 1,001 do 1,100.
- Ślad i pokrycie ładunku obserwacji Ziemi (biblioteka): Orekit 12,2 i GeographicLib 2,1 przy każdym wstępnie zarejestrowanym progu, z regresją węzłów J2 uwzględnioną teraz w rozstawie węzłów.
- Ruch względny Clohessy'ego–Wiltshire'a (biblioteka): z poprawką drugiego rzędu w postaci zamkniętej, w granicach 1.2e-7 m od nieliniowego ruchu w Orekit wobec 1e-3 m; sama macierz liniowa pozostaje scharakteryzowana (od 1,2 do 6,3 mm).
- Celowanie w płaszczyźnie B i asysta grawitacyjna metodą stożków sprzężonych (biblioteka): GMAT R2026a płaszczyzna B, asymptoty, C3 i elementy heliocentryczne; sbpy 0.6.0 oraz Kasuga i Jewitt 2019 dla parametru Tisseranda.
- Wzrost błędu dryfu INS/TRN (biblioteka): dziewięciostanowy model błędu Schulera w granicach 5 % od poprawionych przebiegów dryfu NaveGo we wszystkich 48 punktach (najgorszy 3,70 %).
- Ślepota integralności w trybie wspólnym (P2): numpy
lstsqna 1464 danych wejściowych z parzystością w granicach 1e-12 (najgorszy 1.06e-14). - Księżycowe łączne wielotechnikowe OD i zegar (P2): numpy przelicza każdy krok Gaussa-Newtona, sigmę i błąd stacji w sześciu sieciach (w granicach 2.4e-11) po poprawce rozwiązania QR.
- Kowariancja współrzędnych stacji księżycowego VLBI (biblioteka): jakobian zbudowany w SPICE odtwarza harmonogram, widmo, sigmy i przestrzeń zerową w granicach 1 % i 0,1 stopnia; numpy do 2e-13.
- Górne ograniczenie niewykrywalnego błędu w trybie wspólnym dla reszty poza Omega (P2, sformułowanie poprawione decyzją właściciela): numpy LAPACK na 256 przypadkach w granicach 1e-12, sześć dokładnych nieskończoności.
- Klasyfikacja przestrzeni zerowej niezmiennicza względem bazy (P2): przecięcie podprzestrzeni w SciPy i NumPy na 72 skonstruowanych macierzach, liczby całkowite dokładnie, norma rzutnika w granicach 6.0e-15.
- Jednoczęstotliwościowe usługi jonosferyczne i UTC komunikatu nawigacyjnego LEO (biblioteka): GNSSTk 15.3.1 dla Klobuchara, Az i dryfu UTC; ERFA dla trzech przypadków sekundy przestępnej.
- Granica pozycjonowania w sieci nieziemskiej 5G (P1): granice pojedynczego SSB Bachl, Lei i Nabeel 2026 w granicach połowy drukowanej cyfry; numpy dla kowariancji rozwiązań.
- Model zmierzonej odległości LLR (dane pomiarowe, nowy wiersz wydzielony z podłoża datum LLR): 192 normalnych punktów księżycowych ILRS przy 2,81 m RMS wobec progu 10 m, z barycentrycznym czasem światła IERS 2010; składowe poniżej progu nie są rozdzielane jedna po drugiej, i wiersz to mówi.
- Księżycowe geodezyjne VLBI, ścieżka jąder (biblioteka, nowy wiersz wydzielony z wiersza księżycowego VLBI): zbieżne czasy światła SPICE w granicach 1 ps i pochodne cząstkowe w granicach 1e-6 w epokach bliskich J2000; domyślna ścieżka analityczna pozostaje MODELLED.
- 22-parametrowy model efemeryd LEO Liu et al. 2025 i jego dopasowanie (dane pomiarowe, nowy wiersz wydzielony z wiersza modeli wybieralnych): rzeczywiste precyzyjne orbity w granicach 1.5x opublikowanych statystyk w dniach z artykułu i dniach wyłączonych (0,683 do 1,186); konwencja skali n_dot jest przepisana i nie jest sprawdzana tym porównaniem, a reguła zatrzymania to reguła zbieżności parametrów Kshana, a nie reguła zmiany RMS z artykułu. Wielomian ATOMIC i tabela pięciu wysokości pozostają MODELLED.
Istniejące wiersze VALIDATED ponownie oparte na wzorcu (bez zmiany liczby).
- Pozycje planet z elementów JPL Standish i czas światła między ciałami Układu Słonecznego: post factum ustalone progi dwukrotnie nominalne zastąpiono wstępnie zarejestrowanymi porównaniami z JPL Horizons DE441 (RMS co najwyżej wartość z Explanatory Supplement, tabela 8.10.1, najgorszy 0,778, wraz z podziałem Ziemi i rotacją ICRF; czasy światła w granicach 1e-6 s od Horizons na pozycjach DE441, najgorszy 6.7e-9 s). Ich flagi „limit ustalony po porównaniu” usunięto.
- Integralność (RAIM/ARAIM/SBAS): wiersz nie opiera się już na kontrolach wiarygodności. Mówi teraz: rozdzielenie rozwiązań dla wielu hipotez ARAIM z ADD v4.2 zgadza się ze Stanford MAAST dla ARAIM 2 na 270 rzeczywistych przypadkach (najgorsza różnica VPL 2.2e-3 m wobec 0,05 m); detekcja i wykluczanie w migawkowym RAIM zgadzają się z RTKLIB
raim_fdew 2016 z 2016 decyzji, z poziomem ochrony nachylenia w granicach 2.7e-12 m; poziomy ochrony SBAS DO-229E L1 zgadzają się ze Stanford MAAST na rzeczywistych transmisjach WAAS (2868 par w granicach 1.6e-5 m). Mówi wprost, że funkcje o jednolitej sigmieraim::araim_raimiraim::araim_dual_raimNIE są zgodne z ADD (różnice przy dopasowanych danych wejściowych 0.75/4.04 m i 0.39/1.93 m VPL/HPL, ustalenie), że porównanie DFMC L5 SBAS jest ustaleniem (308 par bez GEO w widoku jest chronionych przez Kshana, a nie przez MAAST) oraz żeraim::solution_separation_raimnie ma porównania zewnętrznego. Jego samooznaczenie usunięto. - Dopasowanie efemeryd nadawczych LEO: scałkowana orbita prawdziwa została dodana do części sprawdzonej względem niezależnego wzorca (Orekit 12,2 w granicach 4,55 mm w ciągu 6 h, próg 2 cm); wielomiany korekcyjne, dopasowanie zegara i kompromis okresu aktualizacji pozostają obliczone z modelu.
Ustalenia i zablokowane wiersze (pozostają MODELLED). Tekst wyroczni każdego wiersza zawiera ustalenie i jego przypięty test.
- Modulacja sygnałów nawigacyjnych (Betz 2001, Hein 2006): widma i korelacje się zgadzają; boczne listki 24 MHz i każde obciążenie wielodrogowości (o 11 do 15 % za niskie) nie, przyczyna nierozstrzygnięta.
- Geolokalizacja TDOA/FDOA: granice zgadzają się z Ho i Chan oraz Ho i Xu, a także z kodem autorów w granicach 3e-12; czynniki z Ottawy wydrukowane z Monte Carlo różnią się o 1,3 % i 4,4 %.
- GNSS Ziemi w odległości księżycowej: średnie zenitalne GENESIS zgadzają się z Montenbruck et al. 2023 w 5 z 6; średnie nadirowe są o 1,0 do 2,4 satelity za wysokie.
- Mapy pokrycia i DOP: projekty ziemskie zgadzają się z Orekit, gnss_lib_py i numpy przy każdym progu; projekty księżycowe i marsjańskie przekraczają 1e-9 tylko w komórkach bliskich osobliwości.
- Łączne pozycjonowanie GNSS: dwuczęstotliwościowe 79,9 % i produkty precyzyjne 94,2 % w granicach 3 m wobec 95 % (RTKLIB 67,9 % i 94,1 %); różnica ISB dla produktów precyzyjnych wynika z ignorowania przez RTKLIB przesunięć anten.
- Pętle śledzenia (GNSS-SDR 0.0.19): zgadzają się przy 35 do 45 dB-Hz; przy 30 dB-Hz PLL +21 %, DLL -32 %, progi +1,5 dB; czasy poślizgu krótsze o 0,5 do 2 rzędów wielkości.
- Księżycowa objętość usługi (Orekit i Hipparchus): 155 z 160 wartości się zgadza; wymaganie najgorszej próbki zawodzi na geometrii LNCSS B bliskiej osobliwości.
- Kwantowy czujnik inercyjny: próg tylko QPN jest o 21 do 31 % poniżej zmierzonego szumu Gauguet 2009 (próg 30 %, chybiony o 0,5 punktu).
- Predefiniowane oscylatory: zmierzone egzemplarze przekraczają predefiniowane wartości holdover rubidu, krótkookresowe cezu i najgorszego egzemplarza CSAC; predefiniowany OCXO nie ma zmierzonego zapisu.
- Gęstość pogody kosmicznej: Jacchia 1971 mieści się w czynniku 2 względem gęstości z akcelerometrów w maksimum słonecznym, ale jest około 1.7x za gęsta w minimum 2008.
- Ukośne TEC wolne od geometrii: 33 z 36 łuków w granicach 3 TECU od mapy CODE (najgorszy 6,84).
- Detekcja spoofingu i TPL względem oficjalnego logu JammerTest 2024: 4 z 10 początków wykryto na czas; TPL jest przekroczony w 4 z 10.
- Filtr zegara na świeżych zegarach IGS: dwa z 11 satelitów nie spełniają kryterium sumy innowacji.
- Predyktor EOP metodą najmniejszych kwadratów z autoregresją: UT1 1,73 do 2.11x Bulletin A przy 2 do 10 dniach.
- Górne ograniczenie zrealizowanego przesunięcia UTC(k): łączne przekroczenie 0,0333 wobec 1e-2.
- Księżycowe datum układu odniesienia z kampanii: ramię SPICE się zgadza; ramię P2 z estymowanymi stacjami nie mieści się w 1e-9 na zadaniu o uwarunkowaniu 2.1e8.
- Księżycowe datum układu odniesienia z rzeczywistego LLR: 15 z 16 wielkości zgadza się z SPICE; sigma translacji z jest o 1,03 % za wysoka wobec 1 %.
- Wejście w atmosferę (Allen-Eggers): rozwiązanie masy punktowej zgadza się z rekonstrukcjami agencji (tylko kontrola krzyżowa); porównanie z akcelerometrem jest zablokowane w oczekiwaniu na czytelne źródło Hayabusa2.
- Maski ITU-T: wydrukowane wartości przykładowe się zgadzają; limity klas G.8273.2 ich nie mają (zablokowane).
- Geometria okna startowego: prędkość miejsca dla prawdziwego bieguna z epoką zgadza się z Orekit (4.9e-8); domyślna prędkość bez epoki nadal się nie mieści (1.12e-6). Nie podniesiono; dalsze prace w toku.
- Stałe fizyczne każdego ciała: teraz 0 z 84 różni się od NAIF (transkrypcja), a obliczona orientacja zgadza się z SPICE w granicach 1.4e-10 rad. Nie podniesiono; dalsze prace w toku.
- Zablokowane decyzją właściciela dotyczącą zakresu, każde z zatwierdzonym zgodnym porównaniem: obserwowalność bezwzględna stacji księżycowych, DOP latarni powierzchniowych, eksport poza osią celowania, moc detekcji międzymodalnej, statystyka spójności trybu wspólnego i pokrycie polarnych LEO.
- Zablokowane brakiem danych: budżetowanie błędu transferu czasu (wymaga redukcji rzeczywistych danych), C/N0 JammerTest (położenie anteny i podział mocy nieudokumentowane).
Korekty (opublikowane liczby, które się zmieniły, stare -> nowe).
- Poziomy ochrony
snapshot_raimleżą teraz na geodezyjnym poziomie lokalnym zamiast radialnego: do 0,31 m HPL i 0,14 m VPL w ABMF (16 stopni N); żaden wzorzec złoty się nie zmienił, ale zapisane podsumowanie samouczkagnss-simzmienia się ze średniego HPL 22,1 m / VPL 40,0 m na 22,2 m / 39,9 m (docs/tutorials/scenarios/gnss-sim.toml). - Domyślne sprzężenia układu tempa księżycowego: d_alpha/d_scale 3.139807e-11 -> 3.138801e-11; d_alpha/d_radial 1.807187e-17 -> 1.806185e-17 na metr.
- Domyślny przebieg EOP w trybie offline (
realtime-frame-eop, komórki wymienione wdocs/revisions/M035-default-eop-recut-cell-changes.md): predicted_rows 12 -> 90; próg bieguna 0,06776 -> 0,05550 mas; eop_term_m 14,01601 -> 14,01583; total_m 20,09759 -> 20,09746; total_time_ns 67,03834 -> 67,03790; wiersze tabeli 2 wtests/golden/realtime-frame-eop.csv; zgodność predyktora operacyjnego 0.256/0.695/1.252/3.885 ms -> 0.133/0.421/0.839/2.786 ms. docs/LEO-NAVMSG.mdliu22 SISRE orbita/z zegarem: 60 s 0.011/0.046 -> 0.014/0.046 cm; 300 s 0.068/0.139 -> 0.074/0.142 cm; 600 s 0.269/0.299 -> 0.258/0.290 cm.- Tabela wysokości Liu, Kshana (iloraz): GRACE-A 5,40 (0,61) -> 4,25 (0,48); GRACE-C 4,12 (0,66) -> 2,87 (0,46); Sentinel-2A 2,95 (1,03) -> 2,20 (0,77); HY-2A 2,38 (1,13) -> 1,25 (0,59); Sentinel-6A 0,70 (0,94) -> 0,51 (0,67).
- Skala
nDotkomunikatu nawigacyjnego LEO 2^-60 -> 2^-58 (niezarejestrowana wstępnie, ujawniona; poza porównaniem dopasowania); CRC ramki próbki liu22 0x62373A -> 0xDED99C. - Tabela weryfikacji
docs/LEO-NAVMSG.md: wiersz Liu i ATOMIC podzielono na 22-parametrowy wiersz VALIDATED oraz wiersz ATOMIC i pięciu wysokości MODELLED. - Tekst wiersza orientacji osi głównych Księżyca z DE440: zakres 2024-2025 / 731 wierszy -> 2014-2030 / 6 209 wierszy; „po cichu przycina” -> błąd poza zakresem.
- Scenariusz
eo-coverage: equatorial_ground_track_spacing_km 2756,37 -> 2752,17 km; nowe pola inclination_deg (98,19) i nodal_period_min (98,893). constellation-multi-gnss-coverage(zegar odniesienia TDOP/GDOP to teraz konstelacja o najniższym numerze w widoku): globalne GDOP maks. 2,2236 -> 2,1205, średnia 1,122 -> 1,131, mediana 1,115 -> 1,125, p90 1,255 -> 1,265, p95 1,305 -> 1,315, p99 1,41 -> 1,42 oraz mapa GDOP dla każdej komórki; mean_visible_by_constellation sumowane jako liczby całkowite (około 1e-12 względnie, niewidoczne przy 4 miejscach dziesiętnych).- Łączne rozwiązanie jednoczęstotliwościowe GNSS po poprawce opóźnienia grupowego transmisji: 93,2 % -> 93,6 % w granicach 3 m; mediana ISB -0.351 -> -0.114 ns.
tracking-loopjitter_table log10_mean_time_to_cycle_slip_s (SNR pętli Costasa rho/4): przy progu 25,47 dB-Hz 11,58 -> 2,10; przy 25 dB-Hz 9,55 -> 1,60; przy 22 dB-Hz 2,24 -> -0.14.ins-trn-coast: każde wyjście zmienia się wraz z modelem błędu Schulera; szczyt TRN dostarczonego scenariusza 52,932679 -> 44,711834 m (tests/conflict_resilience_architecture_guard.rs).- Raport
lunar-vlbi: nowy klucz geometry_path („analytic” w przebiegu domyślnym, żadna wartość liczbowa się nie zmieniła); nowe opcjonalne pola planetary_kernel_path, earth_orientation_kernel_path i moon_orientation_kernel_path, z epoch_partials na ścieżce jąder; opis rodzaju przepisano. Wyrocznią wiersza weryfikacji dla ścieżki jąder jest SPICE (0,06 ps); ANISE (0,12 ps) staje się kontrolą krzyżową oceny jąder. - Stałe ciał: Phobos GM 7.087e5 -> 7.087546066894452e5; Deimos 9.62e4 -> 9.615569648120313e4; Uran 5.7939506103e15 -> 5.793951256527211e15; Neptun 6.83509997e15 -> 6.835103145462294e15; Pluton 8.69326e11 -> 8.696138177608748e11 (m^3/s^2); promień równikowy Phobosa 13,1 -> 13,0 km; biegun i południk zerowy Phobosa i Deimosa z pck00011; prime_meridian_deg Układu Słonecznego zawiera teraz człony kwadratowe i okresowe.
europa-surface-pnt(body-pntna Europie), z pełnej orientacji Europy pck00011 (7cfd66b4; orientacja zgadza się z SPICE pxform w granicach 1.4e-10 rad), co przesuwa lądownik w przestrzeni inercjalnej: dostępność tylko przekaźniki / z odległością od Ziemi 0,485 / 0,725 -> 0,480 / 0,719 (83 -> 82 z 171 epok tylko przekaźniki), mediana PDOP 5,266 -> 5,360, RMS błędu rozwiązania 129,516 / 100,983 m -> 112,742 / 86,147 m, mediana sigmy formalnej 5,266 / 4,272 m -> 5,360 / 4,239 m. Tabela wdocs/SOLAR-SYSTEM.mdi przypięcie wmcp/kshana-mcp/tests/round_trip.rspodążają za tym;mars-orbit-pntpozostaje bez zmian.space-weather(f107 180, f107a 165, kp 4), skalibrowany czynnik zastąpiony przez Jacchia 1971: activity_density_kg_m3 przy 300/400/500/600/800 km 2.602e-11 -> 3.608e-11, 4.176e-12 -> 6.929e-12, 8.136e-13 -> 1.618e-12, 1.769e-13 -> 4.189e-13, 1.544e-14 -> 3.781e-14; activity_factor 1.076/1.121/1.168/1.216/1.320 -> 1.492/1.860/2.322/2.881/3.232; reference_exospheric_temperature_k usunięto, dodano mean_exospheric_temperature_k (1186,7 K);tests/space_weather_reference.rs: wahanie cyklu słonecznego przy 800 km wynosi teraz 10.4x (NRLMSISE-00 13.6x), a asercja wysokości podąża za wzrostem NRLMSISE do 500 km i spadkiem przy 800 km.ntn-5g-positioningtoa_median_sigma_3d_m: NR 5 MHz 2,0903959 -> 2,0903962 m; NB 200 kHz 25,938613 -> 25,938839 m (tekst podsumowania bez zmian: 2,09 / 25,94 m).lunar-joint-od-clock(rozwiązanie QR): with_vlbi.station_pos_err_m 3,541344 -> 3,541350 m; without_vlbi.station_pos_err_m 2183,119 -> 2183,558 m.docs/field-units-schema.jsonwygenerowano ponownie dla nowych i usuniętych pól powyżej.
Pakiety walidacji#
D12, rozszerzona precyzja i solwer pierwiastkowy (dwa nowe wiersze VALIDATED: 226 -> 228 wierszy, 110 -> 112 sprawdzonych względem niezależnego wzorca).
Część 1, wyrocznia o rozszerzonej precyzji:
- Księżycowe datum układu odniesienia z estymowanymi stacjami: 50-cyfrowa wyrocznia mpmath o rozszerzonej precyzji (wstępnie zarejestrowana 804662d5, progi skalowane uwarunkowaniem z wzoru a priori na błąd wsteczny) zgadza się na nowej dacie kampanii (2026-03-18) i na pierwotnym scenariuszu 2024-01-01; nowy wiersz VALIDATED w P2. Rozstrzyga wcześniejszy spór o podwójną precyzję: sigmy datum silnika odbiegają do 9.7e-6, drogi odwrotności i wartości własnych w NumPy do 6.2e-6, a jego drogi Cholesky'ego i QR o około 1e-8. Silnik mieści się w swoim ograniczeniu błędu, ale jest około tysiąc razy mniej dokładny niż droga faktoryzacji.
- Środowisko wyroczni: dodano mpmath 1.3.0.
- Korekty: brak. Żaden plik wzorcowy ani opublikowany rysunek się nie zmienia; wiersz „Księżycowe datum układu odniesienia z kampanii obserwacyjnej” pozostaje MODELLED (decyzja założyciela 2026-10-02, opcja A: nie pożycza statusu osobnego wiersza); jego tekst testów przywołuje nowy test i jego ustalenie.
Część 2, solwer datum w postaci pierwiastkowej informacji:
- Nowy opcjonalny solwer pierwiastkowej informacji (
linalg_sr;solver = "srif"w scenariuszu lunar-frame-campaign): QR Householdera, marginalizacja przez czynnik trójkątny, SVD Jacobiego dla widma i produkty kompensowane wyłącznie z poprawnie zaokrąglonych operacji. Względem 50-cyfrowej wyroczni (wstępnie zarejestrowana b41908c9) jego sigmy datum zgadzają się w granicach 3e-13 na nowej dacie (2026-06-09); na danych wejściowych z 2026-03-18 i 2024-01-01 solwer domyślny odbiega do 1e-5. Nowy wiersz VALIDATED w P2. Solwer domyślny i jego wyjście pozostają bez zmian. Wstępnie zarejestrowane progi poświadczają błędy tylko powyżej około 2e-7 względnie: odrzucają solwer domyślny, ale nie odwrócony znak Householdera, nieskompensowany iloczyn skalarny ani widmową odwrotność końcową, i wiersz to mówi. - Opcjonalne ścieżki pierwiastkowe obok niezmienionych wartości domyślnych:
fim::crlb_srif,batch_ls::gauss_newton_srif,orbit_determination::determine_orbit_batch_srif,lunar_combination::formal_covariance_srif,precise_od::fit_srificislunar_srif::srif_cross_validation_sqrt, na nowychlinalg_sr::weighted_lstsqicovariance_from_sqrt_information. Każda zgadza się ze swoją wartością domyślną tam, gdzie obie są dokładne (kontrola wewnętrzna, bez wiersza; nie twierdzi się dla nich żadnej walidacji).precise_od::fitdeleguje teraz do wspólnej procedury; jego wyjście i domyślne wyjście każdego scenariusza pozostają bez zmian. - Decyzje o rzędzie kampanii układu księżycowego: wstępnie zarejestrowana kontrola o rozszerzonej precyzji na 40 dniach potwierdza każdą rozstrzygalną decyzję bloku stacji i pełnego rzędu Helmerta. Ograniczenie a priori nie może poświadczyć 20 dni Helmerta z deficytem rzędu; w arytmetyce dokładnej ich defekt jest geometryczny, a próg 1e-9 leży wewnątrz naturalnego zakresu ilorazów wartości własnych kampanii. Bez wiersza.
- Twierdzenie wiersza kampanii o rozszerzonej precyzji zawężono do „w granicach ograniczenia najgorszego przypadku”, a jego kontrola najsłabszego kierunku przy ustalonych stacjach mierzy teraz rzeczywisty kąt (6.6e-16 rad; komparator zmieniono z acos na cięciwę, próg nie).
- Korekty: brak. Żaden plik wzorcowy ani opublikowany rysunek się nie zmienia; wiersz „Księżycowe datum układu odniesienia z kampanii obserwacyjnej” pozostaje bez zmian i nadal MODELLED (decyzja założyciela 2026-10-02, opcja A).
D4, szkielet efemeryd jąder JPL, faza 1 (cztery nowe wiersze VALIDATED: 228 -> 232 wierszy, 112 -> 116 sprawdzonych względem niezależnego wzorca).
- Czytnik jąder NAIF ma własny wiersz.
naif_kernel(kontener DAF, SPK typu 2, binarny PCK typu 2) zgadza się z SPICE Toolkit (CSPICE N0067 przez spiceypy 8.2.0) i z ANISE 0.10.6 na wszystkich 600 stanach DE440 i 200 rotacjach orientacji księżycowej losowej siatki wylosowanej ze skrótu własnego zatwierdzenia wstępnej rejestracji (abcd9133), w granicach progów wyprowadzonych wcześniej z oceny Czebyszewa w podwójnej precyzji (najgorszy 0,6 % progu, 1.95e-3 m). Wiersz twierdzi, że silnik czyta jądra JPL poprawnie, a nie że DE440 lub szereg analityczny jest dokładny (tests/naif_reader_spice_oracle.rs). ephem_provider::KernelEphemeris: pozycje DE440 (lub dowolnego SPK typu 2) przez własny czytnik silnika, z dwuczęściowymi epokami TDB i SHA-256 jądra zachowanym do raportów; nigdy nie podstawia barycentrum układu za planetę.LunisolarSourcepozwala ścieżce geometrii wybrać szereg analityczny (domyślnie) lub jądro.- Opcjonalny Księżyc z jądra dla
lunar-llr-datumilunar-vlbi-fim: kluczplanetary_kernel_pathczyta geocentryczny środek Księżyca z jądra; nic innego się nie zmienia, a raport zyskuje blokmoon_ephemerisnazywający jądro i jego SHA-256. Bez klucza oba raporty są bajt w bajt identyczne jak wcześniej. - Kowariancja punktu na powierzchni Księżyca na ścieżce jąder (nowy wiersz VALIDATED): przy wszystkich stacjach ustalonych i latarni na Księżycu DE440 kowariancja latarni zgadza się z jakobianem czasu światła SPICE (najgorszy 1.7e-3 wobec progu 1 %) i odwrotnością w NumPy (4e-14 wobec 1e-9), wstępnie zarejestrowana 4a51256 (
tests/lunar_vlbi_surface_point_spice_oracle.rs). Wiersz ścieżki analitycznej pozostaje MODELLED: na analitycznym Księżycu jej najmniejsza sigma latarni jest o 3,9 % poniżej wyroczni. - Księżycowe datum układu odniesienia z rzeczywistej kampanii, środek Księżyca z jądra (nowy wiersz VALIDATED): na 447 niewidzianych normalnych punktach z 2019-Q2, wstępnie zarejestrowanych 830d945a przed pobraniem któregokolwiek, kowariancja datum na ścieżce jąder zgadza się z niezmienioną wyrocznią SPICE i NumPy w granicach 7.6e-5 wobec progów 1 % i 2 % (
tests/validate_llr_datum_kernel_moon_fresh.rs). Założyciel zdecydował, że ten wiersz jest podnoszony tylko na świeżych punktach; diagnostyka na widzianych danych (c51f8b2) jest ustaleniem, a nie dowodem. Próg nie rozróżnia modeli Księżyca: analityczny Księżyc też przechodzi na tym samym wycinku (najgorszy 3.8e-3), planowana mutacja (Księżyc z jądra spóźniony o godzinę) nie została wykryta, a przy zgięciu środek Księżyca błędny o około 4 650 km (Księżyc wzięty wokół barycentrum Ziemia-Księżyc) również przeszedł. Wiersz twierdzi kowariancję na tej ścieżce, a nie środek Księżyca, i to mówi. - Pozycje Słońca, Księżyca, Merkurego i Wenus z DE440 w epokach UTC (nowy wiersz VALIDATED):
KernelEphemeris::relative_position_utczgadza się ze Skyfield 1,54 na 600 pozycjach między 1973 a 2026, najgorszy 2,96 m, w granicach wstępnie zarejestrowanego progu (0bfafe6d) wyznaczonego dwuczłonowym szeregiem TDB − TT (tests/kernel_ephemeris_skyfield_oracle.rs). Pozycje planet otrzymują teraz ten nowy wiersz jąder; wiersz Standisha i wiersz księżyców planet pozostają bez zmian, a księżyce czekają na scenariusz, który ich potrzebuje (decyzja założyciela). - Ustalenia: jedyne chybienie porównania datum LLR (sigma translacji z 1,025 % wobec 1 %) spada do 0,049 %, gdy z DE440 czyta się tylko środek Księżyca, na widzianych danych (
tests/validate_llr_datum_kernel_moon.rs); na świeżym wycinku 2019 analityczny Księżyc także przechodzi, więc chybienie z 2015 było marginalne względem geometrii tamtego kwartału. Wiersze analityczne „Księżycowe datum układu odniesienia z RZECZYWISTEJ kampanii obserwacyjnej” i „Kowariancja współrzędnych punktu na powierzchni Księżyca … utrzymywana osobno od kowariancji stacji ziemskiej” pozostają MODELLED; ich teksty wyroczni wskazują teraz wiersze ścieżki jąder. lunar_ephemerisnie mówi już, że silnik nie ma czytnika jąder binarnych; wskazuje wiersz czytnika i wyjaśnia, dlaczego jądra statków kosmicznych (typy 13 i 21) nadal pochodzą z Horizons.- Korekty: brak. Żaden plik wzorcowy, opublikowany rysunek ani istniejąca wartość testowa się nie zmienia; analityczne raporty
lunar-llr-datum,lunar-vlbi-fimilunar-vlbi-fimze wszystkimi stacjami ustalonymi są bajt w bajt identyczne jak wcześniej (prefiksy SHA-256 wyniku 9927aac2, cf1d2671, 25c357e4).
D9, zmierzona biblioteka zegarów „Clock Atlas” (trzy nowe wiersze, jeden VALIDATED: 232 -> 235 wierszy, 116 -> 117 sprawdzonych względem niezależnego wzorca).
- Zmierzona biblioteka zegarów (
clock_library). Karty urządzeń (szum fazy biały, modulacja częstotliwości biała, flicker i błądzenie losowe, liniowy dryf częstotliwości oraz opcjonalnie człony fazy od jednego do czterech na obrót) dopasowane do nazwanego zmierzonego zapisu zegara i oceniane na danych wyłączonych; wariancje Allana i Hadamarda uwzględniające luki; detektor kondycjonowania, który zapisuje każdą lukę, odstającą fazę, skok fazy, wybuch i skok częstotliwości i nic nie wie o granicach plików ani dni; przeliczenie karty na model szumu taktowania szczeliny, rozszerzony model zegara Kalmana i poziomy szumu monitora spoofingu. Czytniki plików zegarów RINEX i IGS, plików BIPM dla poszczególnych laboratoriów oraz Circular T sekcja 1 (realdata::clk); łączone, hierarchiczne ograniczenie starzenia dla UTC(k) (utck_bound, jeszcze nieocenione). - Identyfikacja szumu z autokorelacji opóźnienia 1 (
allan::lag1_noise_id, Riley i Greenhall 2004), nowy wiersz VALIDATED (biblioteka): zgadza się z allantools 2024,6autocorr_noise_idna 140 przypadkach, liczby całkowite identyczne, najgorsza różnica 9.6e-13 wobec progu 1e-9 (wstępnie zarejestrowana 2ec76864;tests/clock_library_lag1_noise_id_allantools.rs). - Zmierzone karty urządzeń z predykcją na danych wyłączonych, nowy wiersz MODELLED (ustalenie): dopasowanie na jednej trzeciej, predykcja odchylenia Allana pozostałych dwóch trzecich w granicach czynnika 1,5 (wstępnie zarejestrowana 2ec76864). GPS Block IIF na świeżym oknie IGS (od 2026-03-01 do 14): 10 z 11; G27 jest optymistyczny w skali dwóch godzin (najgorszy czynnik 1,510). Cez (w granicach, 1,070), OCXO (poza, 2,348) i stront (w granicach) są raportowane, a nie ślepe. Karta odbiornika JammerTest oraz karty masera Galileo i Deep Space Atomic Clock są zablokowane. Klasa modelu TCXO odbiornika ZED-F9P na 12 statycznych stacjach Wrocławia (Zenodo 6488497) zawodzi: 1 z 11 ślepych stacji w ujawnionym poprawionym ponownym przebiegu (
tests/clock_library_device_cards_oracle.rs,tests/clock_library_f9p_cards_oracle.rs). - Karty GPS Block IIF z członami na obrót, nowy wiersz MODELLED (ustalenie): na drugim świeżym oknie (od 2026-04-01 do 14) 9 z 11 w granicach progu; G03 (1,947) i G25 (1,581) są optymistyczne, ponieważ ich zapisy wyłączone są bardziej zaszumione niż ich trzecie dopasowania; pominięcie członów okresowych zawodzi dla wszystkich 11 (wstępnie zarejestrowana fb475550;
tests/clock_library_periodic_cards_oracle.rs). - M002, estymacja stanu zegara pokładowego, runda 3 (ustalenie, pozostaje MODELLED): po zamrożonym detektorze kondycjonowania rozszerzony filtr z rundy 2, z niezmienionym strojeniem i kryteriami, spełnia (a) i (c) dla wszystkich 11 satelitów po raz pierwszy; (b) zawodzi dla G09 (0,894) i G26 (0,876) (wstępnie zarejestrowana fb475550;
tests/clock_state_ext_igs_conditioned_oracle.rs). - M010, detekcja spoofingu, rundy 3 do 4b (pozostaje MODELLED): runda 3 zablokowana (167 epok treningowych z innych sesji urządzenia JammerTest wobec 3600); z kartą klasy modelu ZED-F9P (rundy 4 i 4b) monitor zegara zgłasza zero fałszywych alarmów przed początkiem przy wszystkich 10 zarejestrowanych początkach (runda 2: 86), a 6 z 10 początków jest wykrywanych w ciągu 10 s (runda 2: 4); te same cztery pozostają spóźnione (
tests/clock_library_tcxo_card_jammertest_oracle.rs). - M083, górne ograniczenie UTC(k), runda 3: wstępnie zarejestrowane prospektywnie (fb475550) na wydaniach Circular T od 465, jeszcze nieuruchomione (
tests/utck_bound_prospective_oracle.rs). - Środowisko wyroczni: zapis Wrocław ZED-F9P jest bramkowany danymi pod
$KSHANA_ORACLES/data/wroclaw_f9p(CC BY 4,0, około 1,5 GB); fixtures zegarów IGS są dołączone (produkty IGS, z przypisaniem autorstwa). - Korekty: brak. Żaden plik wzorcowy, opublikowany rysunek ani istniejąca wartość testowa się nie zmienia; M001 (ponowne zakotwiczenie holdover) nie jest podejmowane, ponieważ żadna klasa zegara nie została podniesiona.
D8, jedna zwalidowana ścieżka propagacji, układu odniesienia i czasu (trzy nowe wiersze VALIDATED i podniesiony M131: 235 -> 238 wierszy, sprawdzonych względem niezależnego wzorca 117 -> 121).
Rodzaje orbit okołoziemskich, które niosły własne modele dwóch ciał, wekowego J2 lub wyłącznie czasu gwiazdowego, dzielą teraz jedną ścieżkę: zestawy elementów SGP4/SDP4 z dwuczęściowymi datami juliańskimi, przeniesione do GCRS i ITRS (International Terrestrial Reference System) łańcuchem IAU (International Astronomical Union) 2006/2000A, z opcjonalnymi parametrami orientacji Ziemi.
- Nowe
sgp4::MeanElementSet,sgp4::SgpOrbit,sgp4::Eop,sgp4::teme_to_itrs_matrix[_eop]isgp4::gcrs_to_itrs_matrix[_eop];Sgp4::new_atiSgp4::propagate_atprzyjmują dwuczęściowe epoki. Nowejd2::Jd2::from_utc_calendar(konwencja SOFAdtf2ddla dni z sekundą przestępną),jd2::utc_to_tai,tai_to_utc,utc_to_ut1(przez TAI, jak SOFAutcut1),tai_to_ttoraz dwuczęściowejd2::earth_rotation_angle. - Tryb polarny
leo-pvtpropaguje przez SGP4 na 2026-01-01T00:00:00 UTC łańcuchem IAU (leo_fusion::polar::latitude_sweep_atprzyjmuje dowolną epokę); generator Walkera SGP4 obraca do układu związanego z Ziemią łańcuchem IAU. - Rodzaj
passesuruchamia nowy predyktor przejść pozornych (passes::predict_passes_apparent,apparent_look_angles): SGP4 w łańcuchu IAU, refrakcja ITU-R P.834-9 i czas światła łącza w dół (nowe przełącznikirefractionilight_time, domyślnie włączone), parametry orientacji Ziemi (ut1_minus_utc_s,xp_arcsec,yp_arcsec, domyślnie 0), przecięcia rozwiązywane do 1e-7 s i kulminację przez wyszukiwanie złotego podziału. Geometrycznepasses::predict_passespozostaje bez zmian. tests/no_private_models.rspilnuje, aby jądra geometrii, czasu i propagacji pakietu nie zawierały prywatnej propagacji keplerowskiej, wekowych tempa J2 ani rotacji opartej wyłącznie na czasie gwiazdowym; nazwane szybkie poziomy i fizyka będąca przedmiotem wiersza są uzasadnionymi dopuszczeniami.- Nowy wiersz VALIDATED „Dwuczęściowe daty juliańskie i sekundy przestępne na ścieżce czasu orbit okołoziemskich”: pyerfa 2.0.1.5
dtf2d/utctai/taiutcna 224 chwilach wokół wszystkich 27 sekund przestępnych w granicach 1e-6 s (wstępnie zarejestrowana e947e69d); najgorszy 1.9e-11 s. - Nowy wiersz VALIDATED „Jedna ścieżka orbit okołoziemskich”: pozycje TEME 232 zestawów elementów względem python-sgp4 2,24 (referencyjnego SGP4 Vallado) w granicach 6.1e-8 m (próg 1 cm) oraz rotacje GCRS -> ITRS i TEME -> ITRS względem ERFA
c2t06a,pnm06aiee06aw granicach 2.9e-6 mas i 0,41 mas (progi 0,1 i 2 mas), z parametrami orientacji Ziemi (wstępnie zarejestrowana 72ea9eb0). Ujawnione: pierwszy przebieg zawiódł przy 2016-12-31T23:59:59,5 o jedną sekundę rotacji; UT1 wzięto z quasi-daty juliańskiej UTC w dniu z sekundą przestępną, silnik idzie teraz przez TAI, a drugi przebieg zgadza się przy niezmienionych progach. - M131 „Pokrycie LEO i rozmycie dokładności dla użytkowników polarnych i arktycznych względem GNSS MEO” zyskuje status VALIDATED: Orekit 13.1.8 bierze stany GCRS silnika, obraca je i oblicza widoczność i DOP (NumPy dla grup wielozegarowych); pozycje w granicach 6.8e-5 m (próg 0,2 m), liczby widocznych identyczne na 4040/4040 próbek, mediana DOP w granicach 2.3e-11 względnie.
- Nowy wiersz VALIDATED „Predykcja przejść pozornych nad stacją naziemną z refrakcją i czasem światła”: Orekit 13.1.8 propaguje te same zestawy elementów w TEME zbudowanym wg podanej definicji, z refrakcją ITU-R P.834 i jego modelem pomiaru czasu światła, na 60 przypadkach dla stacji na poziomie morza: 1210 przejść, przecięcia w granicach 3.4e-6 s (próg 5 ms), maksymalna elewacja w granicach 5.5e-7 stopnia, kierunek pozorny w granicach 8.8e-7 stopnia (próg 1e-4 stopnia).
- Ustalenia, utrzymywane jako przypięte: pierwsze porównania pełnego twierdzenia z Orekit od końca do końca chybiły swoich progów pozycji i kierunku, nie z winy silnika, lecz dlatego, że SDP4 w Orekit 13.1.8 odbiega od referencyjnego SGP4 dla orbit kołowych głębokiego kosmosu (e = 0) (do 67 m), a jego domyślny TEME jest zbudowany na nutacji IERS 1996 (IAU 1980), około 72 milisekund łuku od łańcucha IAU 2006/2000A (2,7 m na LEO). Współczynnik ITU-R P.834 w Orekit przy h*theta0^2 to 0,011380, gdzie Zalecenie podaje 0,01380; porównanie jest na poziomie morza, gdzie ten człon zanika, a różnica powyżej jest przypięta.
- „Predykcja przejść nad stacją naziemną (segment naziemny)” pozostaje VALIDATED, z twierdzeniem zawężonym do geometrycznego
passes::predict_passes; rodzajpassesnależy do nowego wiersza. - Środowisko wyroczni: Orekit 13.1.8 z Hipparchus 4.0.3, pyerfa 2.0.1.5, python-sgp4 2,24 (
xval/d8-orekit13/setup.sh). - Korekty: dołączony
scenarios/passes.tomlcałkowity dostęp 1675 s -> 1659 s (pięć przejść jak wcześniej; najlepsza maksymalna elewacja 73,25 stopnia -> 70,08 stopnia), a każde wyjściepasseszmienia się wraz z nową ścieżką (wypisana linia wdocs/examples/multi-tool-pipeline.mdi wpispasseswdocs/CAPABILITY.mdmówią to teraz); dołączonypolar-arctic-leo-coverageGNSS VDOP na równiku 1,19669 -> 1,19710, przy 89,9 stopnia 1,50645 -> 1,50590, VDOP fuzji przy 89,9 stopnia 1,14388 -> 1,14250 (opublikowane liczby z dwoma miejscami dziesiętnymi 1,20, 1,51 i 1,14 pozostają bez zmian). Żaden plik wzorcowy się nie zmienia. - Jeszcze nieskierowane:
leo_pass, tryby doppler, joint i timingleo-pvtoraz orbita prawdyleo_navmsg(ich modele żyją wleo_link::geometryileo_fusion::geom), a także projekty ziemskie wconstellation-design(nazwany szybki poziom dwóch ciał).
D6, generator odniesienia LunaNet AFS, LSIS V1.0 (cztery nowe wiersze, dwa VALIDATED: 238 -> 242 wierszy, sprawdzonych względem niezależnego wzorca 121 -> 123).
- Generator odniesienia LunaNet Augmented Forward Signal (AFS) (
lunar_afs), przypięty do LunaNet Signal-In-Space Recommended Standard (LSIS) V1.0 z 29 stycznia 2025 i nazywający tę wersję w każdym wyniku: nośna 2492,028 MHz; kanał danych AFS-I BPSK(1) przy 500 symbolach na sekundę z 2046-chipowym kodem Golda; pilot AFS-Q BPSK(5) z 10230-chipowym kodem pierwotnym Weila, 4-chipowym wtórnym i 1500-chipowym trzeciorzędnym; ramka o identyfikatorze 0 (wzorzec synchronizacji, podramka 1 BCH (51, 8), CRC-24, podramki LDPC o szybkości jedna druga od 2 do 4, przeplatacz blokowy 60 na 98) z wyczerpującym dekoderem podramki 1 i dekoderem LDPC min-sum napisanym wyłącznie z macierzy kontroli parzystości; oraz synteza IQ pasma podstawowego z etykietami prawdy zapisana jako nagranie SigMF. Kody są generowane z rejestrów przesuwnych standardu i konstrukcji Legendre'a/Weila. Nic skopiowanego ze standardu nie jest redystrybuowane (nie ma on warunków ponownego użycia): indeksy pierwotne AFS-Q pochodzą z IS-GPS-800J, a to, co definiują wyłącznie załączniki standardu (opóźnienia G2 AFS-I, kody trzeciorzędne, podmacierze LDPC), jest odczytywane w czasie działania z lokalnej pamięci podręcznej, którąxval/lunar-afs/fetch_lsis.shwypełnia z PDF hostowanego przez NASA, przy czym każdy plik jest sprawdzany względem przypiętego SHA-256 (lunar_afs::lsis). Model jest wzorcem zgodności, a nie modelem kanału, propagacji ani bilansu łącza. sigmf::meta_to_json_with_extensionsisigmf::annotation_extension_fields: nagranie może nieść pola rozszerzeń z przestrzeni nazw zadeklarowane wcore:extensions.- Nowy wiersz VALIDATED „Renderowanie pasma podstawowego LunaNet AFS względem niezależnego generatora, przy danym jego stanie kanału”: względem LANS-AFS-SIM (BSD-2-Clause, commit 480c6bf3, build pasma S) zero niezgodności chipów w kodach PRN od 1 do 210, zero niezgodności symboli w trzech ramkach przebiegu oraz znormalizowana korelacja zespolona 0,999990 na 23,9 s jego własnych próbek (najgorszy blok 2 ms 0,999948), w granicach progów ustalonych przed porównaniem (wstępnie zarejestrowana 986ac280). Steruje rendererem własnym stanem kanału symulatora i nie obejmuje podziału mocy z gęstości nośna-szum ani zapisu SigMF i 8-bitowego.
- Nowy wiersz VALIDATED „Kodowanie kanałowe ramki LunaNet AFS, FID 0”: ramki 6000 symboli są równe ramkom LANS-AFS-SIM symbol po symbolu (wstępnie zarejestrowana 986ac280); kod podramki 1 odtwarza przykład z rysunku 8 LSIS, a CRC-24 wartość kontrolną z katalogu CRC-24/LTE-A.
- Oba podniesione wiersze są bramkowane danymi z pamięci podręcznej LSIS: ich test wyroczni jest pomijany z komunikatem, dopóki nie uruchomiono
xval/lunar-afs/fetch_lsis.sh. - Ustalenie (nowy wiersz MODELLED), „Generowanie kodów rozpraszających LunaNet AFS”: z 2 937 232 wygenerowanych chipów i bitów porównanych z tablicami standardu i plikami Annex 3 jeden się różni, „ostatnie 24 chipy” wydrukowane w tabeli E-5 dla trzeciorzędnego PRN 147, które dubluje komórkę PRN 151, podczas gdy własny plik Annex 3 standardu zgadza się z generatorem. Kryterium zera niezgodności zostaje chybione.
- Ustalenie (nowy wiersz MODELLED), „Dekodowalność w pętli zamkniętej LunaNet AFS”: trzy wstępnie zarejestrowane przebiegi względem PocketSDR-AFS; trzeci spełnił w pełni progi śledzenia i dekodowania, ale nie swój warunek, że build odbiornika tylko z wydrukiem odtwarza log przypiętego buildu, ponieważ dwa przebiegi niezmodyfikowanego odbiornika już różnią się zapisami akwizycji.
- Poprawiono: domyślna nośna
lunar_service(export_antenna.carrier_hz),lunar_jammingiattack_surfacebyła zaokrąglonym 2,4 GHz; jest nią teraz nośna AFS z LSIS-020, 2492,028 MHz. Przy dawnej wartości domyślnej tłumienie w wolnej przestrzeni było zaniżone o 0,327 dB. - Korekty: brak. Każdy dołączony scenariusz nazywa swoją nośną, a wyniki wszystkich 138 plików scenariuszy są bajt w bajt identyczne jak w poprzednim main.
D7, rzeczywiste IQ księżycowe i GPS LNAV (siedem nowych wierszy, żaden VALIDATED: 242 -> 249 wierszy, sprawdzonych względem niezależnego wzorca 123 bez zmian).
portable_math::FftPlan: mieszanoradiksowa szybka transformata Fouriera (FFT), której wynik to te same bity na każdej platformie; przypięcie SHA-256 transformat 8000- i 24000-punktowych przechodzi na x86_64 i na wasm32-wasip1 (moduł uruchamiający wxval/portable-fft-wasm/).acquisition: równoległe wyszukiwanie fazy kodu na próbkowanym IQ (pcps_acquire,pcps_grid) ze składaniem koherentnym, akumulacją niekoherentną, progiem chi-kwadrat dla prawdopodobieństwa fałszywego alarmu w całym wyszukiwaniu i statystyką uśredniania komórek dla szumu ograniczonego pasmem;refine,prompt_seriesz Dopplerem kodu oraz estymatory gęstości nośna-szum (C/N0) M2M4 i szczytu siatki.gps_lnav: koder starszego komunikatu nawigacyjnego (LNAV) IS-GPS-200 dla podramek od 1 do 3, z parzystością z tabeli 20-XIV i dekoderem pól.realdata::ion_sdr: czytnik ION GNSS SDR Metadata Standard (.sdrx) i jego plików próbek, zto_mid_risedla poziomów w kodzie uzupełnieniowym do dwóch.realdata::lugre: nagłówek partii IQS, telemetria RAW, ACQ i NAV oraz pliki CLK z LuGRE (Lunar GNSS Receiver Experiment) i kontrola, która wypisuje, gdzie metadane.sdrxprzeczą nagłówkowi binarnemu.antenna::GainPattern2Doraz, wearth_gnss_lunar, układ ciała ze sterowaniem odchyleniem, azymut nadawania i kąty od nadiru, a takżetransmit_side_dbdla względnego C/N0 ze zmierzonymi charakterystykami.Kodowanie komunikatu nawigacyjnego GPS LNAV (nowy wiersz, pozostaje MODELLED po weryfikacji końcowej integratora): na pliku nadawczym IGS z 2 marca 2025, sparsowanym i zdekodowanym przez RTKLIB v2.4.2-p13, wszystkie 960 słów przechodzą parzystość, wszystkie 96 podramek się dekoduje, a wszystkie 608 nadawanych liczb całkowitych równa się wartościom Kshana (
tests/gps_lnav_rtklib_integer_oracle.rs), ale wstępna rejestracja (d4d9eb9d) trafiła do gałęzi publicznej dwie sekundy po zatwierdzeniu zawierającym wynik, więc kolejności „zarejestrowano przed pobraniem pliku” nie można wykazać i wiersz nie został podniesiony.realdata::ion_sdrwypełnia słowa od najstarszego bitu (I w górnym półbajcie bajtu LuGRE; wcześniejszy odczyt dawał sygnał sprzężony), zachowuje stary odczyt jakoSdrLayout::fill_lsb_firsti czyta próbki szersze niż słowo.acquisition::refine_doppler_coherent: koherentne dopracowanie Dopplera w fazie (0,2 Hz RMS przy 30 dB-Hz w ciągu 200 ms w symulacji).GPS L1 C/A względem gps-sdr-sim: chipy i parzystość bit w bit; 230 z 1152 pól LNAV różni się o jedną jednostkę, ponieważ gps-sdr-sim obcina tam, gdzie nadawana liczba całkowita wymaga zaokrąglenia.
LNAV zdekodowany przez RTKLIB: cała parzystość i podramki przechodzą, a każdy parametr mieści się w połowie kwantu; 41 wartości skalowanych różni się o kilka jednostek na ostatnim miejscu przez dziesiętną stałą RTKLIB 2^-43, powyżej zarejestrowanego progu.
Akwizycja LuGRE względem GNSS-SDR 0.0.19: 266 z 266 decyzji się zgadza, 250 wskazało tę samą komórkę; większość wyników dodatnich to artefakty średniej −0,5 w surowych 4-bitowych poziomach; ramię C/N0 nie miało równoczesnych danych lotu. Dwie partie (OP5, OP12) wykluczono błędnie: ich metadane zgadzają się z nagłówkami, ale czytnik nie potrafił wtedy czytać próbki szerszej niż słowo.
Akwizycja LuGRE względem Dopplera przewidzianego z orbity: przy decyzji opartej na mocy próbek każde wyszukiwanie przekracza próg na szumie ograniczonym pasmem; przy decyzji uśredniającej komórki najsilniejsze pary zgadzają się co do wielkości z odwróconym znakiem, co pokazuje, że zarejestrowana kolejność I/Q jest sprzężeniem danych.
Ślepa akwizycja na partiach z powierzchni Księżyca: cztery partie pozyskują po jednym satelicie (przewidziany jako widoczny, bez fałszywego alarmu przy 1e-7), żadna dwóch, więc próg różnicy Dopplera nie ma pary do oceny.
Względne C/N0 w odległości księżycowej (M039 ujęte na nowo): 15 zapisów Block IIR/IIR-M i jedna para, zbyt mało dla zarejestrowanego progu.
Korekty: brak; żadna opublikowana liczba, plik wzorcowy ani rysunek w dokumentacji się nie zmienił.
Wiersz M039 „GNSS Ziemi w odległości księżycowej” ujmuje na nowo swoje twierdzenie w odległości księżycowej jako względne C/N0 między satelitami w jednej epoce plus widoczność (bezwzględne C/N0 nie jest twierdzone); pozostaje MODELLED. NOTICE najwyższego poziomu zawiera przypisanie autorstwa LuGRE CC BY 4,0.
Poprawiono#
- Orientacja osi głównych Księżyca z DE440 jest teraz interpolowana wzdłuż geodezyjnej między dziennymi węzłami. Wcześniejsza interpolacja element po elemencie była błędna do 2.0e-4 rad (340 m na powierzchni Księżyca) w pobliżu ćwiartek każdego dnia, a nie „około 14 m”, jak podawał wiersz. Jego użytkownicy (geometria księżycowego dalmierza laserowego, księżycowe datum, obserwowalność uskoków księżycowych) otrzymują poprawioną orientację.
- Poprawki silnika z rundy 2, każda ponownie uruchomiona względem niezmienionej wstępnie zarejestrowanej tolerancji: wersja IERS wiersza EOP jest odczytywana z jego flag I/P, a nie z pustego bloku Bulletin B;
snapshot_raimużywa geodezyjnego poziomu lokalnego; sprzężenie księżycowego układu tempa używa promienia równikowego, J2 i rotacji; dopasowanie liu22 startuje od zerowych poprawek bez priorów i używa tempa ruchu średniego z artykułu; rozstaw węzłów EO niesie regresję węzłów J2; czas poślizgu cyklu Costasa używa rho/4; rozwiązanie łączne stosuje nadawane opóźnienie grupowe pary; księżycowe rozwiązanie łączne używa kroku QR; granica NTN jest oceniana w pozycji prawdziwej; zegar odniesienia projektu konstelacji to najniższa konstelacja w widoku; szereg orientacji DE440 obejmuje 2014-2030 i zgłasza błąd poza nim zamiast przycinać.
Dodano#
leo_navmsg::truth::TruthOrbit::from_ecef_states, orbita prawdy zbudowana z tablicowych stanów w układzie związanym z Ziemią, używana przez porównanie dopasowania rzeczywistej orbity.- Pliki testowe i fixtures powyższych porównań, każdy z własnym generatorem i plikiem
NOTICE.mdpodającym źródło, licencję, datę pobrania i SHA-256. - Runda 2:
araim_reference::add_v42_protection_levelsi_ecef(detekcja uszkodzeń ADD v4.2, wg Stanford MAAST dla ARAIM 2, uwaga BSD-3 w źródle);raim::snapshot_raim_fde;cw_dynamics::second_order_correctionipropagate_second_order; dziewięciostanowy model błędu INSinertial::coast::ErrorDynamics; pochodne cząstkowelunar_vlbi::KernelGeometryi dane wejściowelunar-vlbina ścieżce jąder;naif_kernel, czytnik jąder SPK typu 2 i binarnych PCK;lunar_llr_geometry::llr_bcrs_one_way_mze stacjami ITRF2020; gęstość Jacchia 1971;solar_system::link_ondla dowolnego dostawcy efemeryd;launch::site_rotation_speed_at;eo_payload::j2_nodal_periodiground_track_spacing_equator_j2;batch_ls::gauss_newton_qr;precise_products(czytniki RINEX zegara, ANTEX i DCB).
[0.29.3] - 2026-10-01#
Wydanie poprawkowe po 0.29.2. Kshana Studio zostało przebudowane wokół dwóch widoków: widoku prostego, który najpierw podaje odpowiedź i wyjaśnia ją zwykłymi słowami, oraz widoku zaawansowanego z pełnym panelem. Razem z nim trafiają dwie drobne poprawki na kshana.dev. Silnik się nie zmienia: każdy dołączony scenariusz daje wynik identyczny bajt w bajt z 0.29.2, poza stemplem wersji.
Zmienione#
- Kshana Studio ma widok prosty. To on otwiera się jako pierwszy.
- Odpowiedź jest na pierwszym miejscu: scenariusz otwiera się na swoim wyniku, podanym w jednym prostym zdaniu. Każdy dołączony scenariusz ma własne zdanie, napisane pod kątem tego, co ten scenariusz mierzy.
- Widocznych jest najwyżej pięć ustawień, tych, które najbardziej zmieniają odpowiedź. Pozostałe znajdują się w sekcji „Ustawienia zaawansowane”, zwiniętej do czasu jej otwarcia.
- „Jak to jest obliczane” wyjaśnia metodę w kilku wierszach, a „Dla badaczy” podaje własne wartości silnika, plik scenariusza i dowody stojące za wynikiem.
- Pełny panel to widok zaawansowany. Jest w nim każdy panel, wykres, eksport i raport z wcześniejszego Studio.
- Przełącznik przechodzi między dwoma widokami i zachowuje miejsce, w którym się jest. Scenariusz, widok, w którym się było, i wszystkie zmienione ustawienia zostają przeniesione. Studio zapamiętuje, którego widoku użyto ostatnio. Odnośniki ze strony i z dokumentacji otwierają widok prosty; odnośnik z
view=advancedotwiera widok zaawansowany, a każdy wcześniejszy odnośnik do Studio nadal otwiera ten sam scenariusz i ten sam widok. - Szybszy pierwszy widok przy wolnych połączeniach. Zapisana odpowiedź dla scenariusza jest rysowana, zanim wczyta się reszta Studio, więc przy wolnym połączeniu mobilnym odpowiedź pojawia się po około dwóch sekundach zamiast po około dziewięciu.
- Lepsze wyszukiwanie. Wyszukiwanie wyświetla teraz najpierw scenariusze, których obszar lub tytuł pasuje do wpisanych słów, przed scenariuszami, które wspominają je tylko w nazwie pliku lub w tekście.
Poprawiono#
- Globus na stronie głównej nie robi się już pusty przy włączonym ograniczeniu ruchu. Przy włączonym systemowym ustawieniu ograniczenia ruchu zmiana rozmiaru okna mogła pozostawić główny globus pusty aż do przewinięcia strony. Globus rysuje się teraz ponownie w tej samej klatce co zmiana rozmiaru.
- Konsola pasma L na stronie głównej wyjaśnia swoje puste pasmo. W „Watch a jammer take the band” panel GPS L5 / Galileo E5a przez całą minutę pozostawał ciemny, co wyglądało na usterkę. W tym scenariuszu żaden jammer nie nadaje w tym paśmie, a sygnały satelitów leżą poniżej poziomu szumu, więc nic tam nad nim nie wystaje. Dyskretna etykieta mówi to teraz w każdym fragmencie panelu, w którym nic nie wystaje ponad poziom szumu (panel L5 / E5a oraz panel L2C, zanim zacznie nadawać jego jammer szumowy), wraz z C/N0 i stanem uchwycenia każdego pasma z tego samego przebiegu. Etykieta jest umieszczana tylko tam, gdzie nic nie jest powyżej poziomu szumu, więc nigdy nie zasłania energii jammera.
0.29.2 - 2026-10-01#
Wydanie poprawkowe po 0.29.1. Usuwa zduplikowany kod w modułach wiadomości nawigacyjnej LEO, fuzji i widma, dodaje jasny motyw do kshana.dev, przenosi Kshana Studio pod własny adres, czyni stronę czytelną dla wyszukiwarek i asystentów AI, poprawia kilka drobiazgów w Studio i pozwala publikować wydania npm bez zapisanego tokenu. Wyniki silnika się nie zmieniają: każdy dołączony scenariusz daje wynik identyczny bajt w bajt z 0.29.1, poza stemplem wersji.
Dodano#
- Jasny motyw dla kshana.dev. Każdą stronę można czytać w trybie jasnym lub ciemnym. Strona podąża za ustawieniem systemowym czytelnika i ma przełącznik, który je zmienia.
- Wyszukiwarki i asystenci AI mogą czytać stronę. Każda strona ma teraz własny tytuł, opis, adres kanoniczny, znaczniki kart społecznościowych i dane strukturalne schema.org, a także zwykły tekst dla sekcji rysowanych skryptem. Strona publikuje
robots.txt,sitemap.xmlz datą ostatniej zmiany każdej strony,llms.txtillms-full.txt(krótki i pełny przewodnik w postaci zwykłego tekstu dla asystentów AI) oraz klucz IndexNow, dzięki któremu wdrożenie może powiadomić wyszukiwarki o tym, co się zmieniło. - Wydania npm można publikować bez zapisanego tokenu. Zadanie npm działa teraz na Node 24 i npm 11.5.1 lub nowszym, które obsługują zaufane publikowanie npm: npm wymienia tożsamość GitHub zadania wydania na krótkotrwałe poświadczenie. Sekret
NPM_TOKENnadal działa i jest używany, dopóki jest ustawiony, więc nic się nie zmienia, dopóki zaufane publikowanie nie zostanie włączone dla pakietu na npmjs.com.docs/RELEASING.mdwymienia kroki.
Zmienione#
Nagłówek strony głównej jest czytelny nad globusem. Delikatny cień leży teraz za nagłówkiem i jego tekstem, przygaszając linie orbit i punkty satelitów animowanego globusa tam, gdzie go przecinają.
Kshana Studio ma własny adres: https://kshana.dev/studio/. Każdy odnośnik na stronie i w dokumentacji prowadzi tam. Stary adres,
/playground/, nadal działa i przekierowuje na nowy, z zachowaniem scenariusza, widoku i innych ustawień zapisanych w odnośniku.Poprawki w Studio. Plik silnika jest pobierany raz zamiast dwa razy. Podczas pobierania Studio od razu pokazuje zapisany wynik scenariusza, oznaczony jako zapisany, zamiast pustego ekranu. Na telefonie nagłówek to jeden zwarty wiersz. Kluczowe wartości zawijają się po dwie w wierszu, więc żadna nie jest ukryta poza krawędzią ekranu. Etykiety pól używają własnych słów scenariusza, z nazwą pola obok, a wyszukiwanie znajduje pola po jednym i drugim.
Mniej zduplikowanego kodu. Tabela jednostek wiadomości nawigacyjnej LEO zapisywała te same dziesięć wierszy statystyk SISRE dla czterech podsumowań dopasowania. Teraz makro zapisuje je raz. Dwa wykresy wodospadu widma mają wspólną oś czasu, pasek kolorów i panel paska C/N0. Próbkowanie w dół głównej siatki używa ponownie
downsample_grid, a całka Simpsona używa ponownienavsignal::simpson. Dwa punkty wejścia rodzaju przelotu LEO mają wspólny krok przygotowania.leo_link::geometryimportuje pomocnicze funkcje wektorowe zleo_fusion::geomzamiast je kopiować. Raport zaawansowany importuje funkcję ucieczki HTML z raportu API zamiast ją kopiować. Każdy z 139 plików scenariuszy wscenarios/uruchomiono na 0.29.1 i na tym kodzie, a każdy plik wyjściowy jest identyczny bajt w bajt.Tabele jednostek leo-navmsg i leo-pvt mają własne pliki. Przeniesiono je z modułów, które zawierają także logikę, do
src/leo_navmsg/units.rsisrc/leo_fusion/pvt_units.rs.PVT_UNITSzachowuje swoją ścieżkę publiczną. Tylko te dwa pliki tabel dołączają do wyłączeń z wykrywania kopii dla katalogów deklaratywnych wsonar-project.properties, które sprawdzatests/sonar_cpd_exclusions_are_justified.rs.
Poprawiono#
- Plakietka CI w README pokazuje wynik pushy do main. Plakietka liczyła przebiegi każdego zdarzenia na main, więc mogła pokazywać „failing”, choć każdy przebieg dla pusha był zielony; teraz prosi tylko o przebiegi dla pushy (
event=push).
0.29.1 - 2026-10-01#
Wydanie poprawkowe po 0.29.0: zmierzona wartość pokrycia, wiersz z nazwą projektu na kshana.dev, szybsze zadanie pokrycia i odświeżony README. Wyniki silnika się nie zmieniają: każdy scenariusz daje ten sam wynik co na 0.29.0.
Rewizje opublikowanych liczb#
- Pokrycie wierszy: ~96 % → ~95 %. Zadanie pokrycia ponownie zmierzyło kod wydania 0.29.0 (commit
db796dd, przebieg CI 36809850252, 2026-10-01): 95.35 %, 55 970 z 58 697 wierszy wsrc/. Opublikowana wartość wynosiła 95,63 % (37 697 z 39 419 wierszy), zmierzona nab1d350dprzed 0.28.0; zaokrąglała się do ~96 %. Nowa wartość zaokrągla się do ~95 %, więc razem zmienia się każda powierzchnia, którą przypinatests/coverage_figure_doc_sync.rs:docs/COVERAGE.md, plakietka README, wiersz Evidence i tabela CI, plakietki crates.io, PyPI i npm, raport techniczny oraz strona pokrycia na kshana.dev. Próg dolny 85 % pozostaje bez zmian.
Dodano#
- Wiersz z nazwą na kshana.dev. „Kshana · क्षण · the precise instant” otwiera teraz główną sekcję Home i znajduje się pod marką w stopce każdej strony. kshana.dev nadal nie wysyła żadnego żądania do innego hosta: dewanagari to samodzielnie hostowany podzbiór Noto Sans Devanagari z trzema literami क्षण (1 692 bajtów,
web/fonts/, z tekstem licencji SIL Open Font License i jego SHA-256 wweb/fonts/FONTS.json).web/tools/fetch_third_party.pynauczył się zapisywać podzbiór Google Fontstext=pod nazwą pliku adresowaną zawartością.
Zmienione#
- Odnośniki na stronie trafiają tam, dokąd wskazują, pod czystymi adresami. Odnośnik do sekcji ustawia teraz tę sekcję tuż pod nagłówkiem, na telefonie i na komputerze: odnośnik do sektora w Missions otwiera ten sektor z jego panelem na górze; odnośniki do Capabilities i Editions utrzymują swoje miejsce, gdy rysują się znajdujące się nad nimi wykresy; Editions nie dodaje już drugiego odsunięcia nagłówka; a odnośnik do zwiniętej części strony dokumentacji ją otwiera. Każda strona jest linkowana swoim czystym adresem (
/evidence#research,/docs/changelog,/dla Home), a odnośniki kanoniczne, mapa witryny i przekierowania starych adresów podają te same; adresy.htmlnadal działają. Research ma własny odnośnik w nagłówku, między Evidence a Developers, i w stopce. Dokumentacja nie pokazuje już planu rozwoju (ROADMAP.mdpozostaje w repozytorium): grupa Project to Changelog, Licensing, Security, Contributing, Governance i Code of conduct, a Glossary przeniesiono do Get started. - Zadanie pokrycia jest szybsze. Na 0.29.0 trwało 143 minut wobec zdrowych 91 do
- Fuzzer
tests/property.rs, przyczyna za ostatnim razem, zajmował 4 z nich. Dołączony korpus urósł z 74 do 139 scenariuszy, a trzy pliki binarne testów przechodziły go cały, plik po pliku (determinismdwa razy,advanced_reportianimationpo razie): razem 37 minut pod instrumentacją pokrycia, wobec 3 na 0.27.2. Teraz współdzielątests/support/corpus.rs, który wykonuje pracę dla każdego scenariusza na wszystkich rdzeniach i oddaje wyniki w posortowanej kolejności; każdy scenariusz i każda asercja pozostają. Na laptopie arm64, kompilacja debug:determinismtrwa 143 s na 14 rdzeniach wobec 612 s zKSHANA_CORPUS_THREADS=1(dawne przejście szeregowe).
- Fuzzer
- README, odświeżone. Otwiera się tym samym wierszem z nazwą co strona; zrzuty ekranu Studio zrobiono na nowo ze Studio w wersji 0.29.1, z nowym zrzutem Studio na telefonie i jego dolnym paskiem kroków; nowy pas „The site” pokazuje trzy strony kshana.dev z kompilacji 0.29.1 (
tools/capture_site_shots.mjs, złożone przeztools/readme_shots.pyi zapisane wdocs/assets/readme/site/SHOTS.json); wartość pokrycia brzmi ~95 %; a tekst alternatywny rysunku badawczego, który powtarzał tekst rysunku architektury, opisuje teraz artykuły. Plakietki w nagłówku są mniejsze i krótsze (18 px wysokości; „~95%”, „83/223”, „quality”, „AGPL-3.0”, „zenodo.20528627”), więc jedenaście mieści się w dwóch wierszach; każdy odnośnik i tekst alternatywny zachowuje pełne znaczenie. - Zadanie obrazu kontenera dostaje 90 minut. Na v0.29.0 emulowana kompilacja linux/arm64 obrazu
kshana-mcpprzekroczyła dawny limit 45 minut podczas kompilowania ostatniego crate'a, więc obraz, wpis w rejestrze MCP i kontrola kanału nie zostały opublikowane. Limit wynosi teraz 90 minut; obraz jest niezmieniony. - Osiem literałów zmiennoprzecinkowych pogrupowano na nowo w
src/ephem.rsisrc/sgp4.rs(0.323_273_64→0.323_273_640): SonarQube Cloud odczytał ostatnią grupę_64lub_32jako brakujący sufiksf64lubf32(reguła S7454). Wartości to te same liczby, więc żaden wynik się nie zmienia.
0.29.0 - 2026-10-01#
Dwanaście nowych rodzajów scenariuszy i trzy nowe sposoby czytania przebiegu. Silnik obejmuje teraz widmo radiowe, cały Układ Słoneczny, konstelacje wokół dowolnego ciała, kampanie łączące scenariusze w jedną misję oraz pozycjonowanie, nawigację i czas (PNT) z niskiej orbity okołoziemskiej (LEO), od sygnału do rozwiązania pozycji. Każdy przebieg można też zapisać jako animację, pełny raport i zestaw plików interoperacyjności dla innych narzędzi.
Wokół silnika: przeprojektowane kshana.dev (strona wielostronicowa i nowy panel Kshana Studio, który uruchamia każdą możliwość w przeglądarce), przepisane README, czternaście narzędzi na serwerze Model Context Protocol (MCP), kompilacja przeglądarkowa dająca te same liczby co natywna oraz publiczna strona Kshana Pro.
| 0.28.0 | 0.29.0 | |
|---|---|---|
| Rodzaje scenariuszy | 63 | 75 |
| Pliki scenariuszy (plus jeden manifest zestawu) | 77 | 138, z czego 132 dołączono do kshana example |
| Wiersze macierzy weryfikacji | 174 | 223 |
| w tym VALIDATED względem zewnętrznej wyroczni | 66 | 83 |
| z czego MODELLED (podany model, sprawdzony tylko pod kątem wewnętrznej spójności) | 104 | 136 |
| z czego PARTNER (wymaga sprzętu lub danych partnera) | 4 | 4 |
Skąd bierze się wzrost:
| Obszar | Rodzaje | Pliki scenariuszy | Wiersze macierzy (sprawdzone + obliczone z modelu) |
|---|---|---|---|
| Widmo | 1 | 1 | 3 (1 + 2) |
| Układ Słoneczny i pozycjonowanie wokół dowolnego ciała | 2 | 3 | 6 (2 + 4) |
| Projekt konstelacji | 1 | 3 | 3 (2 + 1) |
| Kampanie | 1 | 5 | 3 (0 + 3) |
| Scenariusze morskie, drogowe i kolejowe | 0 | 5 | 0 |
| Animacja, raporty, eksporty interoperacyjności | 0 | 0 | 0 |
| Projekty sygnałów LEO i widmo wielopasmowe | 1 | 4 | 4 (2 + 2) |
| Przelot LEO i bilans łącza | 1 | 6 | 9 (6 + 3) |
| Komunikat nawigacyjny LEO | 1 | 5 | 9 (3 + 6) |
| Pozycjonowanie, synchronizacja czasu i fuzja LEO | 3 | 8 | 8 (1 + 7) |
| Łańcuch LEO od początku do końca | 1 | 3 | 1 (0 + 1) |
| Odporność LEO oraz scenariusze obszarów zainteresowania i użytkowników końcowych | 0 | 18 | 3 (0 + 3) |
| Razem dodano | 12 | 61 | 49 (17 + 32) |
Możliwość LEO jest niezależna od systemu: działa na ogólnych, podanych parametrach i nie wymaga żadnego nazwanego systemu. Nazwane systemy są opcjonalnymi presetami, każdy w osobnym pliku z publicznym źródłem. Jeden preset, Celeste IOD (demonstracja na orbicie), używa wartości przedstawionych na warsztatach ESA NAVISP LEO-PNT, 2026 (ESA to Europejska Agencja Kosmiczna; NAVISP to jej Program Wsparcia i Innowacji w Nawigacji); znajduje się w jednym pliku, src/celeste_iod.rs, wraz z pięcioma scenariuszami dostępnymi tylko w repozytorium, więc można go wstrzymać bez edycji źródła, a żadna z jego wartości z warsztatów nie jest powtórzona w tym dzienniku zmian.
Przed aktualizacją przeczytaj „Revisions to published numbers”. Zmienia się jeden wynik silnika (kolumny układu inercjalnego rodzaju ephemeris, po poprawce znaku w macierzy nutacji), a audyt dokumentacji poprawił wartości, które wcześniejsze dokumenty podawały w druku.
Skróty użyte w tym wpisie
Statusy: VALIDATED oznacza sprawdzone względem niezależnej wyroczni zewnętrznej (opublikowanej tabeli, oprogramowania innej grupy lub danych pomiarowych); MODELLED oznacza podany model sprawdzony tylko pod kątem wewnętrznej spójności; PARTNER oznacza, że sprawdzenie wymaga sprzętu lub danych partnera.
| Skrót | Znaczenie |
|---|---|
| 3GPP, 5G, NTN | 3rd Generation Partnership Project (Projekt Partnerski Trzeciej Generacji); sieć mobilna piątej generacji; sieć nienaziemna |
| AD, BC | ery kalendarzowe (anno Domini, przed Chrystusem) |
| AIAA | Amerykański Instytut Aeronautyki i Astronautyki |
| AltBOC, BOC, BPSK, MBOC | alternatywna modulacja z przesunięciem binarnym nośnej; modulacja z przesunięciem binarnym nośnej; binarna kluczowanie fazy; multipleksowana modulacja z przesunięciem binarnym nośnej (modulacje sygnałów) |
| ATOMIC | Autonomous Time and Orbit Determination for Microsatellite Constellations (opublikowany model efemeryd LEO) |
| C/A, L1, L2, L2C, L5 | kod zgrubny/akwizycyjny oraz nazwy nośnych i sygnałów cywilnych Global Positioning System |
| C/N0 | stosunek mocy nośnej do gęstości szumu |
| CIO | Celestial Intermediate Origin (niebieski początek pośredni) |
| CLI | interfejs wiersza poleceń |
| CRC-24Q | 24-bitowa cykliczna kontrola nadmiarowa (wielomian Qualcomm) |
| CSAC | zegar atomowy w skali chipa |
| CSS, HTML, SVG, XML | Cascading Style Sheets (kaskadowe arkusze stylów); HyperText Markup Language (język znaczników hipertekstu); Scalable Vector Graphics (skalowalna grafika wektorowa); Extensible Markup Language (rozszerzalny język znaczników) |
| CSV, JSON, PDF, TOML, URL | wartości rozdzielone przecinkami; JavaScript Object Notation; Portable Document Format; Tom's Obvious Minimal Language; jednolity lokalizator zasobów |
| CW | fala ciągła |
| CZML, KML, GeoJSON | Cesium Language; Keyhole Markup Language; Geographic JSON (formaty map i globusów) |
| DE441 | Development Ephemeris 441 Jet Propulsion Laboratory |
| DOI | cyfrowy identyfikator obiektu |
| DOP, GDOP, PDOP, HDOP, VDOP | rozmycie dokładności: geometryczne, położenia, poziome, pionowe |
| E1, E5, E5a, E5b | nazwy sygnałów Galileo |
| E3F | nazwa miejsca w tabeli konstelacji Global Positioning System |
| ECEF | geocentryczny, związany z Ziemią |
| EE | równanie równonocy |
| EGM2008 | Earth Gravitational Model 2008 |
| EIRP | równoważna moc promieniowana izotropowo |
| ERFA, SOFA | Essential Routines for Fundamental Astronomy; Standards of Fundamental Astronomy (biblioteki astronomii referencyjnej) |
| ESA, NAVISP | Europejska Agencja Kosmiczna; jej Program Wsparcia i Innowacji w Nawigacji |
| FDMA | wielodostęp z podziałem częstotliwości |
| GCRF, GCRS | Geocentryczny Niebieski Układ Odniesienia (Geocentric Celestial Reference Frame); Geocentryczny Niebieski System Odniesienia (Geocentric Celestial Reference System) |
| GLONASS | rosyjski Globalny System Nawigacji Satelitarnej |
| GNSS, GPS | globalny system nawigacji satelitarnej; Global Positioning System |
| IAU | Międzynarodowa Unia Astronomiczna |
| ICD, OS SIS ICD, OS SDD | dokument kontroli interfejsu; Galileo Open Service Signal-In-Space Interface Control Document; Galileo Open Service Service Definition Document |
| ICRF | Międzynarodowy Niebieski Układ Odniesienia |
| IMO | Międzynarodowa Organizacja Morska |
| INS, MEMS | inercjalny system nawigacji; układ mikroelektromechaniczny |
| IOD | demonstracja na orbicie |
| IQ | składowe synfazowa i kwadraturowa |
| IS-GPS-200 | specyfikacja interfejsu Global Positioning System |
| ISS | Międzynarodowa Stacja Kosmiczna |
| ITRF, ITRS, PEF, TEME | Międzynarodowy Ziemski Układ Odniesienia (International Terrestrial Reference Frame); Międzynarodowy Ziemski System Odniesienia (International Terrestrial Reference System); pseudo-związany z Ziemią; prawdziwy równik, średnie równonocy (układy odniesienia) |
| ITU, ITU-R | Międzynarodowy Związek Telekomunikacyjny; jego Sektor Radiokomunikacji |
| J/S | stosunek jammera do sygnału |
| J2 do J6, J2000 | harmoniki strefowe pola grawitacyjnego; epoka 2000-01-01 12:00 |
| JPL | Jet Propulsion Laboratory |
| LEO, MEO | niska orbita okołoziemska; średnia orbita okołoziemska |
| MBSE | inżynieria systemów oparta na modelach |
| NEES | znormalizowany kwadrat błędu estymacji |
| NeQuick-G | model jonosfery Galileo |
| OEM, SP3, TLE | Orbit Ephemeris Message; Standard Product 3 (precyzyjne orbity); zestaw elementów dwuliniowych |
| PNT, PPP | pozycjonowanie, nawigacja i czas; precyzyjne pozycjonowanie punktowe |
| PSD, SSC | gęstość widmowa mocy; współczynnik separacji widmowej |
| RAIM, SQM | autonomiczne monitorowanie integralności w odbiorniku; monitorowanie jakości sygnału |
| RINEX, RTCM | Receiver Independent Exchange Format (niezależny od odbiornika format wymiany); Radio Technical Commission for Maritime Services |
| RMS | pierwiastek ze średniej kwadratów |
| RTKLIB | otwartoźródłowa biblioteka pozycjonowania GNSS, używana tu jako wyrocznia |
| SGP4 | Simplified General Perturbations 4 (model orbity zestawów elementów dwuliniowych) |
| SHA-256 | Secure Hash Algorithm, 256-bitowy |
| SigMF | Signal Metadata Format (format metadanych sygnału) |
| SISRE | błąd odległości sygnału w przestrzeni |
| SPS PS | Standard Positioning Service Performance Standard |
| SRTM | Shuttle Radar Topography Mission |
| STK | Systems Tool Kit (jego format pliku efemeryd .e) |
| STL | Satellite Time and Location |
| SVID | identyfikator pojazdu kosmicznego |
| T/P/F | łączna liczba satelitów konstelacji Walkera, jej płaszczyzny i fazowanie |
| TEC | całkowita zawartość elektronów |
| UHF | ultrawysoka częstotliwość |
| UTC | uniwersalny czas koordynowany |
| WGS 84 | World Geodetic System 1984 |
| X1, X5 | nazwy sygnałów systemu Xona Pulsar |
Rewizje opublikowanych liczb#
Zmieniona opublikowana liczba jest rewizją i zostaje zapisana, nigdy poprawiana po cichu. To wydanie zawiera jedną rewizję wyniku silnika i kilka rewizji wartości podanych w dokumentacji.
Wynik silnika
- Redukcja TEME→GCRS była obrócona o 2·Δψ: macierz nutacji miała odwrócony znak Δψ.
nutation::numatbudowałoRx(−(ε̄+Δε))·Rz(Δψ)·Rx(ε̄), tam gdzieiauNumatz SOFA budujeRx(−(ε̄+Δε))·Rz(−Δψ)·Rx(ε̄), więcnutation_matrix,nutation_matrix_2000a,teme_to_gcrsigcrs_to_temeobracały o dwukrotną nutację w długości, około 25 sekund łuku. Każda kontrola łańcucha była testem własności (obrót właściwy, przejście w obie strony, niezerowy udział nutacji), który przepuszcza pomyłkę znaku; kompleksowy test Vallado obejmował TEME→PEF, TEME→ITRF i GCRS→ITRS, ale nie TEME→GCRS. Na przykładzie Vallado (AIAA 2006-6753, 2004-04-06) łańcuch mijał opublikowany GCRF o 1 145 m; teraz ląduje 0,11 m od niego, a macierz jest równanumatz ERFA z dokładnością 1e-14.tests/frame_reference_vectors.rs::teme_to_gcrs_matches_vallado_gcrfinutation::tests::nutation_matrix_matches_erfa_numatoba zawodzą na starym znaku. Test spójności CIO (Celestial Intermediate Origin) wsrc/cio.rsprzypisał wynikającą z tego niezgodność ~130 m „≈ 2·EE”; reszta wynosi teraz 5 cm, a jej granicę zaostrzono z 250 m do 1 m. To zmienia opublikowane liczby, zapisane tu jako rewizja: kolumnygcrs_r_migcrs_v_m_srodzajuephemeris(około 0,8–1,0 km dla dołączonego scenariusza ISS (Międzynarodowa Stacja Kosmiczna); jego kolumny TEME, związane z Ziemią, śladu na powierzchni, kątów widzenia i Dopplera nie zmieniają się) orazPropagator::position_in_frame/state_gcrsdla układów GCRS i ITRS. Żaden wiersz podsumowania, wykres ani złoty hasz dołączonego scenariusza nie odczytuje tych kolumn. Nowe eksporty interoperacyjności używają poprawionego łańcucha: pozycja CZML pierwszego satelityorbit-sgp4-gpszgadza się z redukcją ERFA tego samego TLE (propagowanego pakietem Pythonasgp4) z dokładnością 2,3 cm. - Rodzaj
leo-navmsg, natywnie i w kompilacji przeglądarkowej. Rodzaj oblicza teraz każdą funkcję przestępną przez jedną przenośną bibliotekę matematyczną, więc jego ramka ma te same bajty na każdej platformie i w każdej kompilacji (przy Fixed). Wraz z tym zmienia się każda wartośćleo-navmsgoraz etapnavmsgwleo-pnt-chain. Rodzaj jest nowy w tym wydaniu, więc nic z wcześniejszego wydania się nie zmienia, ale zmieniają się wartości podane przed poprawką: wartość kontrolna zdocs/LEO-NAVMSG.mddla scenariusza kodowania i dekodowania wynosiła0x110315, a wynosi0x19105F, a SISRE zdekodowanej wiadomości to 0,129 cm. Na kshana.dev karta Missions dlaleo-navmsg-fit-interval-tradepokazywała najgorszy błąd odległości 1,6 mm przy dopasowaniu 60 s i 40,3 mm przy dopasowaniu 900 s; strona jest teraz budowana z silnika tego wydania i pokazuje 1,8 mm i 46,6 mm. - Mapa zasięgu zagłuszania na kshana.dev (Missions). Każda z jej 875 komórek to jeden przebieg
maritime-strait-jammingze zmienioną tylko pozycją odbiornika. Komórki są teraz obliczane z tych samych współrzędnych o trzech miejscach po przecinku, które odnośnik „open this run” komórki podaje Kshana Studio, więc komórka pokazuje dokładnie to, co odtwarza jej odnośnik. Średni stosunek jammera do sygnału (J/S) w 30 komórkach zmienia się o 0,1 dB, w górę lub w dół; dostępność śledzenia żadnej komórki się nie zmienia. Silnik daje identyczne wyniki dla każdej komórki w 0.28.0 i 0.29.0. - Próbkowanie z ziarnem w pakiecie WebAssembly (WASM). Kompilacja przeglądarkowa losowała inne indeksy bootstrapu i tasowania niż kompilacja natywna z tego samego ziarna (przy Fixed). Przedział
quantum-anomaly-detectpola pod krzywą w przeglądarce wynosił[0.9901265, 0.9938305], a teraz jest to natywne[0.99035875, 0.993861]. Żadna liczba natywna się nie zmienia.
Wartości podane w dokumentacji
Dokumentację przeaudytowano słowo po słowie względem przebiegów silnika tego wydania. Tam, gdzie podana wartość nie zgadzała się z przebiegiem, dokument poprawiono, a każda poprawka jest tu wymieniona, stare → nowe. W każdym poniższym przypadku wynik silnika się nie zmienił; to dokument źle go odczytał, źle zaokrąglił lub się zdezaktualizował.
- Audyt dokumentacji stron o widmie, konstelacjach, kampaniach, animacji, raportach i interoperacyjności oraz nowy
docs/SOLAR-SYSTEM.md. Każdą wartość przeliczono ponownie tym silnikiem. Zmieniają się dwie opublikowane liczby:docs/CONSTELLATION-DESIGN.mdpodawał test pokrycia dla 5 000 satelitów jako „około 0,13 s w kompilacji debug”; to się nie odtworzyło (1,24 s na obciążonym laptopie), więc strona podaje teraz udział prefiltra, który drukuje test (9,9 % z 19 440 000 testów par), oraz 0,14 s binarki wydaniowej dla dołączonegoleo-pnt-mega-shell. Ta sama strona podawała przecięcie E3F jako „off by 0,050 deg”; żaden test nie drukuje tej wartości, więc strona podaje teraz tylko próg 0,06 deg, który test wymusza, oraz wyprowadzenie 7,30 wobec 7,36 deg, które za nim stoi. Żaden wynik silnika się nie zmienia. - Dokumenty LEO-PNT: poprawione opublikowane wartości (przeliczone ponownie na silniku tego wydania).
docs/LEO-SIGNAL.mdkompromis między pasmami: opóźnienie jonosferyczne pierwszego rzędu dlageneric-swynosi 3,24 m (podano 3,25 m), a dlageneric-c-wide0,77 m (było 0,78 m).docs/LEO-NAVMSG.mdkodowanie i dekodowanie: SISRE zdekodowanej wiadomości podano jako 0,119 cm, gdy przebieg dał 0,122 cm; strona podaje teraz 0,129 cm, wartość po poprawce niezależności od platformy przy Fixed poniżej.docs/LEO-PASS.mdprzelot LEO w porównaniu z GNSS: o 32 dB mniejsza strata w wolnej przestrzeni w szczycie przelotu (było „26 do 32 dB”). Dla wartości sygnału i przelotu wynik silnika się nie zmienił; dokumenty źle go odczytały lub źle zaokrągliły. - Samouczki, przykład potoku roboczego i polecenie
/kshana-run, przeaudytowane względem silnika tego wydania. Rewizje opublikowanych wartości, stare → nowe: rodzajów, które zapisują<scenario>.table.csv, jest sześć, nie cztery (brakowałoleo-navmsgitelecom-timing;docs/tutorials/README.md,commands/kshana-run.md); przecięcie ½bT² dla zimnych atomów w Samouczku 3 wynosi 18 443 s, nie 18 440 s; błąd przejścia w obie stronyoem-interopwdocs/examples/multi-tool-pipeline.mdto zmierzone 4.88e-7 km, nie „~1e-7 km”; pasmo holdover CSAC w Samouczku 2 to 2000–3200 s, które test potwierdza, a nie „~2600–4400 s”; Samouczek 1 cytuje wiersze SP3 i blok geometrii z dokładnością, z jaką zapisuje je silnik. Żaden wynik silnika się nie zmienił. - Strony o walidacji, kwantowych, SGP4, animacji, twierdzeniach i integralności.
docs/VALIDATION.md: wymuszany próg dla symulowanego jednosekundowego odchylenia Allana zegara z szumem białym częstotliwości wynosi 20 % (podano 25 %; próg 25 % dotyczy krzywej przy 1, 10 i 100 s); wiersz błądzenia losowego prędkości podaje teraz swój wymuszany próg 20 % obok obserwowanych około 12 %; a dostępność zegara atomowego w skali chipa worbit-gnss-challengedwynosi około 0,73 (podano około 0,83).docs/QUANTUM.md: szum pojedynczego strzału ograniczony wibracjami w przykładzie roboczym zimnych atomów na stronie wynosi około 46 razy jego dolną granicę szumu śrutowego (było „~45×”; przeliczone 46,49), a zakres „1–50 µg/√Hz” dla urządzeń terenowych, który przeczył urządzeniu cytowanemu przez samą stronę, zastąpiono opublikowanymi wartościami dwóch cytowanych urządzeń.docs/SGP4-VALIDATION.md: najgorsza różnica pozycji wynosi 4,12 mm (było „≈ 4 mm”), z nazwanym satelitą.docs/ANIMATION.md: przykład z koderem wideo odczytywał klatki o 24 klatkach na sekundę jako 12; teraz używa 24, czyli częstotliwości podanej w manifeście klatek.docs/CLAIMS-VS-REALITY.md: model zagłuszania ma 10 testów (było 8), a „2,97 m wobec 48,8 m” dla filtru sprzężonego zastąpiono tym, co jego test potwierdza (sprzężony błąd pozycji poniżej 0,6 razy błędu niesprzężonego, wygrywając w co najmniej 90 z 100 prób).docs/INTEGRITY.md: stempel „Today” brzmiał v0.22.0; teraz nazywa to wydanie, a dwie możliwości zbudowane od tamtej pory (tryb błędu całej konstelacji i wiadomość wsparcia integralności) znikają z jego listy luk.
Dodano#
Widmo
- Rodzaj scenariusza
spectrum: model widma pasma L i wodospad (src/spectrum.rs,src/sigmf.rs,docs/SPECTRUM.md). Całe pasmo L GNSS jako jedna gęstość widmowa mocy (PSD): GPS L1 kod zgrubny/akwizycyjny (C/A) i L2 cywilny (L2C) (BPSK(1)), Galileo E1 (multipleksowana modulacja z przesunięciem binarnym nośnej, MBOC(6,1,1/11), lub BOC(1 1)), GPS L5 i Galileo E5a (BPSK(10)), poziom szumu kT ze współczynnikiem szumu odbiornika oraz jammery fali ciągłej (CW), wąskopasmowe, z przemiataniem i z szumem dopasowanym na zapisanej osi czasu. Każdy jammer jest oceniany w każdym paśmie przez swój współczynnik separacji widmowej (SSC), co daje stosunek jammera do sygnału (J/S) i efektywny stosunek mocy nośnej do gęstości szumu (C/N0) na pasmo na wiersz. Wykres to wodospad SVG z słupkami C/N0; result.json zawiera siatkę uśrednioną blokowo w mocy. Opcjonalne[iq]rysuje model jako próbki IQ, zapisuje i odczytuje nagranie Signal Metadata Format (SigMF) (cf32_le,ci16_le) i porównuje estymatę Welcha z modelem; opcjonalne[recording]estymuje rzeczywisty plik SigMF. Dołączony przykładscenarios/l-band-waterfall-jamming.toml: przemiatany sygnał przejmuje L1 C/A i E1 w 10 s, ton CW na nośnej L1 utrzymuje C/A na poziomie 17,98 dB-Hz po ustaniu przemiatania, podczas gdy E1, którego widmo ma tam zero, wraca do normy; L5 i E5a pozostają nietknięte.- Nowy wiersz VALIDATED: PSD i SSC sygnałów, względem głównego listka BPSK(n) o szerokości 2n x 1,023 MHz, listków BOC(1 1) wyśrodkowanych w +/-1.023 MHz, zamkniętych postaci Parsevala stojących za opublikowanymi SSC -61.8 / -64.8 / -67.8 dB/Hz oraz podręcznikowych Q = 1 (CW) i 1,5 (dopasowany). Maksimum PSD BOC(1 1) leży w +/-0.759 MHz, a nie w środku listka; test przypina jedno i drugie.
- Dwa nowe wiersze MODELLED: wodospad i oś czasu C/N0, które sprowadzają się dokładnie do łańcucha rodzaju
jamming(sprawdzane krzyżowo w każdym raporcie), oraz kodek SigMF i estymator Welcha. W repozytorium nie ma żadnego nagrania osób trzecich. navsignal: wariant MBOC orazspectral_separation_coeff_offset.- Raport drukuje wartość C/N0, jaką dałaby reprezentatywna tabela Q rodzaju
jamming, obok wartości wyprowadzonej z widma; dla tonu CW na nośnej C/A różnią się one o 1,8 dB. Trzy nowe wiersze macierzy: jeden sprawdzony (widma sygnałów i współczynniki separacji widmowej) i dwa obliczone z modelu.
Układ Słoneczny
- Efemerydy Układu Słonecznego i pozycjonowanie wokół dowolnego ciała. Dwa nowe rodzaje scenariuszy.
solar-system: Słońce, osiem planet, Pluton, Księżyc, Fobos, Deimos, Io, Europa, Ganimedes, Kallisto i Tytan w jednej epoce: położenie i prędkość heliocentryczne w Międzynarodowym Niebieskim Układzie Odniesienia (ICRF), parametr grawitacyjny, promienie, J2 (druga harmoniczna strefowa), tam gdzie jest opublikowana, rotacja gwiazdowa, biegun i południk zerowy według Międzynarodowej Unii Astronomicznej (IAU), ślad orbity w ciągu jednego obiegu oraz czas światła, odległość w jedną i w obie strony, solarne opóźnienie Shapiro i separacja od Słońca z ciała obserwatora i dla każdego dodatkowego łącza. Planety pochodzą z elementów keplerowskich Jet Propulsion Laboratory (JPL) według Standisha i Williamsa (Tabela 1, 1800 AD do 2050 AD; Tabele 2a/2b, 3000 BC do 3000 AD); księżyce z elementów średnich JPL z synchroniczną prędkością obrotu według IAU, a Tytan z modelu rotacji IAU. Przykład:scenarios/solar-system-tour.toml.body-pnt: orbiter lub lądownik na powierzchni wokół dowolnego z tych ciał, nawigujący za pomocą pseudoodległości z konstelacji Walkera wokół ciała i odległości w obie strony bez zegara z Ziemi; rozmycie dokładności, niepewność formalna i rozwiązania metodą najmniejszych kwadratów z ziarnem, z łączem z Ziemią i bez niego. Przykłady:scenarios/mars-orbit-pnt.toml,scenarios/europa-surface-pnt.toml.Bodyzyskuje Merkurego, Wenus, Jowisza, Saturna, Urana, Neptuna, Plutona i siedem księżyców, wyszukiwanie po nazwie oraz rekord fizyczny;AnalyticSolarSystempodaje dowolne ciało względem dowolnego innego przez istniejący szewEphemerisProvider.- VALIDATED względem JPL Horizons (Development Ephemeris DE441; wzorce i zapytania w
tests/fixtures/solar_system/): od Merkurego do Saturna oraz Ziemia z Tabeli 1 w granicach dwukrotności podanego błędu nominalnego (najgorzej 1,87 razy), wszystkie osiem planet z Tabel 2a/2b (najgorzej 1,71 razy) oraz czas światła Ziemia–Mars i Ziemia–Jowisz. MODELLED: Uran i Neptun z Tabeli 1, które przekraczają podany błąd względem DE441 (2,0 i 5,2 razy), Pluton, księżyce, stałe ciał i wynikibody-pnt. - Ustalenie: szereg księżycowy Montenbrucka i Gilla w
src/ephem.rsjest już odniesiony do równonocy J2000 przez własny człon precesji (0,05 stopnia od Horizons), więc używa się go bez dodatkowej rotacji precesji. Sześć nowych wierszy macierzy: dwa sprawdzone (położenia planet, czas światła) i cztery obliczone z modelu.
Konstelacje wokół dowolnego ciała
- Projektowanie konstelacji na dużą skalę (rodzaj
constellation-design,src/constellation.rs). Wzory Walker delta i Walker star (T/P/F), jawne listy elementów i projekty wielopowłokowe, kilka konstelacji na przebieg, wokół Ziemi, Księżyca, Marsa lub innej planety, Plutona albo większego księżyca, ze stałych ciał dodanych przez rodzajsolar-system. Presety z opublikowanych elementów nominalnych: bazowa i rozszerzalna 24-slotowa konstelacja Global Positioning System (GPS) (Standard Positioning Service Performance Standard, SPS PS, 2020), Galileo Walker 24/3/1 (Open Service Service Definition Document, wydanie 1,1), BeiDou na średniej orbicie okołoziemskiej Walker 24/3/1 plus satelity geostacjonarne i nachylone geosynchroniczne (Open Service Performance Standard 3,0) oraz GLONASS 24/3/1 (Interface Control Document 5,1). Pokrycie i rozmycie dokładności (DOP) na siatce szerokości i długości geograficznej: satelity w zasięgu widzenia, GDOP, PDOP, HDOP i VDOP (geometryczne, położenia, poziome, pionowe) i dostępność na komórkę, globalnie i w najgorszym miejscu, z jednym zegarem odbiornika na konstelację. Prefiltr widoczności (półkąt pokrycia plus pas szerokości podsatelitarnej, dokładny na ciele kulistym) przetwarza 5 000 satelitów na siatce 10 deg w około 0,13 s w kompilacji debug.- VALIDATED: generator Walkera odtwarza Tabelę 23 Galileo OS SDD i wzór slotów z GLONASS ICD; preset GPS odtwarza kolumnę przecięć równika z SPS PS (35 z 36 lokalizacji w granicach 0,0108 deg; E3F w granicach 0,06 deg, przy czym własny wiersz tabeli jest niespójny); bazowy globalny rozkład HDOP dla GPS zgadza się z Dodatkiem B SPS PS (mediana 0,940 wobec 0,94, 95 % 1,255 wobec 1,25, średnia 0,965 wobec 0,96; próg 0,03).
- MODELLED: dowolne projekty, inne ciała, faza BeiDou i węzły nachylone geosynchroniczne, orbity dwóch ciał z opcjonalnym J2, wyłącznie geometria.
- Scenariusze:
constellation-multi-gnss-coverage(102 satelitów, dostępność 100 %, mediana PDOP 0,95, 31,0 w zasięgu widzenia powyżej 10 deg),leo-pnt-mega-shell(5 000 satelitów, dostępność 99,22 % przy PDOP 3 lub mniejszym powyżej 20 deg, 0 % na czapach polarnych, prefiltr zachowuje 11,5 % testów par),lunar-relay-constellation(14 satelitów wokół Księżyca, dostępność 21,33 % ogółem i najwyższa nad rejonem południowego bieguna). Wszystkie trzy są dołączone dokshana example. Uwagi:docs/CONSTELLATION-DESIGN.md. Trzy nowe wiersze macierzy: dwa sprawdzone (generator Walkera i presety GNSS, globalny DOP GPS) i jeden obliczony z modelu.
- Kampania napędzana modelem widma i konstelacje wokół dowolnego ciała.
scenarios/campaign-spectrum-holdover-integrity.tomlłączy rodzajspectrumz holdoverem zegara i monitorem integralności (przemiatany sygnał przejmuje L1 C/A i E1; ton CW utrzymuje następnie C/A w dole, podczas gdy E1 wraca do normy, a odbiornik przechodzi na niebo wyłącznie Galileo), przypięta względem samodzielnego przykładu wodospadu wtests/campaign_composition_reference.rs.constellation-designrozwiązuje teraz swoje ciało centralne przezBody::by_name, więc konstelację można rozmieścić wokół dowolnej planety, Plutona lub większego księżyca ze stałymi używanymi przez rodzajsolar-system.
Kampanie
- Kampanie: wiele scenariuszy złożonych w jeden przebieg. Nowy rodzaj
campaign(src/campaign.rs, opisany wdocs/CAMPAIGNS.md) uruchamia członków istniejących rodzajów przez to samo rozdzielanie co wiersz poleceń i odczytuje liczby z ich wyników. Cztery sekcje, w dowolnej kombinacji:[[phases]]: łańcuchowa misja na jednej osi czasu. Presety dla poszczególnych rodzajów odczytują błąd czasu zegara względem jego strażnika, średni efektywny stosunek mocy nośnej do gęstości szumu (C/N0) względem progu śledzenia, pionowy poziom ochrony względem limitu alarmu, błąd pozycji, śledzące satelity i flagi alarmów, utrzymane na wspólnej siatce z granicami faz i zdarzeniami. Stan jest przekazywany przezcarry,handoffiend_at.[sweep]: od jednego do trzech kluczy z kropkami dowolnego rodzaju, opcjonalnie z zespołem z ziarnem w każdym węźle.[monte_carlo]: realizacja k przy ziarnie bazowym + k, ze średnią, rozrzutem, percentylami i 95% przedziałem ufności bootstrapu ze stałym ziarnem.[compose]: wspólne wartości powiązane z kilkoma członkami, ze złożonym podsumowaniem najlepszego i najgorszego przypadku. Każdy wynik niesie hasz kampanii i skrót ze wszystkich wyników członków. Cztery dołączone scenariusze:campaign-jam-spoof-holdover-integrity(nominalny, zagłuszanie, spoofing zakończony przy detekcji monitora zegara po 370 s, holdover z przesunięciem 37,0 ns po spoofingu przy bezwładnościowym wybiegu, alarm integralności, odzyskanie),campaign-sweep-jammer-power,campaign-shared-jammer-sea-roadicampaign-monte-carlo-clock-holdover.tests/campaign_composition_reference.rsprzypina tożsamości złożenia: kampania jednofazowa odtwarza samodzielny przebieg bit w bit dla trzech rodzajów, zespół ze stałym ziarnem jest stabilny co do bajta, a przy zegarze z szumem białym częstotliwości średnia zespołu leży wewnątrz zgłoszonego przedziału, z rozrzutem wewnątrz przedziału chi-kwadrat dla sqrt(q_wf * tau) = 16,459 ns. Trzy nowe wiersze macierzy typu obliczonego z modelu.
Animacja
- Eksport animacji (
--animate svg|html|frames|all,src/animation.rs,docs/ANIMATION.md). Każdy przebieg, którego wynik zawiera szereg czasowy, można teraz zapisać jako animowany plik Scalable Vector Graphics (SVG) (klatki kluczowe Cascading Style Sheets, bez skryptu: ślady rysują się za poruszającym się kursorem czasu), jeden samodzielny odtwarzacz HyperText Markup Language (HTML) (odtwarzanie i pauza, przewijanie, prędkość, każdy panel na jednym zsynchronizowanym kursorze, znaczniki zdarzeń przewijające po kliknięciu; bez zewnętrznych zasobów) albo ponumerowaną sekwencję klatek SVG z plikiemmanifest.jsonpodającym liczbę klatek na sekundę, czas trwania i czasy klatek dla kodera wideo. Kampania odtwarza się jako jej fazy z zaznaczonymi alarmami; przebieg widma animuje swój wodospad wiersz po wierszu. Odtwarzacz stosuje się doprefers-color-scheme, a przyprefers-reduced-motionzarówno SVG, jak i odtwarzacz pokazują gotowy obraz zamiast ruchu.--animate-fpsi--animate-durationustawiają odtwarzanie;kshana::api::animate_tomlikshana::animation::animate_resultto punkty wejścia biblioteki, aresult.jsonzyskuje blokanimationtylko wtedy, gdy działa--animate. Wynik jest czystą funkcją wyniku i opcji, identyczny bajt w bajt przy ponownym przebiegu, bez znacznika czasu. Rodzaj bez próbkowanej osi czasu zostaje odrzucony z komunikatem „no time series to animate” i nic nie jest zapisywane. Eksporter rysuje własne próbki przebiegu i nie dodaje żadnej liczby, więc jest MODELLED (wewnętrzna spójność) i nie ma wiersza macierzy weryfikacji; żadna opublikowana liczba się nie zmienia. Testy:tests/animation.rs(determinizm, liczba klatek, brak zewnętrznego adresu, poprawnie sformułowany XML, ścieżka ograniczenia ruchu i animowanie każdego dołączonego scenariusza z szeregiem czasowym).
Raporty
- Zaawansowane raporty z przebiegów (
src/advanced_report.rs, docs/REPORTS.md). Każdy przebieg z interfejsu wiersza poleceń (CLI) zapisuje teraz<scenario>.report.html, raport HyperText Markup Language (HTML) do wydruku, oraz<scenario>.report.json, tę samą treść jako dokument JavaScript Object Notation (JSON) czytelny dla maszyn. Sekcje: streszczenie dla kierownictwa; każde wejście scenariusza z jego jednostką, odczytaną ze schematu jednostek pól (blokunitswyniku), w przeciwnym razie z sufiksu nazwy pola, w przeciwnym razie podane jako niepodane; wyniki z wykresem przebiegu, każdą wartością skalarną i podsumowaniem każdej kolumny liczbowej; dla kampanii tabela węzłów przeglądu, średnia Monte Carlo, odchylenie standardowe, percentyle 5. / 50. / 95. i przedział ufności bootstrapu z histogramem dla każdej metryki, tabela faz łańcucha albo członkowie kompozycji i podsumowanie złożone (oraz siatka przebiegusweeplubsweep-nd); oś czasu zdarzeń; etykieta VALIDATED / MODELLED / PARTNER, wyrocznia i dowody testowe każdego wiersza macierzy weryfikacji, który wykorzystują rodzaje przebiegu, odczytane z macierzy przez tabelę przyporządkowania rodzaj–wiersz (wiersz, który ocenia jedną ścieżkę wejściową, taką jak ścieżka Simplified General Perturbations 4 (SGP4) rodzajuorbitlub ścieżka zmierzonego zapisu rodzajuslot-timing, jest wymieniany tylko wtedy, gdy przebieg poszedł tą ścieżką, a wiersz czytnika Shuttle Radar Topography Mission (SRTM) nie jest wymieniany dla żadnego rodzaju, ponieważ żadne pole scenariusza nie czyta kafla SRTM); stwierdzenia o tym, czego nie modelowano, i założenia, każde zacytowane ze swoim źródłem; oraz zapis odtwarzalności (wersja silnika, commit źródłowy, gdy kompilacja ustawiaKSHANA_GIT_COMMIT, skróty Secure Hash Algorithm 256-bit (SHA-256) pliku scenariusza i dokumentu wyniku, ziarno, platforma i dokładne polecenie). Raport nie czyta zegara: ten sam scenariusz, ziarno i kompilacja silnika dają raport identyczny bajt w bajt, a jedyny znacznik czasu, jaki może pokazać, to ten, który--study-namejuż zapisuje. Arkusz stylów do druku mieści się na A4 i US Letter, powtarza nagłówki tabel i utrzymuje wiersze i rysunki w całości na stronach; plik Portable Document Format (PDF) powstaje przez „Zapisz jako PDF” w przeglądarce. Nie ma opcji--report pdf, ponieważ renderowanie wykresów do PDF wymagałoby nowej, ciężkiej zależności. Testy:tests/advanced_report.rsraportuje każdy dołączony scenariusz (żadnej pustej sekcji, żadnego tekstu zastępczego, etykiety równe macierzy, skrót scenariusza równy skrótowi pliku, identyczność bajt w bajt przy ponownym przebiegu), atests/advanced_report_cli.rsponownie uruchamia zapisane polecenie w nowym katalogu i wymaga identycznego bajt w bajtresult.json. Żadna opublikowana liczba się nie zmienia, a liczby rodzajów, plików scenariuszy i wierszy macierzy pozostają bez zmian. - Raport, animacja i eksporty działają razem. Raport zaawansowany zyskuje sekcję „Animation and exports”: animowany rysunek przebiegu osadzony jako nieaktywny obraz (lub powód, dla którego go nie ma), odnośniki do plików animacji i eksportu zapisanych obok oraz każdy format interoperacyjności z informacją, czy ma zastosowanie, dlaczego nie, i jego specyfikacją;
report.jsonzawiera ten sam blokcompanions. Odtwarzacz animacji HTML wymienia pliki eksportu zapisane obok niego. Interfejs wiersza poleceń (CLI) renderuje teraz eksporty przed zapisaniem raportu, więc oba mogą nazywać te pliki.
Eksporty interoperacyjności
- Eksporty i importy interoperacyjności (
--export,src/interop/, docs/INTEROP.md).kshana <scenario.toml> --export <format>zapisuje geometrię scenariusza jako CZML (Cesium Language), KML (Keyhole Markup Language 2,2, standard Open Geospatial Consortium, ze śladami ze znacznikami czasugx:Track), GeoJSON (Internet Engineering Task Force Request for Comments 7946) i efemerydy Ansys STK (Systems Tool Kit).e(EphemerisTimePosVel, metry, jeden plik na poruszający się obiekt), a zsyntetyzowaną migawkę IQ (składowe synfazowa i kwadraturowa) rodzajuspectrumjako parę SigMF (Signal Metadata Format) przez istniejącysrc/sigmf.rs.--export allzapisuje każdy format, który ma zastosowanie, i drukuje, dlaczego pozostałe nie;--export listraportuje bez uruchamiania. Poruszające się obiekty są zapisywane w Geocentrycznym Niebieskim Systemie Odniesienia (CZMLINERTIAL, STKICRF) oraz jako długość, szerokość i wysokość związane z Ziemią w WGS 84 (World Geodetic System 1984) (KML, GeoJSON); stałe miejsca w CZML toFIXED. Rodzajjammingdodaje dwa zasięgi jammerów z własnych równań łącza.--import-route <file.geojson>zapisuje GeoJSONLineStringw wejściach śladuterrain-nav,terrain-slam,gravity-mapicombined-altpnt. Eksporty są deterministyczne co do bajta i nie niosą znacznika czasu.tests/interop_formats.rswaliduje każdy eksport względem opublikowanej specyfikacji, porównuje wyeksportowane stany satelitów z własnymi stanami silnika z dokładnością 1 mm i przepuszcza każdy dołączony scenariusz przez każdy format, każdy albo eksportuje, albo podaje dlaczego nie (tabela w docs/INTEROP.md). Żadna opublikowana liczba się nie zmienia: synteza IQ rodzajuspectrumprzeniesiona do jednej wspólnej funkcji, a jego dokument wyniku jest identyczny bajt w bajt, aPassesScenariozyskujepropagator()iepoch_calendar()używane przez jego własny przebieg. Liczby rodzajów, plików scenariuszy i wierszy macierzy weryfikacji pozostają bez zmian. Scenariusz orbity lub integralności bezepochjest datowany własnymi danymi swoich satelitów:t = 0to najwcześniejsza epoka TLE (zestawu elementów dwuliniowych), efemerydy rozgłaszanej lub SP3 (Standard Product 3), a każdy taki satelita jest obracany do układów GCRS i związanych z Ziemią w swojej własnej chwili; 2000-01-01T00:00:00Z jest używane tylko wtedy, gdy żaden satelita nie niesie epoki. Eksporty SP3 i OEM (Orbit Ephemeris Message) zachowują swoją etykietę 2000-01-01. Aby to wesprzeć, dodanoSgp4::epoch_jd_utc,Sp3Interpolator::jd_ut1iPropagator::own_jd_utc; nic, co istniało, ich nie czyta.
Nawigacja z niskiej orbity okołoziemskiej: sygnał
- Projekty sygnałów LEO-PNT i widmo wielopasmowe. Nowy rodzaj
leo-signali rodzajspectrum, który sięga poza pasmo L: jeden rodzaj, cztery pliki scenariuszy (trzy dołączone; plik Celeste IOD jest tylko w repozytorium) i cztery wiersze macierzy (dwa VALIDATED, dwa MODELLED).leo-signal: sparametryzowane projekty sygnałów pozycjonowania, nawigacji i czasu (PNT) z niskiej orbity okołoziemskiej (LEO) dla dowolnego systemu (pasmo, szerokość pasma nadawania, przydział ITU; składowe akwizycyjna, danych i pilotowa z widmami BPSK(n), BOC(m,n), MBOC lub płaskimi, udziałami mocy, podnośnymi FDMA, długościami kodu i szybkościami danych), z wkompilowanych publicznych plików presetów wdata/leo-signals/(Xona Pulsar X1/X5, Iridium STL, sygnał okazji Starlink, CentiSpace, reprezentatywny projekt w paśmie C oraz reprezentatywne projekty UHF/L/S/C/szerokie C, każdy z podanym adresem URL źródła) albo zapisane w treści. Na sygnał: PSD ograniczone pasmem i udziały mocy w paśmie, szerokość pasma Gabora, ograniczony pasmem jitter śledzenia kodu wczesny–późny względem C/N0 i odstępu (Betz i Kolodziejski 2009) oraz dokładność wyznaczania odległości, przestrzeń przeszukiwania akwizycji, prawdopodobieństwo detekcji i średni czas akwizycji szeregowej i równoległej względem kodu, SSC do GPS L1 C/A, Galileo E1, GPS L5, Galileo E5a, E5b i AltBOC i z nich, wraz ze stratą C/N0, tolerancją J/S dla CW, szerokopasmową i dopasowaną z kodu SSC rodzaju widma, kompromis między pasmami (opóźnienie jonosferyczne, strata w wolnej przestrzeni, wyznaczanie odległości przy równym C/N0 i równym EIRP, tolerancja na jammer) oraz opcjonalne kontrole kształtu względem opisanego pomiaru. Przykłady:scenarios/leo-band-trade.toml,scenarios/xona-pulsar-signals.toml,scenarios/celeste-iod-classical-pilot-signals.toml(pasma i konfiguracja sygnału Celeste IOD przedstawione na warsztatach ESA NAVISP LEO-PNT, 2026; wstrzymane razem z presetem Celeste IOD, zob. „LEO-PNT end to end” poniżej). Uwagi wdocs/LEO-SIGNAL.md.spectrum: pasma mogą być teraz presetowym projektem sygnału (każda składowa narysowana, ograniczona pasmem, C/N0 i J/S odniesione do śledzonej składowej) albo własną nośną i modulacją;[[panels]]dodają wodospady dla innych zakresów częstotliwości na jednej osi czasu; jammerwideband(zaporowy) dołącza do czterech przebiegów. Raport dodajebands[].tracked_power_dbw,bands[].designipanelsoraz jeden wpisnot_modelled. Zwykłe pasma dają te same liczby co wcześniej. Przykład:scenarios/multi-band-jamming-waterfall.toml.navsignalzyskuje całkę sinusową, zamknięte postaci mocy BPSK w paśmie i szerokości pasma Gabora ograniczonej pasmem, jitter wczesny–późny ograniczony pasmem dla dowolnego widma i jego granicę Gabora, zamkniętą postać SSC dla przesuniętego BPSK, widmo Galileo E5 AltBOC(15 10) oraz parser etykiet modulacji;Modulation::labeldrukuje BPSK(1/3) jako ułamek.- Cztery wiersze macierzy: VALIDATED zamknięte postaci ograniczone pasmem (90,3 % mocy BPSK w głównym listku, jitter sprowadzający się do postaci koherentnej Kaplana i Hegarty'ego, 0,0039564 chipa przy 45 dB-Hz, B_L 1 Hz, d 1 chip, T 20 ms, oraz do swojej granicy Gabora, i własne SSC BPSK 2/(3 R_c); zamknięta postać Gabora i przesunięte SSC względem jego postaci Parsevala podano jako wewnętrzne kontrole krzyżowe); VALIDATED maksymalny Doppler LEO (Xona X1 33,2 kHz w opublikowanym zakresie od 32 do 34 kHz, Iridium w granicach 0,5 kHz od 36 kHz); MODELLED
leo-signal; MODELLED widmo wielopasmowe.
Nawigacja z niskiej orbity okołoziemskiej: łącze
- Przelot LEO-PNT i bilans łącza dla każdego pasma: rodzaj
leo-pass. LEO-PNT to pozycjonowanie, nawigacja i czas z satelitów na niskiej orbicie okołoziemskiej (LEO). Użytkownik (naziemny, morski, powietrzny lub we wnętrzu, nieruchomy lub w ruchu) i jeden lub więcej satelitów LEO z zaprojektowanego przelotu, jawnych elementów, zestawu elementów dwuliniowych (TLE) przez SGP4 albo konstelacji Walkera z koduconstellation-design. Na satelitę, pasmo i epokę: kąty widzenia, odległość, zamknięta postać prędkości i przyspieszenia zmiany odległości (sprawdzane w każdym przebiegu względem różnic centralnych), Doppler i jego tempo, strata w wolnej przestrzeni, EIRP (równoważna moc promieniowana izotropowo) z charakterystyką satelity izoflux, wiązką gaussowską lub płaską, antena użytkownika typu patch, tłumienie gazowe ITU-R P.676, tłumienie deszczu ITU-R P.838/P.618, scyntylacja troposferyczna P.618, strata wnikania do budynku ITU-R P.2109 dla użytkownika we wnętrzu, niedopasowanie polaryzacji, temperatura szumowa systemu i C/N0 (stosunek mocy nośnej do gęstości szumu); opóźnienie jonosferyczne pierwszego rzędu w każdym paśmie z ukośnego TEC (całkowitej zawartości elektronów) według Klobuchara lub pionowego TEC poniżej satelity oraz pary pasm wolne od jonosfery z ich wzmocnieniem szumu. Satelity Galileo lub GPS są oceniane tym samym odbiornikiem na podstawie mocy odbieranych z dokumentów interfejsu, więc dzwonowaty przelot LEO i płaskie nośne MEO (średnia orbita okołoziemska) mają wspólny wykres. Sekcja[iot]podaje czas do pierwszego rozwiązania pozycji, energię na rozwiązanie i czas pracy baterii względem cyklu pracy (MODELLED).- Niezależność od systemu: silnik nie potrzebuje żadnego presetu. Opcjonalne presety, każdy w osobnym pliku i oznaczony PUBLIC (z URL), REPRESENTATIVE lub WORKSHOP: ogólny wielopasmowy (UHF, L, S, C), ogólne pasmo C, Xona Pulsar X1/X5 (arXiv 2509,19551), Iridium STL, Starlink jako sygnał okazji wyłącznie dopplerowski, CentiSpace oraz Celeste IOD (demonstracja na orbicie), którego parametry sygnału przedstawiono na warsztatach ESA NAVISP LEO-PNT, 2026, i które znajdują się w
src/celeste_iod.rs, aby można je było wstrzymać (zob. „LEO-PNT end to end” poniżej). - Publiczne bloki konstrukcyjne w
src/leo_link/(geometry, antenna, itu, iono, energy, presets), które mogą wywoływać inne moduły. - Scenariusze:
leo-pass-vs-gnss-cn0,leo-indoor-uhf,leo-iot-energy,leo-pass-xona-pulsar,leo-pass-iridium,leo-pass-celeste-iod-multiband. - Dziewięć wierszy macierzy. VALIDATED (6): współczynniki ITU-R P.838-3 względem jego Tabeli 5; tłumienie deszczu i scyntylacja P.618-14 względem przykładów walidacyjnych ITU-R Study Group 3; strata wnikania do budynku P.2109 względem skoroszytu Study Group 3; skalowanie jonosferyczne pierwszego rzędu względem stosunku opóźnień grupowych z IS-GPS-200, ze stratą w wolnej przestrzeni; maksymalny Doppler użytkownika nieruchomego na orbicie kołowej względem arXiv 2509,19551, Tabela 1. MODELLED (3): przelot i bilans łącza, presety oraz bilans rozwiązania niskoenergetycznego. Jeden rodzaj i sześć plików scenariuszy. Uwagi w
docs/LEO-PASS.md.
- Niezależność od systemu: silnik nie potrzebuje żadnego presetu. Opcjonalne presety, każdy w osobnym pliku i oznaczony PUBLIC (z URL), REPRESENTATIVE lub WORKSHOP: ogólny wielopasmowy (UHF, L, S, C), ogólne pasmo C, Xona Pulsar X1/X5 (arXiv 2509,19551), Iridium STL, Starlink jako sygnał okazji wyłącznie dopplerowski, CentiSpace oraz Celeste IOD (demonstracja na orbicie), którego parametry sygnału przedstawiono na warsztatach ESA NAVISP LEO-PNT, 2026, i które znajdują się w
Nawigacja z niskiej orbity okołoziemskiej: wiadomość nawigacyjna
- Wiadomość nawigacyjna LEO (rodzaj
leo-navmsg,src/leo_navmsg/). Rozgłaszana wiadomość z efemerydami i zegarem satelity pozycjonowania, nawigacji i czasu (PNT) na niskiej orbicie okołoziemskiej (LEO), dla dowolnej orbity, nośnej i modelu; nazwane presety są danymi opcjonalnymi, a każda możliwość działa bez nich. Jeden rodzaj, pięć plików scenariuszy i dziewięć wierszy macierzy (trzy VALIDATED, sześć MODELLED). Zob.docs/LEO-NAVMSG.md.- Zawartość wiadomości: SVID, wydanie danych, pasmo i stan sprawności sygnału; tydzień, czas tygodnia i wielomian zegara drugiego rzędu; efemerydy w jednym z czterech modeli — 16-parametrowy zestaw keplerowski z Galileo OS SIS ICD, ten zestaw plus wielomiany poprawek wzdłuż toru, poprzecznych do toru i radialnych, 22-parametrowy model Liu i in. 2025 (doi 10.3390/rs17162894) albo wielomian ECEF ATOMIC z zerowym zegarem — oraz zestaw Klobuchara, współczynniki NeQuick-G z efektywnym poziomem jonizacji i parametry czasu systemowego do UTC z przypadkami sekundy przestępnej z ICD.
- Dopasowanie: orbita prawdziwa całkowana z grawitacją zonalną J2–J6 lub EGM2008 i oporem, zegar swobodny lub sterowany z ziarnem, dopasowanie Levenberga–Marquardta na elementach niesingularnych, następnie liniowe wielomiany poprawek metodą najmniejszych kwadratów oraz zegar dopasowany po odjęciu relatywistycznego członu użytkownika.
- Cztery analizy i scenariusze:
leo-navmsg-fit-interval-trade(błąd odległości sygnału w przestrzeni (SISRE) względem przedziału dopasowania i okresu aktualizacji),leo-navmsg-model-comparison(cztery modele, bity i 22-parametrowe dopasowanie Kshana na wysokościach z Liu i in. obok opublikowanych wartości, MODELLED),leo-navmsg-midpass-update(ciągłość przy każdym przełączeniu wiadomości w przelocie) ileo-navmsg-encode-decode(własna udokumentowana ramka binarna Kshana z CRC-24Q i bilansem kwantyzacji, blok w stylu RINEX-4 oznaczony jako rozszerzenie Kshana oraz tabela CSV). - VALIDATED: globalnie uśrednione wagi SISRE względem opublikowanej tabeli orbit średnich i geostacjonarnych Montenbrucka i in. 2018; algorytm użytkownika Galileo względem RTKLIB na czterech rzeczywistych rozgłaszanych efemerydach Galileo (
tests/leo_navmsg_reference.rs); CRC-24Q względem wartości kontrolnej z katalogu i ramki przykładowej RTCM 10403 1005. - Presety, po jednym pliku ze źródłami: Xona Pulsar i Pulsar-0, Iridium, Starlink, CentiSpace, reprezentatywny system w paśmie C, ATOMIC oraz Celeste IOD (jedyny preset używający materiałów przedstawionych na warsztatach ESA NAVISP LEO-PNT, 2026, przechowywany w
src/celeste_iod.rsrazem ze swoimi scenariuszami, aby można go było wstrzymać).
Nawigacja z niskiej orbity okołoziemskiej: fuzja
- Połączone pozycjonowanie, nawigacja i czas MEO + LEO:
leo-pvt,leo-pppintn-positioning. Trzy nowe rodzaje scenariuszy wsrc/leo_fusion/, niezależne od systemu: każda konstelacja to powłoki Walkera, zestawy elementów lub preset GNSS, każdy sygnał to nośna, szybkość chipów i obwiednia stosunku mocy nośnej do gęstości szumu (C/N0), każdy bilans błędów to jawne jedno sigma, a nazwane systemy na niskiej orbicie okołoziemskiej (LEO) są opcjonalnymi presetami, po jednym pliku ze źródłami oznaczonymi jako publiczne, z warsztatów lub wyprowadzone (Xona Pulsar X1/X5, Iridium Satellite Time and Location (STL), sygnały okazji Starlink, CentiSpace, reprezentatywny system w paśmie C, model efemeryd ATOMIC z zerowym zegarem oraz jeden preset ESA Celeste z demonstracji na orbicie, którego parametry wyprowadzone z warsztatów znajdują się wsrc/celeste_iod.rs, aby można je było wstrzymać).leo-pvtma cztery tryby: pozycjonowanie dopplerowskie (wsadowa metoda najmniejszych kwadratów na prędkości zmiany odległości ze stanami dryfu zegara i prędkości, tryb sygnałów okazji wyłącznie dopplerowski, dokładność wzdłuż toru i poprzeczna do toru w pojedynczym przelocie oraz obwiednia Dopplera, tempa Dopplera i szarpnięcia); łączną ważoną metodę najmniejszych kwadratów GNSS + LEO z jednym zegarem na system (przesunięcie międzysystemowe) lub znanym przesunięciem, z sigmami poszczególnych pomiarów jako wejściami i DOP względem liczby satelitów LEO; pokrycie polarne i arktyczne względem szerokości geograficznej; oraz transfer czasu LEO do uniwersalnego czasu koordynowanego (UTC) względem C/N0 i oscylatora odbiornika z wyrażeniem czasu systemowego do UTC z IS-GPS-200.leo-ppp: filtr Kalmana rozszerzony dla precyzyjnego pozycjonowania punktowego (PPP) z liczbami zmiennoprzecinkowymi na kodzie i fazie wolnych od jonosfery, tylko GNSS i z wsparciem LEO, z czasem zbieżności i testem spójności NEES (znormalizowany kwadrat błędu estymacji) metodą Monte Carlo. Dołączony scenariusz daje 7,4 min z czterema systemami MEO oraz 4,8, 3,2, 2,7 i 2,3 min przy 60, 96, 192 i 288 satelitach LEO, obok 9,6, 7,0, 3,2, 2,1 i 1,3 min Li i in. (J. Geod. 93:749, 2019) jako porównanie trendu typu MODELLED.ntn-positioning: pozycjonowanie w sieci nienaziemnej (NTN) 5G w mobilnym pasmie satelitarnym S 3GPP n256 z granicy Craméra–Rao dla czasu przybycia i Dopplera.- Scenariusze:
leo-doppler-positioning,starlink-sop-doppler-positioning,meo-leo-fused-pvt,leo-ppp-convergence,ntn-5g-positioning,polar-arctic-leo-coverage,leo-timing-utc(dołączone) iceleste-iod-fused-pvt(tylko w repozytorium, wstrzymany razem z presetem Celeste IOD). - Osiem wierszy macierzy: obwiednia Dopplera LEO VALIDATED względem opublikowanych wartości dla Iridium (±36 kHz: 35,9 kHz, w granicach 5%) i Xona Pulsar X1 (od 32 do 34 kHz: 33,6 kHz z powłoki 97 deg, bez poszerzenia) (
tests/leo_doppler_reference.rs); pozycjonowanie dopplerowskie, łączne pozycjonowanie z pseudoodległości, zbieżność PPP, granice NTN, czas LEO, pokrycie polarne i presety MODELLED. Trzy rodzaje i osiem plików scenariuszy. Dokumentacja:docs/LEO-PNT-FUSION.md.
- LEO-PNT od początku do końca: rodzaj
leo-pnt-chaini etapy LEO połączone razem. Jeden system pozycjonowania, nawigacji i czasu (PNT) na niskiej orbicie okołoziemskiej (LEO) prześledzony od projektu sygnału do pozycji użytkownika, każdy etap to własny rodzaj silnika na własnej tabeli scenariusza, z wartościami przekazywanymi w kodzie (docs/LEO-PNT.md):- Pasma
leo-passmogą wskazywać projektleo-signal(signal = "xona-x5"): pasmo przejmuje środek projektu, szerokość pasma nadawania i szybkość chipów śledzonej składowej, dzieli swoje EIRP (równoważną moc promieniowaną izotropowo) między składowe projektu i raportuje w każdej epoce C/N0 śledzonej składowej (stosunek mocy nośnej do gęstości szumu) oraz jitter śledzenia kodu ograniczony pasmem (błąd wyznaczania odległości; szum paryiono_freetakże go używa). Pasmo bez projektu daje takie samo wyjście jak wcześniej. leo-pnt-chainuruchamia sygnał -> przelot -> wiadomość nawigacyjna -> łączne rozwiązanieleo-pvt-> opcjonalnieleo-ppp. Każdy system LEO etapu pozycjonowania, który ich nie ustawia, przyjmuje linię C/N0 w sin(elewacji) dopasowaną do przelotu, błąd odległości sygnału w przestrzeni wiadomości (SISRE: jej błąd reprezentacji na orbicie satelity przelotu, ze wskazanym członem wyznaczania orbityod_sisre_mw pierwiastku sumy kwadratów) oraz nośną i szybkość chipów projektu; przypadki precyzyjnego pozycjonowania punktowego (PPP) przyjmują SISRE. Każde przekazanie jest wymienione ze swoją wartością i jednostką, atests/leo_pnt_chain.rssprawdza, że każde jest równe wyjściu poprzedniego etapu i że zmiany poprzedniego etapu przesuwają wartości następnego.LeoNavmsgScenario::broadcast_sisreto nowy punkt wejścia wiadomości.- Scenariusze:
leo-pnt-end-to-end(ogólna konstelacja 1080 km i reprezentatywny sygnałgeneric-l),xona-pulsar-end-to-end(publiczny sygnał X5), oba dołączone, oraz opcjonalny, tylko w repozytoriumceleste-iod-end-to-end. - Presety Celeste IOD (demonstracja na orbicie) z obszarów przelotu, wiadomości i połączonego pozycjonowania znajdują się teraz w jednym pliku,
src/celeste_iod.rs, którybuild.rskompiluje tylko wtedy, gdy istnieje (flaga konfiguracjikshana_celeste). Jego pięć scenariuszy (scenarios/*celeste-iod*.toml) jest tylko w repozytorium, więc usunięcie tego pliku i tych scenariuszy wstrzymuje każdą liczbę przedstawioną na warsztatach ESA NAVISP LEO-PNT, 2026, bez edycji źródła;tests/workshop_preset_isolation.rssprawdza, które pliki mogą wymieniać preset lub zawierać liczby jego planu pasm. - Każdy rodzaj LEO w tabeli przyporządkowania raportu zaawansowanego, z wierszami zależnymi od ścieżki wymienianymi tylko wtedy, gdy przebieg poszedł tą ścieżką (natężenie deszczu, budynek, analiza lub tryb, które się wykonały). Okna Dopplera
leo-pvtzyskująt_s, a przypadkileo-pppzyskująt_min, więc oba się animują;leo-passileo-pnt-chaineksportują efemerydy CZML, KML, GeoJSON i STK, a pozostałe rodzaje LEO podają, dlaczego format nie ma zastosowania.
- Pasma
Nawigacja z niskiej orbity okołoziemskiej: odporność, obszary zainteresowania i scenariusze użytkowników końcowych
- Odporność LEO-PNT, jeden scenariusz na obszar zainteresowania eksperymentu i jeden na branżę użytkowników końcowych oraz
docs/LEO-PNT.mdjako przegląd każdego rodzaju i scenariusza LEO. Każdy scenariusz działa bez żadnych danych Celeste i jest dołączony.leo-passzyskuje sekcję[spoofer]: spoofer podrabia, spójnie w odległości i prędkości zmiany odległości, sygnały deklarowanej pozycji, która po początku ataku skacze lub jest odsuwana od prawdziwej (dla każdego pasma LEO oraz sygnału MEO GNSS), z jonosferą lub bez niej. Dwa monitory działają przy podanym prawdopodobieństwie fałszywego alarmu: spójność Dopplera i geometrii przelotu (zmierzone prędkości zmiany odległości względem przewidywanych z orbit i niezależnej pozycji oraz prędkości z wcześniejszej wiedzy; uogólniony chi-kwadrat metodą najmniejszych kwadratów w oknie, dla kanałów GNSS, LEO i wszystkich, z szumem pętli synchronizacji częstotliwości wyznaczonym z C/N0) oraz spójność międzypasmowa (skok skorygowanej modelem kombinacji wolnej od geometrii każdej pary pasm LEO). Wynik podaje statystyki na epokę (więc się animuje), każdą parę oraz moment, w którym każdy monitor wykrywa. Bloki konstrukcyjne wleo_link::spoof. Brak sekcji, wyjście bez zmian.- Każda para pasm
leo-passraportuje także ukośną całkowitą zawartość elektronów (TEC), którą jej kombinacja wolna od geometrii odzyskuje w szczycie przelotu, oraz sigmę szumu kodu tego oszacowania (sondowanie jonosfery). Dodaje to dwa pola do każdego wielopasmowego wynikuleo-pass; żadna istniejąca liczba się nie zmienia. - Tryb czasu
leo-pvtprzyjmujetrace = true: każdy wiersz raportuje wtedy swój błąd czasu i przewidywaną sigmę w każdej epoce, z tymi samymi losowaniami, więc statystyki wierszy nie zmieniają się, a przebieg się animuje i łączy w kampanię. - Kampania eksportuje teraz każdy scenariusz członka, który ma geometrię (przebiegi faz, scenariusze bazowe przeglądu i Monte Carlo, członkowie złożeni z powiązanymi wspólnymi wartościami), jako osobny zestaw plików, z etykietą członka w nazwie pliku; wcześniej kampania nie eksportowała niczego. Tabela interoperacyjności w
docs/INTEROP.mdzmienia się odpowiednio. - Klucz przeglądu kampanii może indeksować tablicę tabel według pozycji (
system.2.sisre_m). - Scenariusze odporności:
leo-resilience-multiband-diversity(zaporowy jammer w paśmie L5 o szerokości 50 MHz przemiatany w mocy: każdy sygnał pasma L zanika, sygnały LEO w pasmach UHF, S i C zachowują swoje C/N0),leo-resilience-js-margin(margines J/S z mocy odbieranej: GPS L5, Galileo E5a i Xona X5 tracone przy -105, -100 i -95 dBW, ogólny sygnał LEO -135 dBW nadal śledzony przy -90 dBW),leo-resilience-spoof-doppler(skok o 30 m niewykryty przez test Dopplera wyłącznie GNSS i wykryty przez test na wszystkich kanałach 105 s po początku),leo-resilience-spoof-monitors(cztery spoofery wobec obu monitorów) ileo-resilience-gnss-jammed-leo-carries(GNSS zagłuszony, warstwa LEO w pasmach S i C śledzona, autonomiczne monitorowanie integralności w odbiorniku na samej warstwie LEO alarmuje w 2 z 30 epok). - Scenariusze obszarów zainteresowania:
leo-focus-ppp-altitude,leo-focus-ntn-bandwidth,leo-focus-iot-eirp,leo-focus-science-iono-sounding,leo-focus-data-services,leo-focus-indoor-uhf,leo-focus-fused-pnt-sisre(odporność w L, S i C toleo-resilience-multiband-diversity). - Kampanie branżowe, każda animowana i eksportująca swoje przeloty LEO:
leo-vertical-autonomous-vehicle,leo-vertical-rail-maritime(dołączone scenariusze morskie i kolejowe plus LEO),leo-vertical-critical-infrastructure-timing,leo-vertical-polar-arctic,leo-vertical-5g-network-timing,leo-vertical-asset-tracking-iot. Wyniki w jednym wierszu wdocs/LEO-PNT.md. - Trzy wiersze macierzy MODELLED: monitor spoofingu oparty na Dopplerze i geometrii przelotu, monitor spoofingu międzypasmowy oraz sondowanie jonosfery.
tests/leo_resilience_verticals.rssprawdza monitory (milczące przed początkiem, statystyka Dopplera kwadratowa względem skoku, skok jonosferyczny spoofera naziemnego i brak takiego skoku u spoofera uwzględniającego jonosferę), tożsamość sondowania, ślad czasu względem statystyk wierszy oraz to, że eksport kampanii jest równy eksportowi każdego z jej członków. - Strona
leo-passprzenosi się dodocs/LEO-PASS.md;docs/LEO-PNT.mdjest przeglądem.
Scenariusze morskie, drogowe i kolejowe
- Scenariusze morskie, drogowe i kolejowe. Pięć dołączonych przykładów na istniejących rodzajach, tak aby statki, pojazdy drogowe i pociągi miały każde swój przykład roboczy. Każda wartość jest MODELLED; żadna nie jest sprawdzona względem danych pomiarowych.
scenarios/maritime-strait-jamming.toml(jamming): szerokopasmowy jammer 50 W na maszcie 30 m, 30 km po otwartej wodzie od statku. Średni stosunek jammera do sygnału (J/S) około 48 dB, a dostępność spada z 1,00 do 0,00.scenarios/maritime-port-approach-coast.toml(ins-trn-coast): inercjalny system nawigacji (INS) klasy nawigacyjnej przy 12 węzłach, z utraconym GNSS i bez wspomagania. Przekracza 10 m po 281 s i 100 m po 833 s, czyli wartości dla podejścia do portu i wód oceanicznych z Rezolucji A.1046(27) Międzynarodowej Organizacji Morskiej (IMO), użyte tu jako budżety.scenarios/maritime-spoof-position-push.toml(spoof-detect): spoofer +2 dB, niewyrównany z nośną, spychający cztery satelity, aby zepchnąć statek o 500 m. Połączony monitor wykrywa go (wynik 0,70 wobec progu 0,50) przez autonomiczne monitorowanie integralności w odbiorniku (RAIM) i monitorowanie jakości sygnału (SQM); samo monitorowanie mocy go nie wykrywa.scenarios/automotive-urban-canyon.toml(gnss-ins): samochód przejeżdżający przez 15 s tunel pod drogą i 60 s przerwę wywołaną przez jammer przy drodze, względem budżetu 1,5 m na pół pasa. Błąd średniokwadratowy (RMS) połączonego rozwiązania w czasie przerwy wynosi 1,9 m dla jednostki mikroelektromechanicznej (MEMS) klasy motoryzacyjnej i 0,7 m dla porównawczej jednostki klasy taktycznej; przy swobodnej pracy jednostka MEMS dryfuje do 850,8 m.scenarios/rail-tunnel-coast.toml(ins-trn-coast): INS klasy taktycznej w pociągu jadącym 160 km/h w tunelu. Przekracza 2 m (rozróżnienie torów) po 35,8 s, po około 1,6 km, a 20 m po 107,3 s. To jest wyłącznie INS: silnik nie ma modelu drogomierza, więc jest to ograniczenie pesymistyczne. Liczba plików scenariuszy w README zmienia się z 77 na 82. Wszystkie pięć jest dołączonych dokshana examplei wymienionych w przeglądarkowym playground.
Serwer Model Context Protocol
Serwer Model Context Protocol (MCP) sięga każdego rodzaju i każdego widoku przebiegu: siedem nowych narzędzi, w sumie czternaście.
run_scenariojuż rozdzielał każdy rodzaj; agentowi brakowało drogi do poprawnego scenariusza danego rodzaju i trzech wyników, które wiersz poleceń zapisuje obok wyniku. Nowe narzędzia:list_example_scenariosiget_example_scenarioudostępniają dołączone scenariusze referencyjne (tabelakshana example), każdy z jego rodzajem i pierwszym zdaniem własnego nagłówka, bajt w bajt jak plik wscenarios/. Scenariusz, który jest w repozytorium, ale nie jest dołączony, zostaje odrzucony z podaniem powodu. Każdy rodzaj pozalunar-llr-datum(którego wycinek danych jest dostarczany tylko z repozytorium) ma co najmniej jeden przykład.report_scenariozwraca raport z przebiegu jako JSON (JavaScript Object Notation) albo jako stronę HTML (HyperText Markup Language) do wydruku (docs/REPORTS.md).animate_scenariozwraca szereg czasowy przebiegu jako animowany rysunek SVG (Scalable Vector Graphics), odtwarzacz HTML lub ponumerowane klatki, po podsumowaniu JSON tego, co narysowano (docs/ANIMATION.md). Odpowiedź zawiera najwyżej 120 klatek; wiersz poleceń zapisuje dowolną długość.list_export_formats,export_interopiimport_routeudostępniają eksporty interoperacyjności i import trasy GeoJSON (docs/INTEROP.md): CZML (Cesium Language), KML (Keyhole Markup Language), GeoJSON, efemerydy STK (Systems Tool Kit).ei SigMF (Signal Metadata Format), z indeksem JSON plików (sufiks, rozmiar i SHA-256, 256-bitowy skrót Secure Hash Algorithm) oraz binarnym plikiem próbek SigMF jako base64.
Biblioteka zyskuje domyślnie wyłączoną funkcję
bundled-scenarios, która udostępnia tabelę scenariuszy referencyjnych jakokshana::bundled_scenarios; włącza ją tylko serwer MCP, więc koło Pythona i moduł WebAssembly nadal nie niosą tekstu scenariuszy. Zestawy badań (--study) pozostają tylko w wierszu poleceń, ponieważ zestaw nazywa pliki na dysku, a serwer żadnych nie czyta. Testy przejścia w obie strony uruchamiają każde nowe narzędzie na dołączonych scenariuszach i sprawdzają liczby silnika: widmo, Układ Słoneczny, konstelacje wokół Księżyca i Europy, przegląd kampanii oraz rodzaje: sygnał na niskiej orbicie okołoziemskiej (LEO), przelot, wiadomość nawigacyjna, połączone pozycjonowanie, precyzyjne pozycjonowanie punktowe, sieć nienaziemna i od początku do końca. Każda powierzchnia, która podaje liczbę narzędzi MCP lub je wymienia, mówi teraz czternaście, z wyjątkiem strony playground wweb/, która jest zastępowana stroną.
kshana.dev, Kshana Studio i README
- Przeprojektowane kshana.dev. Pojedyncza strona playground została zastąpiona stroną wielostronicową: Home, Missions, Capabilities, Evidence, Developers, Editions i Docs, z Kshana Studio w odległości jednego kliknięcia. Każdy wykres, mapa i liczba na niej to zapisany przebieg silnika tego wydania, ze scenariuszem i odnośnikiem, który otwiera ten sam przebieg ponownie w Studio; kompilacja strony odrzuca zapis wykonany przez inny commit silnika. Strony dokumentacji są generowane z
docs/repozytorium, a opcje instalacji z jego kanałów. Czcionki i biblioteki skryptów są serwowane z samego kshana.dev, więc żadna strona nie żąda niczego od hosta zewnętrznego. Stare adresy (/#playground,/#ledger, odnośniki udostępniania/#s=<scenario>, odnośniki osadzania/?embed=1&…i reszta) przekierowują na nowe miejsce, a nieznany adres dostaje stronę 404. - Kshana Studio, panel dla każdej możliwości. Studio otwiera się na ekranie startowym z kafelkami domen i dobrymi pierwszymi przebiegami, a następnie prowadzi przebieg przez pięć ponumerowanych kroków: wybór scenariusza, ustawienie jego parametrów, uruchomienie silnika lokalnie w przeglądarce, odczytanie wyników (najpierw kluczowe wartości, każda z chipem PASS lub FAIL tam, gdzie przebieg podaje próg, potem panele) oraz udostępnienie lub eksport. Jedno pole wyszukiwania znajduje scenariusze, domeny i pola w nich oraz przeskakuje do kontrolki; przebiegi można przypinać i porównywać; ścieżka okruszków mówi, gdzie się jest; na telefonie kroki stają się paskiem kroków. Każdy rodzaj scenariusza ma swój widok, w tym wodospad widma, Układ Słoneczny, pokrycie konstelacji, kampanie, animację, raport z przebiegu, eksporty interoperacyjności i łańcuch niskiej orbity okołoziemskiej. Odnośnik bezpośredni (
?scenario=…&tab=…) otwiera ten sam przebieg na wskazanym panelu. - Badania i cytowanie. Strona Evidence wymienia pięć artykułów Kshana na arXiv (2606,22054, 2606,24210, 2607,02566, 2607,05415 i 2607,06212), każdy z podsumowaniem, rysunkiem obliczonym przez ten silnik, poleceniem, które go odtwarza, odnośnikiem do Studio i BibTeX, obok informacji, jak cytować oprogramowanie. README zyskuje tę samą sekcję Research.
- Publiczna strona dla Kshana Pro.
docs/PRO.mdi strona Editions witryny mówią, co dodaje własnościowa nakładka Pro do tego samego silnika (optymalizator projektu, niepewność i czułość, dossier misji, obserwacja kampanii, współistnienie widma, usługa zadań na miejscu, śledzenie wymagań), co każda z tych funkcji wytwarza i czego nie robi. Każda wartość Pro pokazana na stronie jest podana na tej publicznej stronie. Pro nie dodaje żadnego modelu fizycznego, a otwarty silnik pozostaje cały i bezpłatny. - Przepisane README. Krótkie sekcje, jeden obraz na sekcję, znak Kshana, dwa rzędy plakietek, generowane obrazy architektury, przepływu scenariuszy, łańcucha niskiej orbity okołoziemskiej i weryfikacji (
tools/gen_readme_assets.py, który zawodzi przy nieaktualnym obrazie) oraz zrzuty ekranu Studio wykonane z działającego Studio przeztools/capture_studio_shots.mjs. README dla crates.io, PyPI, npm i serwera MCP mają ten sam projekt. Długie materiały referencyjne są zwinięte lub przeniesione dodocs/.
Zmienione#
<scenario>.report.htmljest teraz zaawansowanym raportem z przebiegu opisanym w sekcji Added, a wierszwrote …w CLI nazywa także<scenario>.report.json. Jednostronicowa karta wyników, którą zastąpił, pozostaje bez zmian jakoRunOutput::html_report(), które wiązania Pythona i WebAssembly nadal zwracają.OracleKind::modelled_reason()udostępnia zdanie, któredocs/MODELLED-RATIONALE.mddrukuje dla każdego wiersza MODELLED; ten dokument jest bez zmian.- README mówi, na czym opiera się Kshana Pro. Sekcja Editions i wiersz Kshana Pro w „Support & professional services” podają teraz, co robią narzędzia Pro do inżynierii systemów opartej na modelach (MBSE) i do programów oraz które opublikowane wyniki otwartego silnika odczytują (
result.jsonireport.jsonkażdego przebiegu, plik scenariusza, schemat jednostek pól i etykiety macierzy weryfikacji), a także na czym w otwartym silniku opierają się cyfrowe bliźniaki zegarów, studia kompromisów i pakiety dowodowe. Tylko sformułowania: żaden wynik silnika ani opublikowana liczba się nie zmienia. - Zgodność wsteczna. Publiczny enum
navsignal::Modulationzyskuje wariantMboc, co jest zmianą łamiącą dla wywołującego, który dopasowuje go wyczerpująco. Kolumnygcrs_r_migcrs_v_m_srodzajuephemerissię zmieniają (zob. „Revisions to published numbers”). Przebieg nadal odtwarza wersja silnika, która go wykonała.
Poprawiono#
export_table_csvna serwerze MCP wymieniało cztery rodzaje jako jedyne z tabelą CSV (wartości rozdzielone przecinkami); sześć ją publikuje. Narzędzie zawsze zwracało tabelę dlatelecom-timingi dlaleo-navmsg(jego analizaencode-decodena modelu wiadomościkepler16lubkepler-rac), ale jego opis, komunikat odmowy i dokumenty wymieniające rodzaje pomijały oba, więc agentowi mówiono, żeby o nie nie prosił. Teraz są wymienione, a test przejścia w obie strony pobiera obie tabele.Ramka wiadomości nawigacyjnej na niskiej orbicie okołoziemskiej (LEO) nie miała tych samych bajtów na każdej platformie ani w każdej kompilacji jednej platformy.
scenarios/leo-navmsg-encode-decode.tomlkodowało ramkę z cykliczną kontrolą nadmiarową0x110315w kompilacji wydaniowej na aarch64 macOS,0x898BD8w kompilacji debug tego samego źródła na tej samej maszynie i0x6A82D9w kompilacji WebAssembly (WASM);leo-navmsg-celeste-iod.tomldawało natywnie0x6EDB2D, a w przeglądarce0xC6E4F0. Trzy przyczyny, każda wyśledzona do pierwszej rozbieżnej wartości:- Między platformami. Orbita prawdziwa była identyczna bit w bit na obu; punkt startowy dopasowania nie.
truth::state_to_elementsbierze nachylenie oskulacyjne zacos, a argument perygeum zatan2, a obie biblioteki matematyczne zaokrąglają je inaczej na ostatnim miejscu (na 20 000 argumentach różnią się dla 781 sinusów, 858 cosinusów, 1 931 funkcji wykładniczych i 1 899 arcusów tangensów dwuargumentowych). - Między profilami kompilacji. Zoptymalizowana kompilacja na macOS łączy sinus i cosinus jednego argumentu w jedno wywołanie połączonej procedury systemowej, a jej sinus nie jest sinusem samotnego
sindla 379 z 200 000 argumentów; niezoptymalizowana kompilacja wykonuje dwa wywołania. Rodzaj bierze sinus i cosinus razem w trzynastu miejscach. - W zegarze. Próbnik normalny z
rand_distrwywołuje systemoweexpilnw swoich dwóch rzadkich gałęziach: z czterech milionów losowań z ziarnem trzy różniły się na ostatnim bicie między kompilacją natywną a WASM.
Dopasowanie Levenberga–Marquardta, które na tym łuku zatrzymuje się na swoim limicie 80 iteracji, a nie w minimum, przenosi jedną jednostkę na ostatnim miejscu do różnych skwantowanych pól. Rodzaj oblicza teraz każdą funkcję przestępną przez nowy
src/portable_math.rs, który wywołuje czysto rustowy cratelibm(już w drzewie zależności, teraz nazwany wCargo.toml), kompilowany z jednego źródła dla każdego celu, a nie wywołanie biblioteki, które optymalizator przepisuje:leo_navmsg::{truth, fit, elements, codec, sisre, services}i kod scenariusza. Potęgi całkowite na tej ścieżce są rozpisane jako podnoszenie do kwadratu i mnożenie, ponieważf64::powima nieokreśloną precyzję, a zegar prawdziwy czerpie swoje odchylenia normalne zportable_math::standard_normal(metoda biegunowa Marsaglii na surowym wyjściu generatora). Wspólne procedury, przez które całkowana jest orbita prawdziwa, są napisane raz, generycznie względem biblioteki matematycznej, z wewnętrznym dla crate'a punktem wejścia_portableobok istniejącego: przyspieszenie harmonik sferycznych, przyspieszenia zonalne i oporu, tempa wiekowe J2 i opóźnienie Klobuchara. Istniejące punkty wejścia pozostają bez zmian co do ostatniego bitu, więc liczba żadnego innego rodzaju się nie zmienia.leo_navmsg::tests::the_encoded_frame_is_the_same_bytes_on_every_platformprzypina całą 171-bajtową ramkę i jedną wartość kontrolną na model efemeryd, w zwykłym (niezoptymalizowanym) profilu testowym, na każdej platformie i bez bramki bazowego hosta;the_kind_never_calls_the_host_mathematics_libraryczyta źródła rodzaju z dysku i zawodzi przy wywołaniu wbudowanej funkcji przestępnej, przy próbnikurand_distrlub przy wywołaniu modułu, który nie został przejrzany. Po zmianie kompilacja debug, kompilacja wydaniowa i kompilacja WASM dają dokumenty wyników identyczne bajt w bajt dla wszystkich pięciu scenariuszyleo-navmsg. To zmienia liczby, zapisane tu jako rewizja. Rodzajleo-navmsgjest nowy w tym wydaniu, więc nic opublikowanego we wcześniejszym wydaniu się nie zmienia, ale zmienia się każda wartośćleo-navmsg, natywnie i w kompilacji WASM, a wraz z nią etapnavmsgwleo-pnt-chain: wartości orbity, ponieważ dopasowanie startuje teraz z przenośnych elementów, wartości zegara, ponieważ zegar prawdziwy jest inną realizacją tego samego procesu.docs/LEO-NAVMSG.mdjest wygenerowany ponownie z nowych wyników; jego opublikowana wartość kontrolna dla scenariusza kodowania i dekodowania wynosiła0x110315, a wynosi0x19105F(pozycja w granicach 1,126 mm od dokładnej wiadomości, gdzie było 0,665 mm, zegar w granicach 0,185 mm, gdzie było 0,451 mm). Wielkość zmian w wartościach poniżej milimetra to czułość dopasowania, a nie błąd żadnego z dwóch zestawów: dopasowanie jest bez zmian i nadal zatrzymuje się na limicie iteracji.- Między platformami. Orbita prawdziwa była identyczna bit w bit na obu; punkt startowy dopasowania nie.
Próbkowanie z ziarnem losowało inne indeksy na celu 32-bitowym.
Rng::gen_rangenausizebierze 64 bity z generatora na hoście 64-bitowym i 32 bity na 32-bitowym, więc to samo ziarno dawało inne indeksy i zostawiało strumień w innym miejscu w kompilacji WASM. Tak losowały trzy miejsca: bootstrapy percentylowe weval_stats(bootstrap_ci,bootstrap_auc_ci), tasowanie przed każdym przebiegiem treningowym wimpairment_mloraz test permutacyjny wimpairment_study. Teraz losują przezportable_math::uniform_index, które zawsze próbkuje jakou64: dokładnie to, co robił host 64-bitowy, więc żadna liczba natywna się nie zmienia. To zmienia opublikowane liczby pakietu WASM, zapisane tu jako rewizja: przedział bootstrapuquantum-anomaly-detectdla pola pod krzywą (quantum_auc_ci,trade.foms[0].ci95) wynosił[0.9901265, 0.9938305]w przeglądarce, a teraz jest to natywne[0.99035875, 0.993861].Nazwy plików efemeryd STK z identyfikatorów ruchomych obiektów. Identyfikator ruchomego obiektu zawierający
/lub spację (powłoka konstelacji i satelita,Pulsar inclined/S1-0163) powodował panikę CLI przy--export stk; teraz każdy identyfikator przechodzi przez bezpieczną część nazwy pliku (litery, cyfry,-,_).Znak nutacji TEME→GCRS, opisany powyżej w „Revisions to published numbers”, ponieważ zmienia opublikowany wynik.
0.28.0 - 2026-09-26#
Dodano#
- Rodzaj scenariusza
slot-timing(src/slot_timing.rs): sekundy, zanim wolno biegnący zegar opuści strażnika slotu trasowania lub zadań indeksowanego czasem, każdy składnik w tej chwili z nazwanym dominującym, czas pozostały od ostatniego rozwiązania pozycji i największy odstęp między rozwiązaniami, który utrzymuje zegar w granicach, po odjęciu opóźnienia rozwiązania. Zegar pochodzi z domyślnej klasy, presetu z karty katalogowej telecom-timing, wbudowanej karty katalogowej (maksima odchylenia Allana, starzenie, współczynnik temperaturowy) lub zmierzonego zapisu fazy. Naruszenie poza najdłuższym czasem uśredniania, który obsługuje źródło, jest oznaczane jako ekstrapolowane. Dołączony przykład:slot-timing-ocxo-leo. Zob.docs/SLOT-TIMING.md. - Zmierzony próg szumu czerwonego. Nakładające się odchylenie Allana zapisu fazy jest dopasowywane ważoną metodą najmniejszych kwadratów w bazie szumu białego fazy i modulacji częstotliwości według IEEE Std 1139 (
slot_timing::fit_weighted), każdy punkt ważony swoimi równoważnymi stopniami swobody, więc odpowiedź dla holdover może opierać się na własnym progu zegara zamiast na założeniu klasy. Dopasowanie bez ważenia nałożyło pozorny próg szumu migotania na testowy zapis szumu białego i skróciło naruszenie po 2 000 s o 30 %. - Walidacja na zbiorze zapieczętowanym dla inwersji holdover na prawdziwym zegarze (
tests/slot_timing_cs5071a_holdout.rs): dopasowane na pierwszej jednej trzeciej zapisu cezu 5071A względem masera wodorowego, przewidziane naruszenia jednego sigma przy sześciu progach od 0,5 do 2,5 ns wypadają w granicach od 0,84 do 1,03 naruszeń zmierzonych na pozostałych dwóch trzecich, wobec progu 1,5 ustalonego przed pierwszym uruchomieniem testu. Kontrola (jednosekundowe odchylenie Allana odczytane jako szum biały) chybia około 1 000 razy i nie spełnia progu. Nowy wiersz rejestru VALIDATED; przepływ pracyrealdata-clockteraz go uruchamia. - Ta sama prognoza na prawdziwym oscylatorze kwarcowym (
tests/slot_timing_ocxo_holdout.rs,scripts/fetch_ocxo.sh): na zmierzonym oscylatorze kwarcowym z termostatem prognoza na zbiorze zapieczętowanym jest zachowawcza, na poziomie od 0,59 do 0,70 zmierzonego naruszenia i nigdy później, i w większości poza progiem 1,5, ponieważ próg szumu tego oscylatora zmniejszył się o połowę w trakcie 5.5-godzinnego zapisu; dopasowana w próbce mieści się w granicach od 0,98 do 1,17. Przypadek kwarcowy nie jest sprawdzony i pozostaje MODELLED. Przebieg ujawnił też brakujący człon: częstotliwość kwarcu wędruje, więc model niesie teraz niepewność częstotliwości znanej w chwili rozwiązania (fix_frequency_sigma); bez niego prognoza była zbyt optymistyczna nawet 2,5×. - Ta sama prognoza na zegarach atomowych na orbicie (
tests/slot_timing_igs_holdout.rs,scripts/fetch_igs_clocks.sh): 14 dni końcowych zegarów International GNSS Service dla satelitów GPS Block IIF, z protokołem spisanym przed pobraniem danych. Osiem z dziesięciu satelitów mieści się w progu 1,5; G25 i G30 przewidują naruszenia nawet około dwa razy późniejsze niż zmierzone. Protokół wymaga, aby zaliczył każdy satelita, więc przypadek orbitalny nie jest sprawdzony i pozostaje MODELLED; wynik jest przypięty. - Klasy zegarów: kwarc z kompensacją temperaturową (TCXO), kwarc z termostatem (OCXO) i rubidowy wzorzec częstotliwości atomowy (RAFS) (
ClockClass::Tcxo,Ocxo,Rafs), części, które lata komercyjna magistrala małego satelity lub bramka naziemna, każda z jedną publiczną kartą katalogową (ClockClass::source). DodanoClockClass::ALL,idifrom_id.baseline_clock_classzquantum-tradeprzyjmuje trzy nowe identyfikatory. Dodanie wariantów do publicznego enum jest zmianą łamiącą dla wywołującego, który dopasowuje go wyczerpująco. - Poziom ochrony czasu dla odbiornika na orbicie (
src/orbital_timing.rs, opcjonalna sekcjaspoofingrodzajuslot-timing): jak długo spoofer naziemny może dosięgać satelity na niskiej orbicie okołoziemskiej w jednym przelocie, odchylenie, które spoofer przy podanym maksymalnym tempie narastania gromadzi, zanim satelita opuści jego zasięg lub zostanie wykonana niezależna kontrola, oraz czy każda kontrola z kontaktu naziemnego lub łącza międzysatelitarnego jest niezależna od tego spoofera. Sprowadza się dokładnie dotpl::timing_protection_level_nsdla zegara bez szumu migotania, białego fazy lub błądzenia losowego. MODELLED. - Trzy uwagi:
docs/SLOT-TIMING.md(w tym względem której metryki wędrówki należy akceptować slot: maksymalny bezwzględny błąd czasu, a nie maksymalny błąd interwału czasu ani odchylenie czasu, i dlaczego),docs/DECEIVED-TIME.md(podpisane polecenie zastosowane w oszukanym czasie nadal błędnie trasuje) orazdocs/DEPLOYMENT-TARGETS.md(gdzie działa Kshana; nie oferuje się rdzenia lotniczegono_std).
0.27.4 - 2026-09-26#
Wydanie v0.27.3 dotarło do crates.io (kshana i kshana-mcp) i PyPI, po czym zatrzymało się na npm, więc npm, obraz MCP na ghcr.io, rejestr MCP, JetBrains Marketplace i kshana.dev nigdy go nie otrzymały. 0.27.4 niesie ten sam silnik, z poniższą poprawką wydania, do każdego kanału.
Poprawiono#
- Krok publikacji npm wskazuje tarball jawną ścieżką. npm odczytuje samo
npm-dist/kshana-0.27.3.tgzjako skrót GitHubowner/repo, więc zadanie npm dla v0.27.3 próbowało sklonowaćgithub.com/npm-dist/kshana-0.27.3.tgzi zawiodło z „Permission denied (publickey)”. Sam tarball został zbudowany i poświadczony. Krok publikuje teraz./npm-dist/*.tgz. Wszystko po npm w kolejności wydania (obraz MCP, wtyczka JetBrains, kontrola parzystości kanałów i strona) zostało pominięte, zgodnie z założeniem.
Zmienione#
- Katalogi jednostek telecom-timing i
gnss-inssą wyłączone z wykrywania kopii, według tej samej polityki i testu uzasadnienia co inne katalogi. Bramka jakości SonarCloud zaczerwieniła się z powodu duplikacji w nowym kodzie (4,0% wobec 3%), a każdy zduplikowany blok był wierszem jednostek lub wpisem maski ITU-T.
0.27.3 - 2026-09-25#
Dodano#
scenarios/small-uas-jammed-nav.toml: jak długo nawigacja małego drona wytrzymuje po zagłuszeniu GNSS. Uruchamia jednostkę inercjalną mikroelektromechaniczną (MEMS) klasy kontrolera lotu, Bosch BMI088, wobec jednostki klasy taktycznej. Sygnał GNSS (globalnego systemu nawigacji satelitarnej) jest nominalny przez 100 s, a potem odmówiony przez 60 s (jamming-demo.tomlpokazuje, dlaczego robi to pobliski jammer). Błędy systematyczne BMI088 to reszty pozostające po kalibracji początkowej, wzięte ze współczynników temperaturowych w jego karcie katalogowej (BST-BMI088-DS000-19 rev 1,9): 0,015 °/s na K dla żyroskopu i < 0,2 mg na K dla akcelerometru. W pliku oznaczono dwa założenia: 10 K nagrzania po kalibracji i dalsze nagrzewanie o 1 K na minutę w locie. Dryf w locie to błąd, którego filtr nie może się nauczyć, zanim zacznie się zagłuszanie, i to on kończy wybieg. Każda wartość jest obliczona z modelu; jej sprawdzenie wymaga zapisów lotów ze środowiska zagłuszanego.kshana example small-uas-jammed-navją drukuje.Każdy czujnik
gnss-insmoże ustawić własny prior filtru ([imu_quantum.filter_prior]lub[imu_classical.filter_prior], zsigma_accel_biasisigma_gyro_bias). Wartość domyślna jest bez zmian, więc każdy istniejący scenariusz daje ten sam wynik. Pozostały błąd systematyczny żyroskopu jednostki klasy konsumenckiej leży około 26 sigma poza domyślną wartością klasy taktycznej, gdzie filtr nigdy by się go nie nauczył. Prior, który nie jest skończony i dodatni, jest odrzucany, a wynik powtarza prior, gdy jest ustawiony.kshana example [<name>]daje użytkownikowi rejestru scenariusz do uruchomienia. Użytkownikcargo install kshanama plik wykonywalny i nie ma kataloguscenarios/, więc pierwsze polecenie z każdego szybkiego startu zawodziło. Interfejs wiersza poleceń (CLI) niesie teraz 75 scenariuszy referencyjnych, które działają samodzielnie, bajt w bajt, wkompilowanych zscenarios/(src/bundled_scenarios.rs; tabela żyje w binarce CLI, więc koło Pythona i moduł WebAssembly nie rosną).kshana exampleje wymienia;kshana example clock-holdover > clock-holdover.tomlzapisuje jeden. Pozostałe dwa pliki są tylko w repozytorium:lunar-llr-datumczyta zarchiwizowane dane księżycowego pomiaru laserowego, które są dostarczane tylko z repozytorium, aquantum-pnt-demonstrator.suiteto manifest badania, który uruchamia trzy pliki siostrzane przez--study. Zażądanie któregokolwiek podaje powód i kończy się kodem 2 zamiast drukować coś, co nie może działać samodzielnie.tests/cli_first_run.rstrzyma tabelę zgodną z katalogiem w obu kierunkach, więc nowy plik scenariusza, który nie jest ani dołączony, ani nazwany jako tylko w repozytorium, zawodzi.Każdy wskaźnik jakości w wyniku dla zegara, orbity, hybrydy lub fuzji mówi teraz, czy jest VALIDATED, czy MODELLED, w samym wyniku. Dokument wyniku zyskuje blok
figure_tiers, zawsze jego ostatni klucz. Wymienia każdą raportowaną wartość (na przykładquantum.fom.timing_p95_ns) z jej poziomem — VALIDATED oznacza sprawdzone względem niezależnej wyroczni zewnętrznej, MODELLED oznacza model oparty na pierwszych zasadach, testowany wewnętrznie — i wiersz macierzy weryfikacji, z którego poziom jest odczytywany. Poziom pochodzi zsrc/verification.rsprzezsrc/fom_label.rs, więc nie ma drugiej tabeli, która mogłaby się rozjechać. Wcześniej słowa „sprawdzone” i „obliczone z modelu” pojawiały się w wyniku holdover zegara zero razy, a czytelnik surowego JSON (JavaScript Object Notation) nie miał jak odróżnić tych dwóch. Wartości położeniahybridifusionnie mają własnego wiersza macierzy, więc są wymienione poduntieredzamiast otrzymać poziom. Blok nie niesie liczb. Jest udowodnione, że jest addytywny, a nie założone: jego usunięcie przywraca dokument sprzed zmiany bajt w bajt, dla wszystkich pięciu rodzajów (test silnika), a oba zestawy wzorców (tests/registry_golden.rs,tests/cross_platform_golden.rs) odcinają teraz dokładnie ten klucz, i tylko gdy jest ostatni, po czym haszują resztę względem swoich niezmienionych zamrożonych stałych. Lista w każdym zestawie przypina, które scenariusze muszą nieść blok, więc wyłączenie nie może się po cichu rozszerzyć.Rodzaj
telecom-timingodpowiada w jednostkach inżyniera czasu: błąd czasu, maksymalny błąd interwału czasu (MTIE) i odchylenie czasu (TDEV), każde z PASS lub FAIL i marginesem względem masek Sektora Normalizacji Telekomunikacji Międzynarodowego Związku Telekomunikacyjnego (ITU-T). Maski są przepisane z wydań obowiązujących: G.8272 (07/2025) dla klas A i B podstawowego zegara czasu odniesienia (PRTC), G.8272.1 (2024) Amd. 1 (07/2025) dla rozszerzonego PRTC w trybie zablokowanym i w holdover (w tym jego obwiednia błędu czasu, która rośnie od 30 ns do 100 ns w okresie holdover zależnym od tego, jak długo zegar był zablokowany), G.8273.2 (2023) Amd. 2 (11/2025) dla zegarów granicznych i podrzędnych czasu telekomunikacyjnego, klasy od A do D, oraz G.8271.1 (2022) Amd. 3 (05/2025) dla limitów sieciowych w punkcie odniesienia C. Każdy wpis, który te Zalecenia pozostawiają „do dalszych badań”, jest nieobecny, a nie szacowany, adocs/TELECOM-TIMING.mdwymienia każdą liczbę z jej tabelą lub klauzulą i każdą pominiętą pozycję. Raport podaje też czas przekroczenia każdego budżetu błędu czasu: domyślnie domyślny holdover ePRTC 100 ns, alokację holdover sieci 400 ns, limit punktu C 1 100 ns i wymaganie end-to-end klasy 4 wynoszące 1,5 mikrosekundy.Wejściem jest albo syntetyczny holdover, albo własny szereg. Syntetyczny używa jednego z czterech presetów oscylatora (oscylator kwarcowy z termostatem, wzorzec rubidowy, wzorzec cezowy i zegar atomowy w skali chipa), każdy niesie wartości stabilności, starzenia i temperatury z nazwanej karty katalogowej Microchip. To, jak te wartości stają się szumem białym, migotania i błądzenia losowego częstotliwości, starzeniem i członem temperaturowym, jest podane w każdym raporcie i oznaczone MODELLED. Własny szereg to pary
[time_s, time_error_ns], w treści (tak działa w przeglądarce) lub, w kompilacjach natywnych, z pliku z wartościami rozdzielonymi przecinkami. Tabela MTIE/TDEV, z limitem każdej wybranej maski obok, jest zapisywana jako artefakt CSV przebiegu.scenarios/telecom-prtc-holdover-24h.tomlto 24-godzinny holdover rubidowy ze starzeniem, migotaniem i dobowym cyklem temperatury: jego największy błąd czasu wynosi 603,2 ns, przekracza 100 ns po 8 206 s od utraty i przez cały dzień mieści się w 1,5 mikrosekundy, a nie spełnia obwiedni holdover rozszerzonego PRTC, jak powinien zegar, który nie jest klasy cezowej.scenarios/telecom-tie-ingest.tomlpokazuje wejście w treści. MTIE i TDEV raportowane przez rodzaj są sprawdzone względem pakietu allantools na zatwierdzonym 2 048-próbkowym szeregu holdover, dokładnie dla MTIE i do 1.1e-15 dla TDEV, więc macierz zyskuje jeden wiersz VALIDATED i dwa MODELLED (transkrypcja masek i presety) i wynosi teraz 171 wierszy — 65 VALIDATED, 102 MODELLED, 4 PARTNER. Pokrycie jednostek pól rośnie z 60 z 61 rodzajów do 61 z 62 i z 1 742 do 1 788 opisanych pól. Rodzaj jest nowy i addytywny: żaden istniejący scenariusz, pin ani opublikowana wartość się nie zmienia.Playground uruchamia silnik w tle w Web Workerze, więc wolny scenariusz nie zamraża już strony.
web/engine-worker.mjshostuje silnik WebAssembly, aweb/engine.mjsprzekazuje do niego każde wykonanie scenariusza — przebiegi, przeglądy parametrów oraz eksporty SP3 / OMM / OEM / CSV. Przebieg, który trwa dłużej niż 150 ms, pokazuje stan zajętości (Run wyłączone, „Running… N s”) i przycisk Cancel, który kończy i ponownie uruchamia workera; przeglądarka, która nie może uruchomić workera modułowego, wraca do dawnej ścieżki w głównym wątku.cislunar-arc-recovery, pominięty w katalogu, ponieważ zamrażał stronę, wrócił do niego, oznaczony jako wolny: trwa około 13 s w Chrome (cztery wywołania silnika po około 3 s każde), w czasie których strona pozostaje responsywna.Każda raportowana wielkość
cislunar-observabilityniesie teraz jednostkę, klasę pochodzenia i definicję — to przedostatni rodzaj na liście wyłączeń obejmującej cały crate. Wszystkie 41 pól liczbowych dokumentu WYDANEGO są opisane, więc pokrycie jednostek pól rośnie z 59 z 61 rodzajów do 60 z 61 i z 1 698 do 1 742 opisanych pól, przy niezmienionym zaległym zbiorze bez definicji, wynoszącym 239.Blokował to pin, który zamraża wydany dokument i który nazywał
unitskluczem, jakiego dokument nigdy nie może zyskać. Dodanie go oznaczałoby usunięcie tej asercji i ponowne ustalenie wzorców trzech haszy w trzech plikach — kształt nieodróżnialny od zatuszowania regresji. Zamiast tego dwa piny, które mierzą ten dokument, dowodzą teraz, że dodatek jest addytywny: każdy odcina blokunitsz powrotem i haszuje ponownie względem stałej zamrożonej, zanim blok istniał, a obie stałe są niezmienione. Mutacja potwierdza, że gwarancja jest prawdziwa — przesuń wydaną wartość i ustal ponownie wzorzec hasza całego dokumentu tak, jak zrobiłaby to nieuważna poprawka, a odcięcie i ponowne haszowanie nadal zawodzi. Trzeci pin, w ogólnym zestawie wzorców rejestru, jest ustalony ponownie zgodnie z sześcioma rodzeństwa, które ustalono ponownie dokładnie z tego powodu, a jego niosący wartość literałexpect_summarysię nie zmienia.realtime-frame-eopraportuje, względem której prawdy oceniono każdy wiersz orientacji Ziemi i jak często zadziałał zapas.table3_joint_eop[].{ut1, polar_motion,combined}zyskujątruth_sourceitruth_fallback_rows. Prógfinaljest oceniany względem Bulletin B final i może używać tylko epok, które go publikują; każdy wierszdNjest oceniany względemtruth_pm()/truth_ut1(), które wracają do szybkiej wartości z Bulletin A. W dołączonym wyciągu 2026 to 12 z 31 próbek przy jednym dniu, wobec 0 przy progu — więc wiersz progu i wiersze predykcji obok niego opierają się na mierzalnie innej prawdzie, co raport teraz podaje, zamiast zostawiać do wywnioskowania z liczby próbek, która rośnie tam, gdzie zagnieżdżone horyzonty mówią, że nie może.moonlight-service-volumeemituje punkt odniesienia keplerowski dopasowany wielkością.ephemeris_comparison.keplerian_matchedponownie uruchamia konstelację ilustracyjną przy własnej liczbie satelitów zestawu POBRANEGO, obecne tylko wtedy, gdy liczby się różnią. Liczba jest częścią geometrii tego projektu — RAAN i anomalia średnia są obie rozłożone jako360k/n— więc bez niej pięciosatelitarny pobrany zestaw oceniano względem ośmiosatelitarnego ilustracyjnego i projekt mieszano z rozmiarem. Dla pięciosatelitarnego zestawu referencyjnego LANS 8,68 z 14.24-punktowej luki pokrycia okazuje się trzema brakującymi satelitami, a tylko 5,56 punktu projektem; dla czterech statków naprawdę na orbicie księżycowej, specjalnie zbudowany czterosatelitarny zestaw osiąga 4,86 % tam, gdzie one osiągają 0 %. Test przypina, że dopasowany wiersz jest odbudowaną konstelacją, a nie skonfigurowaną ze zmienioną etykietą, bo tak został najpierw napisany i to właśnie przebieg wtedy zgłaszał.Dziewięć kart możliwości na stronie publicznej, obejmujących 22 wiersze macierzy weryfikacji, które zostały wydane bez karty na poziomie produktu. Silnik urósł o rodzinę możliwości — kontrolę ARAIM względem opublikowanych wektorów referencyjnych Working Group C, rzeczywistą pobraną geometrię konstelacji księżycowej, księżycowy kontur odmowy ze zmierzonym pasmem C/N₀, krok od harmonogramu VLBI do kowariancji stacji, przekazanie optyczne i RF z wstrzykiwaniem błędów między modalnościami, predykcję orientacji Ziemi w czasie rzeczywistym względem zarchiwizowanego Bulletin A, współdzielenie apertury nawigacja–komunikacja, wybieg INS/TRN oraz pokrycie jednostek i pochodzenia — każdą z wierszem macierzy i dołączonym scenariuszem, a żadna nie była nazwana na kshana.dev. Pokrycie kart względem wierszy rośnie z 72 z 168 wierszy do 94.
Osiem scenariuszy dodano do katalogu playground. Przycisk Run na karcie możliwości pojawia się tylko wtedy, gdy
web/app.jszawiera także dany plik; sześć kart wskazywało scenariusz, którego tam nie było, więc wyświetlały się bez możliwości uruchomienia. Jedna z nich, dotycząca rzeczywistego pomiaru odległości laserem, była w tym stanie od chwili wydania. Testtests/scenario_examples_doc_sync.rspilnuje teraz tej niezmienniczości w obu częściach: celrunkarty musi być dołączony wscenarios/i oferowany przez katalog. Sprawdzone testami mutacyjnymi względem obu rodzajów błędu.moonlight-service-volumezapisuje geometrię poszczególnych satelitów jako<scenario>.table.csv, gdy skonfigurowano miejsce eksportu (G11). Jest to największa tablica, jaką publikuje crate: 2304 wierszy w wydanej łącznej tabeli komunikacji i nawigacji. Trafiała ona do odbiorców wyłącznie w JSON, czyli w kształcie, który w sąsiednim scenariuszu obciął krzywą o 57 punktach do 23 punktów pod kolumną deklarującą wszystkie z nich. Jeden wiersz na łącze, liczba wierszy w wierszu nagłówka, kolumny anteny tylko wtedy, gdy skonfigurowano antenę. Przebieg bez miejsca eksportu pozostaje bez zmian co do bajta i nie zapisuje żadnego pliku.SBOM opisuje teraz to, co faktycznie jest dostarczane: z 60 komponentów zrobiło się 66.
scripts/gen-sbom.shwymieniał każdy pakiet z rozwiązania zależności dla funkcji domyślnych, łącznie z zależnościami deweloperskimi. Przez tosgp4ichrono, crate'y używane tylko w testach i niewkompilowane do żadnego artefaktu, trafiły do zestawienia komponentów, a pominięto łańcuch--features python, z którym linkuje się wheel z PyPI (pyo3,pyo3-ffi,pyo3-macros,pyo3-macros-backend,pyo3-build-config,portable-atomic,target-lexicon,heck), czyli granicę obcych funkcji (FFI) tego wheela. Skrypt przechodzi teraz po grafie zależności od pakietu kshana, tylko po krawędziach zwykłych i budowania, po sumie zestawów funkcji domyślnych,pythoniwasm(pakiet npm zawiera ten sam SBOM), dla każdej platformy docelowej. Przypięty werdykt testu zgodności formatu CycloneDX został ponownie wyznaczony przez zatwierdzony generator: z 60 do 66 komponentów, z 53 do 60 złożonych wyrażeń licencyjnych, nadal przy zerze błędów schematu po zapisaniu ich w standardowej postaciexpression.Tabela odtwarzalności CSV jest dostępna w każdym punkcie wejścia, nie tylko w CLI i w wheelu Pythona. Serwer MCP zyskuje siódme narzędzie,
export_table_csv, które uruchamia scenariusz i zwraca stabilną co do bajta tabelę, jaką CLI zapisuje jako<scenario>.table.csv, albo błąd wskazujący rodzaje, które ją publikują (realtime-frame-eop,lunar-time-budget,lunar-jammingorazmoonlight-service-volumetylko przy ustawionychexport_site_lat_deg+export_site_lon_deg). Moduł WebAssembly zyskujetable_csv, zwracające ten sam tekst alboundefined. Test pełnego obiegu MCP i testy wiązań Pythona porównują teraz zwracany plik CSV bajt po bajcie ztests/golden/realtime-frame-eop.csvoraz sprawdzają, żeRunOutput.write_csvzwraca liczbę zapisanych bajtów, a dla rodzaju bez tabeli zwraca 0 bez utworzenia pliku. Każda powierzchnia, która podaje liczbę narzędzi MCP lub je wymienia, mówi teraz o siedmiu.run_allw module WebAssembly: jeden przebieg silnika dla wszystkich wyników.run,chart_svg,summaryitable_csvwykonują scenariusz każde od początku, więc playground płacił za cztery pełne przebiegi przy każdym kliknięciu: w przeglądarce około 12 s zamiast 3 s dlacislunar-arc-recovery.run_allzwraca{json, svg, summary, csv}z jednego przebiegu i playground go teraz używa. Wynik jest identyczny bajt po bajcie z czterema osobnymi wywołaniami.
Poprawiono#
KOREKTA: sprzężenie biasu żyroskopu w filtrze GNSS/INS miało zły znak, a wartości dla przestoju w
gnss-inssię zmieniają. Rozszerzony filtr Kalmana stanu błędu (EKF) przechowuje oba biasy inercyjne jako reszty (wartość prawdziwa minus bieżąca estymata, wprowadzane z powrotem przez dodawanie). Kolumna akcelerometru wpływała na błąd prędkości przez+C_b^n b_a, ale kolumna żyroskopu wpływała na błąd orientacji przez−C_b^n b_g. Resztkowy bias żyroskopu faktycznie obraca obliczoną orientację o+C_b^n b_g, więc każda estymata biasu żyroskopu przesuwała wynik w złą stronę. Pakiet pozostawał stabilny tylko dlatego, że jego domyślna wartość a priori biasu żyroskopu (1e-4 rad/s, 1-sigma) była dość ciasna, by utrzymać te stany w miejscu. Przy szerszej wartości a priori filtr rozbiegał się nawet wtedy, gdy prawdziwy bias żyroskopu wynosił zero: 93 m błędu fuzji w przestoju zamieniło się w 4,3 km. Opublikowane wartości dlascenarios/gnss-ins.tomlzmieniają się następująco:gnss-ins.tomlprzed (≤ 0.27.2) po IMU na zimnych atomach, RMS błędu fuzji w przestoju 96,1 m 1,9 m IMU na zimnych atomach, dryf w specyfikacji (50 m) 30 s 60 s (cały przestój) IMU taktyczny, RMS błędu fuzji w przestoju 62,5 m 3,1 m IMU taktyczny, dryf w specyfikacji (50 m) 37 s 60 s (cały przestój) Wartości dla pracy swobodnej (130,7 m i 314,3 m) się nie zmieniają; nigdy nie korzystały z filtra. Wcześniejszy wniosek z pakietu, że dryf z fuzją jest ograniczony dolną granicą orientacji z przekazania, a więc nie poprawia się przy lepszym czujniku, był artefaktem tego błędu i zostaje wycofany. Przy stałych, wolnych od szumu biasach filtr uczy się ich teraz, gdy GNSS działa, więc dryf z fuzją jest przypadkiem najlepszym. Zewnętrzny wzorzec filterpy (
tests/gnss_ins_sensor_fusion_reference.rs) sprawdza tylko aktualizacje pomiarowe, dlatego nigdy nie zauważył propagacji. Dwa testy sprawdzają teraz znak bezpośrednio i oba zawodzą na starym. Pierwszy, wclosed_loop.rs, podaje znany resztkowy bias żyroskopu przez strapdown i wymaga, by filtr przewidział wynikowy błąd orientacji z dokładnością do 2 %. Drugi wymaga, by filtr z szerokim rozkładem a priori nauczył się biasu żyroskopu 1e-3 rad/s i pozostał w granicach 6 m. Złoty wzorzec międzyplatformowygnss-inszostaje ponownie przypięty z tego powodu i z żadnego innego.Każdy quickstart z rejestru działa teraz tak, jak jest zapisany, na czystej maszynie. Zmierzono przed tą zmianą: przykłady crates.io i PyPI (Python Package Index) odczytywały
scenarios/clock-holdover.toml, którego instalacja z rejestru nie zawiera, a przykład npm zawieszał się w Node.js z błędemTypeError: fetch failed, ponieważinit()pakietu pobiera binarny plik WebAssembly, afetchw Node nie potrafi odczytać pliku lokalnego. Teraz:README.crates.mdiREADME.pypi.mdzawierają ten scenariusz w treści, tak jak robił to jużREADME.npm.md. Blok kodu Rust jest kompletnym programem z własnymmain, ponieważ ukryta w rustdoc linia# Ok::<…>, którą się kończył, jest pokazywana na crates.io i po wklejeniu się nie kompiluje.tests/readme_code_fences_doc_sync.rsnadal kompiluje go bajt po bajcie, a teraz także odrzuca ukrytą linię w tym bloku.README.npm.mdrozdziela przeglądarkę i Node.js oraz podaje przepis dla Node, który odczytuje plik binarny z dysku i przekazuje go doinitSync. Test synchronizacji dokumentacji przyjmujeinitSyncjako loader generowany przez wasm-bindgen.- Wszystkie trzy osadzają scenariusz z nieskróconymi ciągami pochodzenia, więc skrót scenariusza to
5ba83a232b94na każdej powierzchni. Przykład npm dawniej je skracał, przez co miał inny skrót niż CLI. - Odtworzono z lokalnych kompilacji tego drzewa: świeży projekt
cargo newz zależnością przez ścieżkę od spakowanego crate'a zbudował i uruchomił przykład Rust; wheel zbudowany maturinem ze spakowanych źródeł, zainstalowany w nowym środowisku wirtualnym, uruchomił przykład Python; a pakietwasm-pack --target web, spakowany i zainstalowany przez npm, uruchomił przepis dla Node. Wszystkie trzy wypisały tę samą linię podsumowania.
cargo run -- <scenario.toml>działa z sklonowanego repozytorium.Cargo.tomlustawiadefault-run = "kshana". Bez tego cargo odmawiało z komunikatem „could not determine which binary to run”, na który natrafiała każda liniacargo run --w dokumentacji.Błędy CLI w pierwszej minucie mówią, co robić dalej. Ścieżka scenariusza, która nie istnieje, dodaje teraz wskazówkę kierującą do
kshana example, a drugi argument pozycyjny wypisuje tekst użycia, a nie tylko nazywa argument.--help,--version, błąd nieznanej opcji (kod wyjścia 2) oraz jednolinijkoweok:z--validatepo powodzeniu były już na main.tests/cli_first_run.rsobejmuje teraz wszystkie z nich, ponieważ wcześniej żaden test nie uruchamiał dla nich pliku binarnego.list_kinds()w Pythonie jest udokumentowane jako zwracające jeden ciąg JSON, a nie listę. Zwraca te same metadane coscenario_kinds(), w postaci zserializowanej, więc iterowanie po nim przechodzi po znakach. Zachowuje zwracany ciąg, aby nie zepsuć istniejących wywołań.kshana.pyi, komentarz dokumentacyjny wiązania,docs/PYTHON_API.mdiREADME.pypi.mdmówią to teraz i wskazująscenario_kinds().Trzy README rejestrów rozwijają każdy skrót przy pierwszym użyciu. PNT jest teraz rozwinięte w haśle, w którym występuje po raz pierwszy, a CLI, TOML, JSON, SVG, CSV, CSAC, HTML, URL i API są rozwinięte w plikach, które ich używają. Nagłówek tabeli wyroczni nie mówi już „CI-gated” przed zdefiniowaniem CI.
Poprawiono opublikowaną wartość: dostępność ARAIM dla dwóch konstelacji na dołączonych TLE Celestrak dla GPS + Galileo.
docs/CAPABILITY.mdstwierdzał, że dodanie Galileo podnosi dostępność z 0,21 do 0,67 przy VAL 12 m oraz że tryb odporny na awarię konstelacji jest ograniczony przy tylko dwóch konstelacjach. Wynikało to z tego, żetests/araim_dual_real_data.rspropagował każdego satelitę od jego własnej epoki TLE (parse_propagatorsodrzuca epokę), a epoki w tych plikach obejmują 70,6 h (GPS) i 335,7 h (Galileo), więc satelity znajdowały się w wzajemnie niespójnych chwilach. Test zachowuje teraz każdą epokę (parse_tle) i ocenia wszystkie satelity w jednej wspólnej chwili UTC, czyli najpóźniejszej epoce TLE w zbiorze (2026-06-07T07:21:04). Zmierzona dostępność na tej samej 24-godzinnej siatce 289 próbek wynosi teraz dla samego GPS 0,993 (było 0,208), dla połączonych 1,000 (było 0,671) i dla dwóch konstelacji w trybie odpornym na awarię konstelacji 0,990 (było 0,031); przy granicy APV-I tryb dwukonstelacyjny przechodzi z 0,180 na 1,000. Wniosek się odwraca: na spójnym niebie dwie konstelacje podtrzymują hipotezę awarii konstelacji przy VAL 12 m. Te same wartości wychodzą przy najwcześniejszej epoce TLE jako odniesieniu. Samokontrola w teście przypina jego pętlę dostępności próbka po próbce doaraim_dual_constellation_availability, więc jedyną różnicą jest wyrównanie czasu.docs/CAPABILITY.mdidocs/REAL_TLE_GUIDE.md§3 zawierają nowe liczby; wpis 0.13.0 poniżej pozostaje w wersji wydanej.Publiczne powierzchnie nie reklamują już RINEX 4 jako sprawdzonego niezależnie. Silnik odmawia teraz po nazwie obsługi pliku nawigacyjnego RINEX 4, zamiast go błędnie dekodować, ale siatka standardów nadal pokazywała kartę „RINEX 3 / 4” ze znacznikiem sprawdzone niezależnie, powiązanym z dowodami parsera nawigacyjnego dla RINEX-3. Karta brzmi teraz „RINEX 3”, a README,
docs/CAPABILITY.md,docs/STANDARDS.md,ROADMAP.mdi podsumowanie możliwości mówią, co jest prawdą: pliki obserwacji RINEX 3.0x są parsowane, układ obserwacji 4,00 powinien być obsługiwany, ale żaden plik 4,00 nie został odczytany przez ten kod, a pliki nawigacyjne RINEX 4 są odrzucane.--validatemówi, kiedy „ok” oznacza, że nie było czego sprawdzać. Około dwie trzecie katalogu nie publikuje żadnego wymaganego pola; te pakiety uruchamiają swoją konfigurację referencyjną z pustej treści, więc lint mógł dla nich wypisać tylko „ok”, tymi samymi słowami, których używał po sprawdzeniu sześciu pól. Linia powodzenia podaje teraz liczbę wymaganych pól, które stwierdzono jako obecne, albo że rodzaj nie wymaga żadnego.scripts/gate.shodrzuca nienumeryczneREPEATlubTEST_THREADS. W bash 3,2 wartośćREPEAT=nopowodowała błąd porównania liczbowego i wynik fałszywy, więc bramka ogłaszała „repeatability loop SKIPPED (REPEAT=0)” dla wartości, która nie była 0, i mimo to zapisywała potwierdzenie. Oba pokrętła kończą się teraz kodem 2, jeśli nie są zwykłymi liczbami całkowitymi.MSRV jest podane jako 1,85 wszędzie, gdzie czyta je człowiek.
Cargo.tomlw ostatnim wydaniu przeszło na 1,85; plakietka w README, tekst instalacji i rozwiązywania problemów,codemeta.jsonoraz własne uzasadnienie crate'a MCP nadal podawały 1,75.RunOutput.__repr__w wiązaniu Pythona podaje bajty, a nie „chars”. Wypisywałolen()ciągów UTF-8, co jest liczbą bajtów: 710 „chars” dla tabeli o 708 znakach.README nie dokumentuje już razem
--study --study-name.--study-namejest flagą dla pojedynczego scenariusza i jest ignorowana z--study(binarka ostrzega). Dwa przykłady do skopiowania w README.md i README.crates.md pokazują teraz samo polecenie study.Dowody stabilności zegara na stronie podają obie zaobserwowane tolerancje. Seria cezowa 5071A jest odtwarzana z dokładnością ≤ 3e-5, a PHASE.DAT z ≤ 5e-5; akapit podawał 3e-5 dla obu.
Dwa pliki wyjściowe silnika nie są już śledzone.
scenarios/quantum-pnt-demonstrator.study.{json,html}zostały opatrzone znacznikiem silnika 0.20.0 z pustymi wszystkimi wskaźnikami jakości, a własne polecenie study w README nadpisywało je, brudząc drzewo i blokując bramkę push.*.study.json/*.study.htmlsą teraz ignorowane jak pozostałe cztery pliki wyjściowe silnika.Przegląd ziarna (seed) w playground nie zawodzi już przy każdym przebiegu. Przegląd zmieniał całkowite pokrętło
seedliniowo (1, 10,9, 20,8, …), a silnik, odczytując je jakou64, odrzucał każdą wartość ułamkową. Pokrętła całkowite przeglądają teraz różne liczby całkowite.Każde pobranie z playground mówi, który silnik i które dane wejściowe je wytworzyły. Kilka rodzajów (np.
realtime-frame-eop) nie zapisujeengine_versionaniscenario_hash, więc ich pobrania nazywały się po prostukshana-csv.csv. Nazwa korzysta teraz z wersji wczytanego silnika i 12-cyfrowego szesnastkowego odcisku FNV-1a-64 tekstu scenariusza.
Zmienione#
Opublikowany crate jest mniejszy niż połowa dawnego rozmiaru, a
cargo install kshanabuduje samo CLI. Pakiet zawierał dawniej artykuły, ich pakiety zgłoszeniowe, artefakty rysunków do artykułów, notatniki,docs/, skrypty opiekunów i programy przykładowe. Żadne z nich nie jest kompilowane przez bibliotekę ani CLI. Zawierał też trzy wewnętrzne generatory wsrc/bin/(crossover_study,gen_validation_artifacts,validation_report), więc instalacja z rejestru kompilowała i instalowała cztery pliki wykonywalne, z których trzy były użyteczne tylko wewnątrz checkoutu. Te drzewa i trzy źródła generatorów są teraz wykluczone. Cargo wylicza binaria pakietu z zawartych w nim plików, więc opublikowany manifest wymienia tylkokshana. W klonie generatory nadal są znajdowane automatycznie, więccargo run --bin <name>i zadanie wydania uruchamiającevalidation_reportpozostają bez zmian. Zmierzono przezcargo package: wcześniej 763 plików, 16,7 MiB, 6,8 MiB po kompresji; teraz 591 plików, 10,5 MiB, 3,0 MiB po kompresji. Jego kompilacja weryfikacyjna, która kompiluje tylko spakowane pliki, przechodzi.cargo install --pathna spakowanym crate'cie zainstalowało jeden plik wykonywalny,kshana.Wynik czytelny dla inżyniera czasu: koniec z
p95 0.0ns, koniec zsecurity 0.000bez ataku oraz liczby na stronie takie same jak w README. To korekta sposobu wyświetlania. Żadna opublikowana liczba się nie zmienia; wartości JSON są identyczne, co potwierdzają powyższe skróty złotych wzorców.- Jednolinijkowe podsumowanie wypisywało 95. percentyl (p95) błędu czasu zegara optycznego jako
0.0ns, podczas gdy tabela obok pokazywała 1.20e-4 ns. Niezerowa wartość czasu zbyt mała na jedno miejsce po przecinku jest teraz wypisywana z trzema cyframi znaczącymi (p95 1.20e-4ns); dokładne zero nadal wypisuje się jako0.0. Raport HTML (HyperText Markup Language), tabela porównania studiów i pobierany raport z playground stosują tę samą regułę, więc żadna niezerowa wartość nie jest też wypisywana jako0.000. securityto analityczna granica wykrywalności spoofingu, która ma sens tylko wobec skonfigurowanego ataku. Rodzajeclock,orbit,hybridifusiongo nie konfigurują, więc ich podsumowanie wypisuje terazsecurity n/a (no attack)zamiast liczby takiej jak0.000, którą można odczytać jako nieudaną detekcję. Wartość pozostaje wfom.security, oznaczonaapplicable: falsez powodem wfigure_tiers, a tabele raportu pokazują „nie dotyczy”. Rodzajspoofnadal ocenia detekcję.- Dwa przypięte podsumowania w
tests/registry_golden.rszmieniły się dokładnie z tych dwóch powodów i z żadnego innego:golden_clock(p95 kwantowe i obie wartościsecurity) orazgolden_orbit(obie wartościsecurity; jego wartości p95 są dokładnie zerowe). Skróty całych dokumentów się nie zmieniły. Oczekiwane podsumowania w README, trzech samouczkach i ich scenariuszach dydaktycznych zostały zaktualizowane, atests/tutorials.rssprawdza kopie dydaktyczne względem silnika. - Przewodnik po playground nie otwiera się już przy pierwszym wczytaniu. Jego okno modalne przechwytywało pierwsze kliknięcia, a podświetlenie przewijało stronę z miejsca, w którym znalazł się odwiedzający. Uruchamia się przyciskiem „Take the 60-second tour” albo pływającym przyciskiem Tour.
- Strona nie przewija się już na boki na telefonie. Przy 390 px wiersz marki i przycisk GitHub zajmowały około 410 px zawartości, czyli przepełnienie o 4 px; nagłówek mieści się teraz od 320 px w górę, a tabela wskaźników jakości przewija się wewnątrz własnego pola, zamiast rozszerzać stronę.
- Eksplorator możliwości zaczynał od własnej liczby kart („46 kart możliwości … 17 popartych zewnętrzną wyrocznią”), obok README podających 64 z 168. Zaczyna teraz od macierzy weryfikacji, odczytanej z generowanego
web/data/verification-matrix.json(tej samej macierzy, do której przypięto liczby w README), a karty nazywa dopiero potem tym, czym są: warstwą podsumowującą.web/counts.test.mjs, nowy krok w przepływie ciągłej integracji (CI), sprawdza arytmetykę i porównuje README.md z opisami na stronie;tests/web_validation_counts_doc_sync.rsprzypina to połączenie od strony Rust.
- Jednolinijkowe podsumowanie wypisywało 95. percentyl (p95) błędu czasu zegara optycznego jako
Publiczny opis zaczyna się teraz od synchronizacji czasu i holdover, czyli najlepiej zwalidowanej dziedziny. Początek README i
docs/POSITIONING.mdprzedstawiają Kshana jako otwarty, odtwarzalny silnik dowodowy odporności PNT z oznaczonym pochodzeniem: najpierw synchronizacja czasu i holdover w infrastrukturze krytycznej (estymatory Allana, zmodyfikowanego Allana, odchylenia czasu i maksymalnego błędu odstępu czasu oraz inwersja wariancji dryfu w holdover to wiersze VALIDATED, które za tym stoją), kwantowe jako neutralna metoda porównania kwantowego z klasycznym, której wyniki są oznaczone MODELLED, a nawigacja księżycowa / cislunarna i w głębokiej przestrzeni jako utrzymywane możliwości, a nie hasło przewodnie. Obie strony mówią teraz, czym Kshana nie jest: nie jest symulatorem sygnałów radiowych ani stanowiskiem hardware-in-the-loop, nie jest zamiennikiem MATLAB/Simulink, STK ani Orekit; wskazują też nowy rodzajtelecom-timingidocs/TELECOM-TIMING.md. Dawne zdanie „nie ma dobrego otwartego narzędzia” znika: wyszukiwanie, które niczego nie znajduje, nie jest dowodem, że nic nie istnieje.ROADMAP.mdzyskuje niedatowaną kolejność priorytetów (najpierw synchronizacja czasu, potem kwantowe porównanie, a lunarne utrzymywane) i traci trzy nieaktualne pozycje (systematyki Coriolisa i przesunięcia świetlnego, warunki początkowe NRHO i scenariusz księżycowy, wszystkie dostarczone); linia README „Coriolis i przesunięcie świetlne pozostają w planie” jest poprawiona w ten sam sposób.docs/CAPABILITY.mdprzestało się niedoceniać. Wiersz układów związanych z Ziemią mówił „none”, podczas gdy macierz ocenia GCRS→ITRS jako VALIDATED; jest teraz „full”, a wiersz układów rdzenia odnotowuje porównanie z ANISE jako dostarczone. Tryb prowadzony figurował jako plan; playground dostarczył suwaki prowadzone i przewodnik. Przegląd względemsrc/verification.rspoprawił pięć kolejnych wierszy, które były starsze od swoich walidacji: model sił Cowella oraz wsadowe/sekwencyjne wyznaczanie orbity względem Orekit 12,2, przeloty nad stacjami naziemnymi względem detektora elewacji Orekit, jądro współczynnika rozmycia dokładności względem gnss_lib_py oraz import OEM względem niezależnego parseraoem; wiersz weryfikacji i walidacji wymienia teraz zabezpieczenia sprawdzające, że każdy przywołany test istnieje.Słownik wyjaśnia, co mówi plik wyniku.
docs/GLOSSARY.mdzyskuje wpisy w prostym języku dla terminów wyniku (holdover, p95, integralność, wskaźnik bezpieczeństwa, PDOP,sigma_y,q_wf), terminów synchronizacji telekomunikacyjnej (błąd czasu, max|TE|, cTE, dTE, MTIE, TDEV, PRTC, ePRTC, T-BC, T-TSC, OCXO, CSAC) oraz trzech poziomów dowodowych (VALIDATED, MODELLED, PARTNER).Skróty są rozwijane przy pierwszym użyciu w każdym ręcznie pisanym dokumencie publicznym. README i 24 plików w
docs/miało kilkaset skrótów użytych przed rozwinięciem lub bez niego; każdy jest teraz rozwinięty tam, gdzie pojawia się w danym pliku po raz pierwszy. Trzy pliki generowane (docs/VERIFICATION-MATRIX.md,docs/MODELLED-RATIONALE.md,docs/SCENARIOS.md) pozostają bez zmian: są pisane zsrc/verification.rsiapi::list_scenario_kinds(), więc ich brzmienie trzeba zmienić u źródła.Pokrycie linii ma pomiar referencyjny.
docs/COVERAGE.mdzapisuje 95,63 % (37 697 z 39 419 linii) z zadania CIcoveragedlab1d350d, atests/coverage_figure_doc_sync.rsprzypina do niego pięć publicznych powierzchni z „~96%”, czyli jedyną główną liczbę, którą utrzymywano ręcznie i która już raz zmieniła się niezauważona.Nowe bramki synchronizacji dokumentacji dla powierzchni, których nic nie czytało.
tests/readme_code_fences_doc_sync.rssprawdza każdeimport { … } from "kshana"w bloku JavaScript względem eksportów WebAssembly i przypina przykład Rust z README.crates.md bajt po bajcie do kopii kompilowanej przez binarkę testową.tests/security_md_doc_sync.rszawodzi, jeślisrc/lib.rstraci#![forbid(unsafe_code)]lub SECURITY.md przestaje to stwierdzać.tests/no_overclaims.rsskanuje teraz takżeweb/README.mdi trzy README rejestrów, a każdy standard na stronie musi jawnie podawać swójproof.Dwie kontrole zegara na rzeczywistym sprzęcie działają na runnerze.
realdata-clock.yml(co miesiąc i na żądanie) pobiera serie 5071A i PHASE.DAT i uruchamia oba testy zKSHANA_REQUIRE_REALDATA=1, więc brakujące dane wejściowe powodują porażkę zamiast pominięcia. Oba skrypty pobierania są przypięte do jednego commitu allantools i weryfikują SHA-256.Stub typów Pythona jest sprawdzany względem zbudowanego wheela (
mypy.stubtestw zadaniu bindings), przez cocsv/write_csvzostały wydane bez stubu.Słownik definiuje URE, EOP, FoM, CTI i TIB, których README i rejestr używały bez rozwinięcia.
Opublikowany kontrakt pól każdego rodzaju jest teraz prawdziwy, a test go tak utrzymuje. Zmieniło się pięć z 61 rodzajów. Rodzaje z niepustym
required_fieldsprzechodzą z 21 do 22:ephemeriswymaga teraztle|orbit+epoch(samokind = "ephemeris"dawniej przechodziło--validate, a potem kończyło przebieg błędem), aquantum-tradedodajecandidate_adev_taus+candidate_adev_values|candidate_clock_class, czego jego przebieg już wymagał. Wymagany wpis może używać|(jedno z nich) i+(wszystkie razem);--validaterozumie oba.lunar-joint-od-clock,pvtiearth-gnss-lunarpublikują 9 rzeczywistych pól opcjonalnych, które wcześniej pominięto.docs/SCENARIOS.mdmówi teraz, żekindjest wymagane dla każdego rodzaju pozaclock.tests/required_fields_are_true.rssprawdza każdy rodzaj względem dostarczonego scenariusza: usunięcie dowolnego wymaganego wpisu musi sprawić, że przebieg zawiedzie, a dokument zawierający tylko wymagane pola musi się uruchomić.Notatki JetBrains Marketplace są objęte bramką.
scripts/check-version-sync.shkończy się teraz błędem, jeśli najnowszy wpis<change-notes>wplugin.xmlnie podaje wydawanej wersji; siedem opublikowanych wersji serwowało bez zmian notatki 0.22.0.Wartość pokrycia w raporcie technicznym jest wartością zmierzoną.
paper/kshana-technical-report.mdpodawał „near 97 %”; teraz podaje około 96 % (95,63 % zmierzone,docs/COVERAGE.md) i jest szóstą powierzchnią, którą przypina test pokrycia.Klient silnika poza głównym wątkiem jest testowany (
web/engine.test.mjs, w CI): lista dozwolonych wywołań, anulowanie i ponowne uruchomienie, trzy ścieżki awaryjne w głównym wątku oraz odzyskiwanie po awarii, na atrapie workera.Nic nie jest publikowane, dopóki otagowany commit nie przejdzie swoich testów, a wydanie nie jest zakończone, dopóki każdy rejestr go nie serwuje. Kolejność to teraz tag, weryfikacja, publikacja, parytet, strona, w jednym przebiegu
release.yml(docs/RELEASING.md).- Publikacja czeka na werdykt.
publish.yml,mcp-publish.ymlijetbrains-plugin.ymlnie startują już po wypchnięciu tagu; wywołuje jerelease.ymlz zadań, które mająneeds: verify. Wcześniej ścigały się z nim: przy v0.27.2 crates.io, npm i Python Package Index (PyPI) opublikowały wszystko w ciągu 4,5 minuty od tagu, averifyzwróciło wynik 84 minuty po nim; przy v0.27.0 npm i PyPI opublikowały, podczas gdy zadanie crates.io zakończyło się błędem. Ręczną ponowną próbę na tagu wstrzymuje nowyscripts/check-release-verdict.sh, który wymaga zielonegoverifydla dokładnie tego commitu z interfejsu Actions i w każdym innym przypadku kończy się odmową. - Wszystko jest budowane, zanim cokolwiek zostanie wysłane, a crates.io, którego krok pakowania zawiódł w połowie wydania, publikuje jako pierwszy.
- Brak tokenu rejestru kończy zadanie błędem zamiast pominąć wysyłkę i zgłosić powodzenie.
- Kontrola parytetu po publikacji.
scripts/check_channel_parity.pyodpytuje crates.io (kshanaikshana-mcp), npm, PyPI (dystrybucję źródłową i wszystkie sześć wheeli platformowych) oraz ghcr.io, aż każdy serwuje daną wersję, albo kończy przebieg błędem; docs.rs i rejestr Model Context Protocol (MCP) są raportowane, ale nie wymagane. Uruchomiony na dawnych wydaniach stwierdza brak 0.22.0 w npm i PyPI, brak 0.23.0 w PyPI i brak 0.27.0 w crates.io. - Gotowe binaria wiersza poleceń dla macOS (Apple silicon i Intel) oraz Windows x86-64, nazwane według celu (
kshana-aarch64-apple-darwini tak dalej), obok linuksowegokshana, którego nazwa się nie zmienia. PlikSHA256SUMSobejmuje każdy zasób, averify-releasesprawdza go i uruchamia binaria dla macOS i Windows na ich własnych systemach. - kshana.dev pokazuje wydanie, a nie
main. Dawniej wdrażało się ponownie przy każdym pushu domain, podczas gdy jego strony wymieniały ostatnie wydanie.pages.ymlbuduje teraz tylko tag wydania: wydanie uruchamia go raz, gdy każdy kanał serwuje daną wersję, a ręczne uruchomienie wdraża ponownie ostatnie wydanie (lub wskazane). - Jedno źródło wheeli. Ręcznie skopiowana macierz sześciu celów w
publish.ymlzniknęła; wywołuje onwheels.yml, więc bramka znacznika auditwheel i sprawdzenie odtwarzalności bajt po bajcie oceniają teraz wheele, które otrzymuje PyPI, a porażka któregokolwiek z nich zatrzymuje wydanie. - Przypięte narzędzia budowania. Każdy workflow żąda Rust 1.93.0 (zadanie msrv własnej wersji);
publish.ymlipages.ymlżądały@stable, a log v0.27.2 pokazuje, że rustup instalował 1.98.1, a następnie kompilował z 1.93.0 tylko dlatego, żerust-toolchain.tomlma pierwszeństwo. wasm-pack jest przypięty do 0.13.1 (wersja, która zbudowała v0.27.2, wybrana przez nieprzypięty skrypt instalacyjny) ze sprawdzeniem sumy kontrolnej, a mcp-publisher do 1.8.1 z opublikowanym SHA-256.scripts/check-toolchain.shkończy się teraz błędem, jeśli workflow prosi o inny kompilator lub przekazuje pobrany skrypt do powłoki. Żadne zadanie weryfikacji, przypięty złoty wzorzec ani lokalny skrypt bramki nie zostały usunięte ani osłabione.
- Publikacja czeka na werdykt.
Bezpieczeństwo#
Każda zewnętrzna akcja GitHub jest przypięta przez SHA commitu: 93 odwołań w 15 workflowach, z czego 92 nowo, a tag zostaje jako końcowy komentarz do aktualizacji przez Dependabot. Wyjątkiem jest
dtolnay/rust-toolchain, którego tag jest selektorem toolchainu.Bazowe warstwy obrazu serwera MCP są przypięte przez skrót wieloarchitekturowy, a Dependabot obserwuje teraz Dockerfile
mcp/kshana-mcp, więc warstwy systemu nadal dostają aktualizacje bezpieczeństwa, przez zrecenzowany PR.Sprawdzenie zgodności tagu z manifestem działa w dwóch workflowach publikacji, które wydają wersję z tagu.
mcp-publish.yml(obraz ghcr, rejestr MCP) ijetbrains-plugin.yml(Marketplace) ścigają się zpublish.ymlzamiast na niego czekać, więc błędnie wycięty tag był bramkowany tylko w siostrzanym workflow. Oba uruchamiają terazscripts/check-version-sync.shprzed budowaniem.Naprawiono cztery ostrzeżenia, które Dependabot zgłosił w dniu włączenia alertów. Serwer MCP przechodzi z
rmcp1,7 na 2,2: trzy ostrzeżenia dotyczącermcp< 2,1 (wyciek tabeli sesji Streamable-HTTP, brak walidacji chronionego zasobu OAuth, własne nagłówki podążające za przekierowaniem między źródłami); żadne nie jest tu osiągalne, bo serwer mówi tylko przez stdio, ale opublikowany crate nie powinien przypinać podatnego SDK. Makrarmcp2 wymagają Rust 1,88, więc tylkokshana-mcpdeklaruje terazrust-version = "1.88"; bibliotekakshanazostaje przy 1,85. Jedna zmiana API (Content→ContentBlock) została zastosowana, a testy pełnego obiegu przechodzą. Akcja skanowania SonarQube przechodzi z v5 na v6, co naprawia ostrzeżenie o wstrzyknięciu argumentu (≥ 4,0, < 6,0).
0.27.2 - 2026-09-22#
Dodano#
Każdy element Rust przywołany przez wiersz macierzy weryfikacji jest teraz rozstrzygany względem crate'a. Dotychczasowa bariera sprawdzała cytowania w kształcie ścieżek plików; 63 ze 164 wierszy niepartnerskich podaje swoje dowody jako element wewnątrz crate'a:
navsignal::code_tests,integrity::tpl_scalar::tests,api::tests::tracking_loop_kind_round_trips_through_the_dispatch, a token bez przyrostka.rsbył niewidoczny dla skanera ścieżek. Takie wiersze mogły wskazywać zmieniony moduł, opróżniony moduł testów lub funkcję, która nigdy nie istniała, a każda bramka pozostałaby zielona.tests/verification_rows_name_a_test_that_exists.rsrozstrzyga wszystkie 339 takich cytowań przez drzewo modułów, wymaga, aby każdy wiersz niepartnerski wskazywał co najmniej jeden test, który faktycznie ma#[test], i wymaga, aby wiersze partnerskie nie wskazywały żadnego. Do oceny testu użyto czterech mutacji: zmiany nazwy cytowanego modułu, skierowania jedynego cytowania testu w wierszu na funkcję niebędącą testem, zmiany nazwy prawdziwegomod testsoraz usunięcia z niego atrybutów#[test]; każda z nich zaczerwienia asercję, która za nią odpowiada.Jeden wiersz był już błędny: Alternative / complementary PNT przywoływał
tests/*, czyli glob, który nie jest cytowaniem. Wymienia teraztests/alternative_complementary_pnt_reference.rsoraz trzy stojące za nim wewnętrzne moduły testów crate'a.Opublikowane wykresy są ponownie sprawdzane względem silnika przy każdej kompilacji (
tests/published_figures_still_reproduce.rs). Trzy wykresy demonstracyjne w README to własny wynikchart.svgsilnika i nic nie uruchamiało scenariusza ponownie; dwa studia punktu przecięcia z artykułu zostały wygenerowane raz i zatwierdzone; a README podaje cztery wskaźniki jakości w tekście obokscenario-fom.png. Wszystkie trzy są teraz przypięte do bieżącego wyniku silnika.Ich uzgodnienie przyniosło użyteczny wynik: wykresy demonstracyjne narysowano w silniku 0.22.0, a JSON punktu przecięcia z artykułu w 0.20.0, a w 0.27.1 każda narysowana wartość we wszystkich pięciu artefaktach jest identyczna; trzy wykresy SVG różnią się od świeżego przebiegu dokładnie dwoma znakami każdy, czyli znacznikiem wersji w stopce. Wykresy wyrenderowano ponownie, aby stopka była prawdziwa. JSON artykułu celowo pozostaje ze znacznikiem 0.20.0: jest zapisem przebiegu, którego wykres zawiera opublikowany artykuł, a zmiana znacznika przypisałaby mu pochodzenie, jakiego PDF nie ma. Bariera stwierdza zamiast tego mocniejszą własność: że obecny silnik nadal odtwarza każdą opublikowaną wartość.
Poprawiono#
Analizy SonarCloud były zapisywane jako
VERSION=not provided, więc okres nowego koduprevious_versionnigdy nie przesuwał się: nadal był zakotwiczony w analizie z 2026-07-02, oceniając osiemdziesiąt dwa dni pracy jako jedną deltę i mierząc 7877 „nowych” zduplikowanych linii wobec progu 3 %. Skan przekazuje teraz wersję crate'a. Leżąca u podstaw duplikacja jest prawdziwa i to jej nie ukrywa: skupia się w deklaratywnych rejestrachFieldUnitpowtarzanych wensemble,hybrid,fusion,inertialireportoraz w 168-wierszowej tabeli weryfikacji i jest tu nazwana pracą do wykonania, a nie wyłączona z pomiaru.scripts/gate.shnie miało blokady jednego piszącego, a każdy przebieg zapisywał ten sam log. To nie jest kwestia porządku: wartościintegration_binaries,tests_passeditests_ignoredz potwierdzenia są odczytywane Z tego logu, a hak pre-push ufa potwierdzeniu. Bramka, która została zabita, ale której binarka testowa nadal żyła, zapisywała dalej do pliku, który następny przebieg właśnie obciął, więc liczby jednego przebiegu mogły zostać poświadczone jako liczby innego, co upoważniało do pushu na podstawie zestawu, który nigdy nie uruchomił się na wypychanym drzewie. Teraz jest jedna bramka na checkout (odmawia z kodem wyjścia 75 obok żywej, usuwa przestarzałą blokadę, której pid już nie istnieje) i jeden log na przebieg, atarget/gate-run.logjest odświeżany z kończącego się przebiegu przy wyjściu. Oba kierunki są przetestowane: żywy pid powoduje odmowę, martwy zostaje wyczyszczony.src/verification.rstwierdził, że jego testy nie dowodzą, że ciągi nazw testów i wyroczni wskazują żywy kod. Dwie bariery robią teraz dokładnie to, więc dokumentacja modułu mówiła odwrotnie niż jest naprawdę; podaje teraz, co jest sprawdzane maszynowo, a co pozostawiono ocenie człowieka. Nieaktualne odwołanie doverification::gen, bo moduł nazywa sięartifacts, zostało poprawione w dokumentacji siostrzanej bariery.
Zmienione#
mainzostała przepisana 2026-09-22 i wypchnięta siłą. Dziesięć commitów stało się czterema. Przepisanie wchłonęło każdy commit, który zostawiał bramkę czerwoną, w commit, który ją naprawiał, więc każdy commit namainma teraz drzewo, które przechodzi, i usunęło anulowane przebiegi, które grupa współbieżności obejmująca cały branch zostawiała na każdym zastąpionym commicie.Nic nie zostało odrzucone. Commity sprzed przepisania pozostają osiągalne przez tagi, które na nie wskazują, a końcowe drzewo jest identyczne bajt po bajcie z drzewem, od którego przepisanie zaczęło:
git diffmiędzy starym a nowym końcem jest puste, poza trzema plikami workflow, które zmienia to wydanie.Zastąpione SHA, dla każdego, kto trzyma do któregoś odwołanie:
stary temat 9733177docs(changelog): disclose the authorship rewrite and the two dangling crate sha1s 5d16ea8fix(docs): the engine-flow diagram said 6 figures of merit; the engine scores 7 148d31dfix(test): two more cross-platform pins, and two wrong assumptions of my own a3a2667feat(web): surface the lunar cluster on the site — seven capability cards 1e8bec6docs(lunar): document 42 public fields and ratchet the ceiling down to 985 7bba514chore(release): v0.27.0 3154548test(docs): guard the distribution diagram, the last unguarded one 7864142chore(release): v0.27.1 Tagi v0.27.0 i v0.27.1 celowo NIE zostały przesunięte. Nadal wskazują
7bba514i7864142, dokładnie te commity, których drzewa wytworzyły artefakty obecnie dostępne w crates.io, npm, PyPI, ghcr.io i rejestrze MCP..cargo_vcs_info.jsoncrate'a zapisuje sha1, z którego został spakowany, rejestry są niezmienne, a atestacja pochodzenia budowy SLSA na zasobach wydania v0.27.1 jest związana z tym commitem. Przesunięcie tagów zostawiłoby każdy z tych opublikowanych artefaktów wskazujący commit, który już nie istnieje. Pozostawienie ich utrzymuje stare commity osiągalnymi i każdy opublikowany łańcuch pochodzenia rozstrzygalnym, kosztem dwóch tagów, które nie są już przodkamimain; dlatego to wydanie istnieje: v0.27.2 dajemainwłasny tag, spakowany z commitu, który się na niej znajduje.To drugie ujawnione przepisanie tej historii; pierwsze, 2026-09-21, ujednoliciło autorstwo i jest zapisane w notatkach 0.27.0 wraz z jego dwoma wiszącymi sha1 crate'ów. Przepisanie jest tu ujawniane za każdym razem, bo repozytorium, które sprzedaje weryfikowalne pochodzenie, nie może po cichu ruszać gruntu spod opublikowanego artefaktu.
0.27.1 - 2026-09-22#
Poprawiono#
Opublikowany crate się nie kompilował.
src/lunar_orientation.rszawierainclude_str!najwyższego poziomu dlatests/fixtures/llr_geometry/de440_moon_pa.csv, a manifest wyklucza/tests/fixturesz pakietu, więc archiwum otrzymywane przez crates.io nie miało pliku, który sama biblioteka osadza. Publikacja v0.27.0 zawiodła w kompilacji weryfikacyjnej z tego powodu i żadne 0.27.0 nie dotarło do crates.io; npm i PyPI, których zadania od niego nie zależą, opublikowały normalnie. Wykluczenie ma teraz wyjątek dla tego jednego katalogu.Każde inne
include_str!fixture wsrc/znajduje się wewnątrz modułu#[cfg(test)], więc nigdy nie trafia do spakowanej biblioteki. Tylko to na najwyższym poziomie trafia.Nic w CI nie uruchamiało
cargo package, dlatego archiwum, które nie może się skompilować, zostało po raz pierwszy wykryte przez zadanie publikacji, gdy dwa inne rejestry już je wydały. Zadaniepackagebuduje teraz i kompiluje dokładnie to archiwum przy każdym pushu.
Zmienione#
- Przypięte skróty emisji realizacji układu księżycowego nie przesuwają się już przy podbiciu wersji. Stopka SVG zawiera wersję silnika, więc każde wydanie wymuszało nowe wyznaczenie trzech skrótów, dwukrotnie w jednym dniu, a pin ponownie wyznaczany z rutyny przestaje być czytany. Ciąg wersji jest normalizowany do symbolu zastępczego przed haszowaniem, a emisja jest osobno sprawdzana pod kątem podania działającej wersji, więc ten fakt jest sprawdzany dokładniej, niż kiedykolwiek sprawdzał go skrót.
0.27.0 - 2026-09-22#
Dodano#
lunar-llr-datum: księżycowy datum układu z prawdziwej kampanii obserwacyjnej.lunar-frame-campaignzastąpiło wstrzykniętą transformację Helmerta symulowaną kampanią i powiedziało to wprost: jej sieć stacji, harmonogram i sigma na obserwację są wejściami ilustracyjnymi. Ten scenariusz usuwa symulację z dwóch miejsc, w których harmonogram i model błędu wchodzą do wyniku. Epokami są czasy nadania 337 zarchiwizowanych normalnych punktów księżycowej laserowej lokacji ILRS (2015-04-08 .. 2015-06-27, Grasse MeO 7845 i Matera MLRO 7941, wszystkie pięć macierzy reflektorów), a waga każdej obserwacji to własna zarchiwizowana precyzja tego punktu normalnego,bin_rms / sqrt(n_raw), czyli mediana 5,13 mm odległości w jedną stronę, wzięta z pliku, a nie wybrana tutaj. Współrzędne stacji pochodzą z IERS ITRF2020, a współrzędne reflektorów z tabeli 7 JPL DE430; każde fixture zapisuje adres URL, datę pobrania i SHA-256 i jest regenerowane ze swojego źródła przez zatwierdzony generator, który weryfikuje źródło i przerywa zamiast wyemitować liczbę. Raport nazywa, które łącza są zmierzone, a które pozostają modelowane, i te modelowane są zmierzone: różnica obserwowana minus obliczona odległości w jedną stronę na rzeczywistych danych wynosi 156 494 m RMS, co ten sam zestaw testów potwierdza względem JPL Horizons na tym samym przedziale (195 655 m RMS wektora, najgorsza epoka 0,054°, czyli w granicach ~0,3°, które wbudowany analityczny szereg księżycowy deklaruje dla siebie). Addytywnie: nowy rodzaj, nowy czytnik (realdata::llr_crd) i nowy moduł (lunar_llr); istniejące pakiety układu księżycowego są przypięte bit po bicie.sigma_ure_mjako parametr scenariusza wlunar-integrityimoonlight-service-volume. Dokładność pomiaru odległości w sygnale w przestrzeni była stałą czasu kompilacji (LUNAR_SIGMA_URE_M), więc przegląd objętości usługi mógł odpowiedzieć tylko „zaliczone albo nie” przy jednej ustalonej wartości. Poziomy ochrony są względem niej dokładnie liniowe, więc jej udostępnienie zamienia przegląd w wymaganie dokładności pomiaru odległości w całej objętości. Wartość domyślna odtwarza dotychczasowe zachowanie bit po bicie.Eksport geometrii poszczególnych satelitów w
moonlight-service-volume:export_site_lat_deg+export_site_lon_degdodają tablicęper_sat_geometrypodającą azymut, elewację i odległość ukośną do każdego satelity w każdej epoce dla jednego nazwanego miejsca selenograficznego, plus znacznik widoczności. Zbiorcze podsumowanie pokrycia celowo zwija geometrię poszczególnych satelitów, ale odległość ukośna jest dokładnie tym, czego używa bilans łącza, więc łącznej analizy komunikacji i nawigacji nie dało się wykonać z samego podsumowania. Wyłączone, jeśli nie podano obu współrzędnych; wyłącznie addytywne.lunar_service::topocentric, publiczna funkcja pomocnicza kątów widzenia stojąca za eksportem.Wiersz macierzy weryfikacji dla nowej możliwości geometrii.
Rzeczywisty wzorzec anteny w eksporcie geometrii. Silnik od P1 zawiera wzorzec jednorodnie oświetlonej apertury kołowej (
antenna::pattern_gain_dbi, postać Airy’ego[2·J₁(x)/x]²), a nic pozaantenna.rsgo nie używało; zamiast tego pracę wykonywała wzmocnienie na osi w parze z regułą kciuka wzmocnienie–szerokość wiązki. Opcjonalna tabelaexport_antennawmoonlight-service-volume(odczytywana tylko wtedy, gdy ustawiono miejsce eksportu) daje teraz każdemu wierszowi eksportu kąt poza osią na satelicie i wzmocnienie nadawcze w kierunku miejsca z tego wzorca oraz dodaje blokantenna_pattern, który podaje liczbę w wiązce według rzeczywistego wzorca obok liczby w wiązce według przybliżenia symetrycznego (θ₃dB[deg] = √(31000/G_lin)) z różnicą jako nazwaną korektą. Emitowane są obie liczby; żadna nie zastępuje drugiej. Zmierzone przy własnej reprezentatywnej aperturze księżycowej silnika (czasza 1 m, 2,4 GHz, η = 0,60) nad miejscem przy biegunie południowym i ilustracyjną powłoką klasy LCNS obie różnią się o więcej niż jednego satelitę: rzeczywisty wzorzec umieszcza 0 z 76 widocznych łączy w wiązce półmocy, przybliżenie twierdzi 28; korekta wynosi −2,33 satelity na epokę, a najgorsza pojedyncza epoka 3. Przybliżenie ma własną sprawność apertury (0,641 wobec reguły70·λ/Dstopni, w której zwykle się je podaje, 0,920 wobec jednorodnej apertury kołowej), więc dla czaszy o η = 0,60 zwraca wiązkę 1,238× za szeroką; blok emituje obie implikowane sprawności zamiast zostawiać je do wywnioskowania. Wyłącznie addytywnie: zmierzone w udokumentowanym punkcie pracy, 597 dotychczasowych liści, 0 zmienionych, 0 usuniętych, 494 dodanych.antenna::symmetric_beamwidth_rad,antenna::symmetric_relation_implied_efficiency,antenna::within_half_power_beam,antenna::HALF_POWER_DROP_DB,antenna::SYMMETRIC_GAIN_BEAMWIDTH_CONST_DEG2,antenna::UNIFORM_APERTURE_HPBW_COEFFilunar_service::nadir_off_boresight_rad, publiczne elementy za tym stojące. Wzorzec jest też teraz zakotwiczony względem opublikowanych stałych Airy’ego, a nie tylko względem samego siebie: przejście przez połowę mocy jest lokalizowane bisekcją i porównywane zx = 1.61634, co daje dokładną szerokość połowy mocy1.02899·λ/Di uczciwie zapisuje, że konwencjonalny współczynnik1.02dajepattern_gain_dbirówne −2,955 dB, a nie −3,010 dB.Długa tabela odtwarzalności dla
lunar-time-budget. Wyniki scenariusza będące tablicami, czyli siatka czasów uśredniania, siedem krzywychx(τ)dla poszczególnych składników i ich suma kwadratowa, docierały do odbiorców tylko jako tablice JSON. Jedna wydana tabela została obcięta na 400 znakach i opublikowała 23 z 57 czasów uśredniania pod kolumną deklarującą wszystkie z nich, a manuskrypt odbudowywał krzywe składników ze wzorów zamkniętych, bo silnik nigdy ich nie emitował. Zwykły przebieg zapisuje teraz także<scenario>.table.csvz jednym wierszem na (indeks siatki, czas uśredniania, składnik), którego nie da się obciąć do czegoś, co nadal wygląda na całość. Indeks siatki jest dokładnym kluczem złączenia;τjest zapisywane z 13 cyframi znaczącymi, a każdexz 7, więc bajty nie rozchodzą się między kompilacjami tego samego źródła. Wyłącznie addytywnie: raport JSON jest identyczny bajt po bajcie.Raport
hybrid-optical-rfopisuje teraz sam siebie. Bloklink_configurationpowtarza rozstrzygnięte wejścia łącza (długość fali nośnej, apertura nadawcza i odbiorcza, odległość, szerokość impulsu, czas integracji, sprawności i straty) z zastosowanymi wartościami domyślnymi, więc artykuł podaje konfigurację, z którą się uruchomił, zamiast cytować wartość domyślną odczytaną ze źródła. Blokunitspodaje jednostkę i klasę pochodzenia każdej wielkości, którą artykuł prawdopodobnie zacytuje. Powodem jego istnienia są ślady kowariancji przekazania: były emitowane jako gołyvariance, a manuskrypt wywnioskował metry kwadratowe z wewnętrznej kontroli spójności. Wniosek był słuszny, i właśnie dlatego był defektem: nic nie wychwyciłoby, gdyby był błędny. Wyłącznie addytywnie: zmierzone dla czterech konfiguracji, 456 dotychczasowych pól, 0 zmienionych, 0 usuniętych, 196 dodanych.Wiersz macierzy weryfikacji dla tabeli odtwarzalności bilansu czasu, uczciwie
InternalConsistency/ MODELLED: suma jest sprawdzana względem sumy kwadratowej składników w tym samym pliku, który współdzieli własne definicje składników silnika i dlatego nie jest niezależną wyrocznią. Razem dodają one trzy wiersze. Bieżąca suma dla tej niewydanej sekcji to 168 wierszy: 64 VALIDATED, 100 MODELLED, 4 PARTNER.
Zmienione#
Autorstwo commitów w całej historii jest teraz jedną tożsamością, a dwa opublikowane crate'y wskazują commit, który już nie istnieje. 2026-09-21 historię git przepisano tak, aby każdy commit od człowieka miał jako autora i zatwierdzającego
ashfordeOU <236818772+ashfordeOU@users.noreply.github.com>. Wcześniej nosiła trzy zapisy jednej osoby: 688 commitów jakoashfordeOU <contact@ashforde.org>, 34 jakoChakshu Baweja <contact@ashforde.org>i 94 już kanonicznych. Jedyny commitdependabot[bot]celowo pozostawiono z własnym autorem: zmiana etykiety aktualizacji zależności od bota przypisywałaby autorstwo pracy, której nikt tu nie wykonał.Żadna treść się nie zmieniła. Przepisanie dotknęło wyłącznie nagłówków autora i zatwierdzającego, i da się to sprawdzić, a nie tylko twierdzić: drzewo każdego tagu i każdego brancha jest bit po bicie takie samo jak wcześniej.
v0.26.0nadal wskazuje drzewo92284e9420605568f1bfabb78cd95d383b40f3e2, dokładnie tak jak przedtem.Ile to kosztowało. Nazwa commitu jest skrótem drzewa, rodziców i nagłówków autora, więc zmiana przodka zmienia nazwę każdego potomka. Commit wydania
v0.26.0miałdce2dbf7700788cf6de46260c14673c0e5347360, a ma terazd4921f3025569e00e425e1747d0acfc261e96e18. Dwa artefakty zapisały starą nazwę w chwili publikacji i nie można ich poprawić, bo opublikowana wersja w rejestrze jest z założenia niezmienna:kshana0.26.0 w crates.io:.cargo_vcs_info.jsonzapisujedce2dbf…kshana-mcp0.26.0 w crates.io: ten sam sha1,path_in_vcs: mcp/kshana-mcp
Nic więcej nie jest dotknięte. Pakiet npm nie zapisuje
gitHead, a dystrybucja PyPI w ogóle nie zapisuje commitu; oba sprawdzono, a nie założono.Nie ma naprawy, po której
dce2dbf…wskazywałoby przepisany commit: ten ciąg jest starym rodowodem, a jedyny sposób, w jaki da się go rozstrzygnąć, to pozostawienie opublikowanej historii sprzed przepisania, co przywróciłoby autorstwo, które przepisanie usunęło. Pochodzenie 0.26.0 biegnie więc przez tag, a nie przez zapisany sha1, a tag dostarcza identyczne bajty, z których crate zbudowano. Następne wydanie zapisuje prawidłowy commit bez żadnego działania.
Poprawiono#
realtime-frame-eopdomyślnie używało pliku EOP bez wierszy predykcji (G12). Scenariusz osadzał pięciowierszowy wyciągfinals2000Atylko z wartościami ostatecznymi jako domyślny tryb offline, więc goły przebieg raportowałpredicted_rows.n = 0, a tabela dla poszczególnych horyzontów opierała się na parach 5, 4, 3 i 2. Silnik zawsze potrafił odczytać wiersz predykcji; po prostu dane wejściowe żadnego nie miały. Domyślnym jest teraz dosłowny wyciąg IERS 2026 (tools/finals2000A_2026.txt, MJD 61173–61204): 20 wartości ostatecznych Bulletin B i 12 wierszy Bulletin A wyłącznie z predykcją, więc goły przebieg bez argumentu pliku i bez sieci raportujepredicted_rows.n = 12i tabelę dla poszczególnych horyzontów przy n = 20 / 31 / 30 / 29, a porównanie z predyktorem operacyjnym i uzgodnienie z własnymi opublikowanymi predykcjami produktu również się wypełniają. Długi 45-wierszowy wyciąg zmierzono jako alternatywę i odrzucono: również zawiera tylko wartości ostateczne, więc zostawiłbypredicted_rows.nna 0. To zmienia opublikowane liczby, na mocy reguły R4 i za zgodą założyciela: dziesięć z 22 komórek wydanegop4_frame_eop.csvi 24 z 42 wypełnionych komórektests/golden/realtime-frame-eop.csv. Zmierzona podłoga bieguna rapid minus final wynosi 0,0678 mas (z 0,0769 mas), czyli wartość, którą własna tabela ruchu bieguna w artykule P4 już publikuje przy n = 20; obie zgadzają się teraz zamiast różnić się o 13,5 %. Każda inna wartość, którą P4 drukuje z tej tabeli, jest bez zmian przy drukowanej precyzji. Pełne zestawienie stare → nowe, w tym pól, które nie uległy zmianie, jest wdocs/revisions/G12-default-eop-cell-changes.md. Wyciąg tylko z wartościami ostatecznymi nadal jest dostarczany, przypięty co do bajta i ćwiczony: zerowa liczba wierszy predykcji na nim jest własnością tego pliku i test nadal to dowodzi.Przestarzałe ograniczenie liczby satelitów w
moonlight-service-volume. Scenariusz ograniczałn_satsdo 12, chociaż jego własny konstruktor konstelacji obsługuje 24, a test stwierdza 24, więc każda żądana liczba powyżej 12 była po cichu zmniejszana, a przegląd liczby satelitów zwracał identyczne wartości powyżej 12, nie do odróżnienia od prawdziwego nasycenia geometrycznego. Teraz ograniczenie wynosi tyle, ile limit konstruktora. Jest to zmiana zachowania tylko dlan_sats > 12.To samo przestarzałe ograniczenie w
lunar-differential-pnt.lunar_dpntograniczałon_satsdo 12 z tym samym skutkiem, a ten trafił do opublikowanej tabeli:dpnt_nsats_sweep.csvzawiera wierszn = 16identyczny bajt po bajcie z wierszemn = 12, bo silnik zwracał odpowiedź dla dwunastu satelitów pod etykietą szesnastu. Teraz ograniczenie wynosi limit konstruktora 24, a nowy test to przypina: każda większa konstelacja musi zarówno podać własną liczbę, jak i ściśle poprawić poziom ochrony, więc ograniczenie nie może wrócić niezauważone. To zmienia opublikowane liczby: poziom ochronyn = 16zmienia się z 16,92 m na 14,57 m. Przy przeglądzie do 24 krzywa jest ściśle monotoniczna (11,94 m przy 24 satelitach, o 29,5 % lepiej niż przy 12), więc przy 12 nie ma nasycenia; pozorne plateau było tym ograniczeniem. Zmiana zachowania tylko dlan_sats > 12.
0.26.0 - 2026-09-18#
Wydanie dokumentacji, przejrzystości i playground. Zachowanie silnika się nie zmienia: macierz weryfikacji liczy 102 wierszy: 56 VALIDATED, 42 MODELLED, 4 PARTNER, bez zmian względem 0.25.0.
Dodano#
- Rustdoc na poziomie crate'a (
//!wlib.rs) obejmujący punkty wejścia, model rzetelności i poziomów dowodowych oraz odtwarzalność, aby docs.rs otwierało się na prawdziwej stronie startowej, a nie na gołej ścianie modułów. docs/SCENARIOS.md: referencja dla każdego z 50 rodzajów scenariuszy, generowana zapi::list_scenario_kinds()(jedyne źródło prawdy) przezgen_validation_artifactsi pilnowana przeztests/scenarios_reference_doc_sync.rs, więc nie może rozjechać się z dyspozytorem.- Dokumentacja modułów dla 11 dotąd nieudokumentowanych modułów publicznych (
allan,estimator,fom,hybrid,inertial,models,report,run,scenario,timetransfer,types). - Źródła literaturowe dla pięciu modułów wzorów, które podawały równanie, ale nie wskazywały źródła:
batch_ls(Tapley/Schutz/Born; Bjorck),cr3bp(Szebehely; Koon i in.),detection(Kay),attitude_budget(Wertz; Sidi),reentry(Allen-Eggers, NACA TR-1381). - Opublikowany
security.txtna kshana.dev do skoordynowanego ujawniania. - Poziom dowodowy walidacji dla każdego przebiegu w playground. Tabela wskaźników jakości pojedynczego przebiegu zawiera teraz dla każdej wartości znacznik VALIDATED/MODELLED odczytany z tego samego wyszukiwania
fomTier(), którego używa pobierany raport (odzwierciedlasrc/fom_label.rs, wyprowadzone z macierzy weryfikacji), więc poziom pokazany obok wartości na żywo nigdy nie może się rozejść z rejestrem. lunar-attack-surfacew menu playground: wszystkie 50 rodzajów dostępnych do uruchomienia jest teraz o jedno kliknięcie (było 49/50).- Pięć kolejnych kart możliwości z możliwością uruchomienia (pogoda kosmiczna, ocena zakłóceń RF, odporność, interoperacyjność CCSDS OEM, KIF), co podnosi liczbę uruchamialnych kart z 11 do 16. Karty tylko dla API i biblioteki zachowują uczciwy odnośnik do dokumentacji zamiast fałszywego przycisku uruchomienia.
Zmienione#
- Pokrycie dokumentacją jest teraz pilnowane w CI przez zapadkę.
check-doc-coverage.shkompiluje bibliotekę zmissing_docs, liczy ostrzeżenia i kończy się błędem tylko wtedy, gdy liczba przekroczy przypięty pułap (986). Twarde#![warn(missing_docs)]pod-D warningszamieniłoby ~1000 obecnie nieudokumentowanych elementów publicznych w nocną awarię budowania; w ten sposób nowe nieudokumentowane elementy publiczne przerywają budowanie, a istniejące zaległości są spłacane świadomie.
Poprawiono#
- Wiersz narzędzia MCP
list_scenario_kindsreklamował „~17 wbudowanych rodzajów scenariuszy”, podczas gdyapi::list_scenario_kinds()od pewnego czasu udostępniało 50: dokumentacja dla agentów trzykrotnie zaniżała rzeczywiste możliwości. Przypięto do prawdziwej liczby. - Ponownie wygenerowano wyrocznię zgodności SBOM CycloneDX dla zaktualizowanego grafu zależności (60 komponentów). Werdykt testu zgodności formatu się nie zmienia: zero znormalizowanych błędów schematu, a każdy atomowy identyfikator licencji nadal należy do oficjalnego wyliczenia SPDX.
0.25.0 - 2026-07-15#
Dodano#
- Pięć możliwości awansowało do zewnętrznie VALIDATED, z których każda jest teraz sprawdzona względem niezależnej implementacji strony trzeciej tej samej jednoznacznie zdefiniowanej wielkości (nieokrężnie, z fixture odtwarzalnymi offline):
- Konwersja potęgowa IEEE-1139 → odchylenie Allana względem wzorów zamkniętych
allantoolsdla wszystkich pięciu rodzajów szumu (tests/powerlaw_oadev_reference.rs); - Wagi beamformera CRPA MVDR / o minimalnej normie z zerowaniem kierunku względem numpy/scipy LAPACK (
tests/crpa_reference.rs); - Wyznaczanie orientacji Wahba / TRIAD / QUEST względem SVD
Rotation.align_vectorsSciPy na obserwacjach bez szumu (tests/wahba_reference.rs); - Wymiana bloków kowariancji CCSDS 502,0 OEM przeprowadzona w obie strony przez parser niezależnej biblioteki
oem(tests/ccsds_oem_covariance_reference.rs); - jądro statystyk detekcji akwizycji w detektorze kwadratowym (uogólnione Marcum-Q / P_d / P_fa / próg) względem SciPy
ncx2/chi2(tests/acquisition_reference.rs). Sprawdzana maszynowo macierz walidacji przechodzi na 56 VALIDATED · 42 MODELLED · 4 PARTNER w 102 wierszach (było 51 · 47 · 4). Zastrzeżenia co do uczciwego zakresu zostają zachowane, np. awans akwizycji obejmuje tylko jądro statystyk detekcji; straty CFAR/straddling pozostają MODELLED.
- Konwersja potęgowa IEEE-1139 → odchylenie Allana względem wzorów zamkniętych
- Wskaźniki jakości w dziedzinie pozycji (
fom::positioning_performance): dokładne CEP, SEP i 2DRMS z kowariancji pozycji ENU 3-D rozwiązania nawigacyjnego oraz poziomego poziomu ochrony. CEP/SEP są dokładnymi medianami błędu promieniowego (a nie regułą liniową0.589·(σ₁+σ₂)), sprawdzonymi względem kwantyli rayleigh/maxwell zscipy.statsi niezależnej mediany Monte-Carlo w NumPy (tests/positioning_fom_reference.rs). Zastępuje dotychczasowy uczciwy zaślepiony brak implementacji: sygnatura funkcji się zmieniła z()zwracającego błąd na(cov_enu, hpl_m)zwracającąPositioningFom. - Równoważna liczba stopni swobody (EDF) przedziału ufności dopełniona dla wszystkich estymatorów rodziny Allana (
assurance::uncertainty::edf): EDF dla zmodyfikowanego Allana, Hadamarda i wariancji całkowitej używa teraz algorytmu łącznego EDF Greenhalla i Rileya oraz postaci TOTVAR z tabeli 7 NIST SP 1065 (dotąd zaimplementowano tylko EDF nakładającego się Allana, a pozostałe po cichu go ponownie wykorzystywały), sprawdzone względemallantoolsedf_greenhall/edf_totdev(tests/uncertainty_edf_reference.rs). - Niezależne zewnętrzne kontrole dla geometrii PNT księżycowego, DOP, EOP, DRO i możliwości pomiaru odległości RF (
tests/validate_p*.rs, z fixture i generatorami wyroczni wtests/fixtures/{p1_footprint,lunar_service,eop_prediction,rf_ranging_precision,dro_family_jpl,p2_independent_dop}/). Każda kontrola uruchamia już dostarczoną modelowaną możliwość względem wyroczni wytworzonej przez inną implementację, więc zgodność nie jest okrężna: orbitalny ślad nadawania/przechwytu względemscipy.special.j1(Cephes, rzeczywiście inna funkcja Bessela J1); geometryczne DOP naziemnych radiolatarni względem niezależnego rozwiązania NumPy(HᵀH)⁻¹; wzrost błędu predykcji persystencji UT1/EOP względem osobnego ponownego sparsowania w NumPy tych samych dosłownych wierszy IERSfinals2000A; płaska rodzina orbit wstecznych dalekich (DRO) względem bazy NASA/JPL Three-Body Periodic Orbit Database; oraz bilans precyzji pomiaru odległości RF względem odniesienia z pierwszych zasad. Są to dodatkowe dowody regresji dla istniejących modułów; dodanie tych testów kontrolnych samo w sobie nie zmienia etykiety żadnej możliwości (pięć awansów powyżej to osobne zmiany statusu poparte wyrocznią wsrc/verification.rs). - Scenariusz
lunar-attack-surface(src/attack_surface.rs,kind = "lunar-attack-surface"): złożony, osiągalny z binarki (CLI / Python / MCP / wasm przezrun_toml) przebieg P1 bezpieczeństwa sygnału księżycowego, który łączy deficyt mocy bilansu łącza i jego pasmo czułości 12–18 dB, wymaganą moc nadawczą zagłuszania/spoofingu względem odległości odstępu, orbitalny ślad przechwytu przy rzeczywistym wzorcu anteny, wynik wciągnięcia przy przechwyceniu przez spoofing w pętli śledzenia, zasięg horyzontu ciała bez atmosfery oraz bilans uwierzytelniania OSNMA/TESLA. Puste ciało odtwarza punkt odniesienia P1. - Pasmo czułości deficytu mocy (
linkbudget::deficit_sensitivity_band,deficit_power_factor): prawdziwy wieloosiowy przegląd (odniesienie × EIRP × odległość ukośna) zbudowany nasweep::SweepAxisi oceniany przezreceived_signal_power_dbw, odtwarzający pasmo P1 12–18 dB i uzgadniający wartości współczynnika liniowego 32× (zaokrąglone) / 36× (niezaokrąglone). - Trójwymiarowa kostka przechwycenia przez spoofing (
spoof_capture::capture_cube): dodaje do mapy przechwycenia oś przesunięcia nośnej/Dopplera (J/S × przesunięcie kodu × przesunięcie nośnej, czas zaczepienia na komórkę); przekrój z zerową nośną redukuje się dokładnie docapture_map2-D.
Zmienione#
- Detekcja w rzadkiej sieci monitorów (
monitor_network) składa teraz fizyczną statystykę AGCspoof_monitorsi siatkę widoczności selenograficznejlunar_service, aby wyprowadzić statystykę detekcji i geometrię każdej stacji, zamiast swobodnych parametrów i doraźnego nakładania się kół wielkich; prawdopodobieństwa detekcji monitora i sieci pozostają zamkniętymi postaciami chi-kwadrat/Marcum-Q zdetection. PolaSurfaceMonitor/SpoofEventzmieniły się na wielkości fizyczne (szer./dł./wysokość/moc).
Poprawiono#
- Wymiarowanie narzutu uwierzytelniania OSNMA/TESLA (
nma_budget): części pól OSNMA na stronę (8-bitowy HKROOT + 32-bitowy MACK na stronę 2 s) były błędnie oznaczone jako sumy na podramkę, co zaniżało narzut 15× (1,33 bit/s). Poprawiono do opublikowanych w SIS-ICD sum na podramkę 30 s (HKROOT 120 + MACK 480 bitów ⇒ 20 bit/s). Konsekwencja jest teraz podana uczciwie: przy szybkości danych nawigacyjnych AFS 50 bit/s narzut uwierzytelniania jest kosztem pierwszego rzędu ≈40 %, a nie pomijalnymi kilkoma procentami; poleauth_latencyjest udokumentowane jako opóźnienie ujawnienia klucza (dolna granica czasu do pierwszego uwierzytelnionego rozwiązania).
0.24.0 - 2026-07-09#
Szerokie wydanie możliwości. Wprowadza dwa w pełni zewnętrznie zwalidowane zestawy analiz, kompletną rodzinę wielokryterialnej analizy decyzyjnej (MCDA) oraz estymatory wędrówki Allana / stabilności zegara dla długich τ, i otwiera nową uruchamialną warstwę scenariuszy: księżycowy bilans czasu, ramka/EOP w czasie rzeczywistym, hybryda optyczno-RF, obserwowalność cislunarna i odporność warstwowego PNT na konflikt, na wierzchu podstawy, plus podstawę możliwości dla naziemnej radiolatarni księżycowej i bezpieczeństwa sygnału. Sprawdzana maszynowo macierz walidacji rośnie do 51 VALIDATED · 47 MODELLED · 4 PARTNER w 102 wierszach (było 40 · 47 · 4 w 91): wszystkie jedenaście nowych wierszy to walidacje względem wyroczni zewnętrznej dla analizy decyzyjnej i estymatorów czasu, sprawdzone względem niezależnych bibliotek (SciPy, pymcdm, pyDecision, allantools) z ciasną tolerancją, podczas gdy nowa powierzchnia możliwości PNT jest uczciwie pokazana jako MODELLED. Jak zawsze, żadne twierdzenie o modelu liczbowym nie jest podnoszone bez zewnętrznego zbioru danych.
Dodano#
Scenariusze do uruchomienia: każdy to zarejestrowany scenariusz kind, wywoływany przez silnik i potwierdzany w CI od początku do końca przez tests/determinism.rs (który uruchamia każdy dołączony scenarios/*.toml i kończy się twardym błędem przy każdym fixture, którego nie da się uruchomić):
- Odporność warstwowego PNT na konflikt (
conflict-resilience,src/conflict_resilience.rs): silnik odporności Monte-Carlo z ziarnem (seed) dla wielowarstwowej architektury PNT, z modelem przeżywalności przy łagodnej degradacji dla każdego wektora z §4,2 (cztery nazwane wektory zagrożeń, zamknięta postać przeżywalności użytecznego PNT, do której zbiega Monte-Carlo dla każdej warstwy, emitowana w JSON wyniku) oraz udokumentowanym, pilnowanym przed dryfem pochodzeniem parametrów zagrożeń (src/conflict_threat_params.rs). Architektury MODELLED; zbieżność Monte-Carlo przeżywalności do postaci zamkniętej jest rdzeniem sprawdzonym niezależnie. - Obserwowalność cislunarna (
cislunar-observability,src/cislunar_observability.rs): widmo wartości własnych gramianu obserwowalności na łuku, generator orbit wstecznych dalekich (DRO) z korekcją różnicową oraz niezależna kontrola filtrem pierwiastka informacji, której kowariancja a posteriori staje się skończona dokładnie przy pełnym rzędzie obserwowalności. Konstelacja MODELLED; niezmienniki rzędu/gramianu/STM/SRIF są rdzeniem sprawdzonym niezależnie. - Heterogeniczna hybrydowa ciągłość i integralność optyczno-RF (
hybrid-optical-rf,src/hybrid_integrity.rs,src/optical_availability.rs,src/optical_linkbudget.rs,src/cross_raim.rs): dostępność i integralność międzydziedzinowa, gdy łączy się PNT optyczne i RF. MODELLED. - Endogeniczny księżycowy bilans czasu (
lunar-time-budget,src/lunar_time_budget.rs) i bilans ramki / EOP w czasie rzeczywistym (realtime-frame-eop,src/realtime_frame_eop.rs,src/frame_eop.rs): bilanse czasu księżycowego i orientacji Ziemi P3/P4 wyprowadzone endogenicznie z łańcucha synchronizacji czasu, a nie zakładane. MODELLED.
Zewnętrznie zwalidowane zestawy analiz: możliwości biblioteczne, każda wchodzi do macierzy jako nowe wiersze VALIDATED (sprawdzone względem niezależnej wyroczni zewnętrznej, a nie samokontroli):
- Pełny zestaw wielokryterialnej analizy decyzyjnej (MCDA) (
src/mcda/): cztery rodziny metod: agregacja wartości (WSM, WPM, WASPAS), system ilorazowy (MOORA) i proporcjonalny (COPRAS), odległość od ideału (TOPSIS), programowanie kompromisowe (VIKOR) i przewyższanie (PROMETHEE II z sześcioma uogólnionymi kształtami kryteriów, zgodność/niezgodność ELECTRE I), a ponadto wagi priorytetów AHP z wektora własnego Perrona z bramką współczynnika spójności Saatyego (CR < 0,10), użyteczność MAUT, wydobywanie frontu Pareto i analiza wrażliwości wag. Dziewięć agregatorów odtwarza pymcdm / pyDecision, a wektor własny AHP zgadza się z SciPy/LAPACK, wszystko do < 1e-9 (tests/mcda_*_reference.rs). Tornado wrażliwości jest też dostępne w scenariuszu odporności na konflikt. - Estymatory wędrówki Allana i stabilności zegara dla długich τ (
src/allan.rs): MTIE (statystyka wędrówki błędu czasu między szczytami wg ITU-T G.810/G.823/G.8261, względem której pisane są maski synchronizacji), MDEV i TDEV jako wędrówka w dziedzinie czasu oraz estymatory o rozszerzonym zakresie Theo1 / TOTVAR. VALIDATED względem allantools na serii NIST SP 1065; hybryda ThéoH z usuniętym obciążeniem, zbudowana na TOTVAR, pozostaje uczciwie MODELLED. - Zestaw zapewnienia / zewnętrznej wyroczni (
src/assurance/): zestaw wyroczni podłączony bezpośrednio do bramki rzetelności CI, rekord pochodzenia W3C-PROV z deterministycznym korzeniem Merkle'a oraz Greenhall, równoważna liczba stopni swobody + przedziały ufności chi-kwadrat dla estymat stabilności. - Szew rozszerzeń PackRegistry / ExternalPack (
src/registry.rs,src/api.rs): szew dyspozytora, dzięki któremu pakiety możliwości trafiają przez jeden rejestr (wbudowane wywołania są na gorącej ścieżce CLI; pakiety spoza drzewa podłączają się za domyślnymExternalPack::register_into), pilnowany przez złoty zestaw zgodności identyczności bajtowej oraz bramki CI standalone / wasm32.
Podstawa możliwości oparta na modelu: nowe moduły biblioteczne zasilające powyższe scenariusze i przyszłe (jeszcze nie samodzielny scenariusz kind):
- DOP naziemnej radiolatarni księżycowej (
src/lunar_beacon.rs) z bilansem osiągniętej dokładności, przeglądem liczby N satelitów i mapą GDOP, a także zaburzona efemeryda księżycowa (src/lunar_perturbed.rs) i geometria horyzontu ciała bez atmosfery / odwrotność mocy spoofingu / pasmo deficytu AFS (src/jamming.rs,src/linkbudget.rs). Wykorzystuje ponownie jądro DOP sprawdzone względem gnss_lib_py. - Wczytywanie DEM w formacie LOLA + widoczność bezpośrednia terenu (
src/realdata/lola_dem.rs). - Trójwarstwowa obrona bezpieczeństwa sygnału: przechwycenie przez spoofing, integralność międzyczujnikowa i wymiarowanie sieci monitorów (
src/spoof_capture.rs,src/cross_sensor_integrity.rs,src/monitor_network.rs) z orbitalnym śladem wiązki anteny i bilansem uwierzytelniania OSNMA (src/antenna.rs,src/nma_budget.rs). MODELLED.
Zmienione#
- Macierz walidacji i każdy pochodny artefakt zostały ponownie wygenerowane z jedynego źródła prawdy (
src/verification.rs): rejestr na stronie, diagramy mapy modułów i pochodzenia walidacji oraz ciągi liczbowe README i poszczególnych powierzchni pokazują teraz 51 / 47 / 4 z 102 (było 40 / 47 / 4 z 91); bariera rzetelności liczb skanuje teraz pełną historię git, a rysunki w README ujednolicono w ciemnej palecie marki. - Jeden wspólny adaptacyjny sterownik całkowania obsługuje teraz zarówno
integrate, jak iintegrate_dopri(src/integrator.rs), usuwając zduplikowany stepper. - SonarQube Cloud: analiza statyczna dodana do CI (Rust + zaimportowane pokrycie), z plakietkami ocen bezpieczeństwa / łatwości utrzymania / niezawodności w README.
- Dyscyplina wydań i pakowania: CI rejestruje środowisko wdrożeniowe dla każdej publikacji pakietu/rejestru, a ukierunkowane zadanie publiczne standalone jest odcięte od wolnych binarek walidacyjnych.
- Bariera higieny braku atrybucji jest ograniczona wyłącznie do znaczników autorstwa, więc wymienienie hosta integracji lub produktu nie przerywa już budowania.
- Dokumentacja: sekcja Citing w README wymienia teraz cztery opublikowane preprinty arXiv, a możliwość DOP naziemnej radiolatarni jest udokumentowana w wierszu księżycowym.
Fragment wymieniający klientów AI osób trzecich pominięto tutaj; znajduje się w CHANGELOG.md na GitHubie.
Poprawiono#
- Całkowite liczniki pętli dla pętli sterowanych liczbami zmiennoprzecinkowymi (Sonar S2193).
- Dokładna odwrotność chi-kwadrat przy małej liczbie stopni swobody przez udoskonalenie Newtona w ścieżce przedziałów ufności zapewnienia.
- kshana.dev: sekcja standardów otwiera się teraz domyślnie, a zapasowa liczba w rejestrze jest poprawiona; nieaktualne ciągi README / strony wokół warstwy obserwowalności zsynchronizowano.
0.23.0 - 2026-06-29#
Wydanie możliwości dodające ogólną warstwę obserwowalności Fishera / Cramér–Rao i optymalnego projektowania eksperymentu oraz wydanie, na którym opiera się artykuł o obserwowalności PNT księżycowego. Sprawdzana maszynowo macierz walidacji rośnie do 40 VALIDATED · 47 MODELLED · 4 PARTNER w 91 wierszach (było 39 · 46 · 4 w 89): nowy silnik estymacji jest sprawdzony względem wyroczni zewnętrznej i jest VALIDATED; jego zastosowanie księżycowe jest uczciwie MODELLED. Jak zawsze, żadne twierdzenie o modelu liczbowym nie jest podnoszone bez zewnętrznego zbioru danych.
Dodano#
src/fim.rs: informacja Fishera, granice Cramér–Rao i optymalne projektowanie eksperymentu. Ogólny, wielokrotnego użytku silnik teorii estymacji: macierz informacji FisheraM = HᵀWHz jakobianu pomiarów i wag; symetryczny rozwiązywacz wartości własnych (cykliczny Jacobiego); dolna granica Cramér–Rao przez odwrotność albo pseudoodwrotność Moore'a–Penrose'a plus baza przestrzeni zerowej, gdy informacja jest o niepełnym rzędzie (przypadek sieci swobodnej / defektu datum); oraz miary D-, A-, E- i T-optymalne projektowania eksperymentu z selektorembest_designpo kandydackich geometriach. VALIDATED względem NumPy (eigh/inv) i opublikowanych zamkniętych granic Kaya (1993) do 1e-9 (tests/fim_observability_reference.rs), więc wchodzi do macierzy jako wiersz z wyrocznią zewnętrzną, a nie samokontrola.- Obserwowalność księżycowego łącznego wyznaczania orbity (
lunar_observabilitywsrc/lunar_combination.rs, uwidoczniona w raporcie lunar-combination): stosuje silnik FIM/CRLB do łącznego rozwiązania orbity i zegara, aby ujawnić defekt datum bezwzględnego położenia stacji, odzyskiwanie rzędu wraz z dodawaniem stacji z bazą ziemską, osiągniętą CRLB położenia stacji oraz kondycjonowanie E-optymalne. Uczciwie MODELLED: silnik estymacji jest zwalidowany zewnętrznie, ale sieć księżycowa, do której go zastosowano, jest reprezentatywną symulacją, a żaden obecny zbiór danych nie może zamienić tej geometrii w pomiar. - Reprezentatywna geometria eliptycznej księżycowej orbity zamrożonej (ELFO) dla scenariusza lunar-combination (
orbit_ecc,orbit_inc_deg,orbit_argp_deg,orbit_planes; domyślnie pozostaje rozmieszczenie kołowe) oraz pole obserwowalności bez VLBI w raporcie, aby można było pokazać, że wynik defektu datum jest ogólny względem geometrii. Ta sama drabina 3→1→0 i próg trzech stacji obowiązują na ELFO rodziny Moonlight/LCNS, a przy trzech ziemskich liniach bazowych VLBI bezwzględne położenie stacji jest obserwowalne przy granicy poniżej metra, co blokujeelfo_geometry_confirms_the_observability_structure. Nadal MODELLED.
Zmienione#
- Macierz walidacji i każdy wygenerowany artefakt dowodowy zostały ponownie wygenerowane z jedynego źródła prawdy (
src/verification.rs): rejestr (web/data/verification-matrix.json),docs/VERIFICATION-MATRIX.md,docs/MODELLED-RATIONALE.md, rysunki podziału walidacji i rodzaju wyroczni oraz ciągi liczbowe README na wszystkich powierzchniach dystrybucji pokazują teraz 40 / 47 / 4 z 91.
0.22.1 - 2026-06-29#
Wydanie poprawkowe wyłącznie pakowania. Bez zmian silnika, scenariuszy ani wyników; macierz walidacji pozostaje bez zmian: 39 VALIDATED · 46 MODELLED · 4 PARTNER w 89 wierszach.
Poprawiono#
- Publikacja npm: pakiet
repository.urlwyprowadzony z manifestu crate'a używał właściciela GitHub z błędną wielkością liter (AshfordeOU), co nie przeszło weryfikacji pochodzenia sigstore w npm (porównuje właściciela z uwzględnieniem wielkości liter). Manifestrepositoryma teraz kanoniczne małe literyashfordeOU, więc wygenerowanypackage.jsonzgadza się z podmiotem pochodzenia, a wydanie npm się publikuje.
Zmienione#
- Budowanie wheela przypina
codegen-units = 1, aby wheel manylinux był odtwarzalny bajt po bajcie przy przebudowach (sprawdzenie odtwarzalności przez przebudowę i porównanie).
0.22.0 - 2026-06-29#
Wydanie konsolidacyjne skupione na dyscyplinie dowodów, pochodzenia i dystrybucji. Sprawdzana maszynowo macierz walidacji rośnie do 39 VALIDATED · 46 MODELLED · 4 PARTNER w 89 wierszach (było 15 · 42 · 4 w 61), co wynika z walidacji krzyżowej możliwości modelowanych względem niezależnych wyroczni zewnętrznych. Każdy dystrybuowany artefakt ma teraz kryptograficzną atestację pochodzenia budowy SLSA, dostarcza SBOM CycloneDX i jest publikowany równolegle na wszystkich powierzchniach. Żadne twierdzenie o modelu liczbowym nie jest podnoszone bez zewnętrznego zbioru danych; nowe możliwości pozostają uczciwie MODELLED.
Dodano#
- Dynamika orientacji (
src/attitude_dynamics.rs, MODELLED): równania Eulera bryły sztywnej bez momentu + kinematyka kwaternionów (RK4), z samotestami praw zachowania (norma kwaternionu, energia kinetyczna, |Iω|, precesja symetrycznego bąka). - Walidacja krzyżowa możliwości modelowanych względem niezależnych wyroczni zewnętrznych, co podnosi macierz walidacji do 39 wierszy VALIDATED, każdy poparty zewnętrznym zbiorem danych (bramka rzetelności CI zabrania statusu VALIDATED bez niego). Najnowsze walidacje z wyrocznią zewnętrzną: zmierzona krzywa stabilności zegara optycznego (dopasowanie krzywej ADEV w
quantum_tradeodtwarza opublikowane σ_y(τ) optycznego zegara sieciowego ⁸⁸Sr Norcii i in., Science 366:93 (2019), Zenodo 10.5281/zenodo.3382347, CC-BY-4.0, dołączone wtests/fixtures/optical_clock_adev/); generowanie kodu rozpraszającego GPS L1 C/A (LFSR G1/G2 wsrc/sdr.rsodtwarza ósemkowe fazy kodu z tabeli 3-Ia IS-GPS-200 dla PRN 1–9); oraz czytnik cyfrowego modelu terenu SRTM na rzeczywistym terenie (src/altpnt/terrain.rsodczytuje dołączony kafel SRTM v3 NASA/USGS z domeny publicznej, N36W117 / Dolina Śmierci, umieszczając Badwater Basin w jego udokumentowanym paśmie pomiaru). - Nowe możliwości MODELLED, każda sprawdzona wewnętrznie względem postaci zamkniętej lub siostrzanej ścieżki kodu: dynamika ruchu względnego Clohessy’ego–Wiltshire’a / Hilla, pasywna geolokalizacja emiterów TDOA/FDOA, wyznaczanie orientacji Wahba/TRIAD/QUEST, rozwiązywanie całkowitoliczbowej niejednoznaczności fazy nośnej GNSS (LAMBDA), celowanie w płaszczyźnie B i asysta grawitacyjna z przybliżeniem stożkowych, formowanie wiązki w macierzy antyzakłóceniowej CRPA, statystyki akwizycji GNSS w detektorze kwadratowym, niejednoznaczność prążków / zakres dynamiczny kwantowego czujnika inercyjnego, szum zegara IEEE-1139 o prawie potęgowym + podłoga flicker-FM oraz wymiana bloków kowariancji CCSDS-OEM.
- Rejestr dowodów z jednego źródła z generowaną dokumentacją weryfikacji i barierą przed dryfem; przeglądalny rejestr walidacji na kshana.dev z odnośnikami do dowodów dla poszczególnych kart.
- Maszynowo czytelne metadane cytowania:
codemeta.json(CodeMeta 2,0) i.zenodo.json, przypięte do manifestu Cargo przeztests/citation_metadata_doc_sync.rs. - Pochodzenie łańcucha dostaw: atestacja pochodzenia budowy SLSA dla archiwum crate'a, wheeli, sdist i archiwum npm; PyPI OIDC Trusted Publishing; SBOM CycloneDX dostarczany w wheelu i pakiecie npm; porównanie budowy odtwarzalnej i weryfikacja po wydaniu.
- Wykrywalność:
robots.txt,sitemap.xmloraz metadane Open Graph / JSON-LD na kshana.dev; generowany rysunekvalidation-breakdownwyprowadzony z macierzy. - README dla poszczególnych powierzchni w crates.io / PyPI / npm z barierą rzetelności liczb.
Zmienione#
- Wyrocznia transferu czasu Sagnaca podniesiona do ExternalDataset: poprawka Sagnaca dla okrążenia równika jest teraz sprawdzana względem opublikowanej przez Ashby'ego wartości 207,4 ns (Living Reviews in Relativity 6:1, 2003, wzór 1,29; odtworzone z dokładnością < 0,05 ns). Złożona możliwość transferu czasu pozostaje uczciwie MODELLED.
- Dokumentację, diagramy i rysunki odświeżono do bieżącej macierzy (39/46/4/89): diagram pochodzenia walidacji, rysunek
oracle-kind-stacked(teraz generowany z macierzy z barierą CI przed dryfem), VALIDATION/PROVENANCE/CAPABILITY/QUANTUM-MODELS/WHEEL_TAGS, dokumenty architektury i samouczków oraz łączną liczbę w rejestrze kshana.dev. - Przeformatowano drzewo źródeł przypiętym rustfmt (toolchain 1.93.0): czysty styl, bez zmiany zachowania.
- Wersjonowanie w zgodnym kroku. Każda powierzchnia dystrybucji (crate, PyPI, npm, crate MCP + obraz OCI, wtyczka JetBrains) wersjonuje się teraz w kroku z silnikiem, co wymusza w CI
scripts/check-version-sync.sh. - Wtyczka JetBrains przelicencjonowana na AGPL-3.0-only (opublikowana 0.1.1 nadal podawała Apache-2.0) i wyprowadza teraz wersję w Marketplace z tagu wydania.
- Utwardzenie odporności:
unwrappoza testami usunięto lub uzasadniono;clippy::unwrap_usedwymuszane na kodzie poza testami. - kshana.dev: gruntowna przebudowa z dowodami na pierwszym miejscu: dominujący hero, diagramy architektury i rysunki wyników, i18n, zwijane i responsywne sekcje rejestru i standardów.
Poprawiono#
- Precyzyjna efemeryda SP3: stosowanie poprawki węzła rotacji Ziemi IGS podczas interpolacji.
- Obrazy w rejestrach: README dla PyPI/crates.io/npm używają bezwzględnych adresów URL obrazów; względne ścieżki obrazów z głównego README renderowały się jako uszkodzone obrazy na stronie PyPI 0.21.0. Bariera CI (
tests/surface_readme_image_urls_doc_sync.rs) zapobiega regresji. - CI:
fmt+clippyzielone; koniec z kompilowaniem względem prawdziwych danych ignorowanych przez git.
Testy#
- Kowariancja zegara Kalmana pozostaje dodatnio półokreślona i symetryczna (test własności,
tests/property.rs). - Bariery synchronizacji dokumentacji: każdy publiczny ciąg liczby walidacji, metadane cytowania, wygenerowany rysunek i adresy URL obrazów w README powierzchni są przypięte do swojego źródła prawdy.
0.21.0 - 2026-06-26#
To wydanie dodaje do otwartego silnika dwa zestawy zastosowań MODELLED: demonstrator PNT z technologiami kwantowymi (zaufany kwantowy transfer czasu, nawigacja kwantowa bez GNSS, kwantowa detekcja usterek/anomalii) oraz zestaw PNT księżycowego / cislunarnego (księżycowy czas współrzędnych, księżycowe VLBI, łączne wyznaczanie orbity i zegara, realizacja układu odniesienia, objętość usługi, różnicowe PNT, eksport interoperacyjności), każdy uruchamiany z jednego kind, każdy emitujący uczciwy zapis TradeEvidence oraz rejestr reprezentatywności / luk do lotu. Wprowadza też sześć nowych walidacji względem wyroczni zewnętrznych, co podnosi sprawdzaną maszynowo macierz walidacji do 15 VALIDATED · 42 MODELLED · 4 PARTNER w jej 61 wierszach. Nowe liczby zastosowań są MODELLED z ilustracyjnych parametrów ze źródeł publicznych: bez TRL, doświadczenia lotnego, certyfikacji ani poparcia agencji, a ponownie używane sprawdzone niezależnie jądra są tak oznaczone.
Dodano#
- Zestaw demonstratora PNT z technologiami kwantowymi (
quantum-time-transfer,quantum-gnss-free-nav,quantum-anomaly-detect). Trzy uruchamialne obszary zastosowań MODELLED za silnikiem, każdy emitujeTradeEvidenceoraz zapis reprezentatywności / luk do lotu:- Zaufany kwantowy transfer czasu (
src/timetransfer_chain.rs): bilans optyczny zegar sieciowy + łącze fotoniczne wobec CSAC + dwukierunkowe RF, z ponownym użyciem poziomu ochrony czasu, ze wskaźnikiem jakości bezpieczeństwa wobec ataku opóźnienia/odtwarzania (1 − P_md) oraz detekcją anomalii zegara + opóźnieniem CUSUM. - Nawigacja kwantowa bez GNSS (
src/quantum_nav_od.rs): inercyjny dryf z interferometrem zimnych atomów wobec INS klasy nawigacyjnej w czasie przestoju GNSS, z uczciwym zastrzeżeniem, że bez zewnętrznego poprawienia pozycji bias akcelerometru pozostaje nieobserwowalny, więc błąd nadal rośnie. - Kwantowa detekcja usterek / anomalii (
src/quantum_faults.rs): oznaczony katalog usterek z ROC AUC z przedziałem ufności bootstrap i minimalną wykrywalną usterką przy ustalonym wskaźniku fałszywych alarmów. - Wspólna biblioteka modeli błędów urządzeń kwantowych (
src/quantum_devices.rs) i ujednolicony harness porównania kwantowego z klasycznym (src/qtrade.rs) stoją za wszystkimi trzema.
- Zaufany kwantowy transfer czasu (
- Zestaw PNT księżycowego / cislunarnego. Siedem uruchamialnych
kindMODELLED osadzonych na rdzeniu CR3BP: księżycowy czas współrzędnych (świecka stopa LTC/TCL − TT,src/lunar_time.rs), geodezyjna wielkość obserwowalna opóźnienia księżycowego VLBI (src/lunar_vlbi.rs), łączny wielotechnikowy estymator wsadowy OD + zegar (src/lunar_combination.rs), realizacja układu odniesienia (transformacja Helmerta o 7 parametrach + powiązanie IAU 2015 WGCCRE,src/lunar_frame_realise.rs), analiza objętości usługi klasy Moonlight / LCNS (src/lunar_service.rs), księżycowe różnicowe PNT (src/lunar_dpnt.rs) oraz eksport interoperacyjności zgodny z LunaNet / IOAG (CCSDS-OEM + księżycowa skala czasu w kopercie KIF,src/lunar_interop.rs). Wszystko MODELLED z ilustracyjnych parametrów ze źródeł publicznych; niesprawdzone względem rzeczywistego VLBI / śledzenia Gateway; bez afiliacji ani poparcia agencji. - Sześć nowych walidacji względem wyroczni zewnętrznych (macierz walidacji liczy teraz 15 wierszy sprawdzonych niezależnie):
- ADEV / HDEV na rzeczywistym zegarze cezowym 5071A: sprawdzone niezależnie względem punktów dekadowych Stable32 (
tests/cs5071a_reference.rs). - OADEV / MDEV / TDEV na wzorcu Stable32
PHASE.DAT: sprawdzone niezależnie względem opublikowanych tabel Stable32 (tests/phasedat_reference.rs). - ROC AUC detekcji anomalii na rzeczywistej telemetrii ESA OPS-SAT: sprawdzone niezależnie względem scikit-learn (
tests/opssat_ad_reference.rs). - Synteza funkcjonałów grawitacyjnych ICGEM: sprawdzona niezależnie względem standardu normalnej grawitacji GRS80 (γ Somigliany do 3.5e-12; mapa zaburzeń EGM2008,
tests/icgem_gravity_reference.rs). - Model jonosfery nadawanej Klobuchara: sprawdzony niezależnie względem RTKLIB (
tests/klobuchar_reference.rs). - Jądro detekcji RAIM (171 przypadków,
tests/raim_reference.rs) i poziom ochrony SBAS DO-229E na rzeczywistych danych EGNOS (fork RTKLIB SBAS-PL,tests/sbas_reference.rs): oba sprawdzone niezależnie względem swoich wyroczni zewnętrznych.
- ADEV / HDEV na rzeczywistym zegarze cezowym 5071A: sprawdzone niezależnie względem punktów dekadowych Stable32 (
- Rejestr reprezentatywności i luk do lotu (
src/representativeness.rs). Ustrukturyzowany zapis emitowany przez każdy demonstrator: co jest reprezentatywne, co uproszczone i co dzieli model od lotu; uczciwy towarzysz każdego porównania MODELLED. - Agregacja studiów i ergonomia CLI. Manifest zestawu scenariuszy z agregacją studium jednym poleceniem, stabilne co do skrótu metadane studium +
--study-name, lintowanie scenariuszy--validateoraz pokazywanie poziomu walidacji dla każdego wskaźnika jakości w raportach studiów.
Zmienione#
- kshana.dev przeprojektowano wokół wspólnego kręgosłupa dziedzin: możliwości i walidacja złożone w jeden eksplorator dziedzin ze wspólnym słownictwem, uwidocznione nowe wyspy sprawdzone niezależnie, wierna lądom animowana mapa Ziemi oraz wezwanie do zamówienia studium, a także marka i odnośniki Ashforde OÜ.
- README + ARCHITECTURE zbadano pod kątem kompletności i rzetelności: poprawiono nieaktualne liczby wyników sprawdzonych niezależnie (teraz 15 wyroczni zewnętrznych), rozszerzono diagramy oraz zacytowano preprinty o Warunkowym Poziomie Ochrony Czasu (arXiv:2606,24210) i o luce optymizmu przy zakłóceniach RF (arXiv:2606,22054).
- Źródła
paper/i potok szkicu JOSS są utrzymywane w publicznym repozytorium.
0.20.0 - 2026-06-22#
To wydanie dodaje do otwartego silnika cztery możliwości studiów: warunkowy Poziom Ochrony Czasu, ocenę odporności PNT zgodną z ramami, ocenę luki optymizmu przy zakłóceniach RF oraz front end odbiornika programowego / rzeczywistych danych, z których każdy jest odtwarzalny jednym poleceniem i zapisuje artefakt deterministyczny co do bajta. Wszystkie studia są MODELLED (kalibracja na danych syntetycznych lub publicznych zbiorach), niosą uczciwe pochodzenie (wersja silnika, ziarna, skrót konfiguracji) i etykiety walidacji oraz nie są certyfikacjami.
Dodano#
- Warunkowy Poziom Ochrony Czasu (
tpl). Ograniczona holdoverem granica niewykrytego błędu czasu przy spoofingu GNSS, z podłogą monitora k-sigma, wariancją dryfu van Loana na opóźnieniu detekcji i czasem do alarmu CUSUM. Skalibrowany na rzeczywistym zarejestrowanym ataku (JammerTest 2024, scenariusz 2.1.1) przezcargo run --release --example tpl_jammertest, które odtwarza swoją tabelę referencyjną ze skalarów odzyskanych z publicznego nagrania (surowy zbiór danych nie jest redystrybuowany). - Ocena odporności PNT zgodna z ramami + studium niestabilności decyzji (
resilience). Model architektury, ocena zgodna z RPCF, sympleks wag Dirichleta, niestabilność Kendalla-tau i częstość odwrócenia pozycji top-1 oraz załamanie różnorodności wspólnego trybu (Hill-N2), zcargo run --release --example resilience_report -- paper-artifacts/resilience-study.json. Tabela odpowiedniości wdocs/RESILIENCE-CROSSWALK.md. - Studium luki optymizmu przy zakłóceniach RF (
impairment_study,impairment_ml,eval_stats). Panel 13 detektorów na syntetycznym korpusie ugruntowanym w parametrach, luka optymizmu między rozkładem wewnętrznym a zewnętrznym, trendy praw skalowania z zerem permutacyjnym oraz predyktor degradacji typu leave-one-out, przezcargo run --release --example optimism_study -- paper-artifacts/optimism-study.json. - Front end odbiornika programowego (
sdr) i adaptery rzeczywistych danych (realdata/). Surowe IQ/IF do odczepów korelatora i SQM, plus adaptery wczytywania (RINEX, u-blox UBX, GnssLogger, JammerTest, Yunnan, SatGrid) i przykłady sond. Odczytują one nagrania dostarczone lokalnie przez użytkownika; żadne nagrania nie są zatwierdzane do repozytorium. - Zatwierdzone artefakty studiów. Deterministyczne co do bajta
optimism-study.jsoniresilience-study.jsonsą teraz śledzone wpaper-artifacts/, aby liczby studiów można było sprawdzić bez przebudowy; pozostają odtwarzalne z powyższych generatorów. Surowe zbiory danych pozostają poza repozytorium (/realdata-cache/).
Zmienione#
- Wersja podniesiona do 0.20.0 w
Cargo.toml,CITATION.cffiREADME; artefakty studium punktu przecięcia są wygenerowane ponownie, aby ich znacznik zgadzał się z wydaną wersją.
0.19.0 - 2026-06-18#
Zmienione#
- Przelicencjonowano z Apache-2.0 na GNU AGPL-3.0-only, z licencją komercyjną dostępną od Ashforde OÜ (podwójne licencjonowanie). Otwarty silnik pozostaje w pełni otwarty i publicznie weryfikowalny; sieciowy copyleft AGPL (§13) oznacza, że zamknięta lub hostowana pochodna musi wrócić do otwartego źródła albo przyjąć licencję komercyjną. To broni sprawdzonego niezależnie rdzenia przed forkiem i zamknięciem, zachowując wiarygodność publicznego, uruchamialnego, audytowalnego silnika. Zob.
LICENSE(AGPL) i nowyLICENSING.md(co obejmuje każda licencja i kiedy ma zastosowanie).LICENSEzawiera teraz tekst AGPL-3.0; nagłówki SPDX we wszystkich źródłach zaktualizowano doAGPL-3.0-only;NOTICE,README,GOVERNANCE,GLOSSARY, strona internetowa oraz metadane crate'a/pakietów (Cargo.toml,pyproject.toml,CITATION.cff, crate MCP + obraz) zostały odpowiednio zaktualizowane.- Warunki dla współtwórców (
CONTRIBUTING.md) licencjonują teraz wkład przychodzący na AGPL i dają Ashforde OÜ prawo do włączania wkładów do wydania licencjonowanego komercyjnie, dzięki czemu podwójna licencja nadal działa. - Polityka zależności bez zmian, ale uzasadniona na nowo (
deny.toml,GOVERNANCE): zależności pozostają permisywne (Apache/MIT/BSD/ISC). AGPL jest dozwolona tylko dla własnego crate'a kshana; zależność typu copyleft zainfekowałaby wydanie komercyjne i zepsuła podwójne licencjonowanie. - Uwaga dla dalszych użytkowników: to przelicencjonowanie na copyleft. Użytkownicy, którzy polegali na permisywnych warunkach Apache-2.0, mogą nadal używać ostatniego wydania na Apache-2.0 (
v0.18.0i wcześniejsze, jak opublikowano); odv0.19.0w górę obowiązuje AGPL-3.0 / licencja komercyjna.
Bezpieczeństwo#
- Podniesiono
pyo30,24 → 0,29, aby usunąć RUSTSEC-2026-0176 / RUSTSEC-2026-0177 (GHSA-36hh-v3qg-5jq4 / GHSA-chgr-c6px-7xpp) ze skanów zewnętrznych OSV/zależności. Oba to ostrzeżenia na poziomie funkcji, których dotknięte funkcje (BoundList/TupleIterator::nth/nth_back,PyCFunction::new_closure) Kshana nigdy nie wywołuje, apyo3jest zależnością opcjonalną (funkcjapython), więc rzeczywiste narażenie wynosiło zero, ale podniesienie utrzymuje czysty skan dla audytorów dalej w łańcuchu. Zmigrowanosrc/python.rsdo API pyo3 0,29 (typ zwracany Bound dlascenario_kinds; jawneskip_from_py_objectna pyclassRunOutput). Wszystkie 11 testów wiązania Pythona przechodzą na przebudowanym rozszerzeniu.
0.18.0 - 2026-06-17#
Dodano#
Jedenaście nowych uruchamialnych rodzajów scenariuszy: demonstratory dla dwóch przetargów, most interoperacyjności CCSDS oraz zestaw analizy misji pierwszego rzędu / środowiska (wszystkie MODELLED, addytywne; istniejące złote wzorce odtwarzalności bez zmian). Każdy można wywołać z CLI / Pythona / WASM / MCP, ma
scenarios/<kind>.tomli niesie jawną etykietę MODELLED w JSON wyniku i jednolinijkowym podsumowaniu (test dla każdego rodzaju wtests/dominance_demonstrators.rsstwierdza, że etykieta jest obecna i że wynik nigdy nie zawiera ciąguVALIDATED):impairment-eval(src/impairment_eval.rs): stanowisko oceny uczenia maszynowego do wykrywania zakłóceń RF: oznaczony korpus syntetyczny + niezależny od detektora harness ROC/AUC + raport luki optymizmu między rozkładem wewnętrznym a zewnętrznym (tylko charakterystyki operacyjne, nigdy dane terenowe/IQ).quantum-trade(src/quantum_trade.rs): porównanie PNT kwantowego z klasycznym ze wczytywaniem zmierzonego ADEV i obwiednią odporności bez GNSS.space-weather(src/space_weather.rs): wskaźniki słoneczne/geomagnetyczne (tabela IAGA Kp↔ap, dzienne Ap, centrowane 81-dniowe F10.7a), temperatura egzosferyczna Jacchia-71 oraz sprzężenie gęstości termosfery sterowane aktywnością nad statyczną atmosferą (NIE jest to model gęstości bezwzględnej NRLMSISE).oem-interop(src/oem.rs): import CCSDS 502,0 OEM + most w obie strony dla efemeryd GMAT / Orekit / STK (czytnikparse_oem, dokładna odwrotność zapisu).launch-window(src/launch.rs): azymut startu dla dwóch ciał (sin Az = cos i/cos lat), Δv zmiany płaszczyzny, bonus rotacji miejsca i geometria dziennych okazji.reentry(src/reentry.rs): korytarz balistycznego wejścia w atmosferę Allena-Eggersa: szczytowe opóźnienie, prędkości szczytowego g i szczytowego nagrzewania, wysokość szczytowego g.eo-coverage(src/eo_payload.rs): geometria pasa / GSD / dostępu / ponownego przeglądu EO (trójkąt kosmiczny SMAD).space-packet(src/space_packet.rs): kodowanie/dekodowanie nagłówka głównego CCSDS 133.0-B Space Packet z obiegiem w obie strony dokładnym co do bitu.attitude-budget(src/attitude_budget.rs): moment grawitacyjno-gradientowy 3-DOF + bilans błędu wskazywania RSS (skalarny bilans przed sprzętem, nie pętla sterowania).passes(src/passes.rs): przewidywanie przelotów nad stacją naziemną (AOS/TCA/LOS, maksymalna elewacja, dostęp).link-budget(src/linkbudget.rs): jednokierunkowe równanie łącza CCSDS-401 / DSN-810-005 (C/N₀ = EIRP − FSPL − L_other + G/T − k, FSPL / Eb·N₀ / zapas / domknięcie).
17-stanowy hybrydowy kwantowo-klasyczny ściśle sprzężony UKF, udostępniony jako scenariusz do uruchomienia (MODELLED). Nowy rodzaj scenariusza
hybrid-ukf(src/fusion/hybrid_ukf.rs,scenarios/hybrid-ukf.toml), który zamienia dotąd dostępny tylko przez API 17-stanowy ściśle sprzężony filtr nieśladowy GNSS/INS (src/fusion/tightly_coupled17.rs) w scenariusz, który mogą wywoływać wiązania CLI/Python/WASM/MCP. 17-stanowy wektor błędu to 15 stanów błędu INS (położenie, prędkość, błąd ustawienia orientacji, bias akcelerometru + żyroskopu) rozszerzonych o poprawkę biasu akcelerometru z CAI: interferometr zimnych atomów (src/inertial/quantum_imu.rs) wyznacza podłogę przypadkowego błądzenia prędkościq_va, więc długoterminowy dryf jest ograniczony przez czujnik kwantowy, oraz o 2-stanowy zegar fazy + częstotliwości, którego szum procesu pochodzi z silnika zegara z parametrami q (clock_state::q_from_allan, odwzorowującego profil odchylenia Allana zegara na PSDq_wf/q_rw, przeskalowane do jednostek odległości). Platforma jest wspomagana GNSS w fazie wstępnej (filtr uczy się biasów, prędkości i zegara), po czym dryfuje przez przestój GNSS tylko na IMU CAI + zegarze, więc przebieg pokazuje hybrydyzację klasycznego IMU w krótkim okresie + kwantowego w długim. Wskaźnikiem jakości jest samospójność filtra: zbiorcze NEES (Normalised Estimation Error Squared, na szacowalnym podzbiorze położenie/prędkość/zegar) i NIS bieli innowacji (Normalised Innovation Squared) na zespole Monte-Carlo, sprawdzone względem ich pasm χ² 95% (Bar-Shalom §5,4). Dopasowany filtr mieści się w pasmach; celowo źle nastrojony filtr (pokrętłaq_factor/r_factor) jest oznaczany: obiektywnie sprawdzalna, rozróżniająca bramka, a nie pieczątka. Kontrola NEES/bieli innowacji jest WYROCZNIĄ STATYSTYCZNĄ: stwierdzeniem samospójności (raportowana kowariancja filtra uczciwie odpowiada rozrzutowi jego własnych błędów przy modelowanym szumie), a NIE gwarancją dokładności w świecie rzeczywistym. Uczciwy zakres: wszystko jest obliczone na podstawie modelu / symulacja: wejścia CAI i zegara to ujęte w granice wartości reprezentatywne dla literatury, a nie zmierzony sprzęt; sprzęt CAI i jego Key-Person pozostają po stronie partnera; nic tu nie sugeruje TRL > 3, doświadczenia lotnego ani zewnętrznej walidacji (JSON wyniku i jednolinijkowe podsumowanie niosą te etykiety jawnie). Pojedyncza trajektoria o stałej prędkości i poziomym locie czyni stany orientacji i biasów IMU obserwowalnymi tylko słabo, więc NEES jest oceniane na 8 szacowalnych stanach; trajektoria z manewrami dla pełnej obserwowalności 17 stanów jest w planie. Dodaje też instrumentację spójnościUkf::update_stats(zwraca NIS dla każdej aktualizacji) iTightlyCoupled17::{update_gnss_nis, nees, nees_subset}. Wszystkie istniejące scenariusze pozostają nietknięte (addytywnie; złote wzorce odtwarzalności bez zmian).Sekwencyjna (rekurencyjna) nawigacja odniesiona do terenu: SITAN jako filtr bieżący. Nowy rodzaj scenariusza
terrain-slam(src/altpnt/sequential.rs,scenarios/terrain-slam.toml), który uruchamia istniejący model pomiaru wysokościomierz–DEM epoka po epoce przez silnik SIRparticle_filter, zamiast wsadowego przeszukiwania od grubego do drobnego, któregoterrain-navużywa do odzyskania pojedynczego stałego przesunięcia INS. W każdym punkcie trasy chmura jest propagowana o przyrost raportowany przez INS (sam zepsuty przez wzrost dryfu na krok), ponownie ważona dopasowaniem do terenu i próbkowana ponownie przy degeneracji, więc zmienny w czasie dryf INS jest śledzony wzdłuż trasy, czego dopasowanie stałego przesunięcia strukturalnie nie potrafi. Na syntetycznym DEM estymata rekurencyjna pozostaje ograniczona i ponownie zbiega (końcowo ≈ 70 m), podczas gdy nieobsługiwane rozwiązanie inercyjne rozbiega się bez ograniczenia do ≈ 5 km; błąd w każdej epoce podąża za wyrazistością terenu (dryfuje na obciążonym INS nad płaskimi siodłami i ponownie się zaczepia nad wyrazistą rzeźbą), a monitor efektywnej liczby próbek potwierdza zdrową chmurę. Uczciwy zakres: mapa jest znana i stała, to rekurencyjna lokalizacja względem zapisanego DEM (lokalizacyjna połowa SLAM terenu), a nie łączne estymowanie mapy; nieokrężne z konstrukcji (wstrzyknięta rampa dryfu jest niezależną prawdą). Wszystkie istniejące scenariusze pozostają nietknięte (addytywnie; złote wzorce odtwarzalności bez zmian).Rdzeń odporności bez GNSS + wycinki demonstratora FutureNAV (
src/holdover.rsoraz podstawy obwiedni odporności wsrc/impairment_eval.rs,src/quantum_trade.rs,src/navsignal.rs,src/inertial/quantum_imu.rs, z wycinkami weryfikacji FutureNAV wsrc/verification.rs). Składa elementy składowe alternatywnego PNT (holdover zegara, śledzenie sygnału, dryf inercyjny, teren) w jedną narrację odporności na przestój GNSS. MODELLED; addytywnie.Kshana Interchange Format (KIF): wersjonowana, samoopisująca się koperta artefaktu (
src/interchange.rs). Opakowanie z tagiem schematu wokół wyników scenariuszy, aby zapisany artefakt niósł ze sobą swój rodzaj, wersję schematu i etykiety MODELLED/VALIDATED, a starsze koperty pozostawały odczytywalne z zachowaniem zgodności w przód. Addytywnie; istniejący JSON wyniku bez zmian.Modulacja / śledzenie sygnału nawigacyjnego + korektor różnicowy halo/NRHO w CR3BP (
src/navsignal.rs,src/cr3bp.rs). Model modulacji i śledzenia sygnału nawigacyjnego pierwszego rzędu oraz korektor różnicowy kołowego ograniczonego problemu trzech ciał dla orbit halo / prawie prostoliniowych orbit halo, udostępnione na istniejącej osi możliwości głębokiej przestrzeni. MODELLED.Tryb oceny przesunięcia rozkładu + pokrętło skali dotkliwości korpusu dla
impairment-eval(src/impairment_eval.rs). Dodaje jawny podział na rozkład wewnętrzny i zewnętrzny oraz regulowaną skalę dotkliwości korpusu do harnessu luki optymizmu ROC/AUC (tylko charakterystyki operacyjne, nigdy dane terenowe/IQ).Zwrot z inwestycji na pokrycie + odwzorowanie wpływu niewykrycia na integralność (
src/frugal.rs,src/integrity_impact.rs). Soczewka ROI inżynierii oszczędnej (koszt na jednostkę pokrycia) i odwzorowanie częstości niewykryć na wpływ na integralność. MODELLED; addytywnie.Arkusz parametrów modelu błędów interferometru zimnych atomów (CAI) z cytowaniami (
src/inertial/quantum_imu.rs). Oparty na literaturze, ujęty w granice arkusz parametrów modelu inercyjnego CAI: wejścia są cytowane, a nie ze zmierzonego sprzętu (bez deklaracji TRL / lotu); zasila podłogę przypadkowego błądzenia prędkościhybrid-ukf.Zarządzanie projektem.
GOVERNANCE.mddokumentuje model decyzyjny i granicę otwarte/zamknięte; wiersz społeczności/zarządzania w mapie możliwości przechodzinone → partial, aby to odzwierciedlić.
Poprawiono#
Poziom ochrony integralności ARAIM: nominalny bias (
b_nom) i σ_URA są teraz stosowane. Poziom ochrony MHSS odejmuje teraz jednostronną projekcję nominalnego biasub_k = Σ_i |s_i|·b_nomdla każdego trybu usterki i używa sigmy integralności σ_URA (odrębnej od sigmy dokładności σ_URE) niesionej w Integrity Support Message. To czyni poziom ochrony bardziej zachowawczym i poprawnym względem standardów, a zatem zmienia wartości PL raportowane przez istniejące scenariusze integralności. ISM/scenariusz zyskuje pola#[serde(default)]sigma_ura_m/b_nom_m, więc dane wejściowe, które ich nie ustawiają, zachowują dotychczasowe zachowanie. Zob.docs/ARAIM_REFERENCE.mddla przywróconego wzorub_ki uczciwej uwagi implementacyjnej.Spójność χ² monitora spoofingu.
parity_raim_testużywa teraz wspólnej ścieżki odwrotności χ²raim::chi2_quantile, co usuwa drugą rozbieżną implementację χ², więc RAIM i monitor spoofingu w parytecie zgadzają się co do swoich progów.gravity-map-navpodłączono do dyspozytora CLI. Scenariusz był wcześniej osiągalny tylko przez API; teraz jest wywoływany jakokind=jak każdy inny scenariusz.Dokumentacja i dokładność liczników. Liczby rodzajów scenariuszy w README są teraz przypięte do
api::list_scenario_kinds().len()przez testscenario_count_doc_sync, więc udokumentowana liczba nie może już rozjechać się z dyspozytorem.
0.17.0 - 2026-06-14#
Dodano#
- PNT dla kosmosu głębokiego i Marsa — otwarty silnik nawigacji radiometrycznej oraz symulacja GSE. Nowa, w pełni addytywna oś możliwości dobudowana na sprawdzonym względem wzorców rdzeniu ziemskim (każdy istniejący scenariusz ziemski jest identyczny co do bajtu — wzorce odtwarzalności przechodzą bez zmian i bez ponownego generowania). Dodaje: rdzeń dynamiki wielociałowej (
Body{mu, re, zonals, gravity, rotation, IAU-pole}z tesseralnym polem grawitacyjnym Marsa GMM-3, układem związanym z ciałem Marsa wg IAU, wymiennym złączemEphemerisProvider, dwuczęściowymi datami juliańskimi z dokładnością poniżej mikrosekundy oraz TT↔TDB); obserwable radiometryczne (iteracyjny czas przelotu światła i opóźnienie Shapiro, dwu-, jedno- i trójdrogowy Doppler oraz odległość przez rozwiązanie dwuodcinkowe Moyera, spójne zawracanie transpondera, pomiar odległości regeneracyjny/PN wg CCSDS 414, Δ-DOR wg CCSDS 506, media: plazma słoneczna, troposfera i jonosfera); parsowanie i emisję CCSDS-TDM (503); filtr informacyjny w postaci pierwiastka o zredukowanej dynamice z empirycznymi przyspieszeniami RTN, trójstanowym zegarem pokładowym i modelem oporu Marsa; łączony estymator fuzji jednokierunkowej i dwukierunkowej; powierzchnię scenariuszymars-pnt(konstelacja przekaźników oraz LMO/transfer/powierzchnia) w CLI, Pythonie, WASM, MCP i playground; a także kompleksowy symulator osiągów GSE (geometria → bilans łącza → obserwable → SRIF → kowariancja). Poziom walidacji — zwalidowany symulacyjnie: syntetyczne wyznaczanie orbity w zamkniętej pętli (Mars-LMO ≈ 0,2 m) i analityczna samospójność, przy czym dynamika Marsa względem Słońca została niezależnie skontrolowana względem JPL DE440 (xval/anise-mars-od, bramkowane jądrem: 137 m przy łuku 1-dobowym, uczciwa pozostałość niemodelowanego efektu n ciał). Podawane dokładności dla kosmosu głębokiego to symulacyjne wskaźniki jakości oparte na kowariancji, a nie wyniki rzeczywistych misji; walidacja na rzeczywistych danych śledzenia DSN/ESTRACK pozostaje w planie rozwoju. ANISE (MPL-2.0, edycja 2024) jest ograniczone do wyłączonego z przestrzeni roboczej crate'a kontroli krzyżowej, więc bramka licencyjnacargo denyi zadanie MSRV-1.75 pozostają nietknięte. - Ślady na powierzchni z dokładnością agencji na podstawie rzeczywistej orientacji Ziemi wg IERS. Scenariusz
ephemerisprzyjmuje opcjonalne poleeop_finals2000a— wstawioną treść rzeczywistego pliku IERSfinals2000A— i redukuje ślad na powierzchni przez UT1−UTC oraz ruch bieguna dla każdej epoki, interpolowane z tego pliku (tym samymEopSeries, którego używaprecise_od), zastępując nominalne skalarydut1_s/xp_arcsec/yp_arcsec. Dane podróżują wraz ze scenariuszem, więc przebieg pozostaje odtwarzalny i nie wymaga systemu plików (działa w playground WASM). Flagakshana --eop <finals2000A>wkłada rzeczywisty plik do scenariusza z poziomu CLI. Usuwa asymetrię, w której rzeczywiste dane orientacji Ziemi wykorzystywał tylkoprecise_od.
Poprawiono#
- Spójność układów w prędkości zmian odległości. Stacja naziemna jest teraz odwzorowywana w układ inercjalny przez dokładną odwrotność redukcji satelity (
frames::itrf_to_teme, cofającą ruch bieguna oraz rotację gwiazdową), a nie przez rotację GMST ślepą na ruch bieguna, więc oba końce współdzielą jeden układ. Wpływ na raportowany Doppler leży poniżej progu walidacji, ale usuwa to rzeczywistą niezgodność układów i przesadne twierdzenie „dokładnie” w źródle. carrier_hzjest walidowane. Zerowa lub nieskończona/niefinitna częstotliwość nośnej zwraca teraz błąd zamiast po cichu dawać zerowy Doppler (powodowała nieskończoną λ = c/nośna), zgodnie z istniejącą kontroląstep_s.
0.16.0 - 2026-06-11#
Dodano#
- Walidacja modelu sił przez dopasowanie efemeryd, sprawdzona krzyżowo względem rzeczywistych produktów agencji. Nowy wsadowy estymator najmniejszych kwadratów (
src/precise_od.rs) z wariacyjną macierzą przejścia stanu i edycją wartości odstających, napędzany pełnym modelem sił (PreciseForceModel: geopotencjał EGM2008, ciała trzecie, pływy stałe, oceaniczne i atmosferyczne oraz empiryczne przyspieszenia CPR/2-na-obrót), zasilany parserem rzeczywistych danych orientacji Ziemi IERSfinals2000A. Sprawdzone względem opublikowanych orbit referencyjnych: Galileo MEO do 13 cm po dopasowaniu, ESA Swarm-A LEO oraz LRO księżycowy (selenocentryczny, grawitacja GRAIL, układ ciała wg IAU-2015 — o zredukowanej dynamice 6,6 m, uczciwie powyżej celu 5 m na otwartej ścieżce; ścieżka klasy DE ANISE/DE440, która go osiąga, to crate wyłączony z przestrzeni roboczej). - Scenariusz
spoof-detect— zintegrowany wielowarstwowy detektor spoofingu łączący parzystość RAIM dla każdej epoki, monitory AGC i jakości sygnału (SQM) oraz decyzję fuzyjną, sprawdzony względem opublikowanych parametrów scenariusza TEXBAT (Humphreys i in., ION GNSS 2012), w tym trudnego przypadku z wyrównaniem nośnej. - Scenariusz
ephemeris— stan, układy odniesienia, ślad na powierzchni i Doppler. Propaguje jednego satelitę (TLE→SGP4 lub orbita analityczna) i dla każdego kroku podaje inercjalny stan TEME i GCRS (położenie i prędkość), położenie ITRF/ECEF związane z Ziemią, ślad na powierzchni punktu podsatelitarnego w WGS-84 (szerokość / długość / wysokość) oraz topocentryczny azymut / elewację / odległość wraz z prędkością zmian odległości i Dopplerem ze stacji naziemnej. Dostępny z CLI, Pythona, WASM i serwera MCP oraz dostarczany jako zestaw „Ground track” w webowym playground, gdzie ślad jest rysowany na rzeczywistej mapie świata (linie brzegowe Natural Earth 1:110m, wbudowane — bez sieci i zewnętrznych zależności). - Eksport CCSDS OEM (
--export-oem/export_oem = true) — Orbit Ephemeris Message z prędkością, używany przez GMAT / Orekit / STK, na równi z istniejącymi eksporterami SP3 i OMM. - Pływy Ziemi: stałe, oceaniczne (FES2004) i atmosferyczne (Ray 2001 S2) na geopotencjale (IERS Conventions rozdz. 6), podłączone do modelu sił.
- Koła ARM64 — kompilacja PyPI tworzy teraz także koła Linux aarch64 (manylinux_2_28), macOS arm64 i Windows arm64.
- Rozszerzony raport techniczny (preprint) podlinkowany z README oraz artykuł JOSS przygotowany do zgłoszenia (ORCID autora, kompilowany do PDF w CI przy każdej zmianie).
Zmienione#
- Układy odniesienia sprawdzone z dokładnością do milimetra względem opublikowanych wektorów Vallado. Redukcja TEME→PEF/ITRF, pełny łańcuch CIO IAU 2006/2000A GCRS→ITRS oraz konwersja ECEF→geodezyjne WGS-84 są teraz przypięte do przykładu opracowanego w Vallado i in. (AIAA 2006-6753) wraz z jego EOP wg IERS, a nie tylko do wewnętrznej samospójności.
- Niezależne kontrole krzyżowe skal czasu. ERA i skale UTC/TAI/TT zgadzają się z
hifitimedo < 1 µs, a efemerydy planet DE440 zgadzają się z JPL Horizons (geocentryczne położenia Księżyca i Słońca) — obie kontrole jako zawsze włączone bramki CI. - Webowy playground ukrywa kartę wskaźników jakości, gdy wynik nie zawiera wierszy wskaźników jakości, więc pakiety wyłącznie z wykresem (efemerydy, RAIM, spoofing) otwierają się na swoim wykresie — dla efemeryd na śladzie na powierzchni — zamiast na pustej tabeli.
- Prowadzone suwaki playground i przegląd parametru działają teraz dla scenariusza efemeryd / śladu na powierzchni: jego pokrętła (szerokość / długość stacji, krok czasu, czas trwania, UT1−UTC) można stroić, a przegląd może wykreślać geometrię przelotu (maksymalna elewacja, szczytowy Doppler, wysokość, prędkość) względem dowolnego z nich — np. maksymalną elewację względem szerokości stacji. Karta Sweep jest teraz pokazywana tylko wtedy, gdy scenariusz rzeczywiście można przeglądać, więc żaden pakiet nie oferuje kontrolki, która nic nie wykreśla.
- Udokumentowano przybliżenie SGP4
DUT1 ≈ 0w miejscu wywołania GMST (błąd rotacji ≤ ~13″, dobrze w granicach własnego błędu modelu SGP4) i odświeżonoCAPABILITY.md.
0.15.1 - 2026-06-09#
Dodano#
- Wtyczka JetBrains Kshana — PNT simulator jest już opublikowana i zatwierdzona w JetBrains Marketplace. README,
kshana.devi dokumentacja dystrybucji odsyłają do niej bezpośrednio.
Poprawiono#
- Publikacja w rejestrze MCP już się udaje:
server.jsondescriptionprzekraczał limit 100 znaków rejestru (HTTP 422). Skrócono go oraz ujednolicono nazwę serwera (i etykietę własności obrazu) z kanoniczną przestrzenią nazwio.github.ashfordeOU/kshana-mcp. - Publikacja w JetBrains Marketplace już się udaje: CI ponownie przesyłało tę samą wersję wtyczki, która została wystawiona ręcznie, a Marketplace to odrzuca. Wersja wtyczki została podniesiona do
0.1.1, a zabezpieczenie idempotencji traktuje teraz odpowiedź „already contains version” także jako bezskuteczne, lecz udane wywołanie. - Unieważnianie pamięci podręcznej
kshana.dev: opatrzone wersją ciągi zapytaństyle.css/app.jsśledzą wydanie, więc powracający odwiedzający zawsze dostają bieżącą kompilację.
0.15.0 - 2026-06-08#
Dodano#
kshana-mcp— Kshana jako serwer Model Context Protocol (MCP) (mcp/kshana-mcp/). Samodzielny crate wyłączony z przestrzeni roboczej (SDKrmcpma edycję 2024), który udostępnia sprawdzony silnik agentom AI i asystentom — Cursor, JetBrains AI Assistant / Junie i każdemu klientowi MCP — przez stdio. Narzędzia:run_scenario,list_scenario_kinds,validate_scenario,export_sp3,export_omm, każde jako cienka nakładka nakshana::api.- Wtyczka do IDE JetBrains (
ide/jetbrains/). Kliknij prawym przyciskiem scenariusz.toml→ Run Kshana Scenario; wskaźniki jakości i JSON wyniku płyną do okna narzędzia Kshana. Czysta platformowa wtyczka w Kotlinie, zgodna z każdym IDE JetBrains 2024,3+. - Publiczna dystrybucja i automatyczna publikacja przy każdym wydaniu dla obu:
kshana-mcpdo crates.io (cargo install kshana-mcp) przezpublish.yml.kshana-mcpjako wieloarchitekturowy obraz OCI wghcr.io(docker run ghcr.io/ashfordeou/kshana-mcp) przez nowymcp-publish.yml.kshana-mcpdo oficjalnego rejestru MCP przez GitHub OIDC (zero sekretów); wpis rejestru (server.json) używa typu pakietu OCI z właścicielem weryfikowanym etykietą.- wtyczka do IDE do JetBrains Marketplace przez
publishPlugin(bramkowane tokenem, opcjonalne podpisanie przez programistę) przy każdym tagu wydania.
0.14.1 - 2026-06-08#
Dodano#
- Niezależna walidacja krzyżowa układów odniesienia ANISE/SPICE (
xval/anise-frames/). Samodzielny crate wyłączony z przestrzeni roboczej porównuje redukcję CIO IAU 2006/2000A wkshana(kshana::cio::gcrs_to_itrs_matrix, GCRS→ITRS) z ANISE (czysto rustową reimplementacją NAIF/SPICE) obracającym GCRF→ITRF93 zearth_latest_high_prec.bpcz JPL, przy czym te same parametry orientacji Ziemi IERSfinals2000Atrafiają do obu stron, na ośmiu kwartalnych epokach 2020–2023. Dwie niezależne realizacje układu zgadzają się do maksymalnego względnego obrotu 0,028″ — ≤ 0,86 m na ziemi, ≤ 0,93 m na LEO, ≤ 3,6 m na orbicie GNSS, co spełnia dawną kontrolę krzyżową układów z ROADMAP „< 10 m” z dużym zapasem (uzupełnia istniejące kotwice SOFA/ERFA zgodne co do bitu, a nie je zastępuje). Crate jest izolowany, ponieważanise+hifitimemają licencję MPL-2.0 / edycję 2024 i nigdy nie mogą trafić do opublikowanego grafu zależnościkshana, jegoCargo.lock, bramki licencyjnejcargo denyani kompilacji MSRV; ANISE jest przypięte zdefault-features = false. Zawiera binarkęframe-xval(pobiera ~5 MB BPC, drukuje tabelę, zapisujereport.{json,md}), bramkę testową samoczynnie pomijającą brak jądra/sieci oraz opcjonalne zadanie CI wyłącznieworkflow_dispatch(nigdy nie blokujemain). Udokumentowane wdocs/VALIDATION.md(wiersz CIO) iROADMAP.md.
Poprawiono#
- Playground przyjazny urządzeniom mobilnym. Naprawiono poziome przepełnienie
.panelplayground na telefonach (element siatki CSS z domyślnymmin-width: autobył renderowany o ~100 px szerzej niż okno) przezmin-width: 0i kontrolki z ograniczoną szerokością; sprawdzono czysto przy 360 / 390 / 414 / 768 px. Wyrównano przyciski akcji „Pin to compare” / „Download report” (równe pola marginesów w rzędzie flex). Powiększono przyciski uruchamiania, suwaki, listy wyboru i linki nawigacji do minimum celu dotykowego ~44 px wg WCAG 2.5.5 / Apple-HIG na telefonach i urządzeniach dotykowych, bez zmiany rozmiarów na pulpicie.
0.14.0 - 2026-06-08#
Poprawiono#
- Utwardzenie odporności po przejściu wrogiego testu bojowego. (1)
sbas_protection_levelodrzuca teraz niefinitną elewację/azymut/wariancję oraz ujemne lub niefinitne przekątne kowariancji (niemal osobliwa geometria przeskalowana małym σ mogła wcześniej ominąć bramkę bezwzględnego elementu osiowego i zwrócić NaN VPL / absurdalny HPL jako poprawnySome— cichą awarię integralności). (2) Propagator numeryczny (propagate/propagate_dopri) kończy się bezpiecznym błędem przy niefinitnym stanie początkowym zamiast kręcić adaptacyjny kontroler bez końca. (3) Pomocnik komórki DEM nie powoduje już paniki na siatce z pojedynczą próbką (1×N). (4) Azymutlunar_look_anglejest utrzymywany ściśle w[0, 360). (5)SphericalHarmonicField::from_gfcodrzuca niefizyczne (NaN / niedodatnie)GM/promień.
Dodano#
- Binarka
validation_reporti artefakt wydania: generator bez zależności, który tworzy jednostronicowe, gotowe do druku podsumowanie walidacji w HTML, indeksujące każdą walidację egzekwowaną w CI (SGP4 666/666, EGM2008, układy zgodne co do bitu, Allan wg NIST, arkusze danych IMU, ARAIM/SBAS, odtwarzalność na 3 systemach, pokrycie) z jej testem i zewnętrzną wyrocznią. Workflow wydania generujekshana-validation-summary.htmli dołącza go (wraz z proweniencją SLSA) do każdego otagowanego wydania. - pytest współpracy z numpy i utwardzenie kół:
tests/python/test_numpy_interop.py(uruchamiany w CI) oraz przypięty kontener manylinux i krok weryfikacjiauditwheel showw kompilacji kół. - Samouczki i edukacja:
docs/tutorials/(trzy opracowane samouczki, opatrzone adnotacjami scenariusze dla każdej dziedziny, ćwiczenia poziomów 1/2/3) ztests/tutorials.rsprzypinającym każdą przytoczoną liczbę do bieżącego wyniku silnika. - Artefakty zgłoszeń zewnętrznych (
paper/,notebooks/,submissions/): szkic artykułu JOSS, notatnik kwantowy kontra klasyczny oraz gotowe zestawy do zgłoszenia do awesome-gnss / ESA Navipedia / NASA ASCL / ESA ESSR / ION/IAC, a takżeFUNDING.yml— przygotowanie zewnętrznych kroków zgłoszenia. - Nawigacja alt-PNT odniesiona do terenu i łączona (moduł
altpnt): nawigator dopasowania terenu TERCOM/SITAN na DEM (loader.hgti generator syntetycznych danych testowych) oraz łączony nawigator grawitacyjno-magnetyczny (IGRF) i terenowy dla środowisk bez GPS, udostępniony jako rodzaje scenariuszyterrain-navicombined-altpnt. Sprawdzony przez zbieżność dopasowania terenu (odzyskano znane wstrzyknięte przesunięcie) oraz ograniczony błąd filtra łączonego w oknie bez GPS. - Geometria LunaNet LANS (
lunar): nazwane księżycowe miejsca na powierzchni (Apollo 11/15/16, krawędź Shackleton) z autorytatywnymi współrzędnymi selenograficznymi, powierzchniowe kąty widzenia (az/el/odległość), widoczność/pokrycie i DOP miejsca, sprawdzone względem promienia Księżyca, opublikowanych współrzędnych miejsc oraz tożsamości elewacji 90° dla położenia radialnie nad głową. - Prowadzony playground w przeglądarce: suwaki trybu prowadzonego, panel wyników z kartami, nakładka wycieczki przy pierwszym uruchomieniu, tryby przeglądu parametru i nakładania wielu przebiegów, niezależny od zależności widok orbity 3D na canvas/SVG (zestaw orbity emituje teraz addytywne
eci_track), tryb osadzania/iframe oraz pobieranie jako raport HTML — każde z testami jednostkowymi node w CI. - Model błędów IMU sprawdzony względem arkuszy danych (
tests/imu_allan_spec.rs): ARW/VRW/niestabilność biasu ADIS16465/16488/16460 odzyskane z zsyntetyzowanego odchylenia Allana i skontrolowane względem specyfikacji producenta (identyfikacja wg NIST SP1065 / IEEE 952). - Walidacja estymatorów Allana wg NIST SP1065 (
tests/allan_nist_sp1065_1000point.rs): cztery estymatory odtwarzają opublikowane 1000-punktowe odchylenia referencyjne i granice ufności z Tabeli 32. - Poziomy ochrony SBAS / DO-229E, jonosferycznie wolne L1/L5 i mapa compliance DO-316 (moduł
sbas).sbas_protection_leveltworzy ważoną macierz geometrii z elewacji/azymutu każdego satelity oraz budżetu błędów UDRE/GIVE/pokładowego/troposferycznego, odwraca macierz normalną (wspólneorbit::invert4) i rzutuje wariancje na HPL/VPL przez współczynniki K z DO-229E (PA 6.0/5.33, NPA 6,18).iono_free_l1l5dodaje wolną od jonosfery pseudoodległość GPS L1/L5 (IS-GPS-705,γ₁₅ = 1.79327), sprawdzoną pod kątem znoszenia niezależnego opóźnienia jonosferycznego pierwszego rzędu w silniku.do316_compliance_mapwiąże wymagania DO-316/DO-229E z funkcjami, które je realizują. Sprawdzone względem definicji współczynników K w postaci zamkniętej, geometrii referencyjnejinv(GᵀG)w numpy oraz tożsamości kowariancji dwóch dróg; kontrola zgodności opublikowanych PL z RTKLIB/gLAB jest udokumentowana jako oczekująca na przegląd wdocs/COMPLIANCE.md. - Pełna tesseralna grawitacja w harmonikach sferycznych — pole EGM2008 do stopnia/rzędu 70. Nowy
gravity_sh::SphericalHarmonicFieldoblicza geopotencjał i jego przyspieszenie w układzie związanym z Ziemią z w pełni znormalizowanych współczynnikówC̄_nm, S̄_nm, używając stabilnej znormalizowanej rekurencji Legendre'a Holmesa–Featherstone'a (denormalizacja przepełniłaby się przy tym stopniu). Dostarczane współczynniki to produkt NGA EGM2008 (domena publiczna, przez ICGEM), dołączony wegm2008_data.rsi odtwarzany co do bitu przeztools/gen_egm2008.pyz zatwierdzonegotools/egm2008_to70.gfc; dowolny model ICGEM.gfcwczytuje się przezfrom_gfc. Sprawdzone względem trzech niezależnych wyroczni: zapadnięcia do masy punktowej (tylkoC̄00=−μr/|r|³), pola wyłącznie zonalnego odtwarzającego istniejąceforces::zonal_acceldo ~1e-9 oraz analitycznego przyspieszenia zgodnego z gradientem różnic skończonych bezpośrednio zsumowanego potencjału do <1e-6. - Ogólnorelatywistyczne przyspieszenie Lense’a–Thirringa (unoszenie układów inercjalnych) (
forces::lense_thirring_accel, IERS 2010 równ. 10,12), człon grawitomagnetyczny wykraczający poza istniejącą poprawkę Schwarzschilda, podłączony do propagatora numerycznego przez nową flagęForceModel::lense_thirring(). Sprawdzone jako liniowe względem momentu pędu Ziemi i o 1–2 rzędy wielkości poniżej członu Schwarzschilda, w reżimie pomiarów LAGEOS / Gravity Probe B. - Trait
Propagatorjednoczący analityczne i numeryczne propagatory orbity. Numeryczny propagator Cowella z modelem sił jest teraz pełnoprawnym partnerem SGP4: nowy typNumericalPropagator(stan początkowy +ForceModel+Tolerance+ wybórIntegratorz podwajaniem kroku lub Dormanda–Prince’a) orazSgp4implementująpropagator::Propagator, któregostate_at(t_seconds) -> StateVectorzwraca inercjalny stan TEME w jednostkach SI (m, m/s), więc oba są wymienne zaBox<dyn Propagator>. Implementacja SGP4 to dokładna konwersja km/min→SI metody własnej (sprawdzona testem równości); implementacja numeryczna przechodzi przez trait tę samą bramkę dokładnego Keplera poniżej metra, oba adaptacyjne sterowniki zgadzają się, aPropagatorErrorujawnia podstawowy kod SGP4.
0.13.0 - 2026-06-08#
To wydanie zamyka największą lukę poprawności w silniku: orientacja Ziemi i redukcja układów odniesienia są teraz wykonywane na poziomie implementacji referencyjnej (sprawdzone co do bitu względem ERFA/SOFA), stos integralności zyskuje dwukonstelacyjny ARAIM na rzeczywistych TLE GPS+Galileo, a warstwy propagacji, sensorów kwantowych, księżycowa/cislunarna i geomagnetyczna pogłębiają się — obok typowanego API Pythona, bogatszego playground w przeglądarce i macierzy odtwarzalności na trzech systemach. Najważniejsze:
- Układy odniesienia, co do bitu. Pełna nutacja IAU 2000A i 2000B, precesja IAU 2006, oparta na CIO (X, Y, s) redukcja IAU 2006/2000A GCRS↔ITRS, ruch bieguna wg IERS oraz układy wyjściowe TEME→GCRS/ITRS — każde sprawdzone co do bitu względem procedur referencyjnych ERFA/SOFA.
- Dwukonstelacyjny ARAIM (GPS + Galileo) na rzeczywistych TLE, z HPL/VPL, wyjściem w postaci diagramu Stanforda i otwartym
docs/ARAIM_REFERENCE.md. - PNT cislunarny: propagator CR3BP Ziemia–Księżyc, układy MCI↔MCMF, współrzędne selenograficzne oraz uruchamialny scenariusz integralności księżycowej LunaNet.
- Sensing kwantowy: systematyki Coriolisa i AC-Stark dla interferometru zimnych atomów, przegląd dryfu oraz walidacja względem budżetu Freiera (2016).
- Geomagnetyczny model pola głównego IGRF-14, samodzielny i sprawdzony.
- Typowane API Pythona (PyO3
RunOutput/ScenarioMeta,.data(),scenario_kinds,validate_toml, stuby typów) z kompilacją kół w CI, a także pełnoprawne wyjście propagatora GCRS/ITRS i eksport CCSDS OMM. - Wiarygodność i odtwarzalność: bezpośrednie porównanie dokładności SGP4 z niezależnym crate'em
sgp4, bramka pokrycia w CI (~97% linii wsrc/) oraz macierz odtwarzalności na trzech systemach (ubuntu/macos/windows).
Zmienione#
- Każdy wykres playground jest teraz zgodny z motywem strony. Wszystkie dwanaście generatorów wykresów SVG — wykres wyniku/holdover (
src/report.rs+src/chart.rs), wykres odchylenia Allana (web/app.js) i każdy wykres scenariusza (src/hybrid.rs,jamming.rs,timetransfer.rs,spoof.rs,raim.rsStanford + dostępność,lunar.rs,ensemble.rs,sweep.rs,gnss_sim.rs,fusion/pack.rs,inertial/mod.rs) — używało chłodnych granatowych paneli (#0e131b), chłodnoszarych osi/tekstu i kłócącej się palety serii czerwony/niebieski/fioletowy. Teraz używają w całości ciepłej grafitowej palety: panele--bg, ciepła siatka--line, etykiety--fg, ze spójnym przypisaniem serii — kwantowe = miodowozłote (--accent-bright), klasyczne = ciepły bursztyn (--partial), specyfikacja/limit =--crit. Widoki kodowane bezpieczeństwem zachowują swoje znaczenie: diagram Stanforda RAIM pozostaje zielony (dostępny) / bursztynowy (mylący) / czerwony (niebezpieczny) / przygaszona stal (niedostępny), a HPL/VPL czytają się jako złoto/brąz. - Wykresy są teraz samoopisujące po zapisaniu/pobraniu. Oba wykresy wbudowują tytuł w SVG (tytuł wykresu Allana i podtytuł „lower is better” były wcześniej tylko HTML wokół obrazu, więc zapisany obraz nie miał podpisu), a oba mają stopkę proweniencji —
Kshana v<version> · <scenario-hash> · kshana.dev— dzięki czemu pobrany wykres jest samodzielny i pozostaje odtwarzalny. - Każdy wykres ma teraz stopkę proweniencji. Stopka —
Kshana v<version> · scenario <hash> · kshana.dev— jest nakładana centralnie dla wszystkich rodzajów scenariuszy wapi::run_toml(wcześniej była tylko na wykresach holdover i Allana), więc każdy zapisany lub pobrany obraz — z playground, z eksportu.chart.svgw CLI lub z karty wyników HTML — identyfikuje swoją wersję, odcisk scenariusza i źródło. Hash jest oznaczonyscenariodla jasności i pochodzi zscenario_hashwyniku, gdy jest dostępny, z zapasowym hashem źródła dla raportów integralności/księżycowych. Czym jest odcisk i po co tam jest, opisano w sekcji „Output” README oraz wdocs/PROVENANCE.md.
Poprawiono#
raim::chi2_quantilei próbnik szumu Stanforda RAIM nie powodują już paniki przy danych spoza zakresu / niefinitnych (znalezisko fuzzingu zależne od kolejnościread_dirz nowych scenariuszy ARAIM).chi2_quantilechroni terazp/ktak jaknormal_quantile(zwracając wartość brzegową zamiast panikiassert!), aNormalszumu Stanforda dla dostępności ogranicza σ do ściśle dodatniej — więc stos integralności/ARAIM nigdy nie wpada w panikę przy zmutowanych lub błędnie skonfigurowanych scenariuszach.
Dodano#
- Macierz CI odtwarzalności między platformami. Nowe zadanie
reproducibility-matrixuruchamia testy odtwarzalności na ubuntu-latest, macos-latest i windows-latest przy każdym pushu. Ponieważ pełny JSON wyniku nie jest identyczny co do bajtu między systemami (rozbieżność libm na ostatniej jednostce ULP), dokładnie asercjonuje rzut niezmienniczy względem platformy — odcisk wejścia plus kształt wyjścia, przypięte dla każdego scenariusza jako wzorce SHA-256 wtests/golden/przez nowytests/cross_platform_golden.rs— obok przypięć numerycznych (golden.rs, do 1e-6), stanów SGP4 (sgp4_verification.rs, do 2e-5 km) i determinizmu w obrębie procesu (determinism.rs). Razem dowodzą one odtwarzalności między platformami na trzech systemach bez kruchości dokładnego hashowania bajtów pełnego wyjścia.docs/REPRODUCIBILITY.mdopisuje ten podział. - Bramka pokrycia kodu w CI. Nowe zadanie
coverageuruchamiacargo-tarpaulinz silnikiem opartym na źródłach LLVM, publikuje raport lcov jako artefakt kompilacji i egzekwuje dolną granicę pokrycia linii dlasrc/(z wyłączeniem generowanych tabel danych, punktu wejścia CLI, testów i zasobów webowych). Zmierzone pokrycie linii to ~97% dlasrc/(SGP4 i moduły zegara ≥95%); bramka jest ustawiona na 85% — powyżej celu ≥80% i z dala od zmierzonej wartości, więc wychwytuje regresje bez fałszywych alarmów. Odznaka pokrycia jest publikowana w README. - SGP4/SDP4 bezpośrednio z niezależnym crate'em
sgp4. Nowy test (tests/sgp4_crate_comparison.rs) sprawdza krzyżowo propagator Kshana względem najczęściej używanej biblioteki SGP4 w Rust (neuromorphicsystems/sgp4, dodanej jako zależność wyłącznie testowa) na tych samych 666 wektorach AIAA 2006-6753. Gdy oba są napędzane modelem grawitacji WGS72, którego używają wektory, dwie niezależne implementacje zgadzają się poniżej mikrometra dla orbit okołoziemskich i rezonansowych oraz do 4,12 mm w najgorszym przypadku dla wszystkich reżimów, obie odtwarzając tabelę referencyjnątcppver.out. Zatwierdzona tabela porównawcza (tests/fixtures/sgp4_comparison.md, regenerowana przezKSHANA_REGEN_FIXTURES=1) rozbija wynik na reżimy (LEO/MEO, kosmos głęboki, rezonans ½-dobowy i 1-dobowy) i odnotowuje cztery celowo patologiczne przypadki, które crate odrzuca przy konstrukcji. Aktywne asercje utrzymują oba wyniki w granicach 2e-5 km od wzorca i zgodność między sobą w granicach 4e-5 km — to zabezpieczenie przed regresją, a nie jednorazowa kontrola. To konkurencyjny pedigree: poprawność względem niezależnej bazy kodu, a nie tylko statyczna tabela. (Domyślnefrom_elementsw crate używa WGS84, więc różni się od wzorca WGS72 o ~km — co zostało uczciwie podane w opisie tabeli.) - Eksport CCSDS OMM jest teraz dostępny od końca do końca. Zapisywacz OMM (
src/omm.rs) wcześniej nie miał ścieżki CLI/API; średnie elementy scenariuszaorbitmożna teraz opublikować jako katalog OMM CCSDS 502.0-B-2 — jedna wiadomość OMM KVN na każdego satelitę zdefiniowanego przez TLE — przezkshana <orbit.toml> --export-omm out.omm, alboexport_omm = truew scenariuszu automatycznie zapisuje<scenario>.omm(analogicznie do istniejącego--export-sp3). Każda wiadomość zawiera rzeczywisty numer katalogowy NORAD satelity, międzynarodowe oznaczenie COSPAR (YYYY-NNNP) i epokę (w formie dnia roku CCSDS), sparsowane z linii TLE 1 przez nowetle::parse_tle_identity; linia nazwy staje sięOBJECT_NAME(w przeciwnym razieOBJECT <id>).CREATION_DATEto epoka scenariusza, a nie czas zegarowy, więc wynik jest odtwarzalny. Nowe API:api::export_omm/api::auto_export_omm,OmmFile::from_tle_block,OrbitClockScenario::to_omm_string. Syntetyczny scenariusz Walkera lub RINEX (bez średnich elementów TLE) kończy się błędem zamiast emitować pusty plik. Sprawdzone względem dołączonej migawki 30 satelitówgps-ops(tests/sp3_export_roundtrip.rs). - Interaktywne odczyty po najechaniu na wykresy playground. Przesunięcie kursora nad wykresem przyciąga celownik do najbliższej próbki i pokazuje podpowiedź z wartością (
web/hover.mjs, podłączone wweb/app.js). Na wykresie Allana odczytuje τ i σ_y(τ) każdego zegara; na wykresach szeregów czasowych scenariuszy (holdover zegara, nawigacja zliczeniowa, transfer czasu, hybrydowe PNT, GNSS/INS) odczytuje czas i wartość każdego zestawu w jednostkach samego wykresu (ns / m / ps / wykorzystanie), sparsowane z wyniku, więc odczyt zgadza się z krzywą. Wyspecjalizowane diagramy (RAIM, spoofing, przegląd) nie dostają nakładki. Wykresy pozostają samoopisującymi się blobami<img>— nakładka to przezroczysty celownik i podpowiedź na wierzchu, więc pobieranie/porównywanie/eksport pozostają nietknięte. Matematyka współrzędnych (najbliższa próbka, kursor→ułamek wykresu, parsowanie łamanej) jest testowana jednostkowo (web/hover.test.mjs, uruchamiane w CI). - Tryb porównania A/B w playground. Przypnij dowolny przebieg jako punkt odniesienia A, uruchom drugi scenariusz, a oba zostaną pokazane obok siebie z tabelą różnic wskaźników jakości (holdover, RMS/p95 synchronizacji czasu, dostępność), która koloruje zwycięzcę dla każdej metryki (
web/compare.mjs, podłączone wweb/app.js; logika różnic testowana jednostkowo wweb/compare.test.mjs, uruchamiana w CI). Wszystkie wartości są wstawiane jako tekst, a wszystkie wykresy przez blob<img>, więc nic z ciągu scenariusza nie jest nigdy wstrzykiwane jako znaczniki. - Przyciski pobierania wykresów (SVG + PNG). Każdy wykres playground ma teraz dopasowany do motywu pasek „Download SVG / PNG” (
web/chartdl.mjs, podłączone wweb/app.js). SVG zwraca wierny, skalowalny oryginał; PNG rasteryzuje ten sam samoopisujący się obraz w skali 2x na potrzeby slajdów i dokumentów. Pliki są nazywane zgodnie z ich proweniencją —kshana-<chart>-v<version>-<scenario-hash>.<ext>— a logika nazw plików i rozmiarów jest testowana jednostkowo (web/chartdl.test.mjs, uruchamiane w CI). - Geomagnetyczny model pola głównego IGRF-14 (
src/igrf.rs). Standardowe pole w harmonikach sferycznych IAGA (stopień/rząd 13, epoka 2025,0 + wariacja wiekowa 2025–2030; współczynniki generowane maszynowo z oficjalnegoigrf14coeffs.txtprzeztools/gen_igrf.pydosrc/igrf_data.rs, odtwarzalne co do bitu). Synteza ze znormalizowaniem Schmidta zwraca wektor pola (północ/wschód/dół) oraz elementy pochodne (deklinacja, inklinacja, natężenie poziome/całkowite) w dowolnym położeniu geodezyjnym i dowolnej dacie, a także biegun geomagnetyczny i siłę dipola — magnetyczny odpowiednik dopasowywania map grawitacyjnych w nawigacji alternatywnej wobec PNT. Sprawdzone samodzielnie: synteza zgadza się z dokładnym dipolem przechylonym w postaci zamkniętej, pełne analityczne pole stopnia 13 zgadza się z różnicą skończoną potencjału skalarnego, oś dipola odtwarza znany biegun geomagnetyczny (~80,7°N, −72,7°E) i siłę ~29,7 µT, a pole globalne jest fizyczne. - Typowane wiązania Pythona (
src/python.rs). Poza działającymi na ciągachrun/run_fullmoduł udostępnia teraz typowaną klasęRunOutput(.json,.svg,.summaryoraz akcesor.data()zwracający wynik sparsowany do natywnego słownika Pythona — bez ponownego parsowania JSON, z możliwością opakowania w NumPy), a takżerun_typed,scenario_kinds()(sparsowana lista słowników metadanych) ivalidate_toml()(niepowodująca wyjątku lista komunikatów o błędach). Zawiera stub typów PEP 561 (kshana.pyi+py.typed) dla mypy/pyright/edytorów oraz krótki przewodnikdocs/PYTHON_API.md. Istniejące funkcje są bez zmian. - Pełnoprawne układy wyjściowe dla propagatorów (enum
src/orbit.rsFrame+position_in_frame+state_gcrs). KażdyPropagator(Kepler, SGP4, RINEX, GLONASS, SP3) może teraz podawać swoje położenie w TEME, GCRS (≈ J2000) lub ITRS (związanym z Ziemią) — TEME natywnie, GCRS przez sprawdzoną redukcję TEME→GCRS, ITRS przez złożenie jej z rotacją CIO IAU 2006/2000Agcrs_to_itrs— oraz swój pełny stan GCRS (położenie + prędkość) przezstate_gcrs. Inercjalne wyjście na datę nie jest już ograniczone do TEME. - Redukcja niebiańskiego do ziemskiego układu IAU 2006/2000A oparta na CIO (
src/cio.rs). Nowoczesny łańcuch GCRS↔CIRS↔ITRS bez równonocy: współrzędne CIPX, Yodczytane z macierzy bias-precesja-nutacja IAU 2006/2000A (z ponownym użyciem sprawdzonej precesji FW i nutacji 2000A z korektąeraNut06aP03), 66-członowy szereg lokalizatora CIOs(eraS06, generowany maszynowo z wzorca ERFA przeztools/gen_s06.pydosrc/cio_s06_data.rs, odtwarzalny co do bitu), macierz GCRS→CIRS (eraC2ixys), kąt obrotu Ziemi (eraEra00) oraz pełna rotacja GCRS→ITRS (eraC2tcio, złożona z istniejącego ruchu bieguna IERS). Sprawdzone co do bitu względem opublikowanych wektorów testowycheraXys06a(X=0.5791308482835292617e-3, Y=0.4020580099454020310e-4, s=-0.1220032294164579896e-7 przy JD_TT 2453736,5),eraC2ixysieraEra00. Wykazano, że łańcuch CIO i dawna redukcja TEME wg równonocy/GMST-1982 zgadzają się z dokładnością do udokumentowanej różnicy konwencji czasu gwiazdowego ≈2·(równanie równonocy). To rygorystyczna redukcja, którą ścieżka równonocy/GMST jedynie przybliżała. - Pełny szereg nutacji IAU 2000A (
src/nutation.rsnutation_iau2000a,nutation_matrix_2000a). Kompletny model MHB2000 — 678 członów księżycowo-słonecznych + 687 planetarnych — o dokładności < 0,1 mas, obok istniejącego 77-członowego obcięcia 2000B. Tabele są generowane maszynowo z wzorca IAU SOFA / ERFAnut00aprzeztools/gen_nut00a.pydosrc/nutation_iau2000a_data.rs(generator odtwarza zatwierdzony plik co do bitu), a cały szereg — zarówno zestawy argumentów fundamentalnych IERS-2003 i MHB2000, jak i długości planet — jest sprawdzony co do bitu względem opublikowanego wektora testowegoeraNut00a(Δψ = −0.9630909107115518e-5, Δε = 0.4063239174001679e-4 przy JD_TT 2453736,5, do 1e-13 rad). Domyślna redukcja TEME→GCRS zachowuje szereg 2000B (~1 mas, poniżej uproszczenia rotacji układu prędkości w łańcuchu);nutation_matrix_2000audostępnia macierz na datę o dokładności < 0,1 mas dla wywołujących, którzy jej potrzebują. - Uruchamialny scenariusz integralności księżycowej (
kind = "lunar-integrity",scenarios/lunanet-araim.toml). Podłącza przebieg poziomu ochrony na południowym biegunie Księżyca (src/lunar.rsLunarScenario→south_pole_hpl_pass) do uruchamiacza scenariuszy z JSONLunarReporti wykresem SVG HPL w funkcji czasu, dzięki czemu przypadek integralności cislunarnej jest osiągalny prosto z CLI. Uczciwie ujawnia lukę: przy σ_URE LANS równym 30 m HPL na południowym biegunie (≈ 260–450 m) przekracza limit alarmowy 50 m (0 % dostępności) — integralność PNT na Księżycu nie jest jeszcze spełniona. - Dostępność ARAIM dwukonstelacyjnego na rzeczywistych TLE GPS+Galileo i podłączenie do uruchamiacza scenariuszy (
src/raim.rs,src/orbit.rs,scenarios/araim-gps-galileo.toml). Dodajearaim_dual_constellation_availability(zaawansowany silnik ARAIM — błędy pojedynczego satelity oraz błędy całej konstelacji — uruchamiany na siatce czasu) ivisible_positions_labeledoraz podłącza go do uruchamiaczaIntegrityScenarioprzez flagęaraim_dual, tak że wieloGNSS-owe badanie ARAIM jest osiągalne prosto z TOML. Test na rzeczywistych danych (tests/araim_dual_real_data.rs) na dołączonych migawkach Celestrak GPS+Galileo z 2026-06-07 pokazuje, że połączenie Galileo podnosi dostępność ARAIM z 0,21 do 0,67 przy wymagającym VAL 12 m (10,5→21,8 widocznych satelitów), podczas gdy tryb odporny na błędy konstelacji jest zasadniczo ograniczony przy zaledwie dwóch konstelacjach — to ilościowy powód, dla którego odporna integralność dwukonstelacyjna zmierza ku trzeciej konstelacji lub SBAS. Uczciwa pozostałość: liczbowo dokładne odtworzenie Tabeli A-3 z EU ARAIM TN względem pojedynczej epoki zablokowanej wersją oraz rekord danych testowych w Zenodo. - Ograniczony kołowy problem trzech ciał (CR3BP) dla układu Ziemia–Księżyc (
src/cr3bp.rs). Nowy rdzeń dynamiki cislunarnej, którego nie mogą zapewnić propagatory dwuciałowe/SGP4: równania ruchu w układzie wirującym (cr3bp_accel), propagator RK4 (propagate_cr3bp), całka Jacobiego (jacobi_constant) i pięć punktów Lagrange'a (lagrange_points). Sprawdzone względem kotwic w postaci zamkniętej / opublikowanych: współliniowe punkty Ziemia–Księżyc (L1 ≈ 0,83692, L2 ≈ 1,15568, L3 ≈ −1,00506), dokładne równoboczne L4/L5 = (½−μ, ±√3/2, 0), wszystkie pięć potwierdzone jako równowagi pola, stała Jacobiego zachowana z precyzją integratora w trakcie propagacji oraz siła przywracająca poza płaszczyzną, która umożliwia orbity halo/NRHO. To fundament do reprezentowania rzeczywistej NRHO. Uczciwa pozostałość: okresowe warunki początkowe NRHO 9:2 skorygowane różniczkowo, model ekscentryczny/efemerydowy (DE) oraz zdenormalizowane przekształcenie do układów selenocentrycznych wsrc/lunar.rs. - Ruch bieguna wg IERS i redukcja TEME→ITRF (
src/frames.rs). Dodajepolar_motion_matrix(SOFAiauPom00:W = Rx(−y_p)·Ry(−x_p)·Rz(s′)z lokalizatorem TIOs′),pef_to_itrf/itrf_to_peforazteme_to_itrf— rotację TEME→PEF opartą na GMST, po której następuje ruch bieguna — dopełniając precyzyjne według ITRF położenie związane z Ziemią na bazie samego GMSTteme_to_ecef(ruch bieguna to efekt rzędu dziesiątek metrów na promieniu orbity).x_p/y_pto obserwowane wielkości IERS dostarczane przez wywołującego. Uczciwa pozostałość: w pełni oparty na CIO łańcuch (X, Y, s) oraz numeryczna kontrola krzyżowa ANISE/SPICE <10 m pozostają kolejnymi krokami. - Systematyki interferometru zimnych atomów, przegląd dryfu i walidacja względem opublikowanego urządzenia (
src/inertial/quantum_imu.rs,docs/QUANTUM.md). Rozszerza akcelerometr CAI zbudowany od podstaw o dwie wiodące systematyki deterministyczne: fazę Coriolisa/rotacjiΦ_cor = 2·k_eff·v_⊥·Ω·T²(coriolis_phase, z równoważnym biasem przyspieszenia2·Ω×vprzezcoriolis_accel_bias) oraz fazę przesunięcia świetlnego AC-StarkΦ_LS = (δ_LS,1 − δ_LS,3)/Ω_eff(ac_stark_phase, która znosi się dzięki symetrii π/2–π–π/2 dla stałego przesunięcia). Dodajecai_drift_sweep(dryf położenia nawigacji zliczeniowej względem czasu cyklu — rdzeń porównania kwantowego z klasycznym) oraz test walidacyjny względem mobilnego grawimetru Freiera i in. 2016 (arXiv:1512,05660): modelowany poziom szumu rzutu kwantowego leży poniżej opublikowanego krótkoterminowego szumu 96 nm/s²/√Hz i w granicach ~2 rzędów wielkości od niego.docs/QUANTUM.mdzaktualizowano. Uczciwa pozostałość: systematyki czoła fali/wskazywania wiązki, rozwiązywanie niejednoznaczności prążków, dokładne odtworzenie testu lotnego CARIOQA-PMP / Boeing-AOSense (wymaga opublikowanych PSD platformy) oraz zestaw ustawień JS dla playground. - Redukcja układów cislunarnych i przebieg integralności na południowym biegunie Księżyca (
src/lunar.rs). Rozszerza księżycowy silnik ARAIM o rotację MCI↔MCMF (inercjalny środkowany na Księżycu ↔ związany z Księżycem) (mci_to_mcmf/mcmf_to_mci, uproszczony model średniej rotacji w tempie gwiazdowym Księżyca), selenograficzną szerokość/długość/wysokość (mcmf_to_selenographic/selenographic_to_mcmf) orazsouth_pole_hpl_pass— odbiornik w rejonie Artemis na lądowisku względem reprezentatywnego zestawu przekaźników LunaNet w ciągu przebiegu 24 h, co uczciwie określa ilościowo lukę integralności: przy nominalnym σ_URE LANS 30 m poziom ochrony jest skończony, ale przekracza limit alarmowy operacji powierzchniowych 50 m. Uczciwa pozostałość: precyzyjna efemeryda NRHO LANS (3-ciałowa orbita cislunarna), fizyczna libracja / precesujący biegun Księżyca (DE421/SPICE) i scenariusz TOML LunaNet pozostają kolejnymi krokami. - Komunikat wspierający integralność ARAIM, SVG diagramu Stanforda i otwarty wzorzec ARAIM (
src/raim.rs,docs/ARAIM_REFERENCE.md). Dodaje jawnyIntegritySupportMessage(σ_URA / σ_URE / b_nom / P_sat / P_const, z wartościami referencyjnymi WG-C GPS+Galileo oraz konwerterami.fault_priors()/.dual_fault_priors()do silnikówaraim_raimpojedynczego błędu iaraim_dual_raimbłędów całej konstelacji), samodzielny rendererstanford_svgdiagramu integralności Stanforda (cztery strefy, granicaPL = error, prowadnice limitu alarmowego, jeden kolorowany znacznik na epokę) orazdocs/ARAIM_REFERENCE.mddokumentujący algorytm, ISM, hipotezy błędów, kontrakt poziomu ochrony i korzyść z dwóch konstelacji. Testy wykazują zysk geometrii/redundancji (połączenie drugiej konstelacji zacieśnia HPL pojedynczego błędu) i tolerancję błędów konstelacji (użytkownik dwukonstelacyjny przeżywa utratę całej konstelacji; użytkownik jednokonstelacyjny nie). Uczciwa pozostałość: liczbowe odtworzenie Tabeli A-3 z EU ARAIM TN / wartości dostępności 15–25 % względem migawki rzeczywistych TLE zablokowanej wersją, rekord danych testowych w Zenodo oraz podłączeniearaim_dual_raimdo uruchamiacza plików scenariuszy. - Nutacja IAU 2000B i pełna inercjalna redukcja TEME→GCRS/J2000 (
src/nutation.rs). Dodaje drugi i trzeci element prawdziwej redukcji do układu inercjalnego na bazie dostarczonej precesji IAU 2006: 77-członowy księżycowo-słoneczny szereg nutacji MHB2000 (nutation_iau2000b, standardowe obcięcie IAU 2000B o dokładności ~1 mas) z argumentami fundamentalnymi Delaunaya i macierzą nutacji SOFAiauNumat, oraz łańcuch Vallado AIAA-2006-6980 TEME→TOD (równanie równonocy) → TOD→MOD (nutacja) → MOD→GCRS (bias-precesja), udostępniony jakoteme_to_gcrs(r, v, jd_tt)/gcrs_to_teme. Szereg, argumenty i stałe jednostkowe są przepisane ze wzorca IAU SOFA / ERFAnut00bi sprawdzone co do bitu względem opublikowanego wektora testowegoeraNut00b(Δψ, Δε do 1e-13 rad). Uczciwa pozostałość: pełny 678-członowy szereg IAU 2000A (<0,1 mas), numeryczna kontrola krzyżowa ANISE/SPICE <10 m oraz ruch bieguna pozostają kolejnymi krokami (zob.ROADMAP.md).
0.12.0 - 2026-06-06#
To wydanie wprowadza pierwszy w Kshana nieanalityczny propagator orbity — integrator Cowella z hierarchicznym modelem sił o sześciu perturbacjach (dwuciałowy + zonalne J2–J6 + zależne od epoki ciało trzecie Słońce/Księżyc + ciśnienie promieniowania słonecznego ze stożkowym cieniem umbry/półcienia + opór atmosferyczny + postnewtonowska poprawka relatywistyczna Schwarzschilda) napędzany jednym z dwóch integratorów adaptacyjnych (RK4 z podwajaniem kroku oraz zagnieżdżona para Dormanda–Prince'a RK5(4)) — obok warstwy manewrów / projektowania trajektorii (manewry impulsowe i o skończonym czasie, solver Lamberta Izzo i przegląd porkchop), warstwy alt-PNT z dopasowaniem map grawitacyjnych, która odtwarza 60-minutowy ślad bez GPS z dokładnością poniżej 500 m, potoku wsadowego i sekwencyjnego wyznaczania orbity oraz pełnego 17-stanowego ściśle sprzężonego UKF GNSS/INS z nawigacją zliczeniową opartą na kwantowym CAI. Każda możliwość numeryczna jest przypięta do prawdy analitycznej lub ręcznie wyprowadzonej postaci zamkniętej; perturbacje domyślnie wyłączone nie naruszają opublikowanych wzorców.
Dodano#
- Postnewtonowska (Schwarzschilda) poprawka relatywistyczna (
forces::relativistic_accel+propagator::ForceModel::relativity). Dodaje dominującą ogólnorelatywistyczną perturbację na orbicie okołoziemskiej — główny czynnik relatywistycznego przesuwu perygeum — w formie IERS / Montenbruck–Gillβ = γ = 1a = (μ/c²r³)·{[4μ/r − v²]·r + 4(r·v)·v}. Podobnie jak opór atmosferyczny jest zależna od prędkości, więc jedzie na prawej stronie integratora(r, v)przez [accel_rv], opcjonalna i domyślnie wyłączona. Sprawdzone samodzielnie: na orbicie kołowej zapada się do postaci zamkniętej3μ²/(c²r³)·r̂(czysto radialnej i skierowanej na zewnątrz, składowe poza osią dokładnie zerowe); jej stosunek do członu dwuciałowego to podręcznikowe≈1.9·10⁻⁹na LEO (sygnaturaμ/(c²r)); przypadek prędkości radialnej zgadza się z ręcznie uproszczonymμ(4μ + 3v²r)/(c²r³); a w propagatorze perturbuje orbitę bez jej rozpraszania — półoś wielka jest zachowana do znacznie poniżej metra/dobę, strukturalne przeciwieństwo monotonicznego zaniku wywołanego oporem. Ponieważ jest domyślnie wyłączona, wzorce dwuciałowe/J2/zonalne pozostają nietknięte. Strojenie parametrów PPN (β,γ) i człon unoszenia układów inercjalnych Lense’a–Thirringa pozostają kolejnymi krokami. - Stożkowy model cienia umbry i półcienia (
forces::conical_shadow), teraz używany przez ciśnienie promieniowania słonecznego. Ulepsza binarne zaćmienie w cylindrze umbry do gładkiego współczynnikaν ∈ [0,1]: Słońce i Ziemia są modelowane jako tarcze o pozornych promieniach kątowycha = asin(R☉/d☉),b = asin(Rₑ/|r|)z pozornym oddaleniem środkówc, aνto jeden minus ułamek tarczy Słońca zasłonięty tarczą Ziemi (pole nakładania się kół w kształcie soczewki) — pełne Słońce dlac ≥ a+b, całkowita umbra dlac ≤ b−a, obrączkowe dlac ≤ a−boraz ciągły półcień pomiędzy.srp_accelteraz go używa, więc siła SRP maleje gładko podczas zaćmienia zamiast włączać się i wyłączać. Dodaje nominalneforces::SOLAR_RADIUSwg IAU. Sprawdzone samodzielnie:ν = 1w pełnym Słońcu iν = 0głęboko w umbrze (dokładnie), gładki monotoniczny półcień (νrośnie 0 → ~½ przyc = b→ 1 w paśmie[b−a, b+a]) oraz stożkowy półcień wykracza poza cylinder umbry (punkt, który binarny cylinder uznaje za w pełni oświetlony, ma0 < ν < 1dla stożka). Prostszycylindrical_shadowpozostaje dostępny; pociemnienie brzegowe Słońca i cień spłaszczonej Ziemi pozostają kolejnymi krokami. - Zagnieżdżony integrator Dormanda–Prince'a RK5(4) (
integrator::dopri54_step/integrator::integrate_dopri+propagator::propagate_dopri). Dodaje standardową zagnieżdżoną parę Dormanda–Prince'a (1980) z tablicą Butchera obok istniejącego sterownika RK4 z podwajaniem kroku: siedem etapów FSAL daje rozwiązanie 5. rzędu i oszacowanie błędu 4. rzędu z jednego zestawu obliczeń (7 wobec 11 wywołań funkcji na krok), tańsze oszacowanie błędu lokalnego. Sterownik adaptacyjny używa tej samej normy błędu RMS i sterownika kroku0.9·(1/err)^(1/5), więc jest zamiennikiem;propagator::propagate_dopriudostępnia go w modelu sił orbity. Sprawdzone samodzielnie: zagnieżdżone oszacowanie błędu jest O(h⁵) (połowienie kroku zmniejsza je ~32×); DP5(4) całkujey' = ydoeoraz oscylator harmoniczny przez 50 okresów, zachowując energię do <1e-6; osiąga ten sam punkt końcowy przy tej samej tolerancji w mniejszej liczbie obliczeń funkcji niż podwajanie kroku (bez utraty dokładności); apropagate_dopriprzechodzi tę samą bramkę prawdy analitycznej co ścieżka RK4 — poniżej metra względem dokładnego rozwiązania Keplera w zmiennych uniwersalnych na orbicie LEO w ciągu 24 h — podczas gdy oba sterowniki zgadzają się do <1 m na orbicie J2..J6 (bez postaci zamkniętej). Wyższe pary zagnieżdżone (RKF7(8) / DOP853) pozostają kolejnym krokiem. - Opór atmosferyczny podłączony do propagatora jako pierwsza siła zależna od prędkości (
forces::atmospheric_density+forces::drag_accel+propagator::ForceModel::drag). Dodaje atmosferę kawałkami wykładniczą wg Vallado, Tabela 8-4ρ = ρ0·exp(−(h−h0)/H)(28 pasm od poziomu morza po 1000 km, ograniczona poniżej powierzchni) oraz kwadratowy opóra = −½ · ρ(h) · (C_D·A/m) · |v_rel| · v_relwzględem współobracającej się atmosferyv_rel = v − ωₑ ẑ × r(forces::EARTH_ROTATION_RATE = 7.2921151467e-5). Ponieważ opór zależy od prędkości,ForceModelzyskuje noweaccel_rv(t, r, v), a prawa strona integratora przekazuje teraz prędkość (f(t,[r;v]) = [v; a(t,r,v)]); zależne tylko od położeniaaccel_atpozostaje bez zmian, więc człony zachowawcze i wzorce są nietknięte. Sprawdzone samodzielnie: gęstość kotwiczy się na wartości 1,225 kg/m³ na poziomie morza, jest ograniczona poniżej powierzchni, maleje monotonicznie przez LEO, mieści się w paśmie ~1e-12 kg/m³ uśrednionym dla Słońca na 400 km, a jej odzyskana lokalna wysokość skalowa (≈ 58 km na 400 km) jest fizyczna; opór przeciwstawia się współobracającej się prędkości względnej z wielkością LEO ~2e-6 m/s² dlaC_D·A/m = 0.02 m²/kg; i — kluczowa sygnatura — opór jest dysypatywny: orbita na 300 km traci energię właściwą monotonicznie, a jej półoś wielka zanika o ograniczone ~km/dobę, podczas gdy punkt odniesienia w próżni zachowuje energię do <1e-9. Gęstość termosferyczna NRLMSISE-00 (klauzula gęstości oporu < 5 %) pozostaje kolejnym krokiem. - Ciśnienie promieniowania słonecznego podłączone w modelu sił propagatora zależnie od epoki (
forces::srp_accel+propagator::ForceModel::solar_radiation). Dodaje model SRP kuli armatnieja = ν · P☉ · cᵣ · (A/m) · (AU/d)² · d̂ze współczynnikiem zaćmienia w cieniu cylindrycznym (forces::cylindrical_shadow, ν ∈ {0 1}): ciśnienie promieniowaniaP☉ = Φ☉/cz nowoczesnej całkowitej irradiancji słonecznej 1361 W/m² (≈ 4,5398·10⁻⁶ N/m²), spadek strumienia odwrotnie proporcjonalny do kwadratu(AU/d)²oraz radialne popchnięcie od Słońca. Jedzie na tej samej zależnej od epoki prawej stronie co ciało trzecie, próbkując Słońceephemraz w przesuniętej epoceepoch_jd_tt + t/86400współdzielonej między ciałem trzecim Słońcem a SRP. Składalne:with_zonals_j2_j6().third_body(true, true, epoch).solar_radiation(1.5, 0.02). Sprawdzone samodzielnie względem ręcznie wyprowadzonych sygnatur: ciśnienie promieniowania na 1 AU przypina się do podręcznikowego ≈ 4,5398·10⁻⁶ N/m²; SRP w pełni oświetlonego satelity LEO jest identyczne co do bitu ze wzorem kuli armatniej, wskazuje od Słońca i mieści się w paśmie ~1,36·10⁻⁷ m/s² dla cᵣ = 1,5, A/m = 0,02 m²/kg; podwojenie odległości od Słońca czterokrotnie zmniejsza wielkość (odwrotny kwadrat); cień cylindryczny zaćmiewa tylko cylinder umbry (przeciwsłonecznie i w obrębie jednego promienia Ziemi od linii Ziemia–Słońce) i daje dokładnie zerowe SRP w zaćmieniu; a w propagatorze SRP perturbuje orbitę LEO o niewielką ograniczoną wartość, skalującą się ~liniowo z A/m — podczas gdy model bez perturbacji pozostaje niezależny od czasu co do bitu, nie naruszając wzorców dwuciałowych/J2/zonalnych. Stożkowa umbra/półcień (gładkie ν ∈ [0 1]), opór atmosferyczny oraz zewnętrzna walidacja krzyżowa z GMAT/Orekit pozostają kolejnymi krokami. - Zależne od epoki ciało trzecie Słońce/Księżyc podłączone do zmiennej w czasie prawej strony propagatora (
propagator::ForceModel::third_body/accel_at). Perturbacja od ciała trzeciego nie jest już samodzielnym członem siły — jest teraz całkowana przez propagator Cowella jako naprawdę zmienna w czasie siła: każde obliczenie prawej strony próbkuje położenia Słońca/Księżycaephemw przesuniętej epoceepoch_jd_tt + t/86400(z ponownym użyciemprecession::julian_centuries_ttdo konwersji doba↔stulecie), więc perturbatory poruszają się po swoich orbitach w trakcie całkowania, zamiast być zamrożone na początku. Składalne z dowolnym modelem grawitacji (ForceModel::with_zonals_j2_j6().third_body(true, true, epoch)). Sprawdzone samodzielnie: człon Słońca prawej strony jest identyczny co do bitu zthird_body_accelobliczonym w położeniu efemerydy dla tej chwili zarówno przyt = 0, jak it = 1 day(co dokładnie dowodzi okablowania 86400 s ↔ 1 doba ↔ 1/36525 stulecia), perturbator przesuwa się o ~2,6·10⁹ m/dobę między próbkami (nie jest zamrożony), chwilowe wielkości pływowe na LEO trafiają w podręcznikowe pasma ~5·10⁻⁷ m/s² (Słońce) i ~1,1·10⁻⁶ m/s² (Księżyc, ≈ 2× Słońce), każde ciało mierzalnie perturbuje całodobową trajektorię, pozostając ograniczone, a ten sam stan początkowy propagowany w epokach oddalonych o kwartał roku daje inną trajektorię (oś pływowa obraca się o 90°) — podczas gdy model bez żadnego z tych ciał jest niezależny od czasu co do bitu, nie naruszając wzorców dwuciałowych/J2/zonalnych. Dokładność efemerydy klasy DE i zewnętrzna walidacja krzyżowa z GMAT/Orekit pozostają kolejnymi krokami. - Efemeryda Księżyca o niskiej precyzji (
ephem::moon_position), dopełniająca parę ciał trzecich Słońce/Księżyc. Dodaje księżycowy szereg niskiej precyzji Montenbrucka i Gilla (§3.3.2) obok modelu Słońca, dzięki czemu niezależne od ciałaforces::third_body_accelmoże być teraz napędzane przez każde z tych ciał niebieskich bez zewnętrznego jądra DE/SPK. Sprawdzone samodzielnie względem ręcznie wyprowadzonych sygnatur księżycowych: odległość geocentryczna mieści się w rzeczywistej kopercie perygeum/apogeum (~356 500–406 700 km) w ciągu miesiąca, a jej średnia miesięczna odtwarza półoś wielką ~384 400 km; szerokość ekliptyczna nigdy nie przekracza nachylenia orbity Księżyca ~5,3° (sprawdzone przez rzutowanie na biegun ekliptyki we współrzędnych równikowych, co sprawdza razem szereg szerokości i rotację nachylenia ekliptyki); kierunek Księżyca wraca w granicach 1° po jednym miesiącu gwiazdowym (27,3217 d), a jego dobowy ruch mieści się w fizycznym paśmie 12–15°/dobę; zaś księżycowa perturbacja od ciała trzeciego na satelicie LEO ma podręczną wielkość ~1,1·10⁻⁶ m/s² (≈ dwukrotność wartości dla Słońca). Dokładność położenia klasy DE, opór atmosferyczny i SRP pozostają kolejnymi krokami. - Grawitacja ciała trzeciego (Słońca) z wbudowaną efemerydą o niskiej precyzji (
forces::third_body_accel,ephem::sun_position). Dodaje do modelu sił perturbację od ciała trzeciego:a = GM₃·((s−r)/|s−r|³ − s/|s|³)(bezpośrednie przyciąganie minus człon pośredni, który układ geocentryczny musi odjąć), z położeniem Słońca dostarczanym przez nowy modułephemz analitycznym szeregiem niskiej precyzji Montenbrucka i Gilla — bez zewnętrznego jądra DE/SPK dla przebiegu o niskiej wierności. Sprawdzone samodzielnie: przyspieszenie zgadza się z dokładnym gradientem własnego potencjału zaburzającego (third_body_potential), perturbacja znika w geocentrum i ma podręczną wielkość ~5·10⁻⁷ m/s² na satelicie LEO, a efemeryda Słońca trafia w ręcznie wyprowadzone kotwice J2000 — odległość w peryhelium ≈ 1,471·10¹¹ m, deklinacja ≈ −23° w pobliżu przesilenia grudniowego, pozorny ruch ≈ 1°/dobę (≈ 90° na kwartał roku) oraz odległość mieszcząca się w kopercie orbity Ziemi 0,983–1,017 AU w ciągu pełnego roku. Dostarcza połowę ciała trzeciego w kroku modelu sił kamienia milowego propagatora numerycznego (Księżyc jest dostarczony we wpisie towarzyszącym powyżej); dokładność położenia klasy DE, opór atmosferyczny i SRP pozostają kolejnymi krokami. - Model sił zonalnych harmonik J2–J6 (
forces::zonal_accel/zonal_potential). Rozszerza model sił propagatora Cowella poza J2 do pełnego pola zonalnego Ziemi do stopnia 6 (standardowe opublikowane nieznormalizowaneJ2..J6z EGM-96), podłączone do propagatora jakoForceModel::with_zonals_j2_j6(). Przyspieszenie to dokładny analityczny gradient zonalnego potencjału zaburzającegoR(r) = −(μ/r)·Σ Jₙ(Re/r)ⁿPₙ(z/r)(wielomiany Legendre'a rekurencją w górę), sprawdzony na trzy niezależne sposoby: redukuje się z precyzją maszynową doj2_accelsprawdzonego na 666 wektorach, gdy ogranicza się do[J2]; zgadza się z numerycznym gradientem własnego potencjału w całym polu J2..J6 (złoty standard kontroli pola zachowawczego); a człony nieparzysteJ3wobec parzystychJ2/J4..J6wykazują swoją charakterystyczną (anty)symetrię północ–południe względemz → −z— asymetrię kształtu gruszki. Propagowana orbita J2..J6 zachowuje energię całkowitą (kinetyczną + centralną + potencjał zonalny) do ~1e-8 w ciągu doby i perturbuje orbitę tylko z J2 o niewielką, niezerową wartość. To dostarcza krok 2 („harmoniki zonalne J2–J6”) kamienia milowego propagatora numerycznego; pole tesseralne EGM wysokiego stopnia, opór, SRP, ciało trzecie i zewnętrzna walidacja krzyżowa z GMAT/Orekit pozostają kolejnymi krokami. - Numeryczny propagator orbity (Cowella) (
src/propagator.rs). Pierwszy w Kshana propagator nieanalityczny (reszta stosu orbitalnego to analityczne SGP4/SDP4): łączy model sił dwuciałowy + J2 (src/forces.rs) z adaptacyjnym sterownikiem RK4 z podwajaniem kroku (src/integrator.rs) jakof(t,[r;v]) = [v; a(r)], z przełącznikiemForceModel. Sprawdzony względem prawdy analitycznej, silniejszej niż byłoby narzędzie numeryczne do porównań krzyżowych: niezaburzona orbita odtwarza dokładne rozwiązanie Keplera w zmiennych uniwersalnych poniżej metra na 24-godzinnej orbicie LEO (ostrzejsza bramka niż „względem numerycznego wzorca < 10 m”, którą formułuje kamień milowy), energia właściwa i moment pędu zachowują się do ~1e-9 względnie, a regresja węzła J2 odtwarza postać zamkniętąj2_secular_ratesdo teorii pierwszego rzędu (w granicach 2 %, pozostałość O(J2²)). Dodaje takżesolve_kepler_checked, solver Newtona dla równania Keplera, który zwracaErrzamiast po cichu błędnej odpowiedzi, gdy nie zbiega się w ograniczonym budżecie iteracji (przypadeke = 0.999w pobliżu perygeum). Uczciwy zakres: model sił to wyłącznie dwuciałowy + J2 — pole tesseralne EGM wysokiego stopnia (200×200 + loader), opór (NRLMSISE-00), SRP, siły od ciał trzecich i zewnętrzna walidacja krzyżowa z GMAT/Orekit pozostają kolejnymi krokami. - 60-minutowe dopasowanie map grawitacyjnych bez GPS do < 500 m (
run_gps_denied_gravity_nav). Pogłębia warstwę alt-PNT do celu walidacji Quantum Wayfarer ESA NAVISP: pojazd leci po śladzie ~700 km przez pełną jednogodzinną przerwę GNSS — jego rozwiązanie inercjalne dryfuje do ≈ 70 km — a grawimetr zimnych atomów wraz z hierarchicznym, od zgrubnego do dokładnego dopasowywaczem cząstek/siatki odzyskuje stały dryf INS do ≈ 145 m (< 500 m), czyli redukcję > 480×. Rzeczywisty poziom szumu białego grawimetru jest wstrzykiwany jako deterministyczna sekwencja z ziarnem, więc dopasowywacz nigdy nie dostaje wolnej od szumu prawdy, a przebieg jest dokładnie odtwarzalny (sprawdzony jako identyczny co do bitu i stabilny do kilku metrów dla różnych realizacji szumu). Test klasy regresyjnej pokazuje, że udoskonalanie jest konieczne — pojedyncza zgrubna siatka zatrzymuje się na ~2 km, dopiero trzyetapowe udoskonalanie przełamuje barierę 500 m. Nowy zatwierdzony scenariuszscenarios/gps-denied-gravity-nav.toml. Wierszdocs/CAPABILITY.mdpozostaje uczciwie częściowy (nadal brak dołączonej mapy EGM2008), a jego dowody zaktualizowano do wyniku 60-min < 500 m. Uczciwy zakres bez zmian: pole harmonik sferycznych niskiego stopnia + syntetyczne mascony; Monte Carlo po realizacjach błędu reprezentacji mapy jest kolejnym krokiem. - Rejestr nadmiernych twierdzeń i zabezpieczenie przed regresją (
docs/CLAIMS-VS-REALITY.md,tests/no_overclaims.rs). Zamyka ścieżkę uczciwości/odstąpienia od twierdzeń: czternaście nadmiernych twierdzeń skatalogowanych we wcześniejszym audycie (OC-0…OC-13) jest teraz w całości GREEN — mocne twierdzenia (sprzężony filtr Kalmana zegara i położeniaOC-0,OC-2jamming J/S→C/N₀→utrata blokady, fizyka CAI Macha–ZehnderaOC-7, ARAIM HPL/VPLOC-8) są zastąpione dostarczonymi, przetestowanymi możliwościami, a nie złagodzonym sformułowaniem, a pozostałe wiersze są pozbawione twierdzeń, by odpowiadały kodowi. Nowy test CI skanuje aktualne powierzchnie publiczne (README,CAPABILITY,GLOSSARY,web/) i kończy się niepowodzeniem, jeśli jakiekolwiek wycofane, gołe sformułowanie nadmiernego twierdzenia pojawi się ponownie bez zastrzeżeń, więc wiersz GREEN nie może po cichu ulec regresji. Wskaźnik jakości „integralność” dla każdego przebiegu pozostaje uczciwie oznaczony jako samospójność filtra (a nie integralność lotnicza); prawdziwe ARAIM HPL/VPL jest przedstawiane osobno, aby nigdy nie były mylone. - Nawigacja z dopasowaniem map grawitacyjnych (alt-PNT bez GPS). Nowy
src/gravimeter.rsdodaje warstwę możliwości alt-PNT, której wymagają badania dopasowywania map grawitacyjnych Quantum Wayfarer / QT-CCI ESA NAVISP: model pomiaru grawimetru zimnych atomów, którego poziom szumu białego pochodzi z ASD akcelerometru CAI (σ = ASD/√τ); niskostopniowe, w pełni znormalizowane pole anomalii grawitacyjnych w harmonikach sferycznych (sprawdzone względem funkcji Legendre'a w postaci zamkniętejP̄₁₁=√3·cosφ,P̄₂₀=(√5/2)(3sin²φ−1),P̄₂₂=(√15/2)cos²φoraz ręcznie wyprowadzonej anomalii jednego członu 1,897 mGal) plus syntetyczne mascony dla lokalnych cech wysokiego stopnia; oraz filtr cząstek dopasowujący mapę grawitacyjną (składającymapmatch+particle_filter), który odtwarza ślad bez GPS z sekwencji anomalii, przez którą leci. Zatwierdzony benchmark NAVISP (scenarios/gravity-map-nav.toml) redukuje dryf swobodnej inercji ~73 km do kilku km. Uczciwy zakres: Kshana nie dołącza pełnego zestawu współczynników EGM2008 2190° — pole jest niskostopniowe + mascony, a nie prawdziwą mapą wysokiej rozdzielczości; loader EGM/EIGEN, mapa magnetyczna, SLAM wspomagany terenem i podłączeniekind=silnika scenariuszy z wykresem dryfu SVG pozostają kolejnymi krokami.docs/CAPABILITY.md„Gravity-map / alt-PNT navigation” → częściowo. - Modelowanie manewrów i przyczółek projektowania trajektorii. Nowy
src/maneuver.rsdodaje pierwszą warstwę projektowania trajektorii ponad SGP4: impulsowe węzły ΔV, które stosują nieciągłość prędkości i przenoszą dalej kowariancję 6×6 (deterministyczny manewr ⇒ tożsamościowe przejście stanu; kowariancja błędu wykonania obraca się z układu manewru — ECI lub LVLH — do bloku prędkości), całkowanie manewru o skończonym czasie (stały ciąg na łuku manewru z masą jako stanem), którego osiągnięte ΔV jest sprawdzane względem postaci zamkniętej równania rakietowego Ciołkowskiego z dokładnością lepszą niż 0,01 %, jednoobrotowy solver Lamberta wg Izzo-2015 (r1,r2, czas przelotu ⇒v1,v2), dokładny propagator Keplera w zmiennych uniwersalnych (prawda dwuciałowa) oraz przegląd porkchop, który odwzorowuje siatkę epoka startu × epoka przylotu na C3 odlotu i V∞ przylotu, emitowany jako tablica JSON 2-D do renderowania konturów w przeglądarce. Walidacja jest samodzielna i silniejsza niż odczyt z samouczka: każde wyjście Lamberta jest przepuszczane w obie strony przez propagator Keplera (musi wylądować z powrotem wr2), a minimum porkchop jest sprawdzane względem analitycznej dolnej granicy C3 transferu Hohmanna dla dwóch współpłaszczyznowych orbit kołowych. Kshana pozycjonuje to jako warstwę symulacji osiągów ponad GMAT/Orekit, a nie jako zamiennik (gałęzie wieloobrotowe i rzeczywista efemeryda planet pozostają poza zakresem). Dziesięć testów. - Pełny 17-stanowy ściśle sprzężony UKF GNSS/INS z nawigacją zliczeniową opartą na kwantowym CAI. Nowy
src/fusion/tightly_coupled17.rsniesie kompletny stan nawigacji inercjalnej, który estymuje filtr ściśle sprzężony —[position, velocity, attitude-error, accelerometer bias, gyro bias, clock bias, clock drift](17 stanów) — propagowany przez mechanizację strapdown napędzaną zmierzoną siłą właściwą i prędkością kątową, z rotacją ciało→inercjalny w przybliżeniu małych kątówC ≈ I + [ψ×], tak aby błąd orientacji sprzęgał się z przyspieszeniem poziomym (standardowe sprzężenie przechyłu INS). Podczas przerwy GNSS filtr dryfuje wyłącznie na IMU; szum procesu losowego błądzenia prędkości to wyprowadzoneq_vaakcelerometru interferometru zimnych atomów (crate::inertial::quantum_imu), więc dryf nawigacji zliczeniowej jest ograniczony przez czujnik kwantowy — 120-sekundowa przerwa pozostaje ograniczona do kilkuset metrów wobec kilometrów, do których doszłoby swobodne INS klasy nawigacyjnej. Aktualizacja pseudoodległości/prędkości zmian odległości przechodzi przez wspólny filtr bezśladowy (z α = 1 dla dobrze uwarunkowanych wag przy tym rozmiarze stanu). Pięć testów: tożsamość modelu pomiaru, całkowanie ze stałą prędkością przy doskonałym IMU, wspomaganie GNSS, estymacja biasu akcelerometru oraz benchmark 120-s przerwy ograniczonej przez CAI.
0.11.0 - 2026-06-05#
Zmienione#
- Uczciwe ujęcie pozycjonowania kwantowego. Nagłówkowy deskryptor to teraz „symulator odporności PNT z modelami osiągów czujników kwantowych” konsekwentnie w haśle README, linii cytowania,
CITATION.cff(tytuł + streszczenie) i grafice banera — zastępując luźniejsze marketingowe sformułowanie „hybrydowy kwantowo-klasyczny symulator PNT”. Sekcja README Czym jest / czym nie jest zyskuje jawne stwierdzenie zakresu „Nie jest (jeszcze)” (nie jest silnikiem fizyki interferometrii atomowej od podstaw, nie jest odbiornikiem GNSS / solverem PVT, nie jest narzędziem do projektowania misji), a nowyROADMAP.mdnajwyższego poziomu czyni warstwę fizyki kwantowej pozycją P2 (faza CAI Macha–Zehndera, szum rzutu, tensor wibracji), aby czytelnicy wiedzieli, że fizyka od podstaw jest w zakresie i nadchodzi, a nie została porzucona. Bez zmian w zachowaniu ani w API.
Dodano#
- Badanie kompromisów projektu konstelacji: przegląd projektów Walkera z frontem Pareto, JSON czasu rewizyty oraz walidacja wzoru Walkera z dokładnością poniżej kilometra.
src/walker.rszyskujewalker_design_sweep, który uruchamia siatkęplanes × sats_per_plane(np. kompromis 3×3) przy stałym nachyleniu i dla każdego projektu zestawia ułamek pokrycia, najgorszy PDOP oraz maksymalną/średnią przerwę rewizyty;pareto_frontoznacza projekty niezdominowane (mniej satelitów, większe pokrycie, niższy PDOP, krótsza rewizyta), aWalkerDesignReport::to_jsonserializuje komórki i front Pareto — wraz z polami czasu rewizyty — jako JSON. Nowa walidacja przypina generator do wzoru Walkerai:T/P/F: wykazano, że satelity w tych samych slotach w sąsiednich płaszczyznach odwzorowują się na siebie dokładną rotacjąR_z(2π/P)z dokładnością poniżej 1 km w ciągu pełnych 24 h propagacji SGP4 (oddychanie krótkookresowe J2 jest wspólne i znosi się), a sloty w płaszczyźnie są potwierdzone jako rozmieszczone co2π/Sw średniej. Opiera się na zatwierdzonej rzeczywistej migawce Celestrakgps-opsz 2021-07-28 (scenarios/orbit-sgp4-gps.toml, wykorzystywanej przez testy pokrycia scenariuszy i obiegu SP3). - Zaawansowany transfer czasu i częstotliwości: TWSTFT, wspólny widok GNSS, PPP, optyczny, dopasowanie potęgowe PSD wg IEEE-1139 i zespół zegarów. Nowy
src/timetransfer_adv.rsbuduje operacyjne metody transferu na dostarczonych postaciach zamkniętych Sagnaca/wspólnego widoku oraz narzędziach stabilności Allana.twstft_sagnacpodaje poprawkę Sagnaca dla dwukierunkowego transferu czasu i częstotliwości przez satelitę (Two-Way Satellite Time and Frequency Transfer) jako sumę pętli o trzech skokach, równą dokładnie postaci zamkniętej BIPMΔt = 2·A·ω_E/c²(sprawdzonej krzyżowo przez niezależnetwstft_sagnac_bipm);run_twstftemituje jednodobowy szeregT_A − T_Bi jego TDEV.gnss_common_view_serieswykonuje pojedyncze różnicowanie dwóch syntetycznych stacji naziemnych, tak że zegar satelity się znosi.iono_free_combination+ppp_receiver_clockto kombinacja wolna od jonosfery dla PPP i rozwiązanie zegara odbiornika względem prawdy klasy SP3 (syntetycznej), dokładnie znosząca jonosferę pierwszego rzędu.rytov_variance,fried_parameterilognormal_fadingo jednostkowej średniej modelują wywołaną turbulencją scyntylację łącza optycznego w wolnej przestrzeni.fit_power_law_psdto pełne pięciowspółczynnikowe dopasowanie najmniejszych kwadratówh_αwg IEEE-1139 do krzywej wariancji Allana (wszystkie pięć kanonicznych procesów szumu naraz) z dominującym procesem podawanym dla każdej dekady τ.ensemble_timescaletworzy ważoną odwrotnością wariancji papierową skalę czasu, której odchylenie Allana spada ściśle poniżej najlepszego zegara składowego. 31 testów jednostkowych; celami walidacji są postacie zamknięte i prawda syntetyczna — rzeczywisty import BIPM Circular-T / IGS SP3 pozostaje do zrobienia. - Mapy jonosfery IONEX: parser plików, interpolacja w czasie i mapowanie nachylenia ukośnego.
src/ionex.rszyskujeparse_ionex, który odczytuje format plików IONEX (definicja siatki w nagłówku + blokiSTART/END OF TEC MAP) do sekwencjiIonexMap— normalizując kolejność szerokości od północy do południa doTecGridz dodatnim krokiem i skalując wartości przez10^EXPONENT.interpolate_tec_in_timełączy dwie kolejne mapy do epoki zapytania, aobliquity_factor/slant_tecodwzorowują pionowe TEC na promień ukośny przez współczynnik cienkiej powłoki jednowarstwowejM(z) = 1/cos z′(sin z′ = (Rₑ/(Rₑ+H))·sin z). Razem z dostarczonym modelem siatki zamieniają one zmierzoną globalną mapę jonosfery IGS w użyteczne opóźnienie ukośne. - Projekt konstelacji: wymiarowanie ulic pokrycia (streets-of-coverage) i porównanie wielu konstelacji.
src/walker.rszyskujemin_satellites_streets_of_coverage, wyidealizowany solver minimalnej liczby satelitów metodą ulic pokrycia — z dostarczonego półkąta pokryciaλi półszerokości ulicycwymiaruje prawie biegunową konstelację dla ciągłego pojedynczego pokrycia globalnego jakop = ⌈π/(2c)⌉płaszczyzn (np. 4-satelitowa płaszczyzna na wysokości GPS wymaga 2 płaszczyzn, 8 satelitów) i zgłaszaNone, gdy satelity są zbyt rzadkie, by utworzyć ciągłą ulicę.compare_constellationsto narzędzie porównania wielu konstelacji: ocenia każdy nazwany projekt Walkera na tej samej stacji/oknie przezpdop_sweepi zwraca ich pokrycie / PDOP / rozmiar obok siebie. Uczciwy zakres: korekcja Ridera dokładna na szwie na granicy płaszczyzn przeciwbieżnych oraz glob pokrycia 3-D są kolejnymi krokami. - Wielowarstwowa detekcja spoofingu: detektor parzystości zgodności RAIM + fuzja warstw.
src/spoof_monitors.rszyskuje trzecią i ostatnią warstwę detekcji oraz etap fuzji:parity_raim_testdopasowuje metodą najmniejszych kwadratów rozwiązanie położenia/zegara do nadmiarowego zestawu pseudoodległości i testuje pozostałą ważoną sumę kwadratów reszt względem jej progu χ²(m−4)— oznaczając obciążony podzbiór satelitów, a jednocześnie poprawnie pozostawiając obciążenie wspólne (pochłaniane przez zegar odbiornika) niewidocznym dla RAIM, a nie zamaskowanym.fuse_spoof_layersłączy warstwy parzystości, AGC i SQM w jedną ważoną decyzję, która zapisuje, które warstwy zadziałały. Monte Carlo charakteryzuje detektor: empiryczne P_fa ≈ 0,068 względem punktu projektowego 0,05, z niewykrytymi zdarzeniami spadającymi z 0,885 przy obciążeniu spoofingu 2σ do 0,16 przy 8σ. Uczciwy zakres: walidacja krzyżowa względem konkretnych opublikowanych wektorów testowych spoofingu (Spirent / ION GNSS+) wymaga tych zewnętrznych zbiorów danych i pozostaje kolejnym krokiem. - Zespół walidacyjny filtru Kalmana: sprzężony wobec rozprzężonego. 100-próbowe Monte Carlo w
src/fusion/coupled.rsokreśla ilościowo wartość utrzymywania kowariancji krzyżowej położenie↔zegar: wierny, wbudowany rozprzężony punkt odniesienia (sprawdzony co do bitu względem dostarczonegoCoupledPntFilter) przetwarza te same dane z wyzerowanymi blokami krzyżowymi, a po niemal zdegenerowanych pseudoodległościach i poprawce wyłącznie zegara filtr sprzężony odtwarza położenie z 2,97 m RMS wobec 48,8 m filtru rozprzężonego, wygrywając w 97 z 100 prób — poprawka zegara wyostrza położenie tylko przez korelację, którą rozprzężony pakiet odrzuca. To dopełnia zestaw walidacji poprawności Kalmana (postać Josepha, bezpieczeństwo PSD, spójność NEES/NIS, a teraz zespół filtra sprzężonego). - Potok wyznaczania orbity (wsadowy + sekwencyjny). Nowy
src/orbit_determination.rsodtwarza stan orbitalny satelity[r, v]ze śledzenia odległości ze stacji naziemnej, składając trzy dostarczone elementy: model sił dwuciałowy + J2 (src/forces.rs) i integrator RK4 (src/integrator.rs) propagują stan kandydujący przez łuk, model pomiaru odległości przewiduje odległość do każdej stacji, a wsadowy korektor Gaussa–Newtona (src/batch_ls.rs) sprowadza kandydata do stanu najlepszego dopasowania (determine_orbit_batch). Ta sama dynamika i model odległości napędzają też sekwencyjne rekurencyjne wyznaczanie na dostarczonym filtrze bezśladowym (determine_orbit_sequential). Cztery testy je walidują: przewidywanie odległości na łuku; odzyskanie wsadowe poniżej metra / mm·s⁻¹ z bezszumowych odległości; odzyskanie wsadowe do ~2 m z resztą po dopasowaniu na poziomie szumu 5 m (sygnatura spójnego dopasowania najmniejszych kwadratów); oraz odzyskanie sekwencyjne w granicach dziesiątek metrów. Uczciwy zakres: pomiary prędkości zmian odległości/Dopplera i kątów, analityczna macierz przejścia stanu J2 oraz maskowanie widoczności stacji są kolejnymi krokami. - Ściśle sprzężony nawigator UKF GNSS/INS. Nowy
src/fusion/tightly_coupled.rspodłącza dostarczony rdzeń bezśladowego filtru Kalmana (src/fusion/ukf.rs) do działającego ściśle sprzężonego nawigatora na ośmiostanowym[px,py,pz,vx,vy,vz,b,d](położenie/prędkość ECEF oraz bias i dryf zegara odbiornika w jednostkach odległości). Przyjmuje surowe pomiary satelitarne —pseudorange(ρ = |p − sᵢ| + b) orazrange_rate/Doppler (ρ̇ = (p − sᵢ)·(v − ṡᵢ)/|p − sᵢ| + d) — zamiast wstępnie sformowanej poprawki położenia, więcTightlyCoupled(zpropagate/propagate_orbital/update_gnss) nadal koryguje przy mniej niż czterech satelitach i dryfuje przez przerwy GNSS na swojej propagowanej dynamice. Pięć testów waliduje go od końca do końca, w tym scenariusze akceptacyjne kamienia milowego: geometrię pseudoodległości/Dopplera względem wartości ręcznych; bezszumową zbieżność do poniżej metra przy pięciu satelitach; przypadek trzech satelitów zbiegający z ~212 m do ~13 m, gdzie migawkowego PVT nie da się nawet sformować; 120-sekundową przerwę przy stałej prędkości w granicach 50 m; oraz — główny test akceptacyjny — 30-minutowy przelot po zakrzywionej orbicie LEO (rzeczywista orbita dwuciałowa + J2) z 120-sekundową przerwą GNSS, utrzymany na 0,77 m RMS przelotu i 2,9 m w najgorszym przypadku podczas przerwy. Ten orbitalny dryf składa dostarczony model sił grawitacji (src/forces.rs) i integrator RK4 (src/integrator.rs) w model procesu UKF (propagate_orbital), więc filtr podąża za krzywizną orbity — czego nie potrafi dryf przy stałej prędkości (sama krzywizna to ~58 km na 120 s na LEO). Uczciwy zakres: dryf orbitalny używa modelu sił dwuciałowego + J2, a nie surowej siły właściwej z IMU (dla niezasilanej platformy orbitalnej są one tożsame); dołączenie stanu błędów IMU strapdown i korekcji jono/tropo w pętli pozostaje kolejnym krokiem. - Model pomiaru z dopasowaniem map (nawigacja odniesiona do terenu / grawitacji). Nowy
src/mapmatch.rsdostarcza model pomiaru, który zamienia dostarczony filtr cząstek z sekwencyjną ważoną próbkowaną ponownie ważnością (src/particle_filter.rs) w działający nawigator bez GPS:field_likelihood(gaussowska wiarygodność dopasowania pola) imap_match_likelihood, które próbkuje dowolne georeferencyjne pole odniesienia — wysokość terenu (TRN) lub anomalię grawitacyjną — w położeniu cząstki i waży ją zgodnością ze zmierzoną wartością pojazdu. Polem jest dowolny próbnikFn(lat, lon) -> value, więc składa się z siatką dwuliniową wsrc/ionex.rslub domknięciem. Dwa testy go kotwiczą — wiarygodność ma szczyt (=1) przy idealnym dopasowaniu i spada doe^(−½)przy jednym sigma, a filtr cząstek nad wyrazistym syntetycznym fragmentem terenu odzyskuje prawdziwe położenie w granicach 0,1. Uczciwy zakres: rzeczywiste mapy referencyjne (wysokość SRTM, anomalia grawitacyjna EGM/EIGEN) i ich loadery są kolejnymi krokami. - Integralność PNT cislunarnego (księżycowe ARAIM). Nowy
src/lunar.rsstosuje ziemski silnik ARAIM MHSS do usługi nawigacji księżycowej w stylu LunaNet z parametrami księżycowymi (σ_URE ≈ 30 mwobec 0,6 m dla GPS,P_sat ≈ 1e-4): stałe księżycowe, selenocentryczna baza Wschód/Północ/Góra i pomocnik geometrii nieba orazlunar_araim(HPL/VPL). Trzy testy go kotwiczą — ortonormalną bazę selenocentryczną, geometrię odległości ukośnej oraz dokładne liniowe skalowanie poziomu ochrony zσ_URE(księżycowe 30 m daje 50× większy poziom ochrony niż ta sama geometria przy 0,6 m GPS — ilościowy powód, dla którego integralność PNT na Księżycu jest trudna). Uczciwy zakres: precyzyjna efemeryda NRHO LANS, budżet błędów sygnału w przestrzeni i redukcja układów MCI↔MCMF są kolejnymi krokami. - Dwuczęściowe (wysokiej precyzji) daty juliańskie. Nowy
src/jd2.rsdodajeJd2, datę juliańską podzieloną na całkowitądayi ułamkowąfracw[0,1)(konwencja SOFA/hifitime), znew/from_parts/add_seconds/diff_seconds/total. Różnice pobliskich epok pozostają dokładne do dnaf64, gdzie pojedyncza JD wf64traci ~50 µs w pobliżu J2000. Cztery testy go kotwiczą: obieg w obie strony, normalizację ułamka, dokładne odzyskanie mikrosekundy (z pokazaną obok awarią pojedynczejf64) oraz addytywną i odwracalną arytmetykę sekund. - Zapisywacz CCSDS OMM (Orbit Mean-Elements Message). Nowy
src/omm.rsuzupełnia zapisywacz efemerydoemo komunikat średnich elementów:OmmFile::from_tleodwzorowuje średnie elementy SGP4/TLE na jednostki OMM (ruch średni w obr./dobę, kąty w stopniach orazBSTAR), ato_omm_kvnserializuje formę KVN CCSDS 502.0-B-2 z toru standaryzacji — dzięki czemu orbitę Kshana może przetworzyć każde narzędzie rozumiejące OMM, zamiast własnego TLE. Dwa testy kotwiczą konwersję jednostek TLE→OMM (≈ 15,5 obr./dobę, nachylenie 51,6° itd.) oraz obecność wymaganych słów kluczowych KVN. Uczciwy zakres: forma KVN i odwzorowanie TLE są dostarczone tutaj; renderowanie XML (ndm/omm) i obieg w obie strony z parserem referencyjnym są kolejnymi krokami. - Filtr cząstek z sekwencyjnym ważonym próbkowaniem ponownym. Nowy
src/particle_filter.rsdodaje nieliniowy, niegaussowski estymator stojący za nawigacją wspomaganą mapą, bez GPS (dopasowanie map terenu lub grawitacji):predict(propagacja cząstek przez dynamikę + gaussowski szum procesu),update(przeważenie wiarygodnością pomiaru dla każdej cząstki), systematyczneresample, monitor degeneracjieffective_sample_sizei estymata średniej ważonej. Sześć testów dokładnie kotwiczy deterministyczny rdzeń — ESS obejmujące 1…N, systematyczne próbkowanie ponowne wybierające indeksy proporcjonalnie do wagi, wypukłą kombinację średniej ważonej, gaussowską wiarygodność przyciągającą estymatę do pomiaru, zachowanie próbkowania ponownego do rozkładu jednostajnego oraz determinizm predict z ziarnem. Uczciwy zakres: silnik jest dostarczony tutaj; mapy referencyjne (wysokość SRTM, anomalia grawitacyjna EGM) i model pomiaru mapy są kolejnymi krokami (próbnik siatki z interpolacją dwuliniowąionexobsłużyłby równie dobrze mapę grawitacji/terenu). - Mapy jonosfery TEC w stylu IONEX. Nowy
src/ionex.rsdodaje zmierzoną jonosferę jako alternatywę dla nadawanego modelu Klobuchara:TecGrid(regularna siatka szerokość/długość pionowego TEC, globalna mapa jonosfery IGS) z interpolacją dwuliniową w punkcie przebicia (vtec_at, ograniczoną poza siatką) oraz opóźnieniem pierwszego rzęduΔ = 40.3·TEC/f²(vtec_to_delay_m,delay_at). Cztery testy go kotwiczą:1 TECU ≈ 0.162 mna L1 ze skalowaniem1/f², interpolację dokładną w węzłach, środki dwuliniowe uśredniające narożniki oraz zapytania spoza siatki ograniczone do krawędzi. Uczciwy zakres: siatka i interpolacja są dostarczone tutaj; parsowanie formatu plików IONEX, interpolacja w czasie między mapami i funkcja mapowania ukośnego są kolejnymi krokami. - Geometryczne poprawki transferu czasu (Sagnac + wspólny widok GNSS). Nowy
src/timegeo.rsdodaje dwa efekty deterministyczne, które musi uwzględniać rzeczywiste porównanie zegarów, uzupełniając stochastyczny model dwukierunkowy wtimetransfer:sagnac_correction(Δt = (ω_E/c²)·(x₁y₂ − x₂y₁), opóźnienie wirującej Ziemi — dziesiątki ns dla linii bazowych kontynentalnych) orazcommon_view_offset, pojedynczą różnicę wspólnego widoku GNSS, która dokładnie znosi błąd zegara satelity i odtwarza przesunięcie między stacjami. Trzy testy kotwiczą je na dokładnych wzorcach: ≈ 33 ns efektu Sagnaca dla równikowego ćwierćobrotu, antysymetrię i zerowe przypadki radialny/biegunowy oraz dokładne zniesienie zegara satelity. Uczciwy zakres: pełny budżet opóźnień transpondera/sprzętu TWSTFT oraz rozwiązanie transferu czasu PPP wolne od jonosfery są kolejnymi krokami. - Model sił orbitalnych (dwuciałowy + J2). Nowy
src/forces.rsdodaje model przyspieszeń, który całkuje propagator numeryczny:two_body_accel(−μ·r/|r|³), perturbację spłaszczeniaj2_accel(postać zamknięta ECI) orazgravity_accelje sumujące — w parze zsrc/integrator.rsjakof(t,[r;v]) = [v; a(r)]. Udostępnia też analityczne tempa wieku J2 (j2_secular_rates): regresję węzłaΩ̇, obrót apsydω̇i dryf anomalii średniejṀ. Sześć testów kotwiczy fizykę na dokładnych wzorcach:μ/r²dla członu dwuciałowego, postać zamkniętą J2 na równiku (~10⁻³ wielkości dwuciałowej), nachylenie krytyczne (63,4349°), które zamraża perygeum (ω̇ = 0), regresję węzła ISS (Ω̇ ≈ −5°/day) oraz dryf na wschód orbity wstecznej heliosynchronicznej. Uczciwy zakres: wyłącznie dwuciałowy + J2; J3–J6, opór, SRP i ciało trzecie są kolejnymi krokami. - Odnośniki do scenariuszy do udostępniania. Nowy
src/permalink.rsdodaje niezależny od zależności kodek Base64 wg RFC 4648 (standardowy alfabet+/z dopełnieniem oraz bezpieczny dla URL alfabet-_bez dopełnienia) i opakowaniaencode_scenario/decode_scenario, dzięki czemu TOML z playground można zakodować w parametrze zapytania?s=i udostępnić jako URL. Udostępniony przeglądarce jako wiązania wasmencode_permalink/decode_permalink. Cztery testy go kotwiczą na kanonicznych wektorach RFC 4648 ("foobar"→"Zm9vYmFy"itd.), obieg w obie strony scenariusza bezpiecznego dla URL (bez+///=do uciekania), odrzucanie nieprawidłowych symboli oraz obieg w obie strony wszystkich 256 bajtów. Uczciwy zakres: kodek i wiązania są dostarczone tutaj; interfejs przycisku Share w playground, wielosegmentowy wykres Plotly/D3 i tryb porównania A/B są kolejnymi krokami. - Wsadowa metoda najmniejszych kwadratów Gaussa–Newtona (wsadowy korektor różniczkowy). Nowy
src/batch_ls.rsdodaje rdzeń estymacji, na którym opiera się wsadowe wyznaczanie orbity (lub dowolne dopasowanie parametrów):gauss_newtonlinearyzuje dostarczony przez użytkownika modelh(x)za pomocą jakobianu z centralnej różnicy skończonej, tworzy i rozwiązuje ważone równania normalne(HᵀWH)·Δx = HᵀW·(z − h(x))(z ponownym użyciem przetestowanej macierzy odwrotnej) i iteruje do zbieżności z wagami dla każdego pomiaru. Cztery testy go kotwiczą: liniowe dopasowanie prostej osiągające dokładne rozwiązanie ważonych najmniejszych kwadratów, nieliniowe dopasowaniea·exp(b·t)odzyskujące prawdziwe parametry, trójwymiarową multilaterację odległości 3-D, która odzyskuje znane położenie z wolnych od szumu odległości (odmiana wyznaczania orbity), oraz odrzucanie wejść niedookreślonych/niezgodnych. Uczciwy zakres: to ogólny silnik korektora; model pomiaru odległości/prędkości zmian odległości/azymutu-elewacji specyficzny dla orbity, analityczna macierz przejścia stanu J2 i walidacja na opublikowanym przypadku są kolejnymi krokami. - Monitory spoofingu w warstwie RF (moc AGC i SQM). Nowy
src/spoof_monitors.rsdodaje dwa niezależne detektory spoofingu w przednim torze odbiornika, które uzupełniają wspomagany zegarem monitor spoofingu czasu wspoof: monitor mocy AGC (combine_power_dbmniekoherentna suma mocy +AgcMonitor), który oznacza nadmiar odbieranej mocy dodawany przez nadajnik spoofingu ponad konfigurowalny margines w dB, oraz monitor jakości sygnału (bpsk_autocorrtrójkątna autokorelacja kodu +SqmMonitor), który oznacza niezrównoważenie korelatora Early-minus-Late wprowadzane przez wielodrogowość/meaconing/replay. Cztery testy kotwiczą dokładne postacie zamknięte (3,01 dB dla podwojenia mocy, agregat10·log10(N), trójkątneR(τ)=1−|τ|i próg alarmowy Early/Late 10 %). Uczciwy zakres: pełny detektor spoofingu parzystości zgodności RAIM, wielowarstwowa fuzja wyjść monitorów i walidacja względem opublikowanych wektorów spoofingu Spirent/ION GNSS+ są kolejnymi krokami. - Adaptacyjny numeryczny integrator równań różniczkowych zwyczajnych. Nowy
src/integrator.rsdodaje pierwszy element propagatora numerycznego (propagacja orbity w Kshana jest poza tym analityczna wg SGP4/SDP4): ogólny krok Rungego–Kutty czwartego rzędu (rk4_step) dla dowolnego układu pierwszego rzęduy' = f(t, y)oraz sterownik adaptacyjny (integrate), który kontroluje błąd lokalny przez podwajanie kroku (ekstrapolacja Richardsona) ze standardowym sterownikiem kroku0.9·(tol/err)^(1/5)i logiką akceptacji/odrzucenia. Sześć testów go kotwiczy na dokładnych rozwiązaniach: wykładniczey' = y → edo< 1e-9, ~16-krotne zmniejszenie błędu przy każdym połowieniu kroku, co dowodzi zbieżności czwartego rzędu, zachowanie energii/powrotu oscylatora harmonicznego przez pełny okres oraz sterownik adaptacyjny spełniający ścisłą tolerancję ze zmiennymi krokami. Uczciwy zakres: to rdzeń integratora i jego kontrola błędu; zagnieżdżone tablice Dormanda–Prince'a RK5(4)/RKF7(8) i hierarchiczny model sił orbity (dwuciałowy + J2–J6 + opór + SRP + ciało trzecie), które czynią z niegoNumericalPropagator, są kolejnymi krokami. - Bezśladowy (sigma-point) filtr Kalmana. Nowy
src/fusion/ukf.rsdodaje skalowany bezśladowy filtr Kalmana (Julier i Uhlmann; Wan i van der Merwe) jako ogólny estymatorn-stanowy nad dostarczonymi przez użytkownika funkcjami procesu i pomiaru — estymator punktów sigma, którego używa ściśle sprzężony nawigator GNSS/INS, gdy model pseudoodległości/Dopplera jest silnie nieliniowy, a jakobian EKF się pogarsza. Zawiera towarzyszącą gęstą algebrę liniową (czynnik Choleskiego dla rozrzutu punktów sigma, odwrotność Gaussa–Jordana dla kowariancji innowacji) oraz aktualizacjęP⁺ = P⁻ − K S Kᵀbez formy Josepha. Sześć testów go przypina, kluczowe z nich wykorzystują dokładną własność, że dla modelu liniowego transformacja bezśladowa odtwarza filtr Kalmana z precyzją numeryczną (predykcja, aktualizacja i pełny cykl predykcja+aktualizacja dopasowane do ręcznie uruchomionego liniowego KF, plus analityczna kontrola 1-D posterioru bayesowskiego i tożsamości Choleskiego/odwrotności). Uczciwy zakres: to silnik estymatora; 17-stanowy ściśle sprzężony nawigator GNSS/INS, model pomiaru pseudoodległości/Dopplera i scenariusz walidacji przerwy pozostają kolejnymi krokami. - Poziomy ochrony ARAIM dla dwóch konstelacji. Nowy
araim_dual_raimrozszerza ARAIM (Advanced RAIM) pojedynczego błędu (araim_raim) o tryb błędu całej konstelacji z EU ARAIM / DO-316: obok hipotez bez błędu i błędu pojedynczego satelity każda konstelacja (oznaczona dla każdego satelity) wnosi jedną hipotezę usuwającą naraz wszystkie jej satelity, z prawdopodobieństwem a prioriP_const(noweDualFaultPriors { p_sat, p_const }). Każda hipoteza dodaje człon do tej samej sumy integralności MHSS, więc VPL/HPL to najmniejsze granice, których całkowiteP_HMIspełnia budżet dla błędów: brak błędu + pojedynczy SV + na konstelację (podział fałszywych alarmów Bonferroniego obejmuje wszystkieN + Chipotezy). PrzyP_const = 0wynik jest identyczny co do bitu zaraim_raim; użytkownik jednokonstelacyjny zwracaNonewzględem błędu własnej konstelacji (nie można jej wykluczyć) — i właśnie dlatego pokrycie dwukonstelacyjne ma znaczenie. Cztery testy obejmują równoważność, poszerzenie poziomu ochrony, niedostępność w przypadku jednej konstelacji i walidację wejścia, z ponownym użyciem istniejącej maszynerii podrozwiązań separacji rozwiązań. - Precesja IAU 2006 (kąty Fukushimy–Williamsa i macierz bias-precesja). Nowy
src/precession.rsimplementuje precesję IAU 2006 (P03; Capitaine, Wallace i Chapront 2003): cztery kąty Fukushimy–Williamsa(γ̄, φ̄, ψ̄, ε̄_A)jako wielomiany w stuleciach juliańskich TT (fw_angles) oraz macierz rotacji bias-precesja GCRS→średni układ na datę zbudowaną z nich metodą SOFAiauFw2m(precession_matrix, z pomocnikamigcrs_to_mod/mod_to_gcrs). To pierwszy element układu inercjalnego na bazie istniejącej redukcjiframesopartej na GMST. Osiem testów waliduje względem kotwic w postaci zamkniętej — średniego nachylenia ekliptyki J2000ε̄ = 84381.406″ = 23.4392794°, opublikowanych stałych członów kątów, akumulacji precesji ogólnejψ̄ ≈ 5039.998″w ciągu stulecia, ortonormalności macierzy idet = +1, wartości prawie tożsamościowej (wyłącznie bias układu) w J2000 oraz kąta rotacji netto≈ 1.40°/stulecie. Uczciwy zakres (ROADMAP.md): wyłącznie precesja — 678-członowa nutacja IAU 2000A, pełny łańcuch TEME→GCRS i numeryczna kontrola krzyżowa SOFA/ANISE µas/<10 m są kolejnymi krokami. - Fizyka akcelerometru interferometru zimnych atomów (CAI) od podstaw.
src/inertial/quantum_imu.rsmodeluje trzyimpulsowy interferometr atomowy Macha–Zehndera od podstaw, a nie z arkusza danych: efektywny wektor falowyk_eff = 4π/λ, fazę interferometruΦ = k_eff·a·T², kwantowy szum rzutowania (śrutowy)σ_Φ = 1/(C·√N), czułość na przyspieszenie dla pojedynczego strzału, zanik kontrastuC(t) = C₀·e^(−t/τ)i — co najważniejsze —CaiAccelerometer::q_va(), które wyprowadza białe PSD przyspieszenia, które klasyczneAccelModeljuż zużywa, z liczby atomów, czasu interrogacji i kontrastu. Model obejmuje teraz także sprzężenie drgań — dominujący człon w rzeczywistym urządzeniu: funkcję przejścia interferometru przyspieszenie→faza|H(ω)| = (4/ω²)sin²(ωT/2)(accel_transfer_function), wariancję fazy dla białego PSDσ_Φ² = k_eff²·S_a·T³/3(vibration_phase_variance_white, z numeryczną kontrolą krzyżową całki pasmowejvibration_phase_variance_band), rzut wzdłuż wiązki rzędu 1beam_axis_projectionorazCaiAccelerometer::vibration_phase_noise/vibration_limited_accel(to ostatnie redukujące się do poziomu√(S_a/(3T))niezależnego odk_eff). Jedenaście testów ręcznie weryfikuje fizykę (Rb-87k_eff ≈ 1.61×10⁷,Φ(1 g) ≈ 1.58×10⁴ rad,σ_a ≈ 0.13 µg/strzał poziom szumu śrutowego wobec ≈ 5,9 µg poziomu drgań, prawa skalowania1/T²,1/√NiT³). Uczciwy zakres wdocs/QUANTUM.md: obejmuje to poziom szumu rzutowania i reżim ograniczony drganiami powyżej niego; szum fazy lasera, systematyki Coriolisa i przesunięcia świetlnego oraz scenariusze walidacyjne PHARAO/CARIOQA pozostają kolejnymi krokami. - Akcelerometr kwantowy CAI podłączony do scenariusza inercjalnego. Akcelerometr w scenariuszu nawigacji zliczeniowej inercjalnej rozstrzyga się teraz do nowego
ImuKind—Classical(istniejący czujnik ze współczynnikami z arkusza danych) lubQuantumCai, gdy niesie opcjonalny blok[cai](CaiCfg: długość fali, odstęp impulsów, liczba atomów, kontrast, czas cyklu i opcjonalnevibration_psdplatformy). Czujnikquantum_caima PSD losowego błądzenia prędkościq_vawyprowadzone z fizyki interferometru — poziom szumu śrutowego plus, gdy podano PSD drgań, składnik ograniczony drganiami w kwadraturze — zamiast dostarczonego współczynnika, a proweniencja przebiegu zapisuje, że szum pochodzi z fizyki. Polecaitoskip_serializing_if = "Option::is_none", więc istniejące scenariusze je pomijają i serializują się identycznie co do bajtu (hash scenariusza bez zmian). Pięć testów obejmuje wyprowadzenie, sumę drgań w kwadraturze, wybórClassical/QuantumCai, serializację stabilną względem hasha i przebieg od końca do końca napędzany przez CAI. - Optymalizator projektu konstelacji i geometria ulic pokrycia (streets-of-coverage).
src/walker.rszyskujeoptimize_walker_design, bezgradientowy optymalizator siatkowy, który przeszukuje przestrzeń projektów{planes × sats × inclination}i zwraca najlepszy projekt Walkera dla wybranegoDesignObjective—MinSatellitesForCoverage,MaxCoveragelubMinWorstPdop— na już sprawdzonym przeglądzie PDOP (test potwierdza, że zwraca zwycięzcę z przeszukania wyczerpującego). Dodatkowo analityczne postacie zamknięte ulic pokryciacoverage_half_angle_rad(λ = arccos(Re/r·cos ε) − ε) istreet_half_width_rad(cos c = cos λ / cos(π/s), Rider/Beste), ręcznie zweryfikowane względem podręcznikowej geometrii i wykrywające lukę niedoludnienia. Pełny solver minimalnej liczby satelitów dla pokrycia globalnego wg Ridera, glob playground 3-D i zewnętrzna kontrola krzyżowa DOP pozostają kolejnymi krokami. - Eksport precyzyjnych efemeryd SP3 z CLI. Propagowany scenariusz orbity/konstelacji można teraz zapisać do pliku SP3-c:
kshana <orbit.toml> --export-sp3 out.sp3, alboexport_sp3 = truew scenariuszu automatycznie zapisuje<scenario>.sp3(api::export_sp3/auto_export_sp3,OrbitClockScenario::to_sp3_string, opcjonalneepoch). Test obiegu w obie strony (tests/sp3_export_roundtrip.rs) propaguje rzeczywistą migawkę Celestrakgps-ops, eksportuje ją, ponownie parsuje i potwierdza, że odzyskane położenia ECEF zgadzają się z prawdą SGP4 w ciągu 24 h do < 0,5 m (dobrze w granicach tolerancji klasy TLE 10 m). README dokumentuje rolę interoperacyjności (RINEX → RTKLIB/gLAB, SP3 → Ginan/precyzyjne produkty orbit). - Sprzężony filtr Kalmana zegara i położenia (kowariancja krzyżowa między blokami).
src/fusion/coupled.rsCoupledPntFilterto pojedynczy skumulowany filtr[pos, vel, phase, freq](aktualizacje w formie Josepha), którego pomiar pseudoodległościρ = g·pos + c·phase + noisenaprawdę sprzęga bloki położenia i zegara — w przeciwieństwie do dawnego pakietu fuzji z dwoma niezależnymi filtrami dwustanowymi, które utrzymują kowariancję między blokami dokładnie zerową. Sprawdzone: wspólna pseudoodległość czyniP[pos,phase]niezerowym; dwie odrębne geometrie łącznie rozwiązują wstrzyknięte przesunięcia położenia i zegara, których pojedyncza odległość nie rozdzieli; poprawka wyłącznie zegara wyostrza położenie przez kowariancję krzyżową (korzyść, której filtry rozprzężone nie dają); a NEES z Monte Carlo jest spójne z χ²(4). To realizacja 1-DOF (wymiarowość pakietu fuzji); rozszerzenie 3-D z 8 stanami i podłączenie do uruchamialnego pakietu są śledzone jako kolejne kroki. - Monitorowanie zdrowia spójności filtra Kalmana (NIS/NEES). Aktualizacja kowariancji dwustanowego filtra zegara jest teraz w stabilizowanej formie Josepha `P⁺ = (I−KH)P(I−KH)ᵀ
- KRKᵀ
, which stays positive-semidefinite under extreme Q/R ratios (Cholesky-checked in CI atR=1e-26 / Q≈1e-30). A newsrc/filter_health.rsruns a Monte-Carlo consistency assessment (Bar-Shalom §5.4): pooled **NIS** (normalised innovation², target 1) and **NEES** (normalised estimation error², target 2) against 95% χ² bands, surfaced as afilter_health { nis_mean, nis_chi2_lower_95, nis_chi2_upper_95, nees_mean, nees_chi2_lower_95, nees_chi2_upper_95, consistent }block in the clock result JSON and as a green/amber card in the playground. A Q/R-mismatch sweep test proves the monitor flips to inconsistent when the process noise is mistuned by ×0.1–×10. Adds a general χ² quantile (detection::chi2_inv_cdf`, Wilson–Hilferty, table-checked).
- KRKᵀ
docs/PROVENANCE.md— jedna cytowalna tabela proweniencji. Konsoliduje każdy parametr czujnika (zegary, inercjalne, transfer czasu), model fizyczny/algorytmiczny (orbita, systemy czasu, układy odniesienia, jono/tropo, integralność, detekcja, jamming, Allan) i zbiór danych walidacyjnych (AIAA 2006-6753, Celestrakgps-ops) wraz z jego opublikowanym źródłem — arkuszem danych, artykułem, ICD lub normą — oraz uczciwą etykietą dojrzałości (flight-qualified / ground-lab / space-goal-on-ground-hardware). Podlinkowana z wprowadzenia README i tabeli Documentation; uzupełnia ciągiprovenancedla każdego przebiegu, które już podróżują w JSON wyniku.- Typowane API scenariuszy. Dyspozycja odbywa się teraz po typowanym enumie
ScenarioKindzamiast dopasowania surowego ciągukind(ScenarioKind::classify+ wyczerpująca dyspozycja), więc dodanie pakietu jest sprawdzane przez kompilator. Nowe typowane powierzchnie obok niezmienionegorun_tomlzwracającego ciąg:run_scenario(src) -> Result<RunOutput, KshanaError>ze strukturalną taksonomią błędów (InvalidInput/NonConvergence/Unsupported/IoError, każdy ze stabilnymkind_tag()); traitScenarioi punkt rozszerzeńExternalPack(przez niego podłączony jest pakietjammingjako przykład opracowany); oraz introspekcjalist_scenario_kinds()(nazwa, opis, pola wymagane/opcjonalne dla każdego rodzaju). Wiązania Pythona i WebAssembly zyskująlist_kinds()ierror_kind(). Udokumentowane wdocs/ARCHITECTURE.md. - Rzeczywista konstelacja GPS i pokrycie obwiedni operacyjnej.
scenarios/orbit-sgp4-gps.tomldostarcza teraz rzeczywistą migawkę Celestrakgps-ops(2021-07-28, 30 satelitów) zamiast syntetycznych TLE Walkera, zstrict_checksum = true, więc ładuje się tylko wtedy, gdy każda suma kontrolna TLE jest prawidłowa;scripts/fetch_tles.shdokumentuje odtwarzalne odświeżanie, a README wskazuje źródło otwartych danych. Nowytests/scenario_coverage.rsćwiczy każdy pakiet na ≥5 wariantach obwiedni, asercjonując skończone/ograniczone wyjście, potwierdza, że poziom flicker-FM mierzalnie pogarsza dryf zegara, gdy jest włączony (teraz ustawiony w trzech dostarczanych scenariuszach), i potwierdza, że filtr fuzji zbiega się przy realistycznym niezerowym biasie akcelerometru (w granicach 3× przypadku z wyzerowanym biasem), zamykając lukę realizmu „fuzja działa tylko z wyzerowanymi biasami”.docs/VALIDATION.mdzyskuje tabelę obwiedni operacyjnej. - Symulacja GNSS w dziedzinie pomiarów (rodzaj
gnss-sim). Model w przód na poziomie pseudoodległości: dla każdego widocznego satelity syntetyzujeρ = geometric range + c·δt_rx − c·δt_sv + I + T + noise + multipathi Doppler L1, z jednoczęstotliwościową jonosferą Klobuchara (IS-GPS-200 §20.3.3.5.2.5) i zenitalną troposferą Saastamoinena rzutowaną funkcją mapowania Niella (1996) — udostępnione jako bloki TOML[iono]i[tropo]. Reszty zasilają migawkowe RAIM dla HPL/VPL w każdej epoce, a tablica JSONgnss_measurements[]niesie pseudoodległość, Doppler, C/N₀ i poprawki jono/tropo każdego SV. Przebieg bez szumu odtwarza geometrię + poprawki z dokładnością poniżej milimetra (test CI). Nowesrc/gnss_sim.rsiscenarios/gnss-sim-raim.toml. - Stochastyczny detektor spoofingu czasu (rodzaj
spoof). Pakiet spoofingu uruchamia teraz prawdziwy detektor zamiast deterministycznego porównania rampy z granicą: cztery kształty wstrzyknięć (linear_ramp,step_jump,meaconing,replay), dwustronny test energii χ²₁ / Neymana–Pearsona na statystyce monitora wspomaganego zegarem z progiem ustawionym z docelowego budżetu fałszywych alarmówtarget_pfaoraz prawdopodobieństwo niewykrytego zdarzeniaP_mdraportowane zarówno w postaci zamkniętej, jak i metodą Monte Carlo (mc_runsprób na hipotezę — oba zgadzają się do kilku ×1/√N). Wskaźnik jakości Security to teraz1 − P_mdprzy operacyjnie szkodliwej (specyfikacyjnej) wielkości. Nowysrc/detection.rs(funkcje ogona gaussowskiego, test NP/energii, Monte Carlo P_fa/P_md) iscenarios/spoof-meaconing.toml. Zgodny wstecz: sam[attack] rate_ns_per_sjest nadal akceptowany jako rampa liniowa.
Zmienione#
- Definicja wskaźnika jakości Security (rodzaj
spoof): od analitycznej granicy wykrywalności1 − min_detectable/thresholddo1 − P_mddetektora stochastycznego. Polesecuritypakietu zegara pozostaje szybszym analitycznym zastępnikiem.
Dodano (ciąg dalszy)#
- Model zagłuszania RF (rodzaj
jamming). Model zakłóceń z bilansem łącza, który zamienia moc i geometrię zagłuszarki na utratę blokady dla każdego satelity: stosunek zagłuszarki do sygnału z tłumienia w wolnej przestrzeni i zysku anteny odbiorczej w każdym kierunku, efektywne C/N₀ przez standardowe równanie przeciwzagłuszeniowe (zysk przetwarzania z despreadingu × współczynnik separacji widmowejQ; Kaplan i Hegarty §9,4) oraz konfigurowalny próg śledzenia, oceniane na konstelacji Walkera jako wskaźnik jakościavailability_under_jamming. Nowesrc/jamming.rsiscenarios/jamming-demo.toml. Uczciwy zakres (bez wielodrogowości, cieniowania terenu, AGC ani adaptacyjnego zerowania) jest udokumentowany wdocs/CAPABILITY.md/docs/VALIDATION.md. - Ogólny przegląd parametrów N-D dla dowolnego rodzaju scenariusza (
sweep-nd). Poprzedni przegląd N-D dotyczył tylko pakietu zegara.sweep-ndzmienia klucze TOML z kropkami scenariusza[base]po iloczynie kartezjańskim jego osi, ponownie kieruje każdy węzeł siatki zwykłą ścieżką uruchomienia i odczytuje jedną lub więcej metryk z wyniku po ścieżce JSON z kropkami — więc działa dla każdego pakietu (inertial, gnss-ins, integrity, spoof, …) bez sprzęgania z typem Rust każdego pakietu. Węzły siatki są obliczane równolegle na wątkach systemu operacyjnego na celach natywnych (bez dodatkowej zależności); wasm wraca do sekwencyjnego. Deterministyczny i wierszowo-główny niezależnie od liczby wątków. Nowy przykładscenarios/sweep-nd-inertial.toml. - Konfigurowalny w TOML deterministyczny model błędów IMU w pakiecie
gnss-ins. Trójosiowy łańcuch błędów strapdown (współczynnik skali, niewspółosiowość, czułość na g, kwantyzacja, rampa prędkości; IEEE Std 952-1997 §A.2, Groves 2013 §4,3) jest teraz osiągalny dla każdego czujnika z pliku scenariusza przez opcjonalny blok[imu_*.error_model], nałożony na stałe biasy włączenia. Pominięcie bloku pozostawia każdy czujnik jako czyste źródło stałego biasu, więc istniejące przebiegignss-inssą bez zmian. To podłącza dotąd wyłącznie bibliotekowy model błędów do uruchamialnego pakietu i wskaźnika jakości.
0.10.0 - 2026-06-04#
Zmienione#
- Walidacja na rzeczywistych danych. Parser nawigacyjny RINEX dla wielu GNSS, propagator GLONASS RK4 i czytnik SP3 są teraz ćwiczone na autentycznych plikach IGS/DLR (rzeczywisty mieszany nadawany plik nawigacyjny RINEX 3 i produkt orbit IGS SP3-c), a nie tylko na samodzielnie przygotowanych próbkach — asercjonując niepuste zbiory satelitów i skończone, fizycznie rozsądne położenia ECEF. Dane testowe służą wyłącznie testom (wyłączone z opublikowanego crate'a); zob.
tests/fixtures/igs/NOTICE. - RAIM na geometrii rzeczywistej orbity referencyjnej. Rdzenie migawkowe, separacji rozwiązań (MHSS) i poziomów ochrony ARAIM są teraz sprawdzone względem rzeczywistej geometrii precyzyjnych orbit IGS (SP3), a nie tylko syntetycznych konstelacji: geometria linii widzenia jest budowana z pierwszej epoki SP3 na rzeczywistej stacji naziemnej, a testy potwierdzają poziomy ochrony rzędu metrów, dostępne dla APV-I, że obciążenie pseudoodległości 60 m wyzwala monitor χ², że separacja rozwiązań identyfikuje uszkodzony satelita oraz że poziomy ARAIM spełniają przydzielone
P_HMI. Zamyka lukę walidacji wyłącznie na syntetycznej geometrii (zgodność z gLAB w dziedzinie odbiornika na pełnym łuku RINEX pozostaje pozycją planu rozwoju — wymaga rozwiązania pseudoodległości).
Dodano#
- Przedziały ufności dla każdego węzła przeglądu parametrów N-D (
sweep::nd_sweep_ensemble). Każdy węzeł siatki N-wymiarowego przeglądu po iloczynie kartezjańskim można teraz obliczyć jako zespół Monte Carlo ziaren, raportując średnią metryki, percentyle i percentylowy przedział ufności bootstrap 95% dla każdego węzła (dla obu zegarów) — statystycznie uczciwy przegląd zamiast jednego losowania na węzeł. Wykorzystuje maszynerię zespołu/bootstrap (metric_stat); deterministyczny;runs = 1redukuje się dokładnie do jednoziarnistegond_sweep. (Uogólnienie przeglądu na wszystkie pakiety, powiązane z refaktoryzacją typowanego Scenario, i wykonanie równoległe pozostają.) - Walidacja krzyżowa potoku szumu IMU względem NaveGo (
tests/navego_imu_crossval.rs). Zewnętrzna kontrola krzyżowa względem NaveGo (otwartoźródłowego zestawu narzędzi INS/GNSS R. Gonzaleza): odtwarza syntetyczny obieg w obie strony znavego_example_allan.mna jego opublikowanym profilu odniesienia Microstrain 3DM-GX3-35 i potwierdza, że nasz estymator overlapping-ADEV odzyskuje współczynniki błądzenia przypadkowego prędkości i kąta z NaveGo (ADEV(1 s) = σ·√dt) z dokładnością poniżej 5%, z oczekiwanym nachyleniem −1/2 dla szumu białego. (Zarejestrowany dziennik STIM300.mato wielkości 40 MB nie jest wczytywany, ponieważ wymaga formatu binarnego.) - Ścisło sprzężona (pseudoodległościowa) aktualizacja GNSS/INS.
GnssInsEkf::update_tightly_coupled(oraz nakładkaClosedLoopInsGnss::fuse_tightly_coupled) realizują wcześniej tylko zaślepiony pomiar w dziedzinie odległości: innowacją jest różnica między odległością przewidzianą od pozycji INS do każdego satelity a zmierzoną pseudoodległością, z jakobianem kierunku widzenia względem błędu pozycji. Ponieważ każdy satelita to pomiar skalarny, filtr nadal koryguje stan przy mniej niż czterech satelitach, gdy luźno sprzężone rozwiązanie PVT nie istnieje. Pięć testów obejmuje zerowanie błędu przy czterech satelitach, korekcję przy dwóch satelitach (bez możliwości PVT), obserwowalność wzdłuż linii widzenia przy jednym satelicie oraz walidację danych wejściowych. Wyłącznie pseudoodległość; faza nośnej i jawny stan zegara odbiornika pozostają w planach rozwoju. Nieużywana funkcja cargotight_coupling(która obejmowała dawną zaślepkę błędu) została usunięta. - Pakiet scenariuszy luźno sprzężonego GNSS/INS (
kind = "gnss-ins",src/fusion/pack.rs). Łączy trójosiowy nawigator strapdown i 15-stanowy EKF stanu błędu (closed_loop/gnss_ins_ekf) w uruchamialny scenariusz ze wskaźnikiem jakości: EKF dyscyplinuje mechanizację za pomocą zaszumionych pozycji GNSS, gdy pokrycie jest dostępne, a następnie przechodzi przez przerwę w ruchu bezwładnym, zastępując reset z przywróceniem prawdy z dawnego pakietu skalarnego 1-DOF prawdziwą fuzją. Wynik podaje szereg połączonego błędu poziomego, oceniany wskaźnik jakości pozycji (dostępność / RMS w przerwie / holdover) oraz RMS swobodnego INS w układzie otwartym dla porównania; para IMU kwantowy/klasyczny różni się wyłącznie rzeczywistym biasem. Wywoływany z punktu wejścia CLI/Python/wasm z przykłademscenarios/gnss-ins.toml. Uczciwe ujęcie: wyłącznie sprzężenie luźne, jedna deterministyczna trajektoria, a błąd połączony w przerwie jest ograniczony od dołu błędem orientacji przy przekazaniu (więc nie twierdzimy, że skaluje się z biasem); wnioski solidne są takie, że fuzja pokonuje nieasystowane nawigowanie zliczeniowe dla czujnika z biasem, a czujnik o mniejszym biasie ma lepszy przebieg bez wspomagania. - Projektowanie konstelacji na sprawdzonym rdzeniu SGP4 (
src/walker.rs). Nowy modułwalkergeneruje zaprojektowany wzór Walker-delta (i: T/P/F) jako elementy uśrednione SGP4, dzięki czemu syntetyczna konstelacja propaguje się tą samą ścieżką SGP4, sprawdzoną z dokładnością 4,12 mm względem wektorów AIAA 2006-6753, a nie analitycznym generatorem keplerowskim. Na nim:pdop_sweeptabeluje pokrycie oraz medianę i najgorszą wartość PDOP w siatce projektów{planes × sats × inclination}, acoverage_revisitpodaje ułamek pokrycia i przerwy w powrotach (najgorsza/średnia) w punkcie naziemnym. Sprawdzone przez fizyczne monotoniczności, których musi przestrzegać kompromis projektowy (więcej satelitów ⇒ większe pokrycie, niższy PDOP, krótszy czas powrotu). Osobno, prawdziwa migawka TLE Celestrakgps-ops(2021-07-28, 30 działających satelitów GPS) została dodana jako wyłącznie testowy zestaw danych, a ścieżkę geometrii prawdziwe TLE → SGP4 → ECEF sprawdzono względem niej (pełna powłoka MEO w granicach 1%, dziewięć satelitów jednocześnie widocznych przy PDOP 1,64), obok istniejących ścieżek danych rzeczywistych SP3 i RINEX. - Efektywne stopnie swobody zależne od typu szumu dla przedziałów ufności Allana.
allan::edf_overlapping_adevimplementuje zamknięte wzory z NIST SP 1065, tabela 5 (prosty zestaw Stable32) dla wszystkich pięciu kanonicznych typów szumu potęgowego: biały/migotania PM, biały/migotania FM, błądzenie przypadkowe FM, zastępując zachowawczą liczbę nienakładających się próbek jako stopnie swobody χ². Nowy typ wyliczeniowyPowerLawNoisei funkcjaclassify_power_lawwskazują typ dominujący na podstawie nachylenia zmodyfikowanego odchylenia Allana rekordu (MDEV odróżnia biały PM od migotania PM tam, gdzie ADEV tego nie potrafi), aoverlapping_adev_curvedołącza teraz do każdego punktu eksportowanej krzywej ADEV zidentyfikowany typ szumu, jego edf oraz pasmo ufności 95% (AdevPointzyskujenoise/edf/ci_lo/ci_hi, addytywnie, z domyślnymi wartościami serde). Sprawdzone dwojako: pięć wzorów zgadza się z wartościami obliczonymi ręcznie z dokładnością 1e-12, a zespół Monte Carlo 4 000 rekordów białego FM potwierdza, że wzór przewiduje rzeczywiste edf chi-kwadrat estymatora w granicach 20% (i że wyraźnie przewyższa liczbę zachowawczą). Osiem nowych testów. - Stochastyczny model dwukierunkowego transferu czasu.
timetransfer::TwoWayLinkzastępuje próbnik wyłącznie białego szumu modelem o fizycznych podstawach: wzajemne (wspólne) opóźnienie ścieżki znosi się w estymacie(m_AB - m_BA)/2(two_way_offset_estimate, więc dwa niezależne pomiary jednokierunkowe uśredniają się do1/sqrt(2)), a resztą jest niewzajemne opóźnienie różnicowe, modelowane jako barwny proces biały FM + błądzenie przypadkowe FM (sprawdzonyClockModel), co nadaje szeregowi błędu synchronizacji realistyczną sygnaturę Allana (sigma_y^2(tau) = q_rw*tau/3) zamiast płaskiego szumu białego.LinkCfgzyskujeq_wf_s/q_rw_s(domyślnie serde 0 ⇒ dawne zachowanie wyłącznie białego szumu, bit w bit), wskaźnik jakości łącza podajeadev_tau0(odchylenie Allana modelu przy kroku bazowym), a scenariusztimetransferi CLI je udostępniają. Wzorcowy wskaźnik jakości zapisano ponownie. Sześć testów wyprowadzonych ręcznie (znoszenie składowej wspólnej, dwukierunkowe wzmocnienie sqrt(2), prawo RWFMtau/3przez własnestep()łącza, równoważność z dawnym zachowaniem przyq=0, determinizm i end-to-end ujawnienie wskaźnika jakości). - Zgodność numeryczna ze Stable32 dla estymatorów rodziny Allana (NBS14).
tests/allan_reference.rssprawdza estymatory overlapping ADEV, modified ADEV, odchylenia czasu oraz overlapping Hadamarda względem odchyleń wzorcowych Stable32 dla kanonicznego zbioru NBS14 (W. J. Riley, Handbook of Frequency Stability Analysis, NIST SP 1065, ok. s. 107) przy tau = 1, 2 z tolerancją względną 1e-4; faktyczna zgodność wynosi ok. 1e-6. Przypina to matematykę estymatorów do de facto wzorcowej implementacji, a nie tylko do własnej analitycznej spójności estymatorów. Używane są wyłącznie publiczne liczby wzorcowe; żadnego kodu osób trzecich. - Pionowy diagram integralności Stanforda eksportowany przez scenariusz
integrity. Uruchamialny rodzaj scenariuszaintegrityeksportuje teraz pionowy diagram Stanford(-ESA) obok mapy dostępności HPL/VPL: w każdej epoce chronionej wylosowany z ziarnem, odtwarzalny błąd odległości bez uszkodzenia jest przekształcany przez geometrię w rzeczywisty błąd pozycji pionowej i klasyfikowany względem VPL oraz pionowego limitu alarmowego (Available / System-Unavailable / Misleading / Hazardously-Misleading). Diagram (punkty dla poszczególnych epok i liczby w regionach) jest zawarty w JSON wyniku, a liczby zdarzeń integralności / HMI w podsumowaniu CLI, więc klasyfikator Stanforda, dotąd tylko w bibliotece, jest osiągalny od końca do końca.IntegrityScenariozyskuje poleseed(domyślnie 0) sterujące realizacją błędu; sama mapa dostępności pozostaje wyłącznie geometryczna i niezależna od ziarna. - Budżet ryzyka integralności ARAIM (P_HMI) dla poziomów ochrony.
raim::araim_raimwyprowadza poziomy ochrony poziomy i pionowy z jawnego budżetu ryzyka integralności zamiast ze stałego mnożnikaK_md: dla rozwiązania ze wszystkich widocznych satelitów i każdego podrozwiązania z wykluczeniem jednego satelity buduje dla każdej osi(prior, detection threshold, σ)poszczególnych trybów, po czymaraim_protection_levelwyznacza najmniejszy PL, którego sumaryczne prawdopodobieństwo niebezpiecznie mylących informacji (araim_integrity_risk,P_HMI = Σ_k p_fault,k · Q((PL − T_k)/σ_k), Blanch i in., Baseline ARAIM) spełnia przydzieloneP_HMI. Wynik podaje ryzyko integralności faktycznie osiągane przez poziomy, więc użytkownik może jawnie wymieniać integralność na limit alarmowy. Sześć testów wyprowadzonych ręcznie (zamknięte wzory dla trybu pojedynczego bez uszkodzenia i z progiem, sumowanie/monotoniczność wielu trybów, ochrona end-to-end bez uszkodzenia, gdzie 10⁵× ciaśniejszy budżet podnosi PL, detekcja/identyfikacja uszkodzenia oraz próg redundancji sześciu satelitów). Pojedyncze uszkodzenie MHSS jest bazą ARAIM; jednoczesne uszkodzenia wielu podzbiorów SV, tryb uszkodzenia dotyczący całej konstelacji i walidacja na zbiorze referencyjnym gLAB są udokumentowanymi rozszerzeniami. - Dwuszybkościowa kompensacja coning/sculling dla mechanizacji strapdown.
inertial::mechanization::coning_sculling_compensatewyłącza z uporządkowanych przyrostów IMU w podprzedziałach zgrubnej aktualizacji składowe coning (orientacja) oraz rotacji+sculling (prędkość) o wysokiej częstotliwości, dzięki czemuNavState::step_incrementso umiarkowanej częstotliwości odtwarza ruch wyprostowany drganiami, którego zgrubny krok na surowych sumach nie wychwytuje. Test walidacyjny prowadzi środowisko coning+sculling o częstotliwości 10 Hz przez 60 s i porównuje prawdę o drobnej częstotliwości, naiwne całkowanie zgrubne i zgrubne całkowanie ze złożeniem: złożenie zmniejsza błąd pozycji ok. 18× (od metrów naiwnego dryfu do poniżej decymetra), co potwierdza, że składowe coning/sculling mają znaczenie nośne. Alias typuScalarErrorBudgetnazywa dawny 1-DOFAccelModeltym, czym jest, odrębnie od trójosiowego nawigatoraNavState. - Parser plików obserwacji RINEX. Nowy moduł
rinex_obswczytuje plik obserwacji RINEX 3.0x / 4,00 (rzeczywiste pomiary odbiornika), uzupełniając parę RINEX obok istniejącego parsera komunikatu nawigacyjnego.parse_obsdekoduje nagłówek (wersja/typ, listySYS / # / OBS TYPESdla poszczególnych systemów z liniami kontynuacji, pozycja przybliżona, interwał, czas pierwszej obserwacji) oraz rekordy każdej epoki dla poszczególnych satelitów: pseudoodległość, fazę nośnej, Doppler i siłę sygnału, indeksowane kodem obserwacji RINEX 3 (C1C,L1C, …) wraz z flagami utraty synchronizacji (LLI) i siły sygnału (SSI); puste pole jest zachowywane jako brak wartości, a nie zero. Uczciwy zakres: to jest wczytywanie formatu standardowego (rzeczywisty dziennik obserwacji RTKLIB/gLAB/stacji IGS na wejściu, typowane pomiary na wyjściu), a nie silnik pozycjonowania; nie ma tu rozwiązania z pseudoodległości, PPP ani RTK. - Zapisywacz CCSDS OEM (Orbit Ephemeris Message). Nowy moduł
oemeksportuje propagowaną konstelację jako poprawny komunikat CCSDS 502.0-B OEM 2,0, czyli format efemeryd KVN, który wczytują GMAT, Orekit, STK i większość narzędzi dynamiki lotu.OemFile::from_propagatorspróbkuje na siatce czasu stan inercjalny (TEME) każdego satelity, czyli pozycję i prędkość, wzięte wprost z propagatora bez obrotu do układu związanego z Ziemią, inaczej niż w eksporcie SP3, aOemFile::to_oem_stringserializuje nagłówekCCSDS_OEM_VERS/CREATION_DATE/ORIGINATORoraz jeden segmentMETA_START … META_STOPna satelitę (OBJECT_NAME/OBJECT_ID/CENTER_NAME/REF_FRAME = TEME/TIME_SYSTEM = GPS/START_TIME/STOP_TIME), po których następują jego linieepoch X Y Z X_DOT Y_DOT Z_DOT(km, km/s). PoleCREATION_DATEpodaje wywołujący, nigdy zegar ścienny, więc wynik jest identyczny bajt w bajt między przebiegami (kontrakt odtwarzalności). To odpowiednik efemeryd statku kosmicznego dla eksportu SP3 GNSS: orbitę Kshana można teraz przekazać narzędziu dynamiki lotu w standardowym formacie. - Precyzyjne efemerydy SP3 jako źródło propagacji.
Sp3File::interpolatorbuduje dla każdego satelitySp3Interpolator, który wypełnia pozycję między tabelarycznymi epokami SP3 wielomianem Lagrange'a 9. rzędu (standardowa praktyka IGS) i obraca ją do wspólnego układu TEME, udostępniony jakoPropagator::Sp3Precise. Plik precyzyjnych orbit IGS/centrum analiz może teraz napędzać ten sam potok geometrii/widoczności/integralności co propagatory transmitowane i analityczne. Sprawdzone obiegiem w obie strony: orbita Keplera zapisana do SP3 i ponownie wczytana przez interpolator zgadza się z oryginałem z dokładnością poniżej metra w węzłach i < 100 m w środku przedziału. Interpolacja zegara jest następna. - Efemerydy transmitowane GLONASS (dopełniają wielosystemową nawigację RINEX). Nowy moduł
glonass: GLONASS nie nadaje elementów keplerowskich, lecz wektor stanu w układzie PZ-90 związanym z Ziemią (pozycja, prędkość, przyspieszenie lunisolarne).parse_glonass_navwczytuje rekordy RINEX 3R, a pozycję satelity w dowolnej chwili uzyskuje się przez całkowanie metodą Runge–Kutty 4. rzędu równań ruchu z ICD GLONASS (grawitacja centralna +J2+ człony Coriolisa/odśrodkowe obrotu Ziemi + przyspieszenie transmitowane). Udostępnione jakoPropagator::Glonass, dzięki czemu satelity GLONASS przechodzą przez potok konstelacji/widoczności/integralności obok systemów keplerowskich; pojedynczy blok konstelacjirinexmoże teraz mieszać GPS, Galileo, QZSS, BeiDou i GLONASS. - Wielosystemowa nawigacja RINEX (GPS, Galileo, QZSS, BeiDou). Parser nawigacyjny RINEX 3 dekoduje teraz rekordy Galileo (
E), QZSS (J) i BeiDou (C, MEO/IGSO) obok GPS (G); mają one wspólny układ keplerowski i algorytm użytkownika, a każdy z nich jest obliczany z własną stałą grawitacyjną i prędkością obrotu Ziemi (μ Galileo/BeiDou, Ω̇ₑ BeiDou). Plik z mieszaną konstelacją daje wszystkie te systemy, przechodzące przez potok konstelacji/widoczności/integralności jakoPropagator::Rinex. Geostacjonarne satelity BeiDou używają innego obrotu współrzędnych i są pomijane do czasu uzyskania wzorcowego zestawu danych do ich sprawdzenia. Przeglądarka rekordów używa liczby linii zależnej od systemu, co naprawia ukryty błąd, w którym czteroliniowe rekordy GLONASS/SBAS były pomijane tak, jakby miały osiem linii. GLONASS (model wektora stanu) jest następny. - Czytnik i zapisywacz precyzyjnych efemeryd SP3-c/d. Nowy moduł
sp3parsuje pliki precyzyjnych orbit SP3 IGS/centrów analiz (parse_sp3), czyli przetworzony po fakcie produkt pozycji/zegara ECEF, który silniki PPP (Ginan, RTKLIB, gLAB) traktują jako wzorzec, do ustrukturyzowanegoSp3File(nagłówek, siatka epok, pozycja dla każdego satelity km→m, zegar µs i prędkość dm/s→m/s dla produktówV), zachowując wartości wartowników błędnych danych SP3. Pokryty jest też kierunek odwrotny:Sp3File::from_propagatorsbuduje SP3 z propagowanej konstelacji (TEME→ECEF dla każdej epoki), ato_sp3_stringgo serializuje, więc orbity Kshana można eksportować w formacie, który wczytują zewnętrzne narzędzia PPP: obieg odczyt↔zapis. Interpolacja epok i źródło propagatora SP3 są następne. - Efemerydy transmitowane RINEX jako uruchamialne źródło konstelacji. Konstelacja przyjmuje teraz wbudowany blok
rinex(tekst nawigacyjny GPS RINEX 3) obok istniejącej opcjitle, więc prawdziwy plik transmitowany napędza scenariusz od końca do końca z CLI, Pythona lub playgroundu w przeglądarce: RINEX na wejściu, geometria PNT na wyjściu. Nowyscenarios/orbit-rinex.tomlpokazuje dostępność GNSS i DOP dla ośmiu satelitów GPS zbudowanych wprost z rekordów transmitowanych. (Tylko GPS LNAV; wielosystemowość i SP3 są następne.) - Efemerydy transmitowane RINEX jako źródło propagacji. Sparsowany
RinexEphemerisjest teraz konwertowany doorbit::Propagator(Propagator::Rinex): pozycja to orbita transmitowana IS-GPS-200 obrócona z ECEF do wspólnego inercjalnego układu TEME (sv_position_teme, z poprawnym względem sekund przestępnych czasem GPS→UT1), prędkość z centralnej różnicy skończonej, a okres orbitalny keplerowski. Rzeczywiste dane transmitowane GPS mogą teraz napędzać ten sam potok geometrii, widoczności i integralności (RAIM) co analityczne propagatory SGP4/Keplera. (Jeszcze nieudostępnione jako rodzaj scenariusza z plikiem RINEX; to oraz wielosystemowość/SP3 są następne.)
0.9.2 - 2026-06-03#
Dodano#
- Archiwalny DOI. Wydania są teraz deponowane w Zenodo i otrzymują cytowalny DOI.
0.9.1 - 2026-06-03#
Zmienione#
- Dokumentacja. Odświeżono README do poziomu instytucjonalnego: przegląd możliwości pełnego stosu v0.9.0, sekcja Wersjonowanie i wydania, czysty nagłówek z nowym znakiem oraz zwięzła linia statusu. Bez zmian w silniku.
0.9.0 - 2026-06-03#
To wydanie dodaje trzy istotne obszary możliwości na podstawie substratu SGP4 0.8.0: prawdziwy trójosiowy INS strapdown, luźno sprzężony EKF stanu błędu GNSS/INS ze sprzężeniem zwrotnym w pętli zamkniętej, prawdziwy migawkowy RAIM oraz RAIM z separacją rozwiązań (w stylu ARAIM) z HPL/VPL i uruchamialnym scenariuszem integrity, a także pierwszy krok interoperacyjności formatów GNSS (wczytywanie efemeryd GPS RINEX-3).
Dodano#
- Parser komunikatu nawigacyjnego GPS RINEX 3 (
src/rinex.rs). Pierwszy krok ku interoperacyjności formatów GNSS:parse_navwczytuje plik nawigacyjny RINEX 3.x i dekoduje każdy rekord efemeryd transmitowanych GPS (G), czyli ośmioliniowy blok SV/epoka +BROADCAST ORBIT, doRinexEphemeriselementów keplerowskich i poprawek zegara, z nazwami pól i jednostkami zgodnie z IS-GPS-200. Obsługuje format liczb zmiennoprzecinkowych Fortrana z wykładnikiemD(parse_d) i układ kolumn o stałej szerokości; rekordy dla systemów innych niż GPS są pomijane, a nie odrzucane, więc plik mieszany nadal daje swoje efemerydy GPS. Cztery testy: parsowanie wykładnikaD(w tym puste pola i błędy), pełny rekord zdekodowany względem znanych wartości pól ze sprawdzeniem poprawności półosi wielkiej GPS (√A² ≈ 26 560 km), pomijanie systemów innych niż GPS oraz przypadek pustego pliku. - Efemerydy transmitowane GPS → pozycja ECEF (
src/rinex.rs).RinexEphemeris::sv_position_ecef(t_tow)oblicza pozycję satelity w układzie związanym z Ziemią ze sparsowanych efemeryd według algorytmu użytkownika IS-GPS-200 §20.3.3.4.3.1: rozwiązanie równania Keplera metodą Newtona dla anomalii mimośrodowej, poprawki drugiej harmonicznej do argumentu szerokości / promienia / nachylenia oraz obrót do ECEF z uwzględnieniem obrotu Ziemi od epoki odniesienia (ze stałymi GPSμiΩ̇ₑnarzuconymi przez specyfikację oraz złożeniemtkprzy przełomie tygodnia). Trzy testy: promień geocentryczny pozostaje w paśmie GPS (≈ 26 560 km), prędkość w układzie związanym z Ziemią wynosi ok. 3,9 km/s, a obliczenie dla chwili odległej o pełny tydzień odtwarza tę samą pozycję. - Błąd zegara SV GPS z poprawką relatywistyczną (
src/rinex.rs).RinexEphemeris::sv_clock_bias_s(t_tow)oblicza transmitowany wielomian zegaraaf0 + af1·Δt + af2·Δt²względemTocoraz relatywistyczny człon mimośrodowyF·e·√A·sin Ek(IS-GPS-200 §20.3.3.3.3.1). NowaEpochUtc::gps_time_of_weekprzelicza epokę kalendarzową rekordu na czas GPS w tygodniu za pomocą arytmetyki dni juliańskich od epoki GPS (1980-01-06), a rozwiązanie Keplera jest wspólne z obliczaniem pozycji. Testy: czas GPS w tygodniu dla niedzieli/wtorku/soboty (granice tygodni) oraz błąd zegara zdominowany przez af0 z obecnym, ograniczonym członem relatywistycznym. Opóźnienie grupowe L1TGDjest udostępnione, ale celowo nie jest wliczane. Uczciwy zakres: źródłoPropagator, Galileo/BeiDou/GLONASS i SP3 pozostają kolejnymi krokami. (docs/CAPABILITY.mdzaktualizowano zgodnie z tym.) - Uruchamialny przez użytkownika rodzaj scenariusza
integrity(scenarios/integrity-raim.toml). Możliwość oceny dostępności RAIM jest teraz osiągalna z CLI/TOML jak każdy inny pakiet:kind = "integrity"parsujeIntegrityScenario(orbita użytkownika, jedna lub więcej konstelacji GNSS, maska elewacji i konfiguracja integralności(sigma, P_fa, P_md, AL_H, AL_V)), uruchamiaconstellation_raim_availabilityi emituje mapę dostępności HPL/VPL dla poszczególnych epok jako JSON oraz samodzielny SVG: poziomy ochrony w czasie względem limitów alarmowych, z zielono-czerwonym paskiem dostępności.kshana scenarios/integrity-raim.tomlzapisuje JSON, wykres i raport HTML. Dołączony scenariusz (24-satelitarny Walker, pomiar odległości dwuczęstotliwościowy 1 m, limity APV-I) podaje ok. 95 % dostępności; dokumentuje, że jednoczęstotliwościowy RAIM nie spełnia pionowego limitu APV-I przy jednej konstelacji, dlatego prowadzenie w pionie używa SBAS/dwóch częstotliwości/ARAIM. Testy obejmują wywołanie, JSON mapy dostępności i SVG. - Uruchamialna ocena dostępności RAIM dla konstelacji (
src/raim.rs). Moduł integralności nie miał wywołującego:constellation_raim_availabilityczyni go prawdziwym punktem wejścia od końca do końca: w każdej epoce na siatce czasu propaguje widoczne satelity (tymi samymiPropagatorSGP4/Keplera, których używa silnik), oblicza poziomy ochrony bez uszkodzenia i ocenia dostępność względem poziomych/pionowych limitów alarmowych, zwracającRaimAvailabilityReportserializowalny przezserde(dla każdej epokin_visible/HPL/VPL/availableoraz ułamek dostępności).RaimConfigłączy(sigma, P_fa, P_md, AL_H, AL_V), araim_availability_epochdla poszczególnych epok jest udostępnione wywołującym, którzy sami rozstrzygają własną geometrię. Trzy testy: epoka oceniona jako dostępna przy limitach APV-I dla geometrii dziesięciu satelitów, uznana za niedostępną przy nierealistycznie ciasnym limicie oraz poziomyNoneponiżej pięciu satelitów; a także przebieg end-to-end dla 24-satelitarnej konstelacji Walker, który daje skończoną mapę dostępności i serializuje się. (Sześć satelitów, czyli próg redundancji residual-RAIM, uczciwie nie spełnia APV-I nawet przy pomiarze odległości 1 m; dostępność APV-I wymaga gęstszej geometrii użytej w teście.) - Akumulator diagramu integralności Stanford(-ESA) (
src/raim.rs). Standardowy sposób podsumowania monitora integralności w wielu epokach: nanosi rzeczywisty błąd pozycji (x) względem poziomu ochrony (y) i klasyfikuje każdą epokę, według przekątnejy = xi limitu alarmowego, jakoAvailable(PL ogranicza błąd, w granicach AL),SystemUnavailable(PL ogranicza błąd, ale przekracza AL: bezpiecznie, lecz bezużytecznie),MisleadingInformation(PL < błąd ≤ AL) lubHazardouslyMisleadingInformation(PL < błąd i błąd > AL: awaria niebezpieczna).classify_stanfordto czysty klasyfikator;StanfordDiagramakumuluje punkty(error, PL)względem stałego limitu alarmowego, udostępniając liczby w regionach, dostępność, sumy zdarzeń integralności oraz punkty serializowalne przezserdedo wykresów/eksportu JSON. Cztery testy: każdy region (w tym granica ograniczeniaerror == PL), akumulacja liczb/dostępności i obieg JSON w obie strony. To powierzchnia raportowania dla poziomów ochrony RAIM; podłączenie jej do scenariusza konstelacji i walidacja na publicznym zbiorze danych pozostają pozycjami planu rozwoju. - RAIM z separacją rozwiązań (w stylu ARAIM) (
src/raim.rs). Monitor integralności z wieloma hipotezami obok istniejącego chi-kwadratsnapshot_raimopartego na resztach/parytecie. Dla rozwiązania najmniejszych kwadratów ze wszystkich widocznych satelitów i każdego podrozwiązania z wykluczeniem jednego satelity tworzy separacjęΔ_k = x_k − x₀, o zerowej średniej i rozkładzie gaussowskim przy braku uszkodzenia, z kowariancjąCov(x_k) − Cov(x₀)(tożsamość estymatorów zagnieżdżonych, ważna, ponieważ rozwiązanie ze wszystkich widocznych satelitów jest BLUE), dzięki czemu wykrywa uszkodzenie i identyfikuje uszkodzony satelita (ten, którego wykluczenie daje największą znormalizowaną separację). Poziomy ochrony poziomy/pionowy wynikają ze standardowej alokacji MHSSPL = max(K_md·σ₀, max_k[K_fa·σ_ss,k + K_md·σ_k]), gdzieK_fa = Φ⁻¹(1−P_fa/2),K_md = Φ⁻¹(1−P_md). Nowe, niezależne od zależnościnormal_cdf/normal_quantile, zbudowane z istniejącej w module regularyzowanej niepełnej funkcji gamma (erf(x) = P(½,x²)). Cztery testy wyprowadzone ręcznie: rozkład normalny CDF / kwantyl względem wartości podręcznikowych (Φ(1,95996)=0,975, ogon 1e-7 = 5,1993, symetria); geometria bez uszkodzenia, która nie wywołuje alarmu i daje skończone, dodatnie HPL/VPL; bias pojedynczego satelity równy 60 σ, który jest wykrywany i poprawnie identyfikowany (excluded_sv == 2); oraz próg redundancji sześciu satelitów. Zamyka po stronie algorytmu lukę P0 z audytu „tautologiczna integralność: brak prawdziwego RAIM/HPL/VPL”; walidacja na zbiorze gLAB i akumulator diagramu Stanforda pozostają pozycjami planu rozwoju. - Integracja GNSS/INS w pętli zamkniętej (
src/fusion/closed_loop.rs).ClosedLoopInsGnssłączy jądro EKF stanu błędu z trójosiową mechanizacją strapdown: każda próbka IMU jest korygowana bieżącymi estymatami biasów, mechanizowana w przód, a kowariancja EKF jest propagowana w czasie z odpowiednim kontekstem nawigacyjnym; każda pozycja/prędkość GNSS tworzy innowację INS−GNSS i wprowadza estymowane błędy pozycji, prędkości, orientacji (ψ, jako obrót kwaternionowy) oraz biasy akcelerometrów/żyroskopów z powrotem do rozwiązania, zerując średnią stanu błędu. Wprowadzenie z powrotem orientacji (a nie tylko biasów) jest konieczne dla stabilności: przechył i bias akcelerometru tworzą sprzężoną parę, więc korygowanie jednego bez drugiego prowadzi do rozbieżności. INS i GNSS są porównywane w lokalnym stycznym układzie NED z użyciem własnych promieni krzywizny mechanizacji (nowemechanization::radii_of_curvature; udostępnioneNavState::omega_ie_n/omega_en_n). To uczciwy zamiennik resetu z przywróceniem prawdy pakietu hybrydowego. Trzy testy: pętla zamknięta zerująca wprowadzony błąd pozycji 8 m / −5 m do <0,1 m; rozwiązanie wspomagane pozostające w granicach metrów (<6 m) na trajektorii jazdy, podczas gdy swobodnie działający INS rozbiega się powyżej 100 m; oraz kamień milowy, czyli benchmark: RMS pozycji Monte Carlo rozwiązania połączonego podczas przerwy GNSS trwającej 60 s pokonuje nieasystowany nawigator zliczeniowy w układzie otwartym o >2× (≈4× w różnych ziarnach). Uczciwe ograniczenie udokumentowane w module: w trybie luźno sprzężonym bias akcelerometru i przechył są rozdzielne tylko słabo (oba sprzęgają się przez grawitację), więc dostarczoną wartością jest ograniczony, skorygowany stan i czyste wejście w przerwę, a nie precyzyjna kalibracja inercjalna; bogatsza dynamika i rozszerzenie na sprzężenie ścisłe pozostają pozycjami planu rozwoju. - Jądro luźno sprzężonego EKF stanu błędu GNSS/INS (
src/fusion/gnss_ins_ekf.rs). 15-stanowy rozszerzony filtr Kalmana stanu błędu,δx = [δp, δv, ψ, b_a, b_g], z dynamiką błędów strapdown według Grovesa 2013 §14,2 (sprzężenie siły właściwej i przechyłu, Coriolis, rzutowanie biasu z układu ciała na układ nawigacyjny, modele biasu Gaussa–Markowa), dyskretną macierzą przejścia pierwszego rzęduΦ = I + F·dtoraz luźno sprzężoną aktualizacją pomiaru pozycji i prędkości (H = [I₃ 0 0 0 0; 0 I₃ 0 0 0]) w postaci Josepha. Algebra liniowa gęsta, niezależna od zależności (odwracanie Gaussa–Jordana, aktualizacja kowariancji Josepha). Funkcja cargotight_couplingbramkuje udokumentowaną, jeszcze niezaimplementowaną aktualizację pseudoodległości/Dopplera. 7 testów z oczekiwaniami wyprowadzonymi ręcznie: tożsamość iloczynu wektorowego, sprawdzona odwrotność 3×3, kowariancja pozostająca symetryczna/PSD podczas predykcji (przy rosnącej niepewności pozycji bez wspomagania), pozycja zmniejszająca kowariancję pozycji, dokładne odzyskanie znanego błędu pozycji przy analitycznym wzmocnieniu KalmanaP/(P+R)oraz mniejsze korekty przy większym szumie pomiaru. To jest jądro, które zastąpi reset z przywróceniem prawdy z układu otwartego w pakiecie hybrydowym sprzężeniem zwrotnym w pętli zamkniętej (podłączenie pakietu i walidacja względem NaveGo w następnej kolejności). - Deterministyczny model błędów IMU dla 3-osiowego nawigatora strapdown (
src/inertial/imu_errors.rs).ImuErrorModelzniekształca prawdziwą parę(ω, f)w układzie ciała w parę zmierzoną przez pięć systematycznych kategorii (IEEE Std 952-1997 §A.2; Groves 2013 §4,3, tabela 4,1): współczynnik skali (błąd wzmocnienia w ppm dla każdej osi), niewspółosiowość / sprzężenie krzyżowe (nieortogonalność triady poza przekątną), czułość na g (bias prędkości kątowej żyroskopu proporcjonalny do siły właściwej), kwantyzacja (zaokrąglanie do wyjściowego LSB) oraz narastanie liniowe (dryf liniowy w czasie, czyli trzeci obszar Allana), a także stały bias włączenia. Każdy człon domyślnie wynosi zero, więcImuErrorModel::ideal()jest przezroczystym przejściem, a istniejące scenariusze pozostają nienaruszone. Każde źródło błędu ma test izolacji (skala liniowa z dokładnością <0,01%, niewspółosiowość międzyosiowa powyżej poziomu VRW, bias czułości na g, siatka LSB, narastanie liniowe), a test end-to-end prowadzi błąd nawigacji przez mechanizację ze zniekształconego IMU. Niemodelowane: błąd prostowania drgań, dryf od gradientu temperatury. (Dostarczany pakiet scenariuszyinertialnadal używa dawnego skalarnego budżetu 1-DOF; ten model zasila bibliotekę 3-osiową.) - Kompensacja coning i sculling dla integratora strapdown. Ścieżka orientacji dodaje dwupróbkowy
coning_increment(½ Δθ_prev × Δθ_cur); zgrubne całkowanie z częstotliwością 30 Hz (5 próbek na cykl) środowiska coning o częstotliwości 5 Hz śledzi prawdę o drobnej częstotliwości co najmniej 3× lepiej z korekcją niż przy naiwnym sumowaniu przyrostów, co zweryfikowano. Ścieżka prędkości dodajesculling_increment(½ Δθ × Δv, równanie 5,82 Grovesa) i rozkłada przyrost prędkości w układzie ciała przez nową aktualizację przyrostowąNavState::step_incrementsz użyciem obrotu względem ciałaΔθ_rel = Δθ_b − C_n^b ζ, dzięki czemu platforma związana z Ziemią nie ponosi pozornego sculling, a rzeczywiste drganie uruchamia pełny człon. - Pełna trójosiowa mechanizacja strapdown w układzie NED (
src/inertial/mechanization.rs).NavState { q, v_ned, p_llh }jest przesuwany przezstep(gyro_b, accel_f_b, dt)według standardowych równań NED w układzie ziemskim (Groves §5,4): orientacja ciało→NED skorygowana o prędkość kątową inercjalny→nawigacyjnyω_in = ω_ie + ω_en(obrót Ziemi + prędkość transportowa); siła właściwa rozkładana ciało→NED przez DCM; prędkość całkującav̇ = f_n − (2 ω_ie + ω_en) × v + g_n(Coriolis/transport + grawitacja); oraz pozycja geodezyjna przez promienie krzywizny południkowy/poprzeczny. Grawitacją jest zamknięta postać Somigliany WGS-84, czyli grawitacja normalna (pionu) z poprawką wysokościową NIMA w powietrzu swobodnym, nigdy stała zapisana na sztywno. To jest prawdziwy trójosiowy nawigator, który zastępuje ścieżkę skalarnego budżetu błędów 1-DOF. Zweryfikowano fizycznymi niezmiennikami: platforma przymocowana do obracającej się Ziemi na 45°N (wykrywająca prędkość obrotu Ziemi + 1 g) pozostaje w granicach 1 mm przez 60 s; pozioma siła właściwa skierowana na północ dajev_N ≈ a·ti przemieszczenie½ a t²; grawitacja normalna zgadza się ze znanymi wartościami na powierzchni dla równika/bieguna/45° i z gradientem w powietrzu swobodnym. - Trójosiowa reprezentacja orientacji dla INS strapdown (
src/inertial/attitude.rs). Typ kwaternionu jednostkowegoQuaternion(skalar na początku, konwencja Hamiltona) niosący obrót ciało→nawigacja, z widokiem DCM (to_dcm/from_dcmmetodą Shepparda), iloczynem Hamiltona, konstruktorami z osi i kąta oraz z wektora obrotu (dokładna mapa wykładnicza) i kinematyką kwaternionów: zarówno aktualizacja prędkości kątowej metodą RK pierwszego rzędu (q̇ = ½ q ⊗ ω), jak i aktualizacja wektora obrotu z korekcją coning. Dwupróbkowyconing_increment(Savage / Bryan–Lewantowski,½ Δθ_prev × Δθ_cur) dostarcza człon sprzężenia krzyżowego prędkości obrotu, który pomija skalarne nawigowanie zliczeniowe. To jest fundament orientacji dla pełnej 3-osiowej mechanizacji, która zastępuje dawną ścieżkę budżetu błędów 1-DOF. Zweryfikowano względem obrotów w postaci zamkniętej: propagacja ze stałą prędkością kątową zgadza się z kwaternionem oś–kąt z dokładnością 1e-6, DCM są ortonormalne z wyznacznikiem jednostkowym, a coning znika dla ruchu jednoosiowego. (src/inertial.rsjest teraz katalogiem modułusrc/inertial/; ścieżka publicznacrate::inertialpozostaje bez zmian.) - Geodezyjnie poprawna widoczność ze stacji naziemnej (
src/frames.rs).elevation,is_visibleivisible_countobliczają elewację satelity nad horyzontem stacji naziemnej względem normalnej do elipsoidy WGS-84 (prawdziwej lokalnej pionowej), a nie geocentrycznego promienia; oba kierunki różnią się nawet o ok. 0,19° ugięcia geodezyjnego, co wystarcza, by satelity bliskie horyzontowi wchodziły do maski elewacji lub z niej wypadały. Zweryfikowano od końca do końca (konstelacja Walker propagowana, obrócona TEME→ECEF i zliczona z miejsca geodezyjnego) oraz względem przybliżenia geocentrycznego.
Zmienione#
- Niezawodność CI. Zadanie
test-python-bindingsbuduje teraz wheel za pomocąPyO3/maturin-action(kontener manylinux) zamiast surowegomaturin buildna hoście, eliminując sporadyczny konflikt rustuprustfmt-preview/cargo-fmtw obrazie runnera. Zadaniedenyinstalujecargo-denyjako gotowy plik binarny przeztaiki-e/install-actionzamiast opartego na Dockerzecargo-deny-action, usuwając przekroczenie czasu pobierania z rejestru Docker Hub. Żadna ze zmian nie wpływa na wykonywane kontrole.
0.8.0 - 2026-06-02#
Dodano#
Prędkość inercjalna jest udostępniona dalej.
Propagator::velocity_eciiPropagator::state_eci(zwracająceStateEci { r_m, v_m_s }) przekazują wywołującym w m/s analityczną prędkość TEME, którą SGP4 już oblicza i dotąd odrzucał;Orbit::velocity_ecidaje ścieżce keplerowskiej spójną prędkość. Test weryfikacyjny AIAA 2006-6753 sprawdza teraz także prędkość dla każdego wiersza wzorcowego (najgorszy błąd prędkości 1.85e-9 km/s w całym zbiorze 666 stanów) i przypina liczbę porównywanych wierszy dokładnie do 666.Surowsze parsowanie TLE bez panik. Linie muszą być ASCII i są dzielone bezpiecznie (koniec z paniką przy indeksowaniu bajtów w danych wielobajtowych); elementy są sprawdzane pod kątem zakresu (nachylenie, mimośród, ruch średni); sumę kontrolną z kolumny 69 można wymusić przez
ParseOpts { strict_checksum }/parse_propagators_optsi nową flagęstrict_checksumwConstellationCfg(domyślnie łagodnie).Krzywa odchylenia Allana w wyniku. Każdy przebieg zegara podaje teraz
adev_curve([{tau_s, adev, n_samples}]), a playground w przeglądarce rysuje wykres logarytmiczno-logarytmiczny „Stabilność zegara (ADEV)”.Walidacja wejściowej siatki czasu.
TimeCfg::validateodrzuca siatkę czasu nieskończoną lub niebędącą liczbą, zerową, ujemną albo zbyt dużą (krok większy niż czas trwania lub więcej niżMAX_TIME_STEPSpróbek) przed jakąkolwiek alokacją, dzięki czemu błędny scenariusz zwraca błąd zamiast panikować lub wyczerpywać pamięć.Zespoły Monte Carlo dla pakietu inercjalnego.
runs = Nw scenariuszu inercjalnym uruchamia N ziaren i podaje dla każdej metryki średnią, odchylenie standardowe, percentyle oraz przedział ufności 95% metodą bootstrapu percentylowego (ensemble). Każdy przebieg inercjalny niesie teraz flagęmonte_carlo, więc wskaźnika jakości z pojedynczej realizacji nie myli się już z rozkładem. (CEP/2DRMS celowo nie są podawane, ponieważ wymagają modelu 3-osiowego, który jest w planach rozwoju.)Tryb playgroundu z przewodnikiem. Playground w przeglądarce nie rzuca już użytkownika na surową ścianę TOML: pasek „Zacznij tutaj” z kartami scenariuszy jednym kliknięciem wczytuje i uruchamia przykład, suwaki udostępniają uniwersalne pokrętła (ziarno, próg czasu) bez dotykania TOML, uwaga „Jak to czytać” wyjaśnia wynik, a pełny TOML jest o jedno rozwinięcie dalej. Każdy przebieg można udostępnić: Kopiuj link do udostępnienia koduje cały scenariusz we fragmencie URL (nic nie jest wysyłane), więc link odtwarza dokładnie ten przebieg po wczytaniu. Kodek ma testy jednostkowe (
web/share.test.mjs, uruchamiane w CI).N-wymiarowe przeglądy parametrów (
src/sweep.rs).nd_sweepoblicza metrykę na pełnym iloczynie kartezjańskim kilku zakresówSweepAxis(wieloparametrowe studium kompromisów), w kolejności wierszowej, deterministycznie. Addytywnie: istniejące API przeglądu 1-wymiarowego pozostaje bez zmian. Przedziały ufności bootstrap dla poszczególnych węzłów i uogólnienie poza pakiet zegara pozostają w planach rozwoju.Prawdziwy migawkowy RAIM (
src/raim.rs). Prawdziwy autonomiczny monitoring integralności odbiornika w dziedzinie pozycji: buduje geometrię kierunków widzenia do widocznych satelitów, tworzy rozwiązanie najmniejszych kwadratów i reszty, uruchamia test detekcji uszkodzeń na resztach χ² (dokładny próg z niezależnej od zależności niepełnej funkcji gamma dla χ²/niecentralnego χ²) i oblicza poziomy ochrony poziomy i pionowy (HPL/VPL) oparte na nachyleniu, z biasem niewykrytego zdarzenia wyprowadzonym dla skonfigurowanych P_fa/P_md. Jest to odrębne od wskaźnika Integrity z potoku scenariuszy, opartego na samospójności filtra, i jeszcze nie jest z nim połączone; wykluczanie uszkodzeń, budżetowanie limitu alarmowego/P_HMI oraz ARAIM pozostają w planach rozwoju.Zestaw stabilności częstotliwości: MDEV, TDEV, HDEV + przedziały ufności (
src/allan.rs). Obok overlapping ADEV: zmodyfikowane odchylenie Allana (odróżnia biały szum fazy od szumu migotania), odchylenie czasu (TDEV = tau/sqrt(3) * MDEV) oraz odchylenie Hadamarda (dokładnie odrzuca liniowy dryf częstotliwości i jest zbieżne dla rozbieżnych typów szumu czerwonego). Przedziały ufności oparte na χ² (deviation_ci) używają niezależnej od zależności pary kwantyli rozkładu normalnego/χ² (Acklam + Wilson-Hilferty) z zachowawczym edf dla nienakładających się próbek; edf zależne od typu szumu i zgodność numeryczna ze Stable32 pozostają w planach rozwoju.Redukcja układów odniesienia (
src/frames.rs). Obrót TEME↔ECEF oparty na GMST (z tym samym czasem gwiazdowym IAU-1982 co propagator), dokładna transformacja WGS-84 geodezyjny↔ECEF ze zainicjowaną metodą Bowringa odwrotnością iteracyjną (dokładność maszynowa na wszystkich wysokościach, w tym MEO/GEO) oraz geodezyjny obserwator stacji naziemnej zwracający azymut / elewację / odległość w lokalnym układzie East-North-Up. Ruch bieguna i nutacja poniżej sekundy łuku nie są stosowane (tylko GMST, poniżej kilometra na śladzie naziemnym); precyzyjny łańcuch CIO w ITRF jest w planach rozwoju.Podstawa skal czasu (
src/timescales.rs). Niezależne od zależności API dat juliańskich (cywilna gregoriańska ↔ JD, MJD), pełna historia sekund przestępnych IERS (UTC↔TAI, 10 s w 1972 do 37 s od 2017), zdefiniowane przesunięcie TAI→TT, poprawka UT1 przez dostarczone DUT1 oraz kąt obrotu Ziemi IAU-2000. To jest podłoże czasowe, na którym opiera się redukcja do układu ziemskiego (planowana). Chwile są datami juliańskimi o pojedynczymf64(rozdzielczość ok. 50 µs w pobliżu obecnej epoki; dwuczęściowe JD jest w planach rozwoju), a epoka sekundy gumowej sprzed 1972 nie jest modelowana; oba ograniczenia są udokumentowane w module.Odtwarzalność i pochodzenie. Deterministyczny generator SBOM CycloneDX (
scripts/gen-sbom.sh) oraz atest pochodzenia kompilacji SLSA dla pliku binarnego wydania i SBOM; łańcuch narzędzi wydania jest przypięty tak, by zgadzał się z CI. Gwarancje determinizmu, zastrzeżenie dotyczącelibmmiędzy platformami i podejście z przypinaniem wartości wzorcowych są udokumentowane wdocs/REPRODUCIBILITY.md.Testy oparte na własnościach i fuzz (
tests/property.rs). Deterministyczne testy losowe (bez nowej zależności) sprawdzają niezmienniki na tysiącach danych wejściowych: parsery TLE i scenariuszy nigdy nie panikują na śmieciach, danych spoza ASCII, zmutowanych ani uciętych;TimeCfg::validatenigdy nie panikuje na siatkach NaN/inf/ujemnych; suma kontrolna TLE jest spójna i dotyczy wyłącznie kolumny 69; obiegi w obie strony geodezyjny↔ECEF i obrót TEME→ECEF zachowują normę na całym globie i w szerokim paśmie wysokości.
Zmienione#
- Testy wzorcowe przypinają wskaźniki jakości pole po polu dla czterech scenariuszy odniesienia (z tolerancją pochłaniającą wahania
libmmiędzy platformami), zastępując dawne kontrole wyłącznie nierównościowe, dzięki czemu cicha regresja numeryczna jest wychwytywana natychmiast. schema_versionw artefaktach wyniku podniesiono z0.1do0.7(był zamrożony, gdy silnik szedł naprzód).cargo-denyteraz odrzuca (zamiast ostrzegać) wycofane (yanked) zależności.- Nowa dokumentacja:
CAPABILITY.md(mapa zakresu, uczciwie),SCHEMA.md(opis pól wyniku),INTEGRITY.md,QUANTUM-MODELS.md,REAL_TLE_GUIDE.md. Strażnik CI zgłasza błąd, jeśli plakietka wersji w README rozjedzie się zCargo.toml.
0.7.0 - 2026-06-02#
Dodano#
- Propagacja orbit SGP4/SDP4. Pełna implementacja standardowego propagatora uproszczonych zaburzeń, niezależna od zależności: SGP4 dla bliskiej Ziemi wraz z rozszerzeniem SDP4 dla głębokiej przestrzeni (zaburzenia sekularne i okresowe księżycowo-słoneczne oraz rezonans geopotencjału 12 h / 24 h). Sprawdzona względem oficjalnych wektorów weryfikacyjnych AIAA 2006-6753 („Revisiting Spacetrack Report #3”): wszystkie 666 stanów wzorcowych w przypadkach bliskiej Ziemi, głębokiej przestrzeni, rezonansowych i kodów błędów zgadza się z najgorszym błędem pozycji ok. 4 mm. Jest to model, względem którego definiowane są zestawy elementów dwuliniowych, więc odwzorowuje rzeczywiste konstelacje, zwłaszcza orbity GNSS o okresie ok. 12 h, które są głęboką przestrzenią i rezonansowe, a których wcześniejszy model dwóch ciał + sekularnego J2 nie potrafi uchwycić.
- Konstelacja podana jako pełne zestawy elementów dwuliniowych (linia 1 + linia 2) jest teraz propagowana SGP4/SDP4; konstelacja podana jako elementy tylko z linii 2 zachowuje analityczną keplerowską propagację dwóch ciał, bez zmian. Obie formy można mieszać w jednym bloku. Nowy scenariusz odniesienia
orbit-sgp4-gps.toml(konstelacja MEO podobna do GPS w rzeczywistym formacie dwuliniowym, propagowana SGP4): wystarczy wstawić aktualny zestaw Celestrak „gps-ops”, aby badać działającą konstelację.
0.6.0 - 2026-06-02#
Dodano#
- Demonstrator aktywnego ataku spoofing. Nowy rodzaj scenariusza
spoofwstrzykuje narastający fałszywy spoofing czasu i uruchamia dla każdego zegara monitor integralności wspomagany zegarem, podając, czy i kiedy spoofing jest wykrywany oraz czy dociera do specyfikacji operacyjnej niewykryty, co zamienia wskaźnik jakości Security w konkretną demonstrację ataku i obrony. Nowy scenariusz odniesieniaspoof-attack.toml. - Dostępność wielu konstelacji. Scenariusz orbitalny może łączyć kilka konstelacji (lista
[[constellations]]obok podstawowej[constellation]) dla dostępności wielosystemowego GNSS i rozmycia dokładności, np. GPS plus Galileo. Nowy scenariusz odniesieniaorbit-multignss.toml.
0.5.0 - 2026-06-02#
Dodano#
- Raport w postaci karty wyników HTML. Każdy przebieg tworzy teraz także samodzielną kartę wyników HTML z marką: jednoliniowe podsumowanie, wykres (osadzony jako bierny obraz data-URI) i pełny JSON, zapisywane przez CLI obok JSON i SVG. Udostępnialny artefakt w jednym pliku dla wyniku studium lub aneksu.
- Łączny estymator fuzji czujników. Nowy rodzaj scenariusza
fusionuruchamia jeden rekurencyjny filtr Kalmana jako rozwiązanie nawigacyjne: łączy stan zegara[phase, frequency]i stan pozycji[position, velocity], dyscyplinowany przez GNSS (uczący się przesunięcia częstotliwości i prędkości) i wspomagany optycznym transferem czasu podczas przerwy, zamiast składać niezależne predyktory. Podaje połączony holdover czasu/pozycji oraz integralność ze wspólnej kowariancji. Nowy scenariusz odniesieniafusion-pnt.toml. - Pełniejszy model szumu IMU. Akcelerometr modeluje teraz pozostałe człony wariancji Allana poza stałym biasem i błądzeniem przypadkowym prędkości: niestabilność biasu (poziom migotania 1/f przy standardowym współczynniku niestabilności biasu Allana, z ponownym użyciem syntezy migotania zegara) oraz błądzenie przypadkowe przyspieszenia. Nowe opcjonalne pola scenariusza inercjalnego
bias_instabilityiq_aa; ponowne wyznaczenie pozycji GNSS rekalibruje resztkowy dryf biasu. - Rzeczywista geometria konstelacji z TLE. Konstelację można podać jako blok zestawów elementów dwuliniowych (standardowy format NORAD/Celestrak) w polu
tle, dzięki czemu dostępność i rozmycie dokładności używają opublikowanej geometrii rzeczywistej konstelacji zamiast syntetycznego wzoru Walker. Silnik wczytuje uśrednione elementy keplerowskie każdego TLE i propaguje je metodą dwóch ciał, a nie SGP4, co jest uzasadnione dla studium migawkowego od wspólnej epoki. Nowy scenariusz odniesieniaorbit-real-tle.toml.
0.4.0 - 2026-06-02#
Dodano#
- Przeglądy parametrów dla studiów kompromisów. Nowy rodzaj scenariusza
sweepzmienia jeden parametr (threshold_ns,duration_s,quantum_q_wflubclassical_q_wf) w zakresie liniowym lub logarytmicznym i zapisuje wybrany wskaźnik jakości w każdym punkcie dla obu zegarów, tworząc wykres porównawczy „jak holdover skaluje się ze stabilnością zegara?”, którego potrzebuje kompromis projektowy. Nowy scenariusz odniesieniasweep-clock-stability.toml. - Pasma ufności Monte Carlo. Scenariusz holdover zegara może uruchomić wiele realizacji (nowe opcjonalne pole
runs): każdy wskaźnik jakości jest wtedy podawany jako średnia z rozrzutem między 5. a 95. percentylem, a wykres zacienia obwiednię błędu 5–95% wokół mediany dla każdego zegara. Domyślnie pozostaje pojedynczy przebieg. Nowy scenariusz odniesieniaclock-ensemble.toml. - Orbity mimośrodowe i dryf J2. Typ orbity jest teraz pełną orbitą keplerowską (półoś wielka, mimośród, nachylenie, RAAN, argument perygeum, anomalia średnia), propagowaną przez rozwiązanie równania Keplera, z opcjonalną sekularną regresją węzłów J2 i precesją apsyd. Nowe opcjonalne pola scenariusza
eccentricity,argp_degij2oraz scenariusz odniesieniaorbit-molniya.toml(użytkownik o okresie 12 h, silnie mimośrodowy, o krytycznym nachyleniu). Orbity kołowe zachowują pierwotną ścieżkę w postaci zamkniętej bit w bit. - Pakiet hybrydowy (połączone PNT) podaje teraz Integrity i Security, więc wszystkie cztery pakiety obejmują pełny zestaw operacyjnych wskaźników jakości. Integrity to zawieranie w granicy ochrony kanału czasu przez estymator Kalmana dyscyplinowany do prawdy, gdy GNSS jest nominalny, i zakotwiczany ponownie (luźniej) przy każdej optycznej resynchronizacji; jego granica obejmuje poziom szumu pomiarowego łącza, więc zegar znacznie lepszy od łącza jest oceniany względem rzeczywistego szumu dostarczonego rozwiązania. Security to wskaźnik wykrywania spoofingu wspomaganego zegarem względem specyfikacji czasu.
Zmienione#
- Notatki wydania są teraz generowane ze starannie przygotowanej sekcji CHANGELOG dla tagu (
scripts/changelog-extract.sh), więc każde wydanie na GitHubie wyróżnia to, co się zmieniło, zamiast wypisywać surowe commity.
0.3.0 - 2026-06-02#
Dodano#
- Wskaźnik jakości Security (wcześniej niewypełniony): wskaźnik wykrywania spoofingu wspomaganego zegarem dla pakietów zegara holdover i orbity. Modeluje monitor integralności, który porównuje czas pochodzący z GNSS z własną predykcją zegara na biegu swobodnym w oknie koherentnym; próg detekcji łączy uśredniony szum pomiaru z niepewnością biegu swobodnego zegara, więc cichszy zegar wykrywa mniejsze, wolniejsze spoofingi czasu. Wskaźnik jest podawany w
[0, 1]względem specyfikacji czasu, co uzupełnia sześć operacyjnych wskaźników jakości. - Dokładność pozycji wyprowadzona z geometrii dla pakietu orbity: z geometrii kierunków widzenia do widocznych satelitów tworzy macierz projektu i jej czynnik kowariancji
Q = (HᵀH)⁻¹, dając współczynniki rozmycia dokładności (GDOP/PDOP/HDOP/VDOP/TDOP). Dokładność pozycji to pozycyjny DOP przeskalowany konfigurowalnym błędem odległości równoważnym użytkownika (nowe opcjonalne pole scenariuszasigma_uere_m). Wynik orbity niesie teraz podsumowanie geometrii (ułamek próbek z rozwiązaniem, najlepszy i medianowy PDOP oraz sigma pozycji). - Playground w przeglądarce (
web/), który uruchamia silnik po stronie klienta jako WebAssembly: wybierz scenariusz odniesienia lub edytuj TOML, uruchom go i zobacz podsumowanie, wykres oraz pełny JSON, bez wysyłania czegokolwiek. Przepływpagesbuduje go i publikuje w GitHub Pages, a nowy eksport WebAssemblysummaryzasila odczyt. - Opisane osie y wykresów SVG: linie siatki, liczbowe etykiety podziałek i tytuł osi z jednostkami (przez wspólną funkcję pomocniczą
chart), dzięki czemu wielkości da się odczytać. - Przepływ publikowania pakietów (
publish) do crates.io, PyPI i npm, każdy bramkowany tokenem swojego rejestru i uruchamiany opublikowanym wydaniem.
0.2.0 - 2026-06-02#
Dodano#
- Poziom migotania (1/f) FM dla modelu błędów zegara, syntetyzowany jako suma rozmieszczonych logarytmicznie procesów Ornsteina–Uhlenbecka i skalibrowany tak, by płaski poziom odchylenia Allana leżał na konfigurowalnej wartości. Domyślnie wyłączony; włączany dla każdego zegara przez opcjonalne pole scenariusza
flicker_floor. - Kanał żyroskopu dla modelu inercjalnego: resztkowy bias żyroskopu i błądzenie przypadkowe kąta wywołują błąd orientacji (przechyłu), który sprzęga grawitację w poziomy błąd siły właściwej, dominujący mechanizm narastania błędu w strapdown. Domyślnie wyłączony; włączany dla każdego czujnika przez opcjonalne pola
gyro_biasiq_arw. - Dwustanowy (faza, częstotliwość) estymator zegara Kalmana z dokładną dyskretyzacją szumu procesu van Loana. Bieg swobodny ze znanego stanu dokładnie odtwarza analityczny wzrost błędu holdover (
q_wf*T + q_rw*T^3/3), a filtr dodatkowo podaje bieżącą granicę niepewności 1-sigma. - Przebieg zegara podaje teraz wskaźnik jakości Integrity (wcześniej niewypełniony): ułamek próbek przerwy, których błąd mieści się w granicy ochrony 3-sigma filtra, udostępniany w JSON wyniku i w podsumowaniu CLI.
- Dostępność GNSS wyprowadzona z geometrii: propagacja orbity kołowej, generator konstelacji Walker-delta i widoczność w linii prostej (zasłanianie przez Ziemię plus maska elewacji) dają oś czasu dostępności z rzeczywistej geometrii orbitalnej. Nowy rodzaj scenariusza
orbiti scenariusz odniesieniaorbit-gnss-challenged.toml(statek kosmiczny wewnątrz powłoki GNSS z przerywanym pokryciem). - Opcjonalne rozszerzenie Pythona (PyO3, abi3) udostępniające
run,run_fulliversion, pakowane maturin (pyproject.toml) i budowane dla Linuksa, macOS i Windows przez przepływwheelsuruchamiany tagiem wydania. Wiązanie jest opcjonalną zależnością za bramką funkcji: domyślna kompilacja, testy i bramka audytu zależności pozostają nienaruszone. - Opcjonalny moduł WebAssembly (wasm-bindgen) udostępniający
run,chart_svgiversion, budowany wasm-pack pod funkcjąwasm;getrandomjest bramkowany celem, by używać przeglądarkowego źródła entropii nawasm32. - Wspólne wywołanie
api::run_tomlużywane przez CLI i oba wiązania, więc wiersz poleceń i wiązania nie mogą się rozjechać.
Zmienione#
- Ocena holdover uwzględnia teraz segmenty: osie czasu przerw są dzielone na ciągłe segmenty przy ponownym uzyskaniu GNSS, a podawany holdover to najgorszy (najkrótszy) bieg swobodny spośród nich. Scenariusze z pojedynczą przerwą pozostają bez zmian. Dotyczy ocen zegara, inercjalnej i hybrydowej.
- Podawane
kindmodelu inercjalnego to terazinertial(byłoaccelerometer), co odzwierciedla połączone kanały akcelerometru i żyroskopu.
0.1.0 - 2026-06-01#
Wydanie początkowe.
Dodano#
- Deterministyczny silnik symulacji dla hybrydowego kwantowo-klasycznego PNT: wspólny interfejs modeli błędów, deklaratywne scenariusze dostępności GNSS, estymatory holdover / nawigowania zliczeniowego oraz ocena wskaźników jakości względem standardowych operacyjnych kryteriów PNT. Wyniki są odtwarzalne z
scenario + seed + engine version(wersjonowany, samoopisujący się JSON z haszem scenariusza) i renderowane jako wykresy SVG. CLI przydziela scenariusze wedługkind. - Cztery pakiety czujników, każdy skalibrowany do opublikowanych danych i sprawdzony względem standardowej zależności:
- Holdover zegara — biały FM, błądzenie przypadkowe FM i starzenie liniowe; sprawdzone za pomocą overlapping odchylenia Allana (Riley, NIST SP 1065). Chipowy zegar atomowy kontra zegar optyczny na sieci strontowej.
- Nawigowanie zliczeniowe inercjalne — resztkowy bias + błądzenie przypadkowe prędkości, dwukrotnie całkowane do błędu pozycji; sprawdzone względem zależności Grovesa dla wzrostu błędu. Akcelerometr z zimnych atomów kontra akcelerometr klasy nawigacyjnej.
- Transfer czasu — jitter czasowy łącza optycznego kontra RF → precyzja synchronizacji → pomiar odległości jednokierunkowy.
- Fuzja hybrydowa (zwieńczenie) — połączony zestaw PNT, który musi utrzymać zarówno czas, jak i pozycję, z opcjonalnym wspomaganiem zegara optycznym transferem czasu między satelitami.
- Jeden cytowany scenariusz odniesienia na pakiet w
scenarios/, przy czym każdy parametr liczbowy niesie recenzowaneprovenance. - Strażnicy odtwarzalności i higieny repozytorium; CI (format, clippy, testy, strażnicy, MSRV) oraz bramkowany tagiem potok wydania, który ponownie uruchamia wszystkie kontrole.
- Dokumentacja: README z diagramami architektury, raport stanu walidacji, przewodnik dla współtwórców, polityka bezpieczeństwa i kodeks postępowania; licencja Apache-2.0; szablony zgłoszeń/PR i konfiguracja Dependabot.
- Neutralność wobec dostawców w całości; recenzowane cytowania naukowe i metrologiczne zachowano.
- Higiena licencji Apache-2.0: nagłówki SPDX we wszystkich źródłach, plik
NOTICEz zastrzeżeniem znaku towarowego, poświadczenie Developer Certificate of Origin (DCO) dla wkładów oraz egzekwowanie przezcargo-denylicencji/zaleceń dotyczących zależności w CI. - Pozycjonowanie open-core (README): bezpłatny silnik na licencji Apache-2.0 oraz dostępne komercyjne wsparcie, integracja i zastrzeżone rozszerzenia od Ashforde OÜ, utrzymywane z usług, a nie z opłat licencyjnych.
CITATION.cff, aby oprogramowanie można było cytować.