Maskinöversättning, inte granskad av en modersmålstalare. Engelska är referensen.

ScenarierRedigera på GitHubKälla: docs/CAMPAIGNS.md

Kampanjer

Ett enskilt scenario besvarar en fråga om en situation. Ett uppdrag är en följd av situationer, och en utformningsstudie är en familj av dem. Scenariotypen campaign sätter ihop de befintliga typerna till en enda körning utan att implementera om någon av dem: varje medlem är en vanlig scenariotabell med sin egen kind, skickas via api::run_toml precis som kshana <file>.toml skulle köra den, och kampanjen läser bara tal ur resultatdokumenten.

En kampanj är MODELLED. Dess sammansättningsidentiteter testas (nedan), men att kedja faser är ett modellval, och varje fas är bara så bra som den typ som körde den.

Kör en som vilket annat scenario som helst:

kshana scenarios/campaign-jam-spoof-holdover-integrity.toml
# writes .result.json, .chart.svg, .report.html and .report.json next to the file

En kampanj kan innehålla vilken kombination som helst av fyra sektioner. En utan någon körs, och dess sammanfattning säger att den inte satte ihop något.

[[phases]]: ett kedjat uppdrag på en tidslinje#

Varje fas kör ett eller flera scenarier över ett fönster av en gemensam uppdragstidslinje, till exempel en klocka i holdover och ett tröghetsnavigeringssystem (INS) som glider samtidigt. Utdata från varje körning läses in i namngivna kanaler, placeras vid fasens starttid och samplas om till ett gemensamt raster ([timeline] step_s) med nollte ordningens hållning: en rastertid tar det senaste provet från den ägande fasens körning vid eller före den, och är null där ingen körning av den fasen ger kanalen.

Kanal Enhet Vad det är Förinställningens källa
time_error_ns ns klockans tidsfel clock: <side>.series[].error_ns; spoof: <side>.series[].offset_ns
guard_ns ns vakt för tidsfel körningens egen threshold_ns
cn0_dbhz dB-Hz genomsnittligt effektivt förhållande mellan bärvåg och brustäthet (C/N0) över de synliga satelliterna jamming: medelvärdet av epochs[].sats[].cn0_effective_dbhz
cn0_floor_dbhz dB-Hz golv för spårningsförlust jamming: scenariots tracking_threshold_dbhz, när det anger ett
tracking antal satelliter som fortfarande spåras jamming: epochs[].tracking
protection_level_m m vertikal skyddsnivå integrity: epochs[].vpl_m
alert_limit_m m vertikal larmgräns integrity: al_v_m
position_error_m m positionsfel gnss-ins: <side>.series[].error_m
position_threshold_m m tröskel för positionsfel gnss-ins: threshold_m
alarm 1 1 så länge någon övervakare i fasen larmar se nedan

<side> är classical om inte körningen anger side = "quantum". Varje annan storhet läses med en uttrycklig post [[phases.runs.series]]: en tidsväg med en [] som namnger raderna (epochs[].t), en värdeväg som delar dessa rader eller ett skalärt värde som sänds ut till varje rad (prefixet input: läser körningens scenario i stället för dess resultat), en valfri reduktion (mean, min, max, count) för flera värden under en rad, en skala och en enhet för en kanal som kampanjen inte känner till.

Larm kommer från tre håll, kombinerade med logiskt ELLER inom en fas:

  • förinställda flaggor som läses från körningen: jamming larmar så länge färre än fyra satelliter spåras (dess egen definition av tillgänglighet). integrity larmar vid epoker som den markerar som otillgängliga;
  • förinställda regler för fasens kanaler, som utvärderas efter carry: clock larmar så länge det absoluta tidsfelet överstiger guard_ns. gnss-ins så länge positionsfelet överstiger position_threshold_m. uttryckliga regler läggs i [[phases.runs.alarms]];
  • larmande händelser: spoof ger en vid sin klockstödda övervakares detect_time_s. spoof-detect ger en vid fasens start när dess fuserade beslut larmar.

