Kampaně
Jeden scénář odpovídá na jednu otázku o jedné situaci. Mise je posloupnost situací a návrhová studie je jejich rodina. Druh scénáře campaign skládá existující druhy do jednoho běhu, aniž by kterýkoli z nich znovu implementoval: každý člen je běžná tabulka scénáře nesoucí vlastní kind, rozdělovaná přes api::run_toml přesně tak, jak by ji spustilo kshana <file>.toml, a kampaň z dokumentů s výsledky pouze čte čísla.
Kampaň je MODELLED. Její kompoziční identity jsou testovány (viz níže), ale řetězení fází je modelářská volba a každá fáze je tak dobrá, jako druh, který ji spustil.
Spusťte ji jako kterýkoli jiný scénář:
kshana scenarios/campaign-jam-spoof-holdover-integrity.toml
# writes .result.json, .chart.svg, .report.html and .report.json next to the file
Kampaň může obsahovat libovolnou kombinaci čtyř sekcí; kampaň bez jediné se spustí a její shrnutí uvede, že nesložila nic.
[[phases]]: řetězená mise na jedné časové ose#
Každá fáze spouští jeden nebo více scénářů v okně sdílené časové osy mise, například hodiny v holdoveru a inerciální navigační systém (INS) setrvávající ve stejné době. Výstupy každého běhu se čtou do pojmenovaných kanálů, umístí se na počáteční čas fáze a převzorkují na společnou mřížku ([timeline] step_s) podržením nultého řádu: čas mřížky přebírá poslední vzorek běhu vlastnící fáze, který v daný okamžik nebo před ním existuje, a je null tam, kde kanál neposkytuje žádný běh dané fáze.
| Kanál | Jednotka | Co to je | Zdroj předvolby |
|---|---|---|---|
time_error_ns |
ns | časová chyba hodin | clock: <side>.series[].error_ns; spoof: <side>.series[].offset_ns |
guard_ns |
ns | ochrana časové chyby | vlastní threshold_ns běhu |
cn0_dbhz |
dB-Hz | průměrný efektivní poměr nosné k hustotě šumu (C/N0) přes viditelné družice | jamming: průměr epochs[].sats[].cn0_effective_dbhz |
cn0_floor_dbhz |
dB-Hz | práh ztráty sledování | jamming: tracking_threshold_dbhz scénáře, pokud je uvádí |
tracking |
počet | družice, které stále sledují | jamming: epochs[].tracking |
protection_level_m |
m | vertikální ochranná úroveň | integrity: epochs[].vpl_m |
alert_limit_m |
m | vertikální mez výstrahy | integrity: al_v_m |
position_error_m |
m | chyba polohy | gnss-ins: <side>.series[].error_m |
position_threshold_m |
m | práh chyby polohy | gnss-ins: threshold_m |
alarm |
1 | 1, dokud kterýkoli monitor fáze hlásí poplach | viz níže |
<side> je classical, pokud běh nenastaví side = "quantum". Jakákoli jiná veličina se čte pomocí explicitního záznamu [[phases.runs.series]]: časová cesta s jedním [] pojmenovávajícím řádky (epochs[].t), cesta hodnot sdílející tyto řádky nebo skalár rozšířený na každý řádek (předpona input: čte scénář běhu místo jeho výsledku), volitelná redukce (mean, min, max, count) pro několik hodnot pod jedním řádkem, měřítko a jednotka pro kanál, který kampaň nezná.
Poplachy pocházejí ze tří míst, uvnitř fáze spojených logickým OR:
- příznaky předvoleb načtené z běhu:
jamminghlásí poplach, dokud sleduje méně než čtyři družice (vlastní definice dostupnosti);integrityhlásí poplach v epochách, které označí jako nedostupné; - pravidla předvoleb na kanálech fáze, vyhodnocovaná po
carry:clockhlásí poplach, dokud absolutní časová chyba přesahujeguard_ns;gnss-insdokud chyba polohy přesahujeposition_threshold_m; explicitní pravidla patří do[[phases.runs.alarms]]; - události s poplachem:
spoofjednu vyvolá přidetect_time_ssvého monitoru podporovaného hodinami;spoof-detectjednu vyvolá na začátku fáze, když jeho fúzní rozhodnutí hlásí výstrahu.
Stav se předává mezi fázemi třemi explicitními způsoby:
carry = ["time_error_ns"]přičte hodnotu kanálu na konci předchozí fáze k hodnotám tohoto kanálu v této fázi. Fáze hodin, kterou spoofer odtáhl, je místem, odkud holdover začíná. Přičtení posunu je přesné pro fázi hodin, která integruje frekvenci; u chyby polohy předpokládá, že obě chyby jsou kolineární, což je pesimistický případ.[[phases.handoff]]zapíše číslo z předchozí fáze (channel:<name>pro koncovou hodnotu kanálu nebo libovolnou cestu výsledku předchozího běhu) do klíče s tečkami scénáře této fáze před jeho během, s volitelným měřítkem a posunem.end_at = "<result path>"ukončí fázi v čase, který vypočítal některý běh, omezeném naduration_s. Přibalená mise ukončuje fázi spoofingu vclassical.detect_time_s.
skip_s zahodí prvních několik sekund vlastní časové osy běhu (zahřátí) před nulovým časem fáze.
Přibalená mise#
scenarios/campaign-jam-spoof-holdover-integrity.toml spouští 18 členských scénářů v šesti fázích na mřížce 10 s:
| Fáze | Běhy | Co časová osa ukazuje |
|---|---|---|
| nominální, 600 s | clock, jamming (bez rušičky), integrity |
časová chyba 0 ns; C/N0 43,0 dB-Hz proti prahu 25 dB-Hz; vertikální ochranná úroveň 9,1 až 21,6 m proti mezi výstrahy 50 m |
| rušení (jamming), 600 s | totéž, rušička -30 dBW, 1 km | C/N0 klesne na 27,7 dB-Hz, všech 8 družic stále sleduje |
spoofing, ukončen v 370 s pomocí end_at |
spoof (časová rampa 0,1 ns/s), spoof-detect, jamming |
časová chyba narůstá na 36 ns; radiofrekvenční detektor hlásí poplach na začátku fáze, monitor podporovaný hodinami v 370 s |
| holdover, 1800 s | clock (odepřeno, přenáší 37,0 ns), gnss-ins (taktická jednotka setrvávající), jamming při 10 dBW |
ztraceny všechny družice (C/N0 asi -12 dB-Hz); časová chyba 36,4 až 62,7 ns proti ochraně 50 ns; chyba polohy až 24 km |
| integrity-alarm, 600 s | clock (přenáší 59,6 ns), jamming a integrity s maskou 25 deg |
sleduje 5 družic; ochranná úroveň 19 až 135 m, chybí v 18 z 60 časů mřížky; přenesená časová chyba, 52,1 až 61,7 ns, zůstává nad ochranou 50 ns, takže poplach trvá po celou fázi |
| zotavení, 600 s | clock, jamming (bez rušičky), integrity |
časová chyba zpět na 0 ns; poplach utichl |
Běhy integrity používají vlastní uživatelskou trajektorii příkladu integrity (kruhovou trajektorii ve výšce 0,4 km), nikoli pevné stanoviště přijímače pro rušení, a maska 25 deg zastupuje částečnou oblohu přijímače, který znovu zachytává signál. To jsou volby scénáře, uvedené v souboru.
Mise řízená spektrem v pásmu L#
scenarios/campaign-spectrum-holdover-integrity.toml spouští 8 členských scénářů ve třech fázích na mřížce 1 s, přičemž C/N0 pro GPS L1 C/A a Galileo E1 se čte z druhu spectrum (viz SPECTRUM.md), nikoli z tabulky druhu jamming po jednotlivých družicích. Rušičky jsou ty z scenarios/l-band-waterfall-jamming.toml.
| Fáze | Běhy | Co časová osa ukazuje |
|---|---|---|
nástup, ukončen v 10 s pomocí end_at |
clock, spectrum (chirp od 10 s), integrity |
L1 C/A 43,48 a E1 44,73 dB-Hz; fáze končí při první ztrátě L1 C/A v běhu spektra (timeline.bands[0].first_loss_t_s); ochranná úroveň 21,6 m proti 50 m |
| holdover, 600 s | clock (odepřeno, přenáší chybu nástupu, zde 0 ns), spectrum (chirp zapnut) |
L1 C/A 3,38 a E1 4,44 dB-Hz, obojí pod prahem 25 dB-Hz; časová chyba -0.07 až 5,06 ns proti ochraně 50 ns; poplach trvá |
| galileo-fallback, 300 s | clock (znovu synchronizováno), spectrum (tón CW na nosné L1), integrity na konstelaci podobné Galileo Walker 24/3/1 |
L1 C/A drží na 17,98 dB-Hz, E1 zpět na 44,73 dB-Hz; ochranná úroveň 6,1 až 17,7 m; poplach utichl |
Zotavení E1 pod tónem CW spočívá na zacházení druhu spektrum se spojitým spektrem: tón leží v nule spektra MBOC a nic nespřahuje. Skutečný tón by se spřahoval přes spektrální čáry kódu; to je uvedeno v souboru a v SPECTRUM.md.
[sweep]: mřížka parametrů přes libovolný druh#
Jeden až tři tečkami oddělené klíče scénáře, každý v lineárním nebo logaritmickém rozsahu, na týchž hodnotách os, jaké používá druh sweep-nd. Každá osa má název a jednotku; každá metrika má název a cestu k výsledku a její jednotka se čte z bloku jednotek procházeného druhu, pokud kampaň neuvede vlastní. S runs > 1 je každý uzel souborem Monte Carlo se seedem (realizace k na seedu uzlu plus k) a uvádí se se statistikami níže. scenarios/campaign-sweep-jammer-power.toml prochází výkon rušičky 1 km od přijímače od -50 do +10 dBW: průměrný poměr rušení k signálu se mění přesně o 1 dB na dB (12,2 až 72,2 dB) a dostupnost klesá z 1 na 0 mezi -30 a -25 dBW.
Klíč s tečkami může indexovat pole tabulek podle pozice: system.2.sisre_m je sisre_m třetí tabulky [[system]] a case.0.system.0.shell.0.altitude_km sahá o tři úrovně hlouběji.
[monte_carlo]: soubor se seedem#
Realizace k spouští scénář s klíčem seedu nastaveným na base_seed + k, což je konvence, kterou už používá soubor hodin, takže soubor je přesně reprodukovatelný. Každá metrika uvádí průměr, populační směrodatnou odchylku, percentily 5., 50. a 95. podle nejbližšího pořadí, percentilový bootstrap s pevným seedem, 95% interval spolehlivosti průměru (2000 převzorkování) a ve výchozím stavu každý vzorek v pořadí seedů. Cesty k výsledkům mohou indexovat pole: classical.series[-1].error_ns je poslední vzorek.
[compose]: několik scénářů za sdílených podmínek#
Pojmenované sdílené hodnoty (číslo nebo pole čísel s jednotkou) se zapisují do každého člena pod klíče, ke kterým je váže, takže se členové nemohou o sdílené podmínce rozcházet. Každý člen běží a pro každou metriku uvádí souhrn nejmenší, největší a průměrnou hodnotu napříč členy a pojmenuje nejlepšího a nejhoršího. scenarios/campaign-shared-jammer-sea-road.toml staví jednu rušičku 8 dBW mezi loď v Finském zálivu (asi 30 km daleko) a auto na pobřežní silnici v Helsinkách (asi 50 km): loď ztratí všechny družice (průměrný poměr rušení k signálu 39,0 dB), zatímco auto si ponechá alespoň čtyři (34,6 dB).
[optimize]: nejlepší hodnota jedné metriky#
Jeden až tři tečkami oddělené klíče scénáře, každý omezený na [lo, hi] v měřítku lin nebo log, se prohledávají kvůli nejlepší hodnotě jedné metriky (goal = "minimize", "maximize" nebo "target", které minimalizuje vzdálenost od target).
Existují dvě metody:
method = "grid"spustí každý uzel mřížky sstepsna klíč, na hodnotách os průchodu.method = "nelder-mead"(výchozí) spouští deterministický simplex Nelder–Mead v souřadnicích normalizovaných na [0, 1] pro každý klíč. Zkušební body se promítají do kvádru. Sekce přijímámax_evals, počátečnístepa zastavovací toleranceftolaxtol.
Běh, jehož metrika chybí nebo není konečná, se hodnotí jako nejhorší a ponechává se ve stopě. S runs > 1 je metrika průměrem přes tytéž seedy při každém vyhodnocení. Výsledek uvádí best_coords, best_metric, best_score, evals, stop_reason a každé vyhodnocení v trace.
scenarios/campaign-optimize-link-budget.toml hledá dosah a datovou rychlost pro rezervu spoje 3 dB. Optimum je lokální v rámci kvádru a startu. Je MODELLED, nikdy nejde o globální tvrzení.
Protokol a jeho předregistrované prahy jsou v docs/design/evidence/cap32-optimize/. Test je tests/campaign_optimize_reference.rs. Výsledky:
- 1D řešení cíle souhlasí s uzavřeným tvarem na 6e-15;
- metoda mřížky souhlasí bit po bitu s nezávislou smyčkou hrubou silou;
- simplex si vede alespoň stejně dobře jako mřížka 41 × 41, přibližně za desetinu jejích běhů.
1D práh kola 1 je zaznamenán jako NOT MET: předregistrovaný kvádr řešení vylučoval.
Reprodukovatelnost#
Každý výsledek kampaně nese scenario_hash, SHA-256 (Secure Hash Algorithm 2, 256bitový otisk) kanonického tvaru dokumentu kampaně v JavaScript Object Notation (JSON) (pořadí klíčů a formátování ho nemění), a blok reproducibility s počtem členských běhů a run_digest, SHA-256 přes otisky všech výsledků členů v pořadí rozdělování. Dva běhy se stejným otiskem vytvořily bajt po bajtu shodné výsledky členů. Každý běh fáze také zaznamenává svůj druh, vlastní scenario_hash, pokud ho druh má, a SHA-256 svého dokumentu s výsledkem. Každé číslo v dokumentu má záznam jednotek.
Jádro je sekvenční a nečte žádné soubory, takže kampaň běží beze změny v sestavení WebAssembly. Kampaně nesmějí obsahovat kampaně.
Exporty#
--export u kampaně zapíše každý členský scénář, který má geometrii, jako vlastní sadu souborů, přičemž štítek člena se vloží před příponu formátu: každý běh fáze (<phase>, nebo <phase>-<k>, má-li fáze několik běhů), základní scénář průchodu (sweep), scénář Monte Carlo (monte-carlo) a každého složeného člena (jeho vlastní štítek, se sdílenými hodnotami, které váže, zapsanými dovnitř). Člen shodný s dřívějším se zapíše jednou; předání a hodnoty průchodu nebo seedu použité za běhu nejsou v exportovaných scénářích.
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
Formát, který žádný z členů nedokáže popsat, je odmítnut s uvedením tohoto důvodu. Tabulka po jednotlivých scénářích je v INTEROP.md.
Kampaně LEO-PNT#
Patnáct přibalených kampaní rámuje otázky určování polohy, navigace a času (PNT) z nízké oběžné dráhy Země (LEO); LEO-PNT.md popisuje, co každá z nich ukazuje. Co každá spouští, jak to shrnuje příkazový řádek:
| Scénář | Režim | Otázka |
|---|---|---|
leo-focus-data-services.toml |
skládání, 4 členové | servisní data navigační zprávy podle délky rámce |
leo-focus-fused-pnt-sisre.toml |
průchod leo-pvt, 7 uzlů |
fúzní určování polohy z MEO a LEO podle chyby dosahu signálu ve vesmíru (SISRE) LEO |
leo-focus-indoor-uhf.toml |
skládání, 2 členové | vnitřní LEO-PNT podle pásma a třídy budovy |
leo-focus-iot-eirp.toml |
průchod leo-pass, 9 uzlů |
energie na určení polohy pro internet věcí (IoT) podle vysílacího výkonu LEO UHF |
leo-focus-ntn-bandwidth.toml |
průchod ntn-positioning, 9 uzlů |
určování polohy v neterestrických sítích (NTN) podle šířky pásma referenčního signálu |
leo-focus-ppp-altitude.toml |
průchod leo-ppp, 3 uzly |
konvergence přesného určování polohy z jednoho bodu (PPP) podle výšky vrstvy LEO o 192 družicích |
leo-resilience-gnss-jammed-leo-carries.toml |
řetěz, 3 fáze po 2100 s | globální družicový navigační systém (GNSS) rušen, uživatele nese vrstva LEO, integrita zachována |
leo-resilience-multiband-diversity.toml |
průchod spectrum, 13 uzlů |
pásmová diverzita LEO proti širokopásmové rušičce v pásmu L |
leo-resilience-spoof-monitors.toml |
skládání, 4 členové | monitory spoofingu proti čtyřem spooferům |
leo-vertical-5g-network-timing.toml |
řetěz, 1 fáze po 86 400 s | časování základnových stanic 5G: holdover a čas z LEO |
leo-vertical-asset-tracking-iot.toml |
řetěz, 3 fáze po 1440 s | sledování kontejnerů přes LEO UHF: energie na určení polohy po cestě |
leo-vertical-autonomous-vehicle.toml |
řetěz, 2 fáze po 1500 s | autonomní vozidlo v městském kaňonu s vrstvou LEO |
leo-vertical-autonomous-vehicle-skyline.toml |
řetěz, 2 fáze po 1800 s | tentýž městský kaňon jako plochá mez 35 deg a jako obrys oblohy city-street |
leo-vertical-critical-infrastructure-timing.toml |
řetěz, 2 fáze po 87 000 s | časování kritické infrastruktury: holdover s časem z LEO |
leo-vertical-polar-arctic.toml |
řetěz, 3 fáze po 10 800 s | polární a arktičtí uživatelé s polární vrstvou LEO |
leo-vertical-rail-maritime.toml |
řetěz, 3 fáze po 2520 s | železniční a námořní uživatelé s vrstvou LEO |
MEO je střední oběžná dráha Země, UHF ultra vysoká frekvence a 5G pátá generace mobilních sítí.
Co se kontroluje#
tests/campaign_composition_reference.rs pevně stanoví kompoziční identity:
- Jednofázová kampaň reprodukuje samostatný běh bit po bitu. Pro
clock,integrityajammingje dokument s výsledkem člena bajt po bajtu shodný srun_tomlna souboru scénáře, jeho otisk je ten, který kampaň uvádí, a při mřížce na vlastním kroku běhu se každá zarovnaná hodnota rovná hodnotě samostatné řady (C/N0 rušení se rovná průměru vypočtenému nezávisle ze samostatného dokumentu). - Průchod o jednom uzlu a složení z jednoho člena čtou přesně samostatné číslo.
- Soubor s pevným seedem je bajtově stabilní a realizace
kje přesně samostatný běh naseed + k; otisk kampaně ignoruje pořadí klíčů. - Analytický případ.
scenarios/campaign-monte-carlo-clock-holdover.tomlspouští 200 seedů čipových atomových hodin pouze s bílým frekvenčním šumem (q_wf = 9e-20 s^2/s, Microchip SA.45s sigma_y(1 s) = 3e-10), synchronizovaných do 590 s a setrvávajících do 3600 s. Konečná časová chyba je gaussovská se střední hodnotou 0 a směrodatnou odchylkou sqrt(q_wf * 3010 s) = 16,459 ns (náhodná procházka fáze při bílém frekvenčním šumu, Technical Note 1337 National Institute of Standards and Technology (NIST)). Uvedený interval, [-2.52, 1,59] ns, obsahuje pravou střední hodnotu 0; výběrová směrodatná odchylka, 14,93 ns, dává statistiku chí-kvadrát 164,5 při 199 stupních volnosti, uvnitř oboustranného 99% intervalu [151,37, 254,14]. Při 3000 seedech dává stejný scénář 16,31 ns. - Řetěz řízený spektrem čte samostatná čísla: fáze nástupu trvá přesně dobu první ztráty v běhu spektra a každá hodnota L1 C/A a E1 na časové ose se na 1e-9 dB rovná řádku samostatného příkladu vodopádu pro stejný stav rušičky (nominální, samotný chirp, samotný tón CW).
- Řetěz předává stav tak, jak je zdokumentováno: fáze spoofingu trvá přesně dobu detekce v běhu spoofingu, holdover přenáší přesně posun běhu spoofingu při detekci, zotavení nepřenáší nic a poplach trvá všude tam, kde ochranná úroveň chybí nebo překračuje mez výstrahy.
Tyto kontroly ověřují, že skládání nemění nic, co by změnit nemělo. Neověřují řetězenou misi proti naměřené, a proto jsou tři řádky kampaní v VERIFICATION-MATRIX.md MODELLED.