Kampagner
Et enkelt scenarie besvarer ét spørgsmål om én situation. En mission er en række af situationer, og et designstudie er en familie af dem. Scenarietypen campaign sammensætter de eksisterende typer i én kørsel uden at genimplementere nogen af dem: hvert medlem er en almindelig scenarietabel med sit eget kind, sendt gennem api::run_toml præcis som kshana <file>.toml ville køre den, og kampagnen læser kun tal tilbage fra resultatdokumenterne.
En kampagne er MODELLED. Dens sammensætningsidentiteter er testet (nedenfor), men at kæde faser sammen er et modelvalg, og hver fase er kun så god som den type, der kørte den.
Kør en som et hvilket som helst andet scenarie:
kshana scenarios/campaign-jam-spoof-holdover-integrity.toml
# writes .result.json, .chart.svg, .report.html and .report.json next to the file
En kampagne kan indeholde en vilkårlig kombination af fire sektioner; en uden nogen kører, og dens oversigt siger, at den intet sammensatte.
[[phases]]: en kædet mission på én tidslinje#
Hver fase kører ét eller flere scenarier over et vindue af en fælles missionstidslinje, for eksempel et ur i holdover og et inertinavigationssystem (INS) i frit løb samtidig. Outputtet fra hver kørsel læses ind i navngivne kanaler, placeres på fasens starttidspunkt og resamples på et fælles gitter ([timeline] step_s) med nulte ordens hold: et gittertidspunkt tager den seneste sample fra den ejende fases kørsel på eller før det, og er null, hvor ingen kørsel i den fase leverer kanalen.
| Kanal | Enhed | Hvad det er | Forudindstillet kilde |
|---|---|---|---|
time_error_ns |
ns | urets tidsfejl | clock: <side>.series[].error_ns; spoof: <side>.series[].offset_ns |
guard_ns |
ns | vagt for tidsfejl | kørslens eget threshold_ns |
cn0_dbhz |
dB-Hz | gennemsnitligt effektivt forhold mellem bærebølge og støjtæthed (C/N0) over de synlige satellitter | jamming: gennemsnit af epochs[].sats[].cn0_effective_dbhz |
cn0_floor_dbhz |
dB-Hz | grænse for tab af tracking | jamming: scenariets tracking_threshold_dbhz, når det angiver en |
tracking |
antal | satellitter, der stadig trackes | jamming: epochs[].tracking |
protection_level_m |
m | vertikalt beskyttelsesniveau | integrity: epochs[].vpl_m |
alert_limit_m |
m | vertikal alarmgrænse | integrity: al_v_m |
position_error_m |
m | positionsfejl | gnss-ins: <side>.series[].error_m |
position_threshold_m |
m | tærskel for positionsfejl | gnss-ins: threshold_m |
alarm |
1 | 1, så længe en monitor i fasen alarmerer | se nedenfor |
<side> er classical, medmindre kørslen sætter side = "quantum". Enhver anden størrelse læses med en eksplicit post [[phases.runs.series]]: en tidssti med ét [], der navngiver rækkerne (epochs[].t), en værdisti, der deler disse rækker, eller en skalar, der udsendes til hver række (præfikset input: læser kørslens scenarie i stedet for dens resultat), en valgfri reduktion (mean, min, max, count) for flere værdier under én række, en skala og en enhed til en kanal, som kampagnen ikke kender.
Alarmer kommer fra tre steder, kombineret med logisk OR inden for en fase:
- forudindstillede flag aflæst fra kørslen:
jammingalarmerer, mens færre end fire satellitter trackes (dens egen definition af tilgængelighed);integrityalarmerer i epoker, den markerer som utilgængelige; - forudindstillede regler på fasens kanaler, evalueret efter
carry:clockalarmerer, mens den absolutte tidsfejl overstigerguard_ns;gnss-ins, mens positionsfejlen overstigerposition_threshold_m; eksplicitte regler står i[[phases.runs.alarms]]; - alarmerende hændelser:
spoofrejser én ved sin ur-støttede monitorsdetect_time_s;spoof-detectrejser én ved fasens start, når dens fusionerede beslutning alarmerer.
Tilstand overdrages mellem faser på tre eksplicitte måder:
carry = ["time_error_ns"]lægger kanalens værdi ved slutningen af den forrige fase til denne fases værdier for den. Den urfase, en spoofer trak, er det sted, holdover starter fra. At lægge forskydningen til er nøjagtigt for urfase, som integrerer frekvens; for en positionsfejl antager det, at de to fejl er kollineære, det pessimistiske tilfælde.[[phases.handoff]]skriver et tal fra den forrige fase (channel:<name>for en kanals slutværdi, eller en hvilken som helst resultatsti fra en tidligere kørsel) ind i en punkteret nøgle i denne fases scenarie, før det kører, med en valgfri skala og forskydning.end_at = "<result path>"afslutter fasen på et tidspunkt, en kørsel har beregnet, begrænset tilduration_s. Den medfølgende mission afslutter sin spoofingfase vedclassical.detect_time_s.
skip_s dropper de første sekunder af en kørsels egen tidslinje (en opvarmning) før fasetid nul.
Den medfølgende mission#
scenarios/campaign-jam-spoof-holdover-integrity.toml kører 18 medlemsscenarier over seks faser på et gitter på 10 s:
| Fase | Kørsler | Hvad tidslinjen viser |
|---|---|---|
| nominel, 600 s | clock, jamming (ingen jammer), integrity |
tidsfejl 0 ns; C/N0 43,0 dB-Hz mod en grænse på 25 dB-Hz; vertikalt beskyttelsesniveau 9,1 til 21,6 m mod en alarmgrænse på 50 m |
| jamming, 600 s | det samme, jammer ved -30 dBW, 1 km | C/N0 falder til 27,7 dB-Hz, alle 8 satellitter trackes stadig |
spoofing, afsluttet ved 370 s af end_at |
spoof (tidsrampe på 0,1 ns/s), spoof-detect, jamming |
tidsfejlen vokser til 36 ns; radiofrekvensdetektoren alarmerer ved fasens start, den ur-støttede monitor ved 370 s |
| holdover, 1800 s | clock (nægtet, bærer 37,0 ns), gnss-ins (taktisk enhed i frit løb), jamming ved 10 dBW |
hver satellit tabt (C/N0 omkring -12 dB-Hz); tidsfejl 36,4 til 62,7 ns mod vagten på 50 ns; positionsfejl op til 24 km |
| integrity-alarm, 600 s | clock (bærer 59,6 ns), jamming og integrity med en maske på 25 deg |
5 satellitter trackes; beskyttelsesniveau 19 til 135 m, mangler ved 18 af 60 gittertidspunkter; den medbragte tidsfejl, 52,1 til 61,7 ns, ligger fortsat over vagten på 50 ns, så alarmen er oppe i hele fasen |
| recovery, 600 s | clock, jamming (ingen jammer), integrity |
tidsfejl tilbage på 0 ns; alarmen er stille |
Integritetskørslerne bruger eksemplet integritys egen brugerbane (en cirkulær bane i 0,4 km højde), ikke jamming-modtagerens faste placering, og masken på 25 deg står for den delvise himmel hos en modtager, der genfinder signalet. Det er scenarievalg, angivet i filen.
En mission styret af L-båndets spektrum#
scenarios/campaign-spectrum-holdover-integrity.toml kører 8 medlemsscenarier over tre faser på et gitter på 1 s, med C/N0 for GPS L1 C/A og Galileo E1 læst fra typen spectrum (se SPECTRUM.md) frem for fra typen jammings tabel pr. satellit. Jammerne er dem i scenarios/l-band-waterfall-jamming.toml.
| Fase | Kørsler | Hvad tidslinjen viser |
|---|---|---|
onset, afsluttet ved 10 s af end_at |
clock, spectrum (chirp fra 10 s), integrity |
L1 C/A 43,48 og E1 44,73 dB-Hz; fasen slutter ved spektrumkørslens eget første tab af L1 C/A (timeline.bands[0].first_loss_t_s); beskyttelsesniveau 21,6 m mod 50 m |
| holdover, 600 s | clock (nægtet, bærer onset-fejlen, her 0 ns), spectrum (chirp tændt) |
L1 C/A 3,38 og E1 4,44 dB-Hz, begge under grænsen på 25 dB-Hz; tidsfejl -0.07 til 5,06 ns mod vagten på 50 ns; alarm oppe |
| galileo-fallback, 300 s | clock (resynkroniseret), spectrum (CW-tone på L1-bærebølgen), integrity på en Galileo-lignende Walker 24/3/1 |
L1 C/A holdt på 17,98 dB-Hz, E1 tilbage på 44,73 dB-Hz; beskyttelsesniveau 6,1 til 17,7 m; alarmen er stille |
At E1 kommer sig under CW-tonen hviler på spektrumtypens behandling af kontinuerligt spektrum: tonen ligger i nulpunktet af MBOC-spektret og kobler intet. En rigtig tone ville koble gennem kodens spektrallinjer; det er angivet i filen og i SPECTRUM.md.
[sweep]: et parametergitter over en vilkårlig type#
Fra én til tre punkterede scenarienøgler, hver over et lineært eller logaritmisk område, på de samme akseværdier som typen sweep-nd bruger. Hver akse har et navn og en enhed; hver metrik har et navn og en resultatsti, og dens enhed læses fra den fejede types egen enhedsblok, medmindre kampagnen erklærer en. Med runs > 1 er hver knude et seedet Monte Carlo-ensemble (realisering k ved knudens seed plus k), rapporteret med statistikken nedenfor. scenarios/campaign-sweep-jammer-power.toml fejer en jammer 1 km fra modtageren fra -50 til +10 dBW: det gennemsnitlige forhold mellem jammer og signal flytter sig præcis 1 dB pr. dB (12,2 til 72,2 dB), og tilgængeligheden falder fra 1 til 0 mellem -30 og -25 dBW.
En punkteret nøgle kan indeksere et array af tabeller efter position: system.2.sisre_m er sisre_m i den tredje tabel [[system]], og case.0.system.0.shell.0.altitude_km når tre niveauer ned.
[monte_carlo]: et seedet ensemble#
Realisering k kører scenariet med dets seed-nøgle sat til base_seed + k, den konvention som urensemblet allerede bruger, så ensemblet gengives nøjagtigt. Hver metrik rapporterer middelværdien, populationens standardafvigelse, 5., 50. og 95. percentil efter nærmeste rang, et percentil-bootstrap-konfidensinterval på 95 % med fast seed for middelværdien (2000 resamplinger) og som standard hver sample i seed-rækkefølge. Resultatstier kan indeksere arrays: classical.series[-1].error_ns er den sidste sample.
[compose]: flere scenarier under fælles betingelser#
Navngivne fælles værdier (et tal eller et array af tal, med en enhed) skrives ind i hvert medlem ved de nøgler, det binder dem til, så medlemmerne ikke kan være uenige om den fælles betingelse. Hvert medlem kører, og for hver metrik angiver den samlede oversigt den mindste, største og gennemsnitlige værdi på tværs af medlemmerne og nævner den bedste og den værste. scenarios/campaign-shared-jammer-sea-road.toml placerer én jammer på 8 dBW mellem et skib i Finske Bugt (omkring 30 km væk) og en bil på en kystvej i Helsinki (omkring 50 km): skibet mister hver satellit (gennemsnitligt forhold mellem jammer og signal 39,0 dB), mens bilen beholder mindst fire (34,6 dB).
[optimize]: den bedste værdi af én metrik#
Fra én til tre punkterede scenarienøgler, hver afgrænset til [lo, hi] på en skala lin eller log, gennemsøges for den bedste værdi af én metrik (goal = "minimize", "maximize" eller "target", som minimerer afstanden fra target).
Der er to metoder:
method = "grid"kører hver knude i et gitter medstepspr. nøgle, på sweepets akseværdier.method = "nelder-mead"(standard) kører et deterministisk Nelder–Mead-simpleks i koordinater normaliseret til [0, 1] pr. nøgle. Prøvepunkter projiceres ind på boksen. Sektionen tagermax_evals, en indledendestepog stoptolerancerneftologxtol.
En kørsel, hvis metrik mangler eller ikke er endelig, scorer værst og bevares i sporet. Med runs > 1 er metrikken middelværdien over de samme seeds ved hver evaluering. Resultatet angiver best_coords, best_metric, best_score, evals, stop_reason og hver evaluering i trace.
scenarios/campaign-optimize-link-budget.toml søger efter rækkevidde og datarate for en linkmargin på 3 dB. Optimum er lokalt for boksen og startpunktet. Det er MODELLED, aldrig en global påstand.
Protokollen og dens tærskler, fastsat på forhånd, står i docs/design/evidence/cap32-optimize/. Testen er tests/campaign_optimize_reference.rs. Resultaterne:
- en 1-D-målløsning stemmer med den lukkede form til 6e-15;
- gittermetoden stemmer bit for bit med en uafhængig brute-force-løkke;
- simpleks klarer sig mindst lige så godt som gitteret på 41 × 41, på omkring en tiendedel af dets kørsler.
Runde 1s 1-D-tærskel er registreret som NOT MET: den boks, der blev fastsat på forhånd, udelukkede løsningen.
Reproducerbarhed#
Hvert kampagneresultat bærer scenario_hash, SHA-256 (Secure Hash Algorithm 2, 256-bit digest) af kampagnedokumentets kanoniske JavaScript Object Notation-form (JSON) (nøglerækkefølge og formatering ændrer den ikke), og en blok reproducibility med antallet af medlemskørsler og run_digest, en SHA-256 over hvert medlemsresultats digest i dispatch-rækkefølge. To kørsler med samme digest gav medlemsresultater, der er identiske byte for byte. Hver fasekørsel registrerer også sin type, sin egen scenario_hash, hvor typen har en, og SHA-256 af sit resultatdokument. Hvert tal i dokumentet har en post i enhedsblokken.
Kernen er sekventiel og læser ingen filer, så en kampagne kører uændret i WebAssembly-bygget. Kampagner må ikke indeholde kampagner.
Eksport#
--export på en kampagne skriver hvert medlemsscenarie, der har geometri, som sit eget filsæt, med medlemmets label indsat før formatsuffikset: hver fasekørsel (<phase>, eller <phase>-<k>, når fasen har flere kørsler), sweepets basisscenarie (sweep), Monte Carlo-scenariet (monte-carlo) og hvert sammensat medlem (med sin egen label og de fælles værdier, det binder, skrevet ind). Et medlem, der er identisk med et tidligere, skrives én gang; overdragelser og sweep- eller seed-værdier, der anvendes under kørslen, er ikke med i de eksporterede scenarier.
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
Et format, som ingen af medlemmerne kan beskrive, afvises med den begrundelse. Tabellen pr. scenarie står i INTEROP.md.
LEO-PNT-kampagner#
Femten medfølgende kampagner rammesætter spørgsmål om positionering, navigation og tidssynkronisering (PNT) fra lav jordbane (LEO); LEO-PNT.md beskriver, hvad hver af dem viser. Hvad hver kører, som kommandolinjen opsummerer det:
| Scenarie | Tilstand | Spørgsmål |
|---|---|---|
leo-focus-data-services.toml |
compose, 4 medlemmer | servicedata i navigationsmeddelelsen mod rammelængde |
leo-focus-fused-pnt-sisre.toml |
sweep af leo-pvt, 7 knuder |
fusioneret MEO- og LEO-positionering mod LEO-signalets afstandsfejl i rummet (SISRE) |
leo-focus-indoor-uhf.toml |
compose, 2 medlemmer | LEO-PNT indendørs efter bånd og bygningsklasse |
leo-focus-iot-eirp.toml |
sweep af leo-pass, 9 knuder |
Internet of Things (IoT), energi pr. positionsbestemmelse mod LEO UHF-sendeeffekten |
leo-focus-ntn-bandwidth.toml |
sweep af ntn-positioning, 9 knuder |
positionering i ikke-terrestriske net (NTN) mod referencesignalets båndbredde |
leo-focus-ppp-altitude.toml |
sweep af leo-ppp, 3 knuder |
konvergens for præcis punktpositionering (PPP) mod højden af et LEO-lag med 192 satellitter |
leo-resilience-gnss-jammed-leo-carries.toml |
chain, 3 faser over 2100 s | Global Navigation Satellite System (GNSS) jammet, LEO-laget bærer brugeren, integriteten opretholdes |
leo-resilience-multiband-diversity.toml |
sweep af spectrum, 13 knuder |
LEO-båndmangfoldighed mod en L-bånds-barrage-jammer |
leo-resilience-spoof-monitors.toml |
compose, 4 medlemmer | spoofingmonitorerne mod fire spoofere |
leo-vertical-5g-network-timing.toml |
chain, 1 fase over 86.400 s | tidssynkronisering af 5G-basestationer: holdover og LEO-tid |
leo-vertical-asset-tracking-iot.toml |
chain, 3 faser over 1440 s | containersporing med LEO UHF: energi pr. positionsbestemmelse undervejs på en rejse |
leo-vertical-autonomous-vehicle.toml |
chain, 2 faser over 1500 s | et autonomt køretøj i en bykløft med et LEO-lag |
leo-vertical-autonomous-vehicle-skyline.toml |
chain, 2 faser over 1800 s | den samme bykløft som en flad afskæring på 35 deg og som en skyline af typen city-street |
leo-vertical-critical-infrastructure-timing.toml |
chain, 2 faser over 87.000 s | tidssynkronisering af kritisk infrastruktur: holdover med LEO-tid |
leo-vertical-polar-arctic.toml |
chain, 3 faser over 10.800 s | polare og arktiske brugere med et polart LEO-lag |
leo-vertical-rail-maritime.toml |
chain, 3 faser over 2520 s | jernbane- og søfartsbrugere med et LEO-lag |
MEO er medium Earth orbit (middelhøj jordbane), UHF ultra-high frequency og 5G femte generation af mobilnet.
Hvad der kontrolleres#
tests/campaign_composition_reference.rs fastlåser sammensætningsidentiteterne:
- En kampagne med én fase gengiver den selvstændige kørsel bit for bit. For
clock,integrityogjamminger medlemmets resultatdokument identisk byte for byte medrun_tomlpå scenariefilen, dets digest er den, kampagnen rapporterer, og med gitteret ved kørslens eget trin er hver tilpasset værdi lig med værdien i den selvstændige serie (jamming-C/N0 er lig med gennemsnittet beregnet uafhængigt ud fra det selvstændige dokument). - Et sweep med én knude og en sammensætning med ét medlem læser nøjagtigt det selvstændige tal.
- Et ensemble med fast seed er byte-stabilt, og realisering
ker nøjagtigt den selvstændige kørsel vedseed + k; kampagnens hash ignorerer nøglerækkefølgen. - Et analytisk tilfælde.
scenarios/campaign-monte-carlo-clock-holdover.tomlkører 200 seeds af et chipskala-atomur med kun hvid frekvensstøj (q_wf = 9e-20 s^2/s, Microchip SA.45s sigma_y(1 s) = 3e-10), synkroniseret til 590 s og i frit løb til 3600 s. Den endelige tidsfejl er gaussisk med middelværdi 0 og standardafvigelse sqrt(q_wf * 3010 s) = 16,459 ns (fasens random walk under hvid frekvensstøj, National Institute of Standards and Technology (NIST) Technical Note 1337). Det rapporterede interval, [-2.52, 1,59] ns, indeholder den sande middelværdi 0; stikprøvens standardafvigelse, 14,93 ns, giver en chi-i-anden-statistik på 164,5 med 199 frihedsgrader, inden for det tosidede interval på 99 % [151,37, 254,14]. Ved 3000 seeds giver det samme scenarie 16,31 ns. - Den spektrumdrevne kæde læser de selvstændige tal: onset-fasen varer nøjagtigt spektrumkørslens tid til første tab, og hver L1 C/A- og E1-værdi på tidslinjen er, til 1e-9 dB, lig med den selvstændige waterfall-eksempelkørsels række for den samme jammertilstand (nominel, chirp alene, CW-tone alene).
- Kæden overdrager tilstand som dokumenteret: spoofingfasen varer nøjagtigt spoofkørslens detektionstid, holdover bærer nøjagtigt spoofkørslens forskydning ved detektion, recovery bærer intet, og alarmen er oppe, hvor beskyttelsesniveauet mangler eller overstiger alarmgrænsen.
Disse kontroller sikrer, at sammensætning ikke ændrer noget, den ikke bør. De validerer ikke en kædet mission mod en målt, og derfor er de tre kampagnerækker i VERIFICATION-MATRIX.md MODELLED.