Kampanie
Pojedynczy scenariusz odpowiada na jedno pytanie o jednej sytuacji. Misja to ciąg sytuacji, a badanie projektowe to ich rodzina. Rodzaj scenariusza campaign składa istniejące rodzaje w jeden przebieg bez ponownej implementacji któregokolwiek z nich: każdy element jest zwykłą tabelą scenariusza z własnym kind, wywoływaną przez api::run_toml dokładnie tak, jak uruchomiłoby ją kshana <file>.toml, a kampania tylko odczytuje liczby z dokumentów wyników.
Kampania jest MODELLED. Jej tożsamości składania są testowane (poniżej), ale łączenie faz w łańcuch jest wyborem modelowania, a każda faza jest tak dobra, jak rodzaj, który ją uruchomił.
Uruchom ją jak każdy inny scenariusz:
kshana scenarios/campaign-jam-spoof-holdover-integrity.toml
# writes .result.json, .chart.svg, .report.html and .report.json next to the file
Kampania może zawierać dowolną kombinację czterech sekcji; kampania bez żadnej uruchamia się, a jej podsumowanie mówi, że nic nie złożyła.
[[phases]]: misja połączona w łańcuch na jednej osi czasu#
Każda faza uruchamia jeden lub więcej scenariuszy w oknie wspólnej osi czasu misji, na przykład zegar w holdover i bezwładnościowy system nawigacji (INS) dryfujący w tym samym czasie. Wyniki każdego przebiegu są wczytywane do nazwanych kanałów, umieszczane w czasie początku fazy i przepróbkowywane na wspólną siatkę ([timeline] step_s) przez zatrzymanie zerowego rzędu: czas siatki przyjmuje najnowszą próbkę przebiegu fazy będącej właścicielem, nie późniejszą niż on, i jest pusty (null), gdy żaden przebieg tej fazy nie dostarcza kanału.
| Kanał | Jednostka | Czym jest | Źródło ustawienia wstępnego |
|---|---|---|---|
time_error_ns |
ns | błąd czasu zegara | clock: <side>.series[].error_ns; spoof: <side>.series[].offset_ns |
guard_ns |
ns | zabezpieczenie błędu czasu | własny threshold_ns przebiegu |
cn0_dbhz |
dB-Hz | średni efektywny stosunek nośnej do gęstości szumu (C/N0) dla widocznych satelitów | jamming: średnia z epochs[].sats[].cn0_effective_dbhz |
cn0_floor_dbhz |
dB-Hz | dolna granica utraty śledzenia | jamming: tracking_threshold_dbhz scenariusza, gdy je podaje |
tracking |
liczba | satelity nadal śledzone | jamming: epochs[].tracking |
protection_level_m |
m | pionowy poziom ochrony | integrity: epochs[].vpl_m |
alert_limit_m |
m | pionowy limit alarmowy | integrity: al_v_m |
position_error_m |
m | błąd pozycji | gnss-ins: <side>.series[].error_m |
position_threshold_m |
m | próg błędu pozycji | gnss-ins: threshold_m |
alarm |
1 | 1, gdy którykolwiek monitor fazy alarmuje | zob. poniżej |
<side> to classical, chyba że przebieg ustawia side = "quantum". Każda inna wielkość jest odczytywana jawnym wpisem [[phases.runs.series]]: ścieżka czasu z jednym [] nazywającym wiersze (epochs[].t), ścieżka wartości dzieląca te wiersze lub skalar rozgłoszony na każdy wiersz (przedrostek input: odczytuje scenariusz przebiegu zamiast jego wyniku), opcjonalna redukcja (mean, min, max, count) dla kilku wartości w jednym wierszu, skala oraz jednostka dla kanału, którego kampania nie zna.
Alarmy pochodzą z trzech miejsc, łączonych logicznym OR w obrębie fazy:
- flagi ustawień wstępnych odczytane z przebiegu:
jammingalarmuje, gdy śledzi mniej niż cztery satelity (własna definicja dostępności);integrityalarmuje w epokach, które oznacza jako niedostępne; - reguły ustawień wstępnych na kanałach fazy, oceniane po
carry:clockalarmuje, gdy bezwzględny błąd czasu przekraczaguard_ns;gnss-ins, gdy błąd pozycji przekraczaposition_threshold_m; jawne reguły trafiają do[[phases.runs.alarms]]; - zdarzenia alarmujące:
spoofzgłasza jedno przydetect_time_sswojego monitora wspomaganego zegarem;spoof-detectzgłasza jedno na początku fazy, gdy jego scalona decyzja alarmuje.
Stan jest przekazywany między fazami na trzy jawne sposoby:
carry = ["time_error_ns"]dodaje wartość kanału z końca poprzedniej fazy do wartości tej fazy. Faza zegara, którą przeciągnął spoofer, jest punktem, od którego zaczyna się holdover. Dodanie przesunięcia jest dokładne dla fazy zegara, który całkuje częstotliwość; dla błędu pozycji zakłada, że oba błędy są współliniowe, co jest przypadkiem pesymistycznym.[[phases.handoff]]zapisuje liczbę z poprzedniej fazy (channel:<name>dla wartości końcowej kanału lub dowolnej ścieżki wyniku poprzedniego przebiegu) do klucza z kropkami w scenariuszu tej fazy przed jego uruchomieniem, z opcjonalną skalą i przesunięciem.end_at = "<result path>"kończy fazę w czasie obliczonym przez przebieg, ograniczonym doduration_s. Dołączona misja kończy swoją fazę spoofingu przyclassical.detect_time_s.
skip_s odrzuca pierwsze sekundy własnej osi czasu przebiegu (rozgrzewkę) przed zerem czasu fazy.
Dołączona misja#
scenarios/campaign-jam-spoof-holdover-integrity.toml uruchamia 18 scenariuszy składowych w sześciu fazach na siatce 10 s:
| Faza | Przebiegi | Co pokazuje oś czasu |
|---|---|---|
| nominalny, 600 s | clock, jamming (bez zagłuszacza), integrity |
błąd czasu 0 ns; C/N0 43,0 dB-Hz wobec dolnej granicy 25 dB-Hz; pionowy poziom ochrony od 9,1 do 21,6 m wobec limitu alarmowego 50 m |
| zagłuszanie, 600 s | to samo, zagłuszacz o mocy -30 dBW, 1 km | C/N0 spada do 27,7 dB-Hz, wszystkie 8 satelitów nadal śledzonych |
spoofing, zakończony po 370 s przez end_at |
spoof (rampa czasu 0,1 ns/s), spoof-detect, jamming |
błąd czasu narasta do 36 ns; detektor radiowy alarmuje na początku fazy, monitor wspomagany zegarem po 370 s |
| holdover, 1800 s | clock (odmówiony, przenosi 37,0 ns), gnss-ins (jednostka taktyczna w dryfie), jamming przy 10 dBW |
utracono wszystkie satelity (C/N0 około -12 dB-Hz); błąd czasu od 36,4 do 62,7 ns wobec zabezpieczenia 50 ns; błąd pozycji do 24 km |
| integrity-alarm, 600 s | clock (przenosi 59,6 ns), jamming i integrity z maską 25 deg |
5 satelitów śledzonych; poziom ochrony od 19 do 135 m, brak wartości w 18 z 60 czasów siatki; przeniesiony błąd czasu, od 52,1 do 61,7 ns, pozostaje powyżej zabezpieczenia 50 ns, więc alarm trwa przez całą fazę |
| odzyskiwanie, 600 s | clock, jamming (bez zagłuszacza), integrity |
błąd czasu wrócił do 0 ns; alarm wyciszony |
Przebiegi integralności używają własnej trajektorii użytkownika z przykładu integrity (kołowa trajektoria na wysokości 0,4 km), a nie stałego stanowiska odbiornika zagłuszania, a maska 25 deg zastępuje częściowe niebo odbiornika odzyskującego śledzenie. Są to wybory scenariusza, podane w pliku.
Misja napędzana widmem pasma L#
scenarios/campaign-spectrum-holdover-integrity.toml uruchamia 8 scenariuszy składowych w trzech fazach na siatce 1 s, z C/N0 dla GPS L1 C/A i Galileo E1 odczytywanym z rodzaju spectrum (zob. SPECTRUM.md), a nie z tabeli rodzaju jamming dla poszczególnych satelitów. Zagłuszacze są takie jak w scenarios/l-band-waterfall-jamming.toml.
| Faza | Przebiegi | Co pokazuje oś czasu |
|---|---|---|
początek, zakończony po 10 s przez end_at |
clock, spectrum (czirp od 10 s), integrity |
L1 C/A 43,48 i E1 44,73 dB-Hz; faza kończy się przy własnej pierwszej utracie L1 C/A w przebiegu widma (timeline.bands[0].first_loss_t_s); poziom ochrony 21,6 m wobec 50 m |
| holdover, 600 s | clock (odmówiony, przenosi błąd początkowy, tu 0 ns), spectrum (czirp włączony) |
L1 C/A 3,38 i E1 4,44 dB-Hz, oba poniżej dolnej granicy 25 dB-Hz; błąd czasu od -0.07 do 5,06 ns wobec zabezpieczenia 50 ns; alarm trwa |
| galileo-fallback, 300 s | clock (zsynchronizowany ponownie), spectrum (ton CW na nośnej L1), integrity na konstelacji typu Galileo Walker 24/3/1 |
L1 C/A utrzymany na 17,98 dB-Hz, E1 wrócił do 44,73 dB-Hz; poziom ochrony od 6,1 do 17,7 m; alarm wyciszony |
Odzyskanie E1 pod tonem CW opiera się na traktowaniu widma ciągłego w rodzaju widma: ton leży w zerze widma MBOC i niczego nie sprzęga. Prawdziwy ton sprzęgałby się przez linie widmowe kodu; jest to podane w pliku i w SPECTRUM.md.
[sweep]: siatka parametrów dla dowolnego rodzaju#
Od jednego do trzech kluczy scenariusza w zapisie z kropkami, każdy w zakresie liniowym lub logarytmicznym, na tych samych wartościach osi, których używa rodzaj sweep-nd. Każda oś ma nazwę i jednostkę; każda metryka ma nazwę i ścieżkę wyniku, a jej jednostka jest odczytywana z własnego bloku jednostek badanego rodzaju, chyba że kampania deklaruje własną. Przy runs > 1 każdy węzeł jest zasianym zespołem Monte Carlo (realizacja k przy ziarnie węzła plus k), raportowanym ze statystykami poniżej. scenarios/campaign-sweep-jammer-power.toml przegląda zagłuszacz w odległości 1 km od odbiornika od -50 do +10 dBW: średni stosunek zagłuszacza do sygnału zmienia się dokładnie o 1 dB na dB (od 12,2 do 72,2 dB), a dostępność spada z 1 do 0 między -30 a -25 dBW.
Klucz z kropkami może indeksować tablicę tabel według położenia: system.2.sisre_m to sisre_m trzeciej tabeli [[system]], a case.0.system.0.shell.0.altitude_km sięga trzy poziomy w głąb.
[monte_carlo]: zasiany zespół#
Realizacja k uruchamia scenariusz z kluczem ziarna ustawionym na base_seed + k, zgodnie z konwencją, której już używa zespół zegara, dzięki czemu zespół odtwarza się dokładnie. Każda metryka podaje średnią, odchylenie standardowe populacji, percentyle 5., 50. i 95. metodą najbliższej rangi, percentylowy przedział ufności bootstrap 95% dla średniej o stałym ziarnie (2000 prób) oraz domyślnie każdą próbkę w kolejności ziaren. Ścieżki wyniku mogą indeksować tablice: classical.series[-1].error_ns to ostatnia próbka.
[compose]: kilka scenariuszy we wspólnych warunkach#
Nazwane wartości wspólne (liczba lub tablica liczb, z jednostką) są zapisywane w każdym elemencie pod kluczami, do których je wiąże, więc elementy nie mogą się nie zgadzać co do wspólnego warunku. Każdy element jest uruchamiany, a dla każdej metryki podsumowanie zbiorcze podaje najmniejszą, największą i średnią wartość po elementach, wskazując najlepszy i najgorszy. scenarios/campaign-shared-jammer-sea-road.toml umieszcza jeden zagłuszacz 8 dBW między statkiem w Zatoce Fińskiej (około 30 km dalej) a samochodem na nadmorskiej drodze w Helsinkach (około 50 km): statek traci każdego satelitę (średni stosunek zagłuszacza do sygnału 39,0 dB), a samochód zachowuje co najmniej czterech (34,6 dB).
[optimize]: najlepsza wartość jednej metryki#
Od jednego do trzech kluczy scenariusza w zapisie z kropkami, każdy ograniczony do [lo, hi] w skali lin lub log, jest przeszukiwanych pod kątem najlepszej wartości jednej metryki (goal = "minimize", "maximize" lub "target", co minimalizuje odległość od target).
Są dwie metody:
method = "grid"uruchamia każdy węzeł siatki ostepsna klucz, na wartościach osi przeglądu.method = "nelder-mead"(domyślna) uruchamia deterministyczny sympleks Neldera–Meada we współrzędnych znormalizowanych do [0, 1] na klucz. Punkty próbne są rzutowane na pudełko. Sekcja przyjmujemax_evals, początkowysteporaz tolerancje zatrzymaniaftolixtol.
Przebieg, którego metryka jest nieobecna lub nieskończona, otrzymuje najgorszy wynik i pozostaje w śladzie. Przy runs > 1 metryką jest średnia z tych samych ziaren przy każdej ewaluacji. Wynik podaje best_coords, best_metric, best_score, evals, stop_reason oraz każdą ewaluację w trace.
scenarios/campaign-optimize-link-budget.toml przeszukuje zasięg i szybkość transmisji danych pod kątem zapasu łącza 3 dB. Optimum jest lokalne względem pudełka i punktu startu. Jest to MODELLED, nigdy twierdzenie globalne.
Protokół i jego wstępnie zarejestrowane progi znajdują się w docs/design/evidence/cap32-optimize/. Test to tests/campaign_optimize_reference.rs. Wyniki:
- rozwiązanie celu 1-D zgadza się ze wzorem zamkniętym do 6e-15;
- metoda siatki zgadza się co do bitu z niezależną pętlą przeszukiwania wyczerpującego;
- sympleks radzi sobie co najmniej tak dobrze jak siatka 41 × 41, w około jednej dziesiątej jej przebiegów.
Próg 1-D rundy 1 jest zapisany jako NOT MET: wstępnie zarejestrowane pudełko wykluczało rozwiązanie.
Odtwarzalność#
Każdy wynik kampanii zawiera scenario_hash, czyli SHA-256 (Secure Hash Algorithm 2, 256-bitowy skrót) kanonicznej postaci JavaScript Object Notation (JSON) dokumentu kampanii (kolejność kluczy i formatowanie jej nie zmieniają), oraz blok reproducibility z liczbą przebiegów składowych i run_digest, czyli SHA-256 ze skrótów wyników wszystkich elementów w kolejności dyspozytora. Dwa przebiegi o tym samym skrócie dały identyczne co do bajta wyniki elementów. Każdy przebieg fazy zapisuje też swój rodzaj, własny scenario_hash, jeśli rodzaj go ma, oraz SHA-256 swojego dokumentu wyniku. Każda liczba w dokumencie ma wpis jednostek.
Rdzeń jest sekwencyjny i nie czyta plików, więc kampania działa bez zmian w kompilacji WebAssembly. Kampanie nie mogą zawierać kampanii.
Eksporty#
--export na kampanii zapisuje każdy scenariusz składowy, który ma geometrię, jako osobny zestaw plików, z etykietą elementu wstawioną przed przyrostkiem formatu: każdy przebieg fazy (<phase> lub <phase>-<k>, gdy faza ma kilka przebiegów), scenariusz bazowy przeglądu (sweep), scenariusz Monte Carlo (monte-carlo) i każdy złożony element (jego własna etykieta, z zapisanymi wartościami wspólnymi, które wiąże). Element identyczny z wcześniejszym jest zapisywany raz; przekazania oraz wartości przeglądu lub ziarna stosowane w czasie przebiegu nie są w eksportowanych scenariuszach.
kshana scenarios/campaign-shared-jammer-sea-road.toml --export kml
# after the usual result, chart and report files:
# wrote scenarios/campaign-shared-jammer-sea-road.ship-strait.kml
# wrote scenarios/campaign-shared-jammer-sea-road.car-coast-road.kml
Format, którego żaden z elementów nie potrafi opisać, jest odrzucany z podaniem tego powodu. Tabela dla poszczególnych scenariuszy znajduje się w INTEROP.md.
Kampanie LEO-PNT#
Piętnaście dołączonych kampanii ujmuje pytania o pozycjonowanie, nawigację i czas (PNT) na niskiej orbicie okołoziemskiej (LEO); LEO-PNT.md opisuje, co pokazuje każda z nich. Co każda uruchamia, w ujęciu wiersza poleceń:
| Scenariusz | Tryb | Pytanie |
|---|---|---|
leo-focus-data-services.toml |
złożenie, 4 elementy | dane usługi komunikatu nawigacyjnego a długość ramki |
leo-focus-fused-pnt-sisre.toml |
przegląd leo-pvt, 7 węzłów |
scalone pozycjonowanie MEO i LEO a błąd zasięgu sygnału w przestrzeni (SISRE) LEO |
leo-focus-indoor-uhf.toml |
złożenie, 2 elementy | LEO-PNT wewnątrz budynków według pasma i klasy budynku |
leo-focus-iot-eirp.toml |
przegląd leo-pass, 9 węzłów |
energia na jedno wyznaczenie pozycji w Internecie rzeczy (IoT) a moc nadawania LEO w UHF |
leo-focus-ntn-bandwidth.toml |
przegląd ntn-positioning, 9 węzłów |
pozycjonowanie w sieci nienaziemnej (NTN) a szerokość pasma sygnału referencyjnego |
leo-focus-ppp-altitude.toml |
przegląd leo-ppp, 3 węzłów |
zbieżność precyzyjnego pozycjonowania punktowego (PPP) a wysokość 192-satelitarnej warstwy LEO |
leo-resilience-gnss-jammed-leo-carries.toml |
łańcuch, 3 fazy w ciągu 2100 s | Globalny System Nawigacji Satelitarnej (GNSS) zagłuszony, użytkownika prowadzi warstwa LEO, integralność zachowana |
leo-resilience-multiband-diversity.toml |
przegląd spectrum, 13 węzłów |
różnorodność pasm LEO a zagłuszacz zaporowy w paśmie L |
leo-resilience-spoof-monitors.toml |
złożenie, 4 elementy | monitory spoofingu wobec czterech spooferów |
leo-vertical-5g-network-timing.toml |
łańcuch, 1 faza w ciągu 86 400 s | synchronizacja czasu stacji bazowych 5G: holdover i czas LEO |
leo-vertical-asset-tracking-iot.toml |
łańcuch, 3 fazy w ciągu 1440 s | śledzenie kontenerów przez LEO UHF: energia na wyznaczenie pozycji w trakcie podróży |
leo-vertical-autonomous-vehicle.toml |
łańcuch, 2 fazy w ciągu 1500 s | pojazd autonomiczny w miejskim kanionie z warstwą LEO |
leo-vertical-autonomous-vehicle-skyline.toml |
łańcuch, 2 fazy w ciągu 1800 s | ten sam miejski kanion jako płaskie odcięcie 35 deg i jako panorama city-street |
leo-vertical-critical-infrastructure-timing.toml |
łańcuch, 2 fazy w ciągu 87 000 s | synchronizacja czasu infrastruktury krytycznej: holdover z czasem LEO |
leo-vertical-polar-arctic.toml |
łańcuch, 3 fazy w ciągu 10 800 s | użytkownicy polarni i arktyczni z polarną warstwą LEO |
leo-vertical-rail-maritime.toml |
łańcuch, 3 fazy w ciągu 2520 s | użytkownicy kolejowi i morscy z warstwą LEO |
MEO to średnia orbita okołoziemska, UHF to częstotliwość ultrawysoka, a 5G to piąta generacja sieci komórkowych.
Co jest sprawdzane#
tests/campaign_composition_reference.rs przypina tożsamości składania:
- Kampania jednofazowa odtwarza samodzielny przebieg co do bitu. Dla
clock,integrityijammingdokument wyniku elementu jest identyczny co do bajta zrun_tomlna pliku scenariusza, jego skrót jest tym, który podaje kampania, a przy siatce o własnym kroku przebiegu każda wyrównana wartość równa się wartości samodzielnego szeregu (C/N0 zagłuszania równa się średniej obliczonej niezależnie z dokumentu samodzielnego). - Przegląd jednowęzłowy i złożenie jednoelementowe odczytują dokładnie samodzielną liczbę.
- Zespół o stałym ziarnie jest stabilny co do bajta, a realizacja
kjest dokładnie samodzielnym przebiegiem przyseed + k; skrót kampanii ignoruje kolejność kluczy. - Przypadek analityczny.
scenarios/campaign-monte-carlo-clock-holdover.tomluruchamia 200 ziaren zegara atomowego w skali układu scalonego z wyłącznie białym szumem częstotliwości (q_wf = 9e-20 s^2/s, Microchip SA.45s sigma_y(1 s) = 3e-10), zsynchronizowanego do 590 s i dryfującego do 3600 s. Końcowy błąd czasu ma rozkład Gaussa ze średnią 0 i odchyleniem standardowym sqrt(q_wf * 3010 s) = 16,459 ns (błądzenie losowe fazy przy białym szumie częstotliwości, National Institute of Standards and Technology (NIST) Technical Note 1337). Podany przedział, [-2.52, 1,59] ns, zawiera prawdziwą średnią 0; odchylenie standardowe próbki, 14,93 ns, daje statystykę chi-kwadrat 164,5 przy 199 stopniach swobody, mieszczącą się w dwustronnym przedziale 99% [151,37, 254,14]. Przy 3000 ziarnach ten sam scenariusz daje 16,31 ns. - Łańcuch napędzany widmem odczytuje liczby samodzielne: faza początkowa trwa dokładnie tyle, ile czas pierwszej utraty w przebiegu widma, a każda wartość L1 C/A i E1 na osi czasu równa się, z dokładnością do 1e-9 dB, wierszowi samodzielnego przykładu wodospadu dla tego samego stanu zagłuszacza (nominalny, sam czirp, sam ton CW).
- Łańcuch przekazuje stan dalej zgodnie z dokumentacją: faza spoofingu trwa dokładnie tyle, ile czas detekcji w przebiegu spoofingu, holdover przenosi dokładnie przesunięcie przebiegu spoofingu w chwili detekcji, odzyskiwanie nie przenosi niczego, a alarm trwa wszędzie tam, gdzie brakuje poziomu ochrony lub przekracza on limit alarmowy.
Te sprawdzenia pokazują, że składanie nie zmienia niczego, czego nie powinno. Nie walidują misji połączonej w łańcuch względem zmierzonej, dlatego trzy wiersze kampanii w VERIFICATION-MATRIX.md są MODELLED.