Tillstånd förs vidare mellan faser på tre uttryckliga sätt:

  • carry = ["time_error_ns"] lägger kanalens värde vid slutet av föregående fas till den här fasens värden för den. Klockfasen som en spoofer drog iväg är där holdover startar. Att lägga till förskjutningen är exakt för klockfas, som integrerar frekvens. För ett positionsfel antar det att de två felen är kollinjära, vilket är det pessimistiska fallet.
  • [[phases.handoff]] skriver ett tal från föregående fas (channel:<name> för en kanals slutvärde, eller vilken resultatväg som helst från en tidigare körning) i en punktseparerad nyckel i den här fasens scenario innan det körs, med valfri skala och förskjutning.
  • end_at = "<result path>" avslutar fasen vid en tid som en körning beräknat, begränsad av duration_s. Det medföljande uppdraget avslutar sin spoofing-fas vid classical.detect_time_s.

skip_s släpper de första sekunderna av en körnings egen tidslinje (en uppvärmning) före fastid noll.

Det medföljande uppdraget#

scenarios/campaign-jam-spoof-holdover-integrity.toml kör 18 medlemsscenarier över sex faser på ett 10 s-raster:

Fas Körningar Vad tidslinjen visar
nominellt, 600 s clock, jamming (ingen störsändare), integrity tidsfel 0 ns; C/N0 43,0 dB-Hz mot ett golv på 25 dB-Hz; vertikal skyddsnivå 9,1 till 21,6 m mot en larmgräns på 50 m
jamming, 600 s samma sak, störsändare vid -30 dBW, 1 km C/N0 sjunker till 27,7 dB-Hz, alla 8 satelliter spåras fortfarande
spoofing, avslutad vid 370 s av end_at spoof (tidsramp på 0,1 ns/s), spoof-detect, jamming tidsfelet ökar till 36 ns; radiofrekvensdetektorn larmar vid fasens start, den klockstödda övervakaren vid 370 s
holdover, 1800 s clock (nekad, bär med sig 37,0 ns), gnss-ins (taktisk enhet som glider), jamming vid 10 dBW varje satellit förlorad (C/N0 cirka -12 dB-Hz); tidsfel 36,4 till 62,7 ns mot vakten på 50 ns; positionsfel upp till 24 km
integrity-alarm, 600 s clock (bär med sig 59,6 ns), jamming och integrity med en mask på 25 deg 5 satelliter spåras; skyddsnivå 19 till 135 m, saknas vid 18 av 60 rastertider; det överförda tidsfelet, 52,1 till 61,7 ns, ligger kvar över vakten på 50 ns, så larmet är uppe under hela fasen
recovery, 600 s clock, jamming (ingen störsändare), integrity tidsfelet tillbaka på 0 ns; larmet tyst

Integritetskörningarna använder exemplet integrity med dess egen användarbana (en cirkulär bana på 0,4 km höjd), inte störningsmottagarens fasta plats, och masken på 25 deg står för den partiella himlen hos en mottagare som återupptar spårning. Det är scenariovärden som anges i filen.

Ett uppdrag styrt av L-bandets spektrum#

scenarios/campaign-spectrum-holdover-integrity.toml kör 8 medlemsscenarier över tre faser på ett 1 s-raster, där C/N0 för GPS L1 C/A och Galileo E1 läses från typen spectrum (se SPECTRUM.md) i stället för från typen jammings tabell per satellit. Störsändarna är de i scenarios/l-band-waterfall-jamming.toml.

Fas Körningar Vad tidslinjen visar
onset, avslutad vid 10 s av end_at clock, spectrum (chirp från 10 s), integrity L1 C/A 43,48 och E1 44,73 dB-Hz; fasen slutar vid spektrumkörningens egen första förlust av L1 C/A (timeline.bands[0].first_loss_t_s); skyddsnivå 21,6 m mot 50 m
holdover, 600 s clock (nekad, bär med sig onset-felet, 0 ns här), spectrum (chirp på) L1 C/A 3,38 och E1 4,44 dB-Hz, båda under golvet på 25 dB-Hz; tidsfel -0.07 till 5,06 ns mot vakten på 50 ns; larm uppe
galileo-fallback, 300 s clock (omsynkroniserad), spectrum (CW-ton på L1-bärvågen), integrity på en Galileo-lik Walker 24/3/1 L1 C/A hålls vid 17,98 dB-Hz, E1 tillbaka på 44,73 dB-Hz; skyddsnivå 6,1 till 17,7 m; larmet tyst

