Campagnes
Een enkel scenario beantwoordt één vraag over één situatie. Een missie is een reeks situaties en een ontwerpstudie is een familie ervan. De scenariosoort campaign voegt de bestaande soorten samen tot één run zonder er een opnieuw te implementeren: elk lid is een gewone scenariotabel met zijn eigen kind, via api::run_toml verwerkt precies zoals kshana <file>.toml het zou draaien, en de campagne leest alleen getallen terug uit de resultaatdocumenten.
Een campagne is MODELLED. De samenstellingsidentiteiten ervan worden getest (hieronder), maar het aaneenschakelen van fasen is een modelleerkeuze, en elke fase is slechts zo goed als de soort die haar draaide.
Draai er een zoals elk ander scenario:
kshana scenarios/campaign-jam-spoof-holdover-integrity.toml
# writes .result.json, .chart.svg, .report.html and .report.json next to the file
Een campagne mag elke combinatie van vier secties bevatten; een campagne zonder secties draait en haar samenvatting meldt dat er niets is samengesteld.
[[phases]]: een aaneengeschakelde missie op één tijdlijn#
Elke fase draait een of meer scenario's over een venster van een gedeelde missietijdlijn, bijvoorbeeld een klok in holdover en een traagheidsnavigatiesysteem (INS) dat tegelijkertijd uitloopt. De uitvoer van elke run wordt ingelezen in benoemde kanalen, op de starttijd van de fase geplaatst en door zero-order hold herbemonsterd op een gemeenschappelijk raster ([timeline] step_s): een rastertijd neemt het laatste sample van de run van de bijbehorende fase op of vóór die tijd, en is null waar geen run van die fase het kanaal levert.
| Kanaal | Eenheid | Wat het is | Bron van de voorinstelling |
|---|---|---|---|
time_error_ns |
ns | tijdfout van de klok | clock: <side>.series[].error_ns; spoof: <side>.series[].offset_ns |
guard_ns |
ns | bewaking van de tijdfout | de eigen threshold_ns van de run |
cn0_dbhz |
dB-Hz | gemiddelde effectieve draaggolf-ruisdichtheidsverhouding (C/N0) over de zichtbare satellieten | jamming: gemiddelde van epochs[].sats[].cn0_effective_dbhz |
cn0_floor_dbhz |
dB-Hz | ondergrens voor volgverlies | jamming: de tracking_threshold_dbhz van het scenario, wanneer dat er een opgeeft |
tracking |
aantal | satellieten die nog worden gevolgd | jamming: epochs[].tracking |
protection_level_m |
m | verticaal beschermingsniveau | integrity: epochs[].vpl_m |
alert_limit_m |
m | verticale alarmlimiet | integrity: al_v_m |
position_error_m |
m | positiefout | gnss-ins: <side>.series[].error_m |
position_threshold_m |
m | drempel voor de positiefout | gnss-ins: threshold_m |
alarm |
1 | 1 zolang een monitor van de fase alarm geeft | zie hieronder |
<side> is classical tenzij de run side = "quantum" instelt. Elke andere grootheid wordt gelezen met een expliciete invoer [[phases.runs.series]]: een tijdpad met één [] die de rijen benoemt (epochs[].t), een waardepad dat die rijen deelt of een scalaire waarde die naar elke rij wordt verspreid (voorvoegsel input: leest het scenario van de run in plaats van het resultaat), een optionele reductie (mean, min, max, count) voor meerdere waarden onder één rij, een schaal, en een eenheid voor een kanaal dat de campagne niet kent.
Alarmen komen uit drie bronnen, binnen een fase gecombineerd met logische OR:
- voorinstellingsvlaggen uit de run:
jamminggeeft alarm zolang minder dan vier satellieten worden gevolgd (zijn eigen definitie van beschikbaarheid);integritygeeft alarm op epochs die hij als niet beschikbaar markeert; - voorinstellingsregels op de kanalen van de fase, geëvalueerd na
carry:clockgeeft alarm zolang de absolute tijdfoutguard_nsoverschrijdt;gnss-inszolang de positiefoutposition_threshold_moverschrijdt; expliciete regels staan in[[phases.runs.alarms]]; - alarmerende gebeurtenissen:
spoofgenereert er een bij dedetect_time_svan zijn klokondersteunde monitor;spoof-detectgenereert er een bij het begin van de fase wanneer zijn gefuseerde beslissing alarm geeft.
De toestand wordt doorgegeven tussen fasen op drie expliciete manieren:
carry = ["time_error_ns"]telt de waarde van het kanaal aan het einde van de vorige fase op bij de waarden ervan in deze fase. De klokfase die een spoofer heeft weggetrokken, is het punt waar de holdover begint. Het optellen van de offset is exact voor klokfase, die frequentie integreert; voor een positiefout veronderstelt het dat de twee fouten collineair zijn, het pessimistische geval.[[phases.handoff]]schrijft een getal uit de vorige fase (channel:<name>voor de eindwaarde van een kanaal, of een willekeurig resultaatpad van een vorige run) naar een sleutel met punten in het scenario van deze fase voordat die draait, met een optionele schaal en offset.end_at = "<result path>"beëindigt de fase op een tijdstip dat een run heeft berekend, begrensd doorduration_s. De meegeleverde missie beëindigt haar spoofingfase opclassical.detect_time_s.
skip_s laat de eerste seconden van de eigen tijdlijn van een run weg (een opwarmperiode) vóór fasetijd nul.
De meegeleverde missie#
scenarios/campaign-jam-spoof-holdover-integrity.toml draait 18 lidscenario's over zes fasen op een raster van 10 s:
| Fase | Runs | Wat de tijdlijn laat zien |
|---|---|---|
| nominaal, 600 s | clock, jamming (geen jammer), integrity |
tijdfout 0 ns; C/N0 43,0 dB-Hz tegenover een ondergrens van 25 dB-Hz; verticaal beschermingsniveau 9,1 tot 21,6 m tegenover een alarmlimiet van 50 m |
| jamming, 600 s | hetzelfde, jammer op -30 dBW, 1 km | C/N0 daalt tot 27,7 dB-Hz, alle 8 satellieten worden nog gevolgd |
spoofing, beëindigd op 370 s door end_at |
spoof (tijdhelling van 0,1 ns/s), spoof-detect, jamming |
de tijdfout loopt op tot 36 ns; de radiofrequentiedetector geeft alarm bij het begin van de fase, de klokondersteunde monitor op 370 s |
| holdover, 1800 s | clock (geweigerd, draagt 37,0 ns mee), gnss-ins (tactische eenheid die uitloopt), jamming bij 10 dBW |
elke satelliet verloren (C/N0 ongeveer -12 dB-Hz); tijdfout 36,4 tot 62,7 ns tegenover de bewaking van 50 ns; positiefout tot 24 km |
| integrity-alarm, 600 s | clock (draagt 59,6 ns mee), jamming en integrity met een masker van 25 graden |
5 satellieten worden gevolgd; beschermingsniveau 19 tot 135 m, ontbrekend op 18 van de 60 rastertijden; de meegedragen tijdfout, 52,1 tot 61,7 ns, blijft boven de bewaking van 50 ns, dus het alarm staat de hele fase aan |
| herstel, 600 s | clock, jamming (geen jammer), integrity |
tijdfout terug op 0 ns; alarm stil |
De integriteitsruns gebruiken het eigen gebruikerstraject van het voorbeeld integrity (een cirkelvormig traject op een hoogte van 0,4 km), niet de vaste locatie van de jamming-ontvanger, en het masker van 25 graden staat voor de gedeeltelijke hemel van een ontvanger die opnieuw verwerft. Dat zijn scenariokeuzes, vermeld in het bestand.
Een missie aangestuurd door het L-bandspectrum#
scenarios/campaign-spectrum-holdover-integrity.toml draait 8 lidscenario's over drie fasen op een raster van 1 s, waarbij de C/N0 van GPS L1 C/A en Galileo E1 uit de soort spectrum wordt gelezen (zie SPECTRUM.md) en niet uit de tabel per satelliet van de soort jamming. De jammers zijn die uit scenarios/l-band-waterfall-jamming.toml.
| Fase | Runs | Wat de tijdlijn laat zien |
|---|---|---|
begin, beëindigd op 10 s door end_at |
clock, spectrum (chirp vanaf 10 s), integrity |
L1 C/A 43,48 en E1 44,73 dB-Hz; de fase eindigt bij het eerste verlies van L1 C/A in de eigen spectrumrun (timeline.bands[0].first_loss_t_s); beschermingsniveau 21,6 m tegenover 50 m |
| holdover, 600 s | clock (geweigerd, draagt de beginfout mee, hier 0 ns), spectrum (chirp aan) |
L1 C/A 3,38 en E1 4,44 dB-Hz, beide onder de ondergrens van 25 dB-Hz; tijdfout -0.07 tot 5,06 ns tegenover de bewaking van 50 ns; alarm aan |
| galileo-fallback, 300 s | clock (opnieuw gesynchroniseerd), spectrum (CW-toon op de L1-draaggolf), integrity op een Galileo-achtige Walker 24/3/1 |
L1 C/A blijft op 17,98 dB-Hz, E1 terug op 44,73 dB-Hz; beschermingsniveau 6,1 tot 17,7 m; alarm stil |
Dat E1 herstelt onder de CW-toon berust op de behandeling van continue spectra door de spectrumsoort: de toon valt in het nulpunt van het MBOC-spectrum en koppelt niets in. Een echte toon zou wel koppelen via de spectraallijnen van de code; dat staat in het bestand en in SPECTRUM.md.
[sweep]: een parameterraster over elke soort#
Een tot drie scenariosleutels met punten, elk over een lineair of logaritmisch bereik, op dezelfde aswaarden als de soort sweep-nd gebruikt. Elke as heeft een naam en een eenheid; elke metriek heeft een naam en een resultaatpad, en haar eenheid wordt gelezen uit het eigen eenhedenblok van de doorgelopen soort, tenzij de campagne er een opgeeft. Met runs > 1 is elk knooppunt een geseed Monte Carlo-ensemble (realisatie k op de seed van het knooppunt plus k), gerapporteerd met de statistieken hieronder. scenarios/campaign-sweep-jammer-power.toml doorloopt een jammer op 1 km van de ontvanger van -50 tot +10 dBW: de gemiddelde verhouding tussen jammer en signaal verschuift precies 1 dB per dB (12,2 tot 72,2 dB), en de beschikbaarheid daalt van 1 naar 0 tussen -30 en -25 dBW.
Een sleutel met punten mag een array van tabellen op positie indexeren: system.2.sisre_m is de sisre_m van de derde tabel [[system]], en case.0.system.0.shell.0.altitude_km reikt drie niveaus diep.
[monte_carlo]: een geseed ensemble#
Realisatie k draait het scenario met zijn seedsleutel ingesteld op base_seed + k, de conventie die het klokensemble al gebruikt, zodat het ensemble exact reproduceert. Elke metriek rapporteert het gemiddelde, de populatiestandaardafwijking, het 5e, 50e en 95e percentiel volgens nearest-rank, een percentiel-bootstrap-betrouwbaarheidsinterval van 95% op het gemiddelde met vaste seed (2000 herbemonsteringen) en, standaard, elk sample in seedvolgorde. Resultaatpaden mogen arrays indexeren: classical.series[-1].error_ns is het laatste sample.
[compose]: meerdere scenario's onder gedeelde omstandigheden#
Benoemde gedeelde waarden (een getal of een array van getallen, met een eenheid) worden in elk lid weggeschreven op de sleutels waaraan het ze koppelt, zodat de leden het niet oneens kunnen zijn over de gedeelde omstandigheid. Elk lid draait, en voor elke metriek geeft de gecombineerde samenvatting de kleinste, de grootste en de gemiddelde waarde over de leden, met vermelding van de beste en de slechtste. scenarios/campaign-shared-jammer-sea-road.toml plaatst één jammer van 8 dBW tussen een schip in de Finse Golf (ongeveer 30 km weg) en een auto op een kustweg bij Helsinki (ongeveer 50 km): het schip verliest elke satelliet (gemiddelde verhouding tussen jammer en signaal 39,0 dB) terwijl de auto er minstens vier behoudt (34,6 dB).
[optimize]: de beste waarde van één metriek#
Een tot drie scenariosleutels met punten, elk begrensd tot [lo, hi] op een schaal lin of log, worden doorzocht naar de beste waarde van één metriek (goal = "minimize", "maximize" of "target", wat de afstand tot target minimaliseert).
Er zijn twee methoden:
method = "grid"draait elk knooppunt van een raster metstepsper sleutel, op de aswaarden van de sweep.method = "nelder-mead"(de standaard) draait een deterministische Nelder–Mead-simplex in coördinaten die per sleutel zijn genormaliseerd naar [0, 1]. Proefpunten worden op de doos geprojecteerd. De sectie neemtmax_evals, een initiëlestepen de stoptolerantiesftolenxtol.
Een run waarvan de metriek ontbreekt of niet eindig is, scoort het slechtst en wordt in de trace bewaard. Met runs > 1 is de metriek bij elke evaluatie het gemiddelde over dezelfde seeds. Het resultaat geeft best_coords, best_metric, best_score, evals, stop_reason en elke evaluatie in trace.
scenarios/campaign-optimize-link-budget.toml zoekt bereik en datasnelheid voor een linkmarge van 3 dB. Het optimum is lokaal voor de doos en het startpunt. Het is MODELLED, nooit een globale bewering.
Het protocol en de vooraf vastgelegde drempels staan in docs/design/evidence/cap32-optimize/. De test is tests/campaign_optimize_reference.rs. De resultaten:
- een 1-D-doeloplossing komt tot op 6e-15 overeen met de gesloten vorm;
- de rastermethode komt bit voor bit overeen met een onafhankelijke brute-force-lus;
- de simplex doet het minstens zo goed als het raster van 41 × 41, in ongeveer een tiende van de runs.
De 1-D-drempel van ronde 1 is vastgelegd als NOT MET: de vooraf vastgelegde doos sloot de oplossing uit.
Reproduceerbaarheid#
Elk campagneresultaat draagt scenario_hash, de SHA-256 (Secure Hash Algorithm 2, digest van 256 bit) van de canonieke JavaScript Object Notation-vorm (JSON) van het campagnedocument (sleutelvolgorde en opmaak veranderen hem niet), en een blok reproducibility met het aantal lid-runs en run_digest, een SHA-256 over de digest van elk lidresultaat in dispatchvolgorde. Twee runs met dezelfde digest leverden byte-identieke lidresultaten op. Elke faserun legt ook haar soort vast, haar eigen scenario_hash waar de soort er een heeft, en de SHA-256 van haar resultaatdocument. Elk getal in het document heeft een eenhedeninvoer.
De kern is sequentieel en leest geen bestanden, dus een campagne draait ongewijzigd in de WebAssembly-build. Campagnes mogen geen campagnes bevatten.
Exports#
--export op een campagne schrijft elk lidscenario dat geometrie heeft als eigen bestandsset, met het label van het lid ingevoegd vóór het formaatachtervoegsel: elke faserun (<phase>, of <phase>-<k> wanneer de fase meerdere runs heeft), het basisscenario van de sweep (sweep), het Monte Carlo-scenario (monte-carlo) en elk samengesteld lid (met zijn eigen label en de gedeelde waarden die het koppelt erin geschreven). Een lid dat identiek is aan een eerder lid wordt één keer geschreven; hand-offs en sweep- of seedwaarden die tijdens de run worden toegepast, staan niet in de geëxporteerde scenario's.
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
Een formaat dat geen van de leden kan beschrijven, wordt geweigerd met die reden. De tabel per scenario staat in INTEROP.md.
LEO-PNT-campagnes#
Vijftien meegeleverde campagnes stellen vragen over positiebepaling, navigatie en tijdsynchronisatie (PNT) met satellieten in een lage baan om de aarde (LEO) aan de orde; LEO-PNT.md beschrijft wat elk ervan laat zien. Wat elk draait, zoals de opdrachtregel het samenvat:
| Scenario | Modus | Vraag |
|---|---|---|
leo-focus-data-services.toml |
compose, 4 leden | servicegegevens van het navigatiebericht tegenover de framelengte |
leo-focus-fused-pnt-sisre.toml |
sweep van leo-pvt, 7 knooppunten |
gefuseerde MEO- en LEO-positiebepaling tegenover de LEO-signaal-in-de-ruimtebereikfout (SISRE) |
leo-focus-indoor-uhf.toml |
compose, 2 leden | LEO-PNT binnenshuis per band en gebouwklasse |
leo-focus-iot-eirp.toml |
sweep van leo-pass, 9 knooppunten |
energie per positiebepaling van Internet of Things (IoT) tegenover het LEO-UHF-zendvermogen |
leo-focus-ntn-bandwidth.toml |
sweep van ntn-positioning, 9 knooppunten |
positiebepaling in niet-terrestrische netwerken (NTN) tegenover de bandbreedte van het referentiesignaal |
leo-focus-ppp-altitude.toml |
sweep van leo-ppp, 3 knooppunten |
convergentie van nauwkeurige puntpositiebepaling (PPP) tegenover de hoogte van een LEO-laag van 192 satellieten |
leo-resilience-gnss-jammed-leo-carries.toml |
chain, 3 fasen over 2100 s | Global Navigation Satellite System (GNSS) gejamd, de LEO-laag draagt de gebruiker, integriteit gehandhaafd |
leo-resilience-multiband-diversity.toml |
sweep van spectrum, 13 knooppunten |
LEO-banddiversiteit tegenover een L-band-breedbandjammer |
leo-resilience-spoof-monitors.toml |
compose, 4 leden | de spoofingmonitors tegenover vier spoofers |
leo-vertical-5g-network-timing.toml |
chain, 1 fase over 86.400 s | tijdsynchronisatie van 5G-basisstations: holdover en LEO-tijd |
leo-vertical-asset-tracking-iot.toml |
chain, 3 fasen over 1440 s | containertracking met LEO-UHF: energie per positiebepaling langs een reis |
leo-vertical-autonomous-vehicle.toml |
chain, 2 fasen over 1500 s | een autonoom voertuig in een stedelijke canyon met een LEO-laag |
leo-vertical-autonomous-vehicle-skyline.toml |
chain, 2 fasen over 1800 s | dezelfde stedelijke canyon als vlakke afsnijhoek van 35 graden en als skyline city-street |
leo-vertical-critical-infrastructure-timing.toml |
chain, 2 fasen over 87.000 s | tijdsynchronisatie van kritieke infrastructuur: holdover met LEO-tijd |
leo-vertical-polar-arctic.toml |
chain, 3 fasen over 10.800 s | polaire en arctische gebruikers met een polaire LEO-laag |
leo-vertical-rail-maritime.toml |
chain, 3 fasen over 2520 s | spoorweg- en maritieme gebruikers met een LEO-laag |
MEO is medium Earth orbit (middelhoge baan om de aarde), UHF ultra-high frequency en 5G de vijfde generatie mobiele netwerken.
Wat wordt gecontroleerd#
tests/campaign_composition_reference.rs legt de samenstellingsidentiteiten vast:
- Een campagne van één fase reproduceert de zelfstandige run bit voor bit. Voor
clock,integrityenjammingis het resultaatdocument van het lid byte-identiek aanrun_tomlop het scenariobestand, is zijn digest die welke de campagne rapporteert, en is bij een raster met de eigen stap van de run elke uitgelijnde waarde gelijk aan de waarde van de zelfstandige reeks (de jamming-C/N0 is gelijk aan het gemiddelde dat onafhankelijk is berekend uit het zelfstandige document). - Een sweep van één knooppunt en een samenstelling van één lid lezen precies het getal van de zelfstandige run.
- Een ensemble met vaste seed is byte-stabiel, en realisatie
kis precies de zelfstandige run opseed + k; de campagnehash negeert de sleutelvolgorde. - Een analytisch geval.
scenarios/campaign-monte-carlo-clock-holdover.tomldraait 200 seeds van een chipschaal-atoomklok met alleen witte frequentieruis (q_wf = 9e-20 s^2/s, Microchip SA.45s sigma_y(1 s) = 3e-10), gesynchroniseerd tot 590 s en uitlopend tot 3600 s. De uiteindelijke tijdfout is Gaussisch met gemiddelde 0 en standaardafwijking sqrt(q_wf * 3010 s) = 16,459 ns (de random walk van de fase onder witte frequentieruis, National Institute of Standards and Technology (NIST) Technical Note 1337). Het gerapporteerde interval, [-2.52, 1,59] ns, bevat het ware gemiddelde 0; de steekproefstandaardafwijking, 14,93 ns, geeft een chikwadraatstatistiek van 164,5 bij 199 vrijheidsgraden, binnen het tweezijdige interval van 99% [151,37, 254,14]. Bij 3000 seeds geeft hetzelfde scenario 16,31 ns. - De door het spectrum aangestuurde keten leest de zelfstandige getallen: de beginfase duurt precies zo lang als de tijd tot het eerste verlies in de spectrumrun, en elke waarde voor L1 C/A en E1 op de tijdlijn is, tot op 1e-9 dB, gelijk aan de rij van het zelfstandige waterfallvoorbeeld voor dezelfde jammertoestand (nominaal, alleen chirp, alleen CW-toon).
- De keten geeft de toestand door zoals gedocumenteerd: de spoofingfase duurt precies zo lang als de detectietijd van de spoofrun, de holdover draagt precies de offset van de spoofrun bij detectie mee, herstel draagt niets mee, en het alarm staat aan overal waar het beschermingsniveau ontbreekt of de alarmlimiet overschrijdt.
Deze controleren dat samenstellen niets verandert wat niet zou mogen veranderen. Ze toetsen een aaneengeschakelde missie niet aan een gemeten missie, en daarom zijn de drie campagnerijen in VERIFICATION-MATRIX.md MODELLED.