Kampanjer
Et enkelt scenario svarer på ett spørsmål om én situasjon. Et oppdrag er en sekvens av situasjoner, og en utformingsstudie er en familie av dem. Scenariotypen campaign setter de eksisterende typene sammen i én kjøring uten å implementere noen av dem på nytt: hvert medlem er en vanlig scenariotabell med sin egen kind, sendt gjennom api::run_toml nøyaktig slik kshana <file>.toml ville kjørt det, og kampanjen leser bare tall ut av resultatdokumentene.
En kampanje er MODELLED. Sammensetningsidentitetene er testet (nedenfor), men å lenke faser sammen er et modellvalg, og hver fase er bare så god som typen som kjørte den.
Kjør en som alle andre scenarioer:
kshana scenarios/campaign-jam-spoof-holdover-integrity.toml
# writes .result.json, .chart.svg, .report.html and .report.json next to the file
En kampanje kan inneholde en hvilken som helst kombinasjon av fire seksjoner. En uten noen kjører, og oppsummeringen sier at den ikke satte sammen noe.
[[phases]]: et lenket oppdrag på én tidslinje#
Hver fase kjører ett eller flere scenarioer over et vindu av en felles oppdragstidslinje, for eksempel en klokke i holdover og et treghetsnavigasjonssystem (INS) som går på tomgang samtidig. Utdataene fra hver kjøring leses inn i navngitte kanaler, plasseres ved fasens starttid og resamples på et felles rutenett ([timeline] step_s) med nulte ordens holdt verdi: et rutenetttidspunkt får siste sample fra den eide fasens kjøring ved eller før det, og er null der ingen kjøring i den fasen gir kanalen.
| Kanal | Enhet | Hva det er | Kilde for forhåndsinnstilling |
|---|---|---|---|
time_error_ns |
ns | klokkens tidsfeil | clock: <side>.series[].error_ns; spoof: <side>.series[].offset_ns |
guard_ns |
ns | vakt for tidsfeil | kjøringens egen threshold_ns |
cn0_dbhz |
dB-Hz | gjennomsnittlig effektivt forhold mellom bærebølge og støytetthet (C/N0) over de synlige satellittene | jamming: gjennomsnitt av epochs[].sats[].cn0_effective_dbhz |
cn0_floor_dbhz |
dB-Hz | gulv for tapt sporing | jamming: scenarioets tracking_threshold_dbhz, når det oppgir en |
tracking |
antall | satellitter som fortsatt spores | jamming: epochs[].tracking |
protection_level_m |
m | vertikalt beskyttelsesnivå | integrity: epochs[].vpl_m |
alert_limit_m |
m | vertikal alarmgrense | integrity: al_v_m |
position_error_m |
m | posisjonsfeil | gnss-ins: <side>.series[].error_m |
position_threshold_m |
m | terskel for posisjonsfeil | gnss-ins: threshold_m |
alarm |
1 | 1 så lenge en overvåker i fasen gir alarm | se nedenfor |
<side> er classical med mindre kjøringen setter side = "quantum". Alle andre størrelser leses med en eksplisitt oppføring [[phases.runs.series]]: en tidsbane med én [] som navngir radene (epochs[].t), en verdibane som deler disse radene eller en skalar som kringkastes til hver rad (prefikset input: leser kjøringens scenario i stedet for resultatet), en valgfri reduksjon (mean, min, max, count) for flere verdier under én rad, en skala og en enhet for en kanal som kampanjen ikke kjenner.
Alarmer kommer fra tre steder, kombinert med logisk ELLER innenfor en fase:
- forhåndsinnstilte flagg som leses fra kjøringen:
jamminggir alarm så lenge færre enn fire satellitter spores (typens egen definisjon av tilgjengelighet), ogintegritygir alarm ved epoker den markerer som utilgjengelige; - forhåndsinnstilte regler på fasens kanaler, evaluert etter
carry:clockgir alarm så lenge den absolutte tidsfeilen overstigerguard_ns, oggnss-insså lenge posisjonsfeilen overstigerposition_threshold_m. Eksplisitte regler settes i[[phases.runs.alarms]]; - alarmerende hendelser:
spoofutløser én ved sin klokkestøttede overvåkersdetect_time_s, ogspoof-detectutløser én ved fasens start når dens fusjonerte beslutning gir alarm.
Tilstand overleveres mellom faser på tre eksplisitte måter:
carry = ["time_error_ns"]legger kanalens verdi ved slutten av forrige fase til denne fasens verdier for den. Klokkefasen en spoofer trakk bort, er der holdoveren starter. Å legge til forskyvningen er eksakt for klokkefase, som integrerer frekvens. For en posisjonsfeil forutsetter det at de to feilene er kollineære, som er det pessimistiske tilfellet.[[phases.handoff]]skriver et tall fra forrige fase (channel:<name>for en kanals sluttverdi, eller en hvilken som helst resultatbane fra en tidligere kjøring) inn i en punktdelt nøkkel i denne fasens scenario før det kjøres, med valgfri skala og forskyvning.end_at = "<result path>"avslutter fasen ved et tidspunkt en kjøring har beregnet, begrenset tilduration_s. Det medfølgende oppdraget avslutter spoofingfasen vedclassical.detect_time_s.
skip_s dropper de første sekundene av en kjørings egen tidslinje (en oppvarming) før fasetid null.
Det medfølgende oppdraget#
scenarios/campaign-jam-spoof-holdover-integrity.toml kjører 18 medlemsscenarioer over seks faser på et rutenett med 10 s:
| Fase | Kjøringer | Hva tidslinjen viser |
|---|---|---|
| nominell, 600 s | clock, jamming (ingen jammer), integrity |
tidsfeil 0 ns; C/N0 43,0 dB-Hz mot et gulv på 25 dB-Hz; vertikalt beskyttelsesnivå 9,1 til 21,6 m mot en alarmgrense på 50 m |
| jamming, 600 s | det samme, jammer på -30 dBW, 1 km | C/N0 faller til 27,7 dB-Hz, alle 8 satellitter spores fortsatt |
spoofing, avsluttet ved 370 s av end_at |
spoof (tidsrampe på 0,1 ns/s), spoof-detect, jamming |
tidsfeilen øker gradvis til 36 ns. Radiofrekvensdetektoren gir alarm ved fasens start, den klokkestøttede overvåkeren ved 370 s |
| holdover, 1800 s | clock (nektet, bærer med seg 37,0 ns), gnss-ins (taktisk enhet på tomgang), jamming ved 10 dBW |
alle satellitter tapt (C/N0 omtrent -12 dB-Hz); tidsfeil 36,4 til 62,7 ns mot vakten på 50 ns; posisjonsfeil opptil 24 km |
| integrity-alarm, 600 s | clock (bærer med seg 59,6 ns), jamming og integrity med en maske på 25 deg |
5 satellitter spores; beskyttelsesnivå 19 til 135 m, mangler ved 18 av 60 rutenetttidspunkter; den overførte tidsfeilen, 52,1 til 61,7 ns, ligger fortsatt over vakten på 50 ns, så alarmen er oppe gjennom hele fasen |
| recovery, 600 s | clock, jamming (ingen jammer), integrity |
tidsfeilen er tilbake til 0 ns; alarmen er stille |
Integritetskjøringene bruker eksempelet integrity sitt eget brukerspor (et sirkulært spor i 0,4 km høyde), ikke jammingmottakerens faste sted, og masken på 25 deg står for den delvise himmelen til en mottaker som gjenfanger signaler. Dette er scenariovalg, oppgitt i filen.
Et oppdrag drevet av L-båndspekteret#
scenarios/campaign-spectrum-holdover-integrity.toml kjører 8 medlemsscenarioer over tre faser på et rutenett med 1 s, der C/N0 for GPS L1 C/A og Galileo E1 leses fra typen spectrum (se SPECTRUM.md) i stedet for fra typen jamming sin tabell per satellitt. Jammerne er de i scenarios/l-band-waterfall-jamming.toml.
| Fase | Kjøringer | Hva tidslinjen viser |
|---|---|---|
onset, avsluttet ved 10 s av end_at |
clock, spectrum (chirp fra 10 s), integrity |
L1 C/A 43,48 og E1 44,73 dB-Hz; fasen slutter ved spektrumkjøringens eget første tap av L1 C/A (timeline.bands[0].first_loss_t_s); beskyttelsesnivå 21,6 m mot 50 m |
| holdover, 600 s | clock (nektet, bærer med seg onset-feilen, her 0 ns), spectrum (chirp på) |
L1 C/A 3,38 og E1 4,44 dB-Hz, begge under gulvet på 25 dB-Hz; tidsfeil -0.07 til 5,06 ns mot vakten på 50 ns; alarmen er oppe |
| galileo-fallback, 300 s | clock (resynkronisert), spectrum (CW-tone på L1-bærebølgen), integrity på en Galileo-lignende Walker 24/3/1 |
L1 C/A holdt ved 17,98 dB-Hz, E1 tilbake til 44,73 dB-Hz; beskyttelsesnivå 6,1 til 17,7 m; alarmen er stille |
At E1 kommer seg under CW-tonen, hviler på behandlingen av kontinuerlig spektrum i typen spectrum: tonen ligger i nullpunktet til MBOC-spekteret og kobler ikke inn noe. En ekte tone ville koblet inn gjennom kodens spektrallinjer. Dette er oppgitt i filen og i SPECTRUM.md.
[sweep]: et parameterrutenett over en hvilken som helst type#
En til tre punktdelte scenarionøkler, hver over et lineært eller logaritmisk område, på de samme akseverdiene som typen sweep-nd bruker. Hver akse har et navn og en enhet. Hver metrikk har et navn og en resultatbane, og enheten leses fra enhetsblokken til den feide typen, med mindre kampanjen deklarerer en. Med runs > 1 er hver node et seedet Monte Carlo-ensemble (realisering k ved nodens seed pluss k), rapportert med statistikken nedenfor. scenarios/campaign-sweep-jammer-power.toml sveiper en jammer 1 km fra mottakeren fra -50 til +10 dBW. Det gjennomsnittlige forholdet mellom jammer og signal endrer seg nøyaktig 1 dB per dB (12,2 til 72,2 dB), og tilgjengeligheten faller fra 1 til 0 mellom -30 og -25 dBW.
En punktdelt nøkkel kan indeksere en tabellrekke etter posisjon: system.2.sisre_m er sisre_m i den tredje tabellen [[system]], og case.0.system.0.shell.0.altitude_km går tre nivåer ned.
[monte_carlo]: et seedet ensemble#
Realisering k kjører scenarioet med seed-nøkkelen satt til base_seed + k, konvensjonen som klokkeensemblet allerede bruker, slik at ensemblet kan reproduseres eksakt. Hver metrikk rapporterer gjennomsnittet, populasjonens standardavvik, 5., 50. og 95. persentil etter nærmeste rang, et persentil-bootstrap-konfidensintervall på 95 % med fast seed for gjennomsnittet (2000 resamplinger) og, som standard, hvert sample i seed-rekkefølge. Resultatbaner kan indeksere tabeller: classical.series[-1].error_ns er det siste samplet.
[compose]: flere scenarioer under felles betingelser#
Navngitte felles verdier (et tall eller en tabell med tall, med en enhet) skrives inn i hvert medlem på nøklene det binder dem til, slik at medlemmene ikke kan være uenige om den felles betingelsen. Hvert medlem kjøres, og for hver metrikk gir den samlede oppsummeringen den minste, største og gjennomsnittlige verdien på tvers av medlemmene og navngir den beste og den verste. scenarios/campaign-shared-jammer-sea-road.toml setter én jammer på 8 dBW mellom et skip i Finskebukta (omtrent 30 km unna) og en bil på en kystvei i Helsingfors (omtrent 50 km unna). Skipet mister alle satellitter (gjennomsnittlig forhold mellom jammer og signal 39,0 dB), mens bilen beholder minst fire (34,6 dB).
[optimize]: den beste verdien for én metrikk#
En til tre punktdelte scenarionøkler, hver avgrenset til [lo, hi] på en lin- eller log-skala, søkes etter den beste verdien for én metrikk (goal = "minimize", "maximize" eller "target", som minimerer avstanden fra target).
Det finnes to metoder:
method = "grid"kjører hver node i et rutenett medstepsper nøkkel, på sveipets akseverdier.method = "nelder-mead"(standard) kjører en deterministisk Nelder–Mead-simpleks i koordinater normalisert til [0, 1] per nøkkel. Prøvepunkter projiseres på boksen. Seksjonen tarmax_evals, et startstegstepog stopptoleranseneftologxtol.
En kjøring der metrikken mangler eller ikke er endelig, skårer dårligst og beholdes i sporet. Med runs > 1 er metrikken gjennomsnittet over de samme seedene ved hver evaluering. Resultatet gir best_coords, best_metric, best_score, evals, stop_reason og hver evaluering i trace.
scenarios/campaign-optimize-link-budget.toml søker etter rekkevidde og datarate for en lenkemargin på 3 dB. Optimum er lokalt for boksen og starten. Det er MODELLED, aldri en global påstand.
Protokollen og terskelene som ble fastsatt på forhånd, står i docs/design/evidence/cap32-optimize/. Testen er tests/campaign_optimize_reference.rs. Resultatene:
- en 1-D-målløsning stemmer med den lukkede formen til 6e-15;
- rutenettmetoden stemmer bit for bit med en uavhengig brute-force-løkke;
- simpleksen gjør det minst like bra som rutenettet på 41 × 41, på omtrent en tiendedel av kjøringene.
Terskelen for 1-D i runde 1 er registrert som NOT MET: boksen som ble fastsatt på forhånd, utelot løsningen.
Reproduserbarhet#
Hvert kampanjeresultat har scenario_hash, SHA-256 (Secure Hash Algorithm 2, 256-bits digest) av den kanoniske JavaScript Object Notation-formen (JSON) til kampanjedokumentet (rekkefølgen på nøklene og formateringen endrer den ikke), og en blokk reproducibility med antall medlemskjøringer og run_digest, en SHA-256 over digesten til hvert medlemsresultat i utsendelsesrekkefølge. To kjøringer med samme digest ga byte-identiske medlemsresultater. Hver fasekjøring registrerer også sin type, sin egen scenario_hash der typen har en, og SHA-256 av resultatdokumentet sitt. Hvert tall i dokumentet har en oppføring i enhetsblokken.
Kjernen er sekvensiell og leser ingen filer, så en kampanje kjører uendret i WebAssembly-bygget. Kampanjer kan ikke inneholde kampanjer.
Eksport#
--export på en kampanje skriver hvert medlemsscenario som har geometri, som sitt eget filsett, med medlemmets etikett satt inn før formatsuffikset: hver fasekjøring (<phase>, eller <phase>-<k> når fasen har flere kjøringer), sveipets basisscenario (sweep), Monte Carlo-scenarioet (monte-carlo) og hvert sammensatte medlem (med sin egen etikett, og med de felles verdiene det binder skrevet inn). Et medlem som er identisk med et tidligere, skrives én gang. Overleveringer og sveip- eller seed-verdier som er brukt under kjøring, er ikke med i de eksporterte scenarioene.
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 av medlemmene kan beskrive, avvises med den begrunnelsen. Tabellen per scenario står i INTEROP.md.
LEO-PNT-kampanjer#
Femten medfølgende kampanjer tar for seg spørsmål om posisjonering, navigasjon og tidssynkronisering (PNT) fra lav jordbane (LEO). LEO-PNT.md beskriver hva hver av dem viser. Hva hver av dem kjører, slik kommandolinjen oppsummerer det:
| Scenario | Modus | Spørsmål |
|---|---|---|
leo-focus-data-services.toml |
compose, 4 medlemmer | tjenestedata i navigasjonsmeldingen mot rammelengde |
leo-focus-fused-pnt-sisre.toml |
sveip av leo-pvt, 7 noder |
fusjonert MEO- og LEO-posisjonering mot LEO-signalets avstandsfeil i signalrommet (SISRE) |
leo-focus-indoor-uhf.toml |
compose, 2 medlemmer | LEO-PNT innendørs etter bånd og bygningsklasse |
leo-focus-iot-eirp.toml |
sveip av leo-pass, 9 noder |
energi per posisjonsbestemmelse for tingenes internett (IoT) mot LEO-UHF-senderens effekt |
leo-focus-ntn-bandwidth.toml |
sveip av ntn-positioning, 9 noder |
posisjonering i ikke-terrestriske nett (NTN) mot referansesignalets båndbredde |
leo-focus-ppp-altitude.toml |
sveip av leo-ppp, 3 noder |
konvergens for presis punktposisjonering (PPP) mot høyden til et LEO-lag med 192 satellitter |
leo-resilience-gnss-jammed-leo-carries.toml |
chain, 3 faser over 2100 s | globalt navigasjonssatellittsystem (GNSS) jammet, LEO-laget bærer brukeren, integriteten opprettholdt |
leo-resilience-multiband-diversity.toml |
sveip av spectrum, 13 noder |
LEO-båndmangfold mot en L-bånds barrage-jammer |
leo-resilience-spoof-monitors.toml |
compose, 4 medlemmer | spoofingovervåkerne mot fire spoofere |
leo-vertical-5g-network-timing.toml |
chain, 1 fase over 86 400 s | tidssynkronisering av 5G-basestasjoner: holdover og LEO-tid |
leo-vertical-asset-tracking-iot.toml |
chain, 3 faser over 1440 s | containersporing med LEO-UHF: energi per posisjonsbestemmelse langs en reise |
leo-vertical-autonomous-vehicle.toml |
chain, 2 faser over 1500 s | et autonomt kjøretøy i en bykløft med et LEO-lag |
leo-vertical-autonomous-vehicle-skyline.toml |
chain, 2 faser over 1800 s | den samme bykløften som en flat avskjæringsvinkel på 35 deg og som en city-street-silhuett |
leo-vertical-critical-infrastructure-timing.toml |
chain, 2 faser over 87 000 s | tidssynkronisering for kritisk infrastruktur: holdover med LEO-tid |
leo-vertical-polar-arctic.toml |
chain, 3 faser over 10 800 s | brukere i polare strøk og Arktis med et polart LEO-lag |
leo-vertical-rail-maritime.toml |
chain, 3 faser over 2520 s | jernbane- og sjøfartsbrukere med et LEO-lag |
MEO er middels høy jordbane, UHF ultrahøy frekvens og 5G femte generasjon av mobilnett.
Hva som kontrolleres#
tests/campaign_composition_reference.rs fester sammensetningsidentitetene:
- En kampanje med én fase reproduserer den frittstående kjøringen bit for bit. For
clock,integrityogjamminger medlemmets resultatdokument byte-identisk medrun_tomlpå scenariofilen, digesten er den kampanjen rapporterer, og med rutenettet på kjøringens eget steg er hver justerte verdi lik verdien i den frittstående serien (jamming-C/N0 er lik gjennomsnittet som er beregnet uavhengig fra det frittstående dokumentet). - Et sveip med én node og en sammensetning med ett medlem leser nøyaktig det frittstående tallet.
- Et ensemble med fast seed er byte-stabilt, og realisering
ker nøyaktig den frittstående kjøringen vedseed + k. Kampanjens hash ignorerer rekkefølgen på nøklene. - Et analytisk tilfelle.
scenarios/campaign-monte-carlo-clock-holdover.tomlkjører 200 seed av en brikkeskala atomklokke med bare hvit frekvensstøy (q_wf = 9e-20 s^2/s, Microchip SA.45s sigma_y(1 s) = 3e-10), synkronisert til 590 s og på tomgang til 3600 s. Den endelige tidsfeilen er gaussisk med gjennomsnitt 0 og standardavvik sqrt(q_wf * 3010 s) = 16,459 ns (fasens tilfeldige gange under hvit frekvensstøy, National Institute of Standards and Technology (NIST) Technical Note 1337). Det rapporterte intervallet, [-2.52, 1,59] ns, inneholder det sanne gjennomsnittet 0. Utvalgets standardavvik, 14,93 ns, gir en kjikvadratstatistikk på 164,5 med 199 frihetsgrader, innenfor det tosidige intervallet på 99 % [151,37, 254,14]. Med 3000 seed gir det samme scenarioet 16,31 ns. - Den spektrumdrevne kjeden leser de frittstående tallene: onset-fasen varer nøyaktig like lenge som spektrumkjøringens tid til første tap, og hver L1 C/A- og E1-verdi på tidslinjen er, innenfor 1e-9 dB, lik raden i det frittstående vannfallseksempelet for den samme jammertilstanden (nominell, bare chirp, bare CW-tone).
- Kjeden overleverer tilstand slik det er dokumentert: spoofingfasen varer nøyaktig like lenge som spoofkjøringens deteksjonstid, holdoveren bærer nøyaktig spoofkjøringens forskyvning ved deteksjon, recovery bærer ingenting, og alarmen er oppe overalt der beskyttelsesnivået mangler eller overstiger alarmgrensen.
Disse kontrollerer at sammensetning ikke endrer noe det ikke skal. De validerer ikke et lenket oppdrag mot et målt, og det er derfor de tre kampanjeradene i VERIFICATION-MATRIX.md er MODELLED.