Att E1 återhämtar sig under CW-tonen vilar på hur typen spectrum behandlar kontinuerliga spektra: tonen hamnar i nollstället i MBOC-spektrumet och kopplar ingenting. En verklig ton skulle koppla via kodens spektrallinjer. Det anges i filen och i SPECTRUM.md.

[sweep]: ett parameterrutnät över vilken typ som helst#

En till tre punktseparerade scenarionycklar, var och en över ett linjärt eller logaritmiskt intervall, på samma axelvärden som typen sweep-nd använder. Varje axel har ett namn och en enhet. Varje mått har ett namn och en resultatväg, och dess enhet läses från den svepta typens eget enhetsblock om inte kampanjen deklarerar en. Med runs > 1 är varje nod en seedad Monte Carlo-ensemble (realisering k vid nodens frö plus k), som redovisas med statistiken nedan. scenarios/campaign-sweep-jammer-power.toml sveper en störsändare 1 km från mottagaren från -50 till +10 dBW: det genomsnittliga förhållandet mellan störsändare och signal ändras exakt 1 dB per dB (12,2 till 72,2 dB), och tillgängligheten faller från 1 till 0 mellan -30 och -25 dBW.

En punktseparerad nyckel kan indexera en array av tabeller efter position: system.2.sisre_m är sisre_m i den tredje tabellen [[system]], och case.0.system.0.shell.0.altitude_km når tre nivåer ned.

[monte_carlo]: en seedad ensemble#

Realisering k kör scenariot med sin frönyckel satt till base_seed + k, den konvention som klockensemblen redan använder, så att ensemblen reproduceras exakt. Varje mått redovisar medelvärdet, populationens standardavvikelse, percentilerna 5, 50 och 95 enligt närmaste rang, ett percentil-bootstrap-konfidensintervall på 95 % för medelvärdet med fast frö (2000 omsamplingar) och, som standard, varje prov i frö-ordning. Resultatvägar kan indexera arrayer: classical.series[-1].error_ns är det sista provet.

[compose]: flera scenarier under gemensamma villkor#

Namngivna delade värden (ett tal eller en array av tal, med en enhet) skrivs in i varje medlem vid de nycklar den binder dem till, så att medlemmarna inte kan vara oeniga om det delade villkoret. Varje medlem körs, och för varje mått ger den samlade sammanfattningen det minsta, största och genomsnittliga värdet över medlemmarna och anger det bästa och det sämsta. scenarios/campaign-shared-jammer-sea-road.toml placerar en störsändare på 8 dBW mellan ett fartyg i Finska viken (cirka 30 km bort) och en bil på en kustväg i Helsingfors (cirka 50 km): fartyget förlorar varje satellit (genomsnittligt förhållande mellan störsändare och signal 39,0 dB) medan bilen behåller minst fyra (34,6 dB).

[optimize]: det bästa värdet för ett mått#

En till tre punktseparerade scenarionycklar, var och en begränsad till [lo, hi] på en lin- eller log-skala, genomsöks efter det bästa värdet för ett mått (goal = "minimize", "maximize" eller "target", som minimerar avståndet från target).

Det finns två metoder:

  • method = "grid" kör varje nod i ett rutnät med steps per nyckel, på svepets axelvärden.
  • method = "nelder-mead" (standard) kör en deterministisk Nelder–Mead-simplex i koordinater normaliserade till [0, 1] per nyckel. Provpunkter projiceras på lådan. Sektionen tar max_evals, ett initialt step och stopptoleranserna ftol och xtol.

En körning vars mått saknas eller inte är ändligt får sämsta poäng och behålls i spåret. Med runs > 1 är måttet medelvärdet över samma frön vid varje utvärdering. Resultatet ger best_coords, best_metric, best_score, evals, stop_reason och varje utvärdering i trace.

