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:
jamminglarmar så länge färre än fyra satelliter spåras (dess egen definition av tillgänglighet).integritylarmar vid epoker som den markerar som otillgängliga; - förinställda regler för fasens kanaler, som utvärderas efter
carry:clocklarmar så länge det absoluta tidsfelet överstigerguard_ns.gnss-insså länge positionsfelet överstigerposition_threshold_m. uttryckliga regler läggs i[[phases.runs.alarms]]; - larmande händelser:
spoofger en vid sin klockstödda övervakaresdetect_time_s.spoof-detectger 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 avduration_s. Det medföljande uppdraget avslutar sin spoofing-fas vidclassical.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 medstepsper 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 tarmax_evals, ett initialtstepoch stopptoleransernaftolochxtol.
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,integrityochjammingär medlemmens resultatdokument identiskt byte för byte medrun_tomlpå 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 vidseed + k. Kampanjens hash ignorerar nyckelordning. - Ett analytiskt fall.
scenarios/campaign-monte-carlo-clock-holdover.tomlkö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.