Handleidingen
Praktische, uitgewerkte voorbeelden die u meenemen van “draai een meegeleverd scenario” naar “kwantificeer en verdedig een resultaat.” Elk getal in de drie tutorials is een echte uitvoer van de engine, verankerd aan een externe (niet-circulaire) gezaghebbende onafhankelijke referentie, en vastgelegd door een integratietest (tests/tutorials.rs), zodat een tutorial nooit ongemerkt kan afwijken van wat de engine werkelijk doet. Als een tutorial zegt dat de optische klok 6600 s volhoudt, laat de test de build falen op de dag dat dat niet langer waar is.
Kshana is een simulator voor positiebepaling, navigatie en tijdsynchronisatie (PNT). De tutorials gebruiken nog een paar afkortingen, elk uitgeschreven waar ze voor het eerst voorkomen: GNSS (Global Navigation Satellite System), GPS (Global Positioning System), CLI (command-line interface) en TOML (Tom's Obvious Minimal Language, het formaat van scenariobestanden).
Nieuw bij het project? Lees eerst de conceptenintroductie en de verklarende woordenlijst en kom dan hier terug.
De drie uitgewerkte voorbeelden#
| # | Tutorial | Wat u leert | Scenariosoort | Moeilijkheid | ~Tijd |
|---|---|---|---|---|---|
| 1 | Mijn eerste baan: waar zijn de GPS-satellieten | een echte GPS-constellatie propageren, beschikbaarheid, position dilution of precision (PDOP) en positienauwkeurigheid lezen, en exporteren waar de satellieten werkelijk zijn (SP3-formaat voor nauwkeurige banen) | orbit |
beginner | 15 min |
| 2 | Klok-holdover: hoelang kunt u doorlopen | een klok-holdover zonder GNSS draaien, de kwaliteitsmaat voor tijdsynchronisatie lezen en de groeiwet √(q_wf·T) erachter begrijpen | clock |
beginner | 20 min |
| 3 | Quantum tegenover klassieke GNSS-veerkracht | het sluitstuk: een spoofingdetector (spoof) en een volledige gefuseerde PNT-suite (hybrid), en hoe u beveiliging, integriteit en dead-reckoning samen leest |
spoof + hybrid |
gevorderd | 35 min |
Notebooks#
Uitvoerbare Jupyter-notebooks, op synthetische gegevens en openbare elementensets die alleen in de repository worden bewaard, staan in notebooks/:
| Notebook | Wat u leert |
|---|---|
| Vaartuigvertrouwen en training | een synthetische NMEA-stroom van de brug genereren met een gescripte gebeurtenis en die scoren met de vertrouwensmonitors voor vaartuigen (adviserend, geen typegoedgekeurde navigatieapparatuur) |
| Interferentiekaart en blootstelling van routes | waar navigatiegegevens verslechterd leken en hoeveel van een route daardoor wordt geraakt |
| Compliance-mapping en test-bench-export | voor welke rijen van openbare raamwerken een reeks runs bewijs levert (nooit dat een raamwerk is gehaald), en de beweging en gebeurtenissen van een scenario als tekst geëxporteerd voor een GNSS-simulator in een laboratorium (er wordt geen signaal geschreven) |
| Quantum tegenover klassieke GDOP | dezelfde constellatiegeometrie met een quantumsensor en een klassieke sensor, vergeleken op dilution of precision |
| Hemelgeometrie onder een skyline | de satellieten die een locatie ziet onder de skyline van een straat of kade, hun DOP en foutellips, een gedateerde hemel uit elementensets en een geseede Monte Carlo tegen de covariantie (MODELLED) |
Een tutorial draaien#
Elke tutorial draait hetzelfde scenario op drie manieren; kies wat bij u past. Ze roepen allemaal dezelfde engine aan, dus de getallen zijn identiek (volgt de sectie Usage van de README).
Opdrachtregel. De CLI schakelt op het veld kind van het scenario en schrijft <scenario>.result.json, <scenario>.chart.svg, <scenario>.report.html en <scenario>.report.json naast de invoer (JSON is JavaScript Object Notation, SVG Scalable Vector Graphics, HTML HyperText Markup Language). Enkele soorten publiceren ook een reproduceerbaarheidstabel als <scenario>.table.csv (door komma's gescheiden waarden): realtime-frame-eop, lunar-time-budget, lunar-jamming, leo-navmsg, telecom-timing, en moonlight-service-volume wanneer een exportlocatie is ingesteld. Geen van de drie tutorials is er een van, dus u ziet dat bestand hier niet.
cargo run -- scenarios/orbit-sgp4-gps.toml
cargo run -- bouwt de CLI uit deze checkout. Met een geïnstalleerd binair bestand (cargo install kshana) is dezelfde opdracht kshana scenarios/orbit-sgp4-gps.toml. Zonder checkout zijn de meeste meegeleverde scenario's in het binaire bestand opgenomen: kshana example somt ze op (en noemt de enkele die niet zijn opgenomen, met de reden), en kshana example orbit-sgp4-gps > orbit-sgp4-gps.toml schrijft er één uit: de kopie van scenarios/orbit-sgp4-gps.toml waarmee het binaire bestand is gebouwd.
Python. Bouw de extensie eenmalig uit deze checkout met maturin, binnen een actieve virtuele omgeving, en roep dan kshana.run aan:
pip install maturin
maturin develop --features python
import json, kshana
result = json.loads(kshana.run(open("scenarios/orbit-sgp4-gps.toml").read()))
print(result["geometry"]["best_pdop"])
pip install kshana installeert in plaats daarvan het gepubliceerde wheel. Dat kan achterlopen op deze checkout: json.loads(kshana.list_kinds()) vertelt u welke scenariosoorten uw build heeft.
Playground in de browser. Zonder installatie: open de Studio, kies een scenario, pas de parameters aan en lees het resultaat. Er wordt niets geüpload; de engine draait aan de clientzijde als WebAssembly.
De tutorials noemen de CLI, maar elke opdracht heeft hierboven het equivalent in Python en in de playground. Elk resultaat is reproduceerbaar uit scenario + seed + engine version: draai het twee keer en u krijgt bitidentieke uitvoer.
Geannoteerde leerscenario's#
Voor elk mogelijkhedendomein is er één rijkelijk becommentarieerd .toml onder scenarios/: een leerversie van een canoniek scenario met elk veld inline toegelicht, de aangehaalde onafhankelijke referentie genoemd en de verwachte samenvatting van één regel vastgelegd als commentaar # expected:. De veldwaarden zijn identiek aan die van het origineel in de map scenarios/ op het hoogste niveau van de repo (tests/tutorials.rs vergelijkt de geparseerde TOML), zodat de gedocumenteerde uitvoer klopt. De golden hashes blijven ook ongewijzigd: commentaar verandert nooit een scenariohash.
| Domein | Leerbestand | Type | Afgeleid van |
|---|---|---|---|
| Klok-holdover | scenarios/clock.toml | clock |
scenarios/clock-holdover.toml |
| Baan en geometrie | scenarios/orbit.toml | orbit |
scenarios/orbit-sgp4-gps.toml |
| Integriteit (RAIM, receiver autonomous integrity monitoring) | scenarios/integrity.toml | integrity |
scenarios/integrity-raim.toml |
| Beveiliging (spoofing) | scenarios/security.toml | spoof |
scenarios/spoof-attack.toml |
| Hybride PNT | scenarios/hybrid.toml | hybrid |
scenarios/hybrid-pnt.toml |
| Inertiële koppelnavigatie | scenarios/inertial.toml | inertial |
scenarios/imu-deadreckoning.toml |
| Tijdoverdracht | scenarios/timetransfer.toml | timetransfer |
scenarios/timetransfer.toml |
| GNSS-meetdomein | scenarios/gnss-sim.toml | gnss-sim |
scenarios/gnss-sim-raim.toml |
Het leerbestand voor beveiliging gebruikt
kind = "spoof"binnenin: de kwaliteitsmaat voor beveiliging (1 − P_md, één min de kans op gemiste detectie) wordt geproduceerd door het spoofpakket. De bestandsnaam volgt de mogelijkheid (beveiliging), dekindvolgt het pakket (spoof). De kop van dat bestand wijst hierop.
De volledige catalogus van scenariosoorten#
De engine schakelt op de kind van het scenario. De tabel hieronder somt de meestgebruikte soorten op (de acht tutorialdomeinen hierboven plus hun naaste buren). Het is niet de complete verzameling: src/api.rs::list_scenario_kinds() geeft alle 92 ingebouwde soorten terug. Die functie (beschikbaar als list_kinds() in de Python- en WebAssembly-bindings (WASM), en als kshana kinds --json op de opdrachtregel) is de gezaghebbende, altijd actuele catalogus, en SCENARIOS.md is de gegenereerde opsomming ervan, één sectie per soort met de verplichte en optionele TOML-velden. tests/tutorials.rs::tutorial_scenarios_use_real_kinds dwingt af dat elke soort die een tutorial beschrijft een echte dispatchsoort is, zodat niets in deze tabel een soort kan noemen die niet bestaat.
| Type | Wat het doet |
|---|---|
clock |
Klok-holdover tegenover specificatie; optioneel Monte-Carlo-ensemble (runs > 1). |
inertial |
1-DOF (één vrijheidsgraad) inertiële dead-reckoning tijdens een GNSS-uitval. |
orbit |
GNSS-beschikbaarheid + dilution of precision (DOP) uit een constellatie (Walker / two-line elements / RINEX, het Receiver Independent Exchange-formaat). |
integrity |
Snapshot / solution-separation / ARAIM (advanced RAIM) met horizontale en verticale beschermingsniveaus (HPL/VPL) + Stanford-diagram. |
lunar-integrity |
ARAIM-passage met beschermingsniveaus op de zuidpool van de maan tegenover een set LunaNet-relays. |
timetransfer |
Optische tegenover radiofrequente (RF) tweewegs tijd-/frequentieoverdracht. |
hybrid |
Sluitstuk hybride PNT: klok + inertiële meeteenheid (IMU) + ondersteuning met tijdoverdracht. |
fusion |
Gezamenlijke Kalman-sensorfusie voor PNT op dezelfde hybride invoer. |
gnss-ins |
Losjes en strak gekoppeld GNSS/INS (inertial navigation system) extended Kalman-filter met foutstatus. |
gnss-sim |
Pseudorange-simulatie in het meetdomein (Klobuchar-ionosfeer, Saastamoinen/Niell-troposfeer) + RAIM. |
jamming |
Jamming met linkbudget: jammer-to-signal ratio (J/S) → effectieve draaggolf-ruisdichtheid (C/N₀) → verlies van lock. |
spoof |
Stochastische detector voor tijdspoofing (Neyman–Pearson / χ²₁) met Monte-Carlo-kansen op vals alarm en gemiste detectie (P_fa/P_md). |
sweep |
1-D-sweep voor een afwegingsstudie over een parameter van een klokpakket. |
sweep-nd |
Generieke N-D-sweep over elk pakket via TOML-sleutels met punten / JSON-metriekpaden. |
Voorbij de tutorials: nieuwere mogelijkheden#
De drie tutorials blijven bij de klassieke pakketten voor klok, baan en beveiliging. De engine is daar ver bovenuit gegroeid. Elke rij hieronder is een meegeleverd scenario dat u ongewijzigd kunt draaien (cargo run -- <file> of kshana <file>); de samenvatting is de eerste regel die kshana 0.35.0 er op 2026-10-10 voor afdrukte. Anders dan de cijfers uit de tutorials zijn deze regels de vastlegging van één run en niet vastgelegd door tests/tutorials.rs: draai het scenario opnieuw voor de actuele waarde. Resultaten vermelden hun eigen reikwijdte (de meeste hebben een label), en de verificatiematrix vermeldt welke mogelijkheden VALIDATED zijn aan een externe onafhankelijke referentie en welke MODELLED.
| Mogelijkheid | Scenario | Type | Eerste regel van de samenvatting | Meer lezen |
|---|---|---|---|---|
| L-bandspectrum en jammingwaterval | scenarios/l-band-waterfall-jamming.toml |
spectrum |
scenario spectrum | 5 bands | 3 jammers | noise floor -202.0 dBW/Hz | worst band gps-l1ca min C/N0 3.2 dB-Hz (J/S 60.2 dB) |
SPECTRUM.md |
| Het zonnestelsel op één epoch | scenarios/solar-system-tour.toml |
solar-system |
Solar system at 2026-09-28T00:00:00 (JD 2461311.50080 TDB), 18 bodies, observer Earth |
SCENARIOS.md |
| Positiebepaling rond een ander hemellichaam | scenarios/europa-surface-pnt.toml |
body-pnt |
Positioning around Europa — surface user, 12 relays at 4500 km, 171 epochs |
SCENARIOS.md |
| Constellatieontwerp op schaal | scenarios/constellation-multi-gnss-coverage.toml |
constellation-design |
constellation-design: 102 satellites (GPS, Galileo, BeiDou, GLONASS) around the Earth; availability 100.00% (PDOP <= 6 at 10 deg mask), … |
CONSTELLATION-DESIGN.md |
| Campagnes: soorten geketend op één tijdlijn | scenarios/campaign-jam-spoof-holdover-integrity.toml |
campaign |
campaign f87a4a0e0bab | Jamming, spoofing, holdover and integrity: a chained mission | chain: 6 phases over 4570 s, … |
CAMPAIGNS.md |
| Eén LEO-PNT-systeem van begin tot eind | scenarios/leo-pnt-end-to-end.toml |
leo-pnt-chain |
LEO-PNT end to end, generic 1080 km constellation |
LEO-PNT.md |
| Gefuseerde MEO- + LEO-positiebepaling | scenarios/meo-leo-fused-pvt.toml |
leo-pvt |
LEO PVT (joint) at 40.42, -3.70 over 1800 s |
LEO-PNT-FUSION.md |
| LEO-signalen, passages en navigatieberichten | scenarios/leo-band-trade.toml, scenarios/leo-pass-iridium.toml, scenarios/leo-navmsg-encode-decode.toml |
leo-signal, leo-pass, leo-navmsg |
LEO pass link budget, air user at 50.00, -30.00; 1 LEO satellite(s), 900 s window (de passage) |
LEO-SIGNAL.md, LEO-PASS.md, LEO-NAVMSG.md |
| PPP-convergentie met een LEO-laag; 5G-positiebepaling | scenarios/leo-ppp-convergence.toml, scenarios/ntn-5g-positioning.toml |
leo-ppp, ntn-positioning |
PPP convergence to 0.10 m horizontal / 0.10 m vertical, 12 runs per case, 96 GNSS satellites |
SCENARIOS.md |
| Veerkracht: GNSS gejamd, LEO draagt de gebruiker | scenarios/leo-resilience-gnss-jammed-leo-carries.toml |
campaign |
campaign 248395b851cc | GNSS jammed, LEO-PNT carries the user, integrity maintained | chain: 3 phases over 2100 s, … |
RESILIENCE-CROSSWALK.md |
| Verticale toepassingen: spoor, maritiem, telecom, voertuigen, Arctisch gebied | scenarios/leo-vertical-rail-maritime.toml (en de andere leo-vertical-*-bestanden) |
campaign |
campaign 49575d27b696 | Railway and maritime with a LEO layer | chain: 3 phases over 2520 s, … |
CAMPAIGNS.md |
| Telecom-holdover tegenover de klokgrenzen van ITU-T (International Telecommunication Union, Telecommunication Standardization Sector) G.8272 | scenarios/telecom-prtc-holdover-24h.toml |
telecom-timing |
telecom-timing: max|TE| 603.2 ns over 90000 s; eprtc-a-holdover FAIL, prtc-a FAIL; 100 ns budget exceeded after 8206 s (MODELLED) |
TELECOM-TIMING.md |
LEO is lage baan om de aarde (low Earth orbit) en MEO middelhoge baan om de aarde (medium Earth orbit); PVT is positie, snelheid en tijd; PPP is precise point positioning; 5G is de vijfde generatie mobiele standaard; TDB is Barycentric Dynamical Time; JD is Juliaanse datum; TE is tijdfout.
De CLI voegt drie uitvoeren toe aan elke run:
- Rapporten. Elke run schrijft
<scenario>.report.htmlen<scenario>.report.json(zie REPORTS.md).kshana --study <suite.toml>draait een suite van scenario's naar één.study.jsonen.study.html, bijvoorbeeldkshana --study scenarios/quantum-pnt-demonstrator.suite.toml. - Animation.
kshana <scenario.toml> --animate <svg|html|frames|all>geeft de tijdreeks van de run weer, bijvoorbeeld--animate htmlopscenarios/orbit-sgp4-gps.tomlschrijftorbit-sgp4-gps.animation.html. Een soort zonder bemonsterde tijdas (zoalssolar-system) wordt met een foutmelding geweigerd; zie ANIMATION.md. - Interop-exports.
--export <czml|kml|geojson|stk|sigmf|all|list>schrijft het resultaat voor andere hulpmiddelen: CZML (Cesium Language), KML (Keyhole Markup Language, voor Google Earth), GeoJSON (geografische JSON), een efemeride voor STK (Systems Tool Kit) of een opname in SigMF (Signal Metadata Format).--export listzegt welke formaten voor een scenario gelden; SigMF geldt alleen voorspectrum. Het baanpakket exporteert ook--export-sp3,--export-ommen--export-oem(CCSDS, het Consultative Committee for Space Data Systems, baanberichten). Zie INTEROP.md.
Oefeningen met oplopende moeilijkheid#
Werk de ladder door. Elke tier is moeilijker en beter verdedigbaar dan de vorige; referentie-oplossingen staan in exercises/.
| Tier | Doel | Wat u doet | Referentie-oplossing |
|---|---|---|---|
| Tier 1 — draaien en lezen | een meegeleverd scenario ongewijzigd draaien en één kwaliteitsmaat lezen | Draai scenarios/clock-holdover.toml; druk de holdover_s van quantum tegenover klassiek af. CLI, playground of een Python-aanroep van één regel. |
exercises/tier1_run.py |
| Tier 2 — bewerken en sweepen | verander één parameter en observeer een monotoon effect | Scherp de klokspecificatie (threshold_ns) aan of verleng de uitval en zie de holdover dalen; of gebruik kind = "sweep"/"sweep-nd" om die in een tabel te zetten. |
exercises/tier2_sweep.py |
| Tier 3 — kwantificeren en verdedigen | Monte-Carlo, betrouwbaarheidsbanden, reproduceerbaarheid en een beschermingsniveau | Draai een klokensemble (runs = N), lees de band [p05–p95], bevestig dat twee runs een identieke scenario_hash geven en lees een integriteits-/Stanford-resultaat. |
exercises/tier3_montecarlo.py |
De referentie-oplossingen gebruiken de Python-extensie (eerst maturin develop --features python). Vanuit de root van de repository gedraaid drukt tier2_sweep.py af dat de holdover van de atoomklok op chipschaal daalt van 2610 s bij een specificatie van 20 ns naar 1140 s bij 5 ns.
Verse gegevens nodig?#
De kerngetallen in deze tutorials draaien volledig uit scenario's die al in de repo staan. Er wordt niets opgehaald, en dat houdt ze reproduceerbaar en veilig om in continuous integration (CI) te draaien. Voor de oefeningen “breid het uit” kunt u live gegevens ophalen:
- GPS two-line elements (TLE's) (ververs de baanconstellatie): https://celestrak.org/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=tle, elementensets van 3 regels in platte tekst (naam + regel 1 + regel 2). Hulpmiddel:
scripts/fetch_tles.sh. Open gegevens (catalogus van het 18th Space Defense Squadron van de US Space Force, herverspreid door Celestrak, Dr T. S. Kelso). - Verificatiereferentie voor SGP4 (Simplified General Perturbations 4) (al opgenomen, haal niet opnieuw op): de testvectoren uit AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 “Revisiting Spacetrack Report #3”, https://celestrak.org/publications/AIAA/2006-6753/, gebruikt door
tests/sgp4_verification.rs; ziedocs/SGP4-VALIDATION.md. - Onafhankelijke referentie voor klokstabiliteitsrelaties: NIST (National Institute of Standards and Technology) Special Publication 1065 (Riley, Handbook of Frequency Stability Analysis), https://tf.nist.gov/general/pdf/2220.pdf, de relaties tussen σ_y(τ) en fase achter Tutorial 2.