scenarios/campaign-optimize-link-budget.toml söker avstånd och datatakt för en länkmarginal på 3 dB. Optimum är lokalt för lådan och startpunkten. Det är MODELLED, aldrig ett globalt påstående.

Protokollet och dess tröskelvärden som fastställdes i förväg finns i docs/design/evidence/cap32-optimize/. Testet är tests/campaign_optimize_reference.rs. Resultaten:

  • en 1-D-lösning mot ett målvärde stämmer med den slutna formen till 6e-15;
  • rutnätsmetoden stämmer bit för bit med en oberoende brute force-loop;
  • simplexen klarar sig minst lika bra som rutnätet på 41 × 41, på ungefär en tiondel av antalet körningar.

Omgång 1s 1-D-tröskel är registrerad som NOT MET: lådan som fastställdes i förväg uteslöt lösningen.

Reproducerbarhet#

Varje kampanjresultat bär scenario_hash, SHA-256 (Secure Hash Algorithm 2, 256-bitars sammandrag) av den kanoniska JavaScript Object Notation-formen (JSON) av kampanjdokumentet (nyckelordning och formatering ändrar det inte), och ett block reproducibility med antalet medlemskörningar och run_digest, en SHA-256 över varje medlemsresultats sammandrag i dispatch-ordning. Två körningar med samma sammandrag gav identiska medlemsresultat byte för byte. Varje körning av en fas registrerar också sin typ, sin egen scenario_hash där typen har en, och SHA-256 för sitt resultatdokument. Varje tal i dokumentet har en post i enhetstabellen.

Kärnan är sekventiell och läser inga filer, så en kampanj körs oförändrad i WebAssembly-bygget. Kampanjer får inte innehålla kampanjer.

Exporter#

--export på en kampanj skriver varje medlemsscenario som har geometri som en egen filuppsättning, med medlemmens etikett insatt före formatsuffixet: varje körning av en fas (<phase>, eller <phase>-<k> när fasen har flera körningar), svepets basscenario (sweep), Monte Carlo-scenariot (monte-carlo) och varje sammansatt medlem (sin egen etikett, med de delade värden den binder inskrivna). En medlem som är identisk med en tidigare skrivs en gång. Överlämningar samt svep- eller frövärden som tillämpas vid körning finns inte i de exporterade scenarierna.

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

Ett format som ingen av medlemmarna kan beskriva avvisas med den anledningen. Tabellen per scenario finns i INTEROP.md.

LEO-PNT-kampanjer#

Femton medföljande kampanjer ramar in frågor om positionering, navigering och tidssynkronisering (PNT) från låg jordbana (LEO). LEO-PNT.md beskriver vad var och en visar. Vad var och en kör, så som kommandoraden sammanfattar det:

Scenario Läge Fråga
leo-focus-data-services.toml compose, 4 medlemmar navigeringsmeddelandets tjänstedata mot ramlängd
leo-focus-fused-pnt-sisre.toml svep av leo-pvt, 7 noder fusionerad MEO- och LEO-positionering mot LEO:s signal-i-rymden-avståndsfel (SISRE)
leo-focus-indoor-uhf.toml compose, 2 medlemmar LEO-PNT inomhus per band och byggnadsklass
leo-focus-iot-eirp.toml svep av leo-pass, 9 noder energi per positionsbestämning för sakernas internet (IoT) mot LEO:s UHF-sändningseffekt
leo-focus-ntn-bandwidth.toml svep av ntn-positioning, 9 noder positionering i icke-terrestra nätverk (NTN) mot referenssignalens bandbredd
leo-focus-ppp-altitude.toml svep av leo-ppp, 3 noder konvergens för precis punktpositionering (PPP) mot höjden på ett LEO-lager med 192 satelliter
leo-resilience-gnss-jammed-leo-carries.toml chain, 3 faser över 2100 s Global Navigation Satellite System (GNSS) störs, LEO-lagret bär användaren, integriteten bibehålls
leo-resilience-multiband-diversity.toml svep av spectrum, 13 noder LEO:s bandmångfald mot en L-bands barrage-störsändare
leo-resilience-spoof-monitors.toml compose, 4 medlemmar spoofing-övervakarna mot fyra spoofers
leo-vertical-5g-network-timing.toml chain, 1 fas över 86 400 s tidssynkronisering för 5G-basstationer: holdover och LEO-tid
leo-vertical-asset-tracking-iot.toml chain, 3 faser över 1440 s containerspårning med LEO UHF: energi per positionsbestämning längs en resa
leo-vertical-autonomous-vehicle.toml chain, 2 faser över 1500 s ett autonomt fordon i en urban kanjon med ett LEO-lager
leo-vertical-autonomous-vehicle-skyline.toml chain, 2 faser över 1800 s samma urbana kanjon som en platt avskärning på 35 deg och som en skyline av typen city-street
leo-vertical-critical-infrastructure-timing.toml chain, 2 faser över 87 000 s tidssynkronisering för kritisk infrastruktur: holdover med LEO-tid
leo-vertical-polar-arctic.toml chain, 3 faser över 10 800 s polara användare och användare i Arktis med ett polärt LEO-lager
leo-vertical-rail-maritime.toml chain, 3 faser över 2520 s järnvägs- och sjöfartsanvändare med ett LEO-lager

MEO är medelhög jordbana, UHF ultrahög frekvens och 5G den femte generationen av mobilnät.

Vad som kontrolleras#

tests/campaign_composition_reference.rs fastlåser sammansättningsidentiteterna:

  • En kampanj med en fas reproducerar den fristående körningen bit för bit. För clock, integrity och jamming är medlemmens resultatdokument identiskt byte för byte med run_toml på scenariofilen, dess sammandrag är det som kampanjen redovisar, och med rastret på körningens eget steg är varje justerat värde lika med den fristående seriens värde (C/N0 för jamming är lika med medelvärdet som beräknats oberoende ur det fristående dokumentet).
  • Ett svep med en nod och en sammansättning med en medlem läser exakt det fristående talet.
  • En ensemble med fast frö är byte-stabil, och realisering k är exakt den fristående körningen vid seed + k. Kampanjens hash ignorerar nyckelordning.
  • Ett analytiskt fall. scenarios/campaign-monte-carlo-clock-holdover.toml kör 200 frön av en chipskalig atomklocka med enbart vitt frekvensbrus (q_wf = 9e-20 s^2/s, Microchip SA.45s sigma_y(1 s) = 3e-10), synkroniserad till 590 s och glidande till 3600 s. Det slutliga tidsfelet är gaussiskt med medelvärde 0 och standardavvikelse sqrt(q_wf * 3010 s) = 16,459 ns (fasens slumpvandring under vitt frekvensbrus, National Institute of Standards and Technology (NIST) Technical Note 1337). Det redovisade intervallet, [-2.52, 1,59] ns, innehåller det sanna medelvärdet 0. Stickprovets standardavvikelse, 14,93 ns, ger en chi-två-statistika på 164,5 med 199 frihetsgrader, inom det tvåsidiga intervallet på 99 % [151,37, 254,14]. Vid 3000 frön ger samma scenario 16,31 ns.
  • Den spektrumdrivna kedjan läser de fristående talen: onset-fasen varar exakt spektrumkörningens tid till första förlust, och varje L1 C/A- och E1-värde på tidslinjen är lika med, till 1e-9 dB, det fristående vattenfallsexemplets rad för samma störsändartillstånd (nominellt, enbart chirp, enbart CW-ton).
  • Kedjan för tillstånd vidare som dokumenterat: spoofing-fasen varar exakt spoof-körningens detektionstid, holdover bär exakt spoof-körningens förskjutning vid detektionen, recovery bär ingenting, och larmet är uppe överallt där skyddsnivån saknas eller överstiger larmgränsen.

Dessa kontroller visar att sammansättning inte ändrar något som den inte ska ändra. De validerar inte ett kedjat uppdrag mot ett uppmätt, och därför är de tre kampanjraderna i VERIFICATION-MATRIX.md MODELLED.