Tutorials
Praxisnahe, durchgespielte Beispiele, die Sie von „ein mitgeliefertes Szenario ausführen“ zu „ein Ergebnis quantifizieren und verteidigen“ führen. Jede in den drei Tutorials genannte Zahl ist eine reale Ausgabe der Engine, verankert an einer externen (nicht zirkulären) maßgeblichen unabhängigen Referenz und durch einen Integrationstest festgeschrieben (tests/tutorials.rs), sodass ein Tutorial nie unbemerkt von dem abweichen kann, was die Engine tatsächlich tut. Sagt ein Tutorial, dass die optische Uhr 6600 s hält, lässt der Test den Build an dem Tag scheitern, an dem das nicht mehr stimmt.
Kshana ist ein Simulator für Positionierung, Navigation und Zeitgebung (PNT). Die Tutorials verwenden einige weitere Abkürzungen, die jeweils an der ersten Stelle ausgeschrieben sind: GNSS (Global Navigation Satellite System), GPS (Global Positioning System), CLI (Befehlszeilenschnittstelle) und TOML (Tom's Obvious Minimal Language, das Format der Szenariodatei).
Neu im Projekt? Lesen Sie zuerst die Einführung in die Konzepte und das Glossar und kehren Sie dann hierher zurück.
Die drei durchgespielten Beispiele#
| # | Tutorial | Was Sie lernen | Szenarioart | Schwierigkeit | ~Zeit |
|---|---|---|---|---|---|
| 1 | Meine erste Umlaufbahn: wo die GPS-Satelliten sind | eine reale GPS-Konstellation propagieren, Verfügbarkeit, Positions-DOP (PDOP) und Positionsgenauigkeit lesen und exportieren, wo die Satelliten tatsächlich sind (SP3-Präzisionsbahnformat) | orbit |
Einsteiger | 15 min |
| 2 | Uhren-Holdover: wie lange können Sie durchhalten | einen Uhren-Holdover bei verweigertem GNSS ausführen, die Zeitgebungs-Kennzahl lesen und das dahinterstehende Wachstumsgesetz √(q_wf·T) verstehen | clock |
Einsteiger | 20 min |
| 3 | Quantum gegen Classical bei der GNSS-Resilienz | der Abschluss: ein Spoofing-Detektor (spoof) und eine vollständige fusionierte PNT-Suite (hybrid), und wie Sicherheit / Integrität / Koppelnavigation gemeinsam zu lesen sind |
spoof + hybrid |
fortgeschritten | 35 min |
Notebooks#
Ausführbare Jupyter-Notebooks, nur mit synthetischen Daten und öffentlichen Elementsätzen im Repository, liegen in notebooks/:
| Notebook | Was Sie lernen |
|---|---|
| Schiffsvertrauen und Training | einen synthetischen NMEA-Brückenstrom mit einem skriptgesteuerten Ereignis erzeugen und ihn dann mit den Schiffsvertrauens-Monitoren bewerten (beratend, keine typzugelassene Navigationsausrüstung) |
| Störungskarte und Streckenbelastung | wo Navigationsdaten degradiert aussahen und wie viel einer Route sie betreffen |
| Compliance-Zuordnung und Test-Bench-Export | wofür eine Reihe von Läufen Belege für öffentliche Framework-Zeilen liefert (nie, dass ein Framework erfüllt ist), und Bewegung und Ereignisse eines Szenarios als Text für einen GNSS-Simulator im Labor exportiert (es wird kein Signal geschrieben) |
| Quantum gegen Classical bei GDOP | dieselbe Konstellationsgeometrie mit einem Quantum- und einem Classical-Sensor, verglichen nach Verdünnung der Genauigkeit |
| Himmelsgeometrie unter einer Horizontlinie | die Satelliten, die ein Standort unter der Horizontlinie einer Straße oder eines Kais sieht, ihr DOP und ihre Fehlerellipse, ein datierter Himmel aus Elementsätzen und eine Monte-Carlo-Simulation mit Seed gegen die Kovarianz (MODELLED) |
So führen Sie ein Tutorial aus#
Jedes Tutorial führt dasselbe Szenario auf drei Arten aus; wählen Sie, was zu Ihnen passt. Alle rufen die eine Engine auf, daher sind die Zahlen identisch (entspricht dem Abschnitt Verwendung der README).
Befehlszeile. Die CLI verzweigt nach dem Feld kind des Szenarios und schreibt <scenario>.result.json, <scenario>.chart.svg, <scenario>.report.html und <scenario>.report.json neben die Eingabe (JSON ist JavaScript Object Notation, SVG Scalable Vector Graphics, HTML HyperText Markup Language). Einige Arten veröffentlichen außerdem eine Reproduzierbarkeitstabelle als <scenario>.table.csv (durch Komma getrennte Werte): realtime-frame-eop, lunar-time-budget, lunar-jamming, leo-navmsg, telecom-timing und moonlight-service-volume, wenn ein Exportstandort gesetzt ist. Keines der drei Tutorials gehört dazu, daher sehen Sie diese Datei hier nicht.
cargo run -- scenarios/orbit-sgp4-gps.toml
cargo run -- baut die CLI aus diesem Checkout. Mit einer installierten Binärdatei (cargo install kshana) lautet derselbe Befehl kshana scenarios/orbit-sgp4-gps.toml. Ohne Checkout sind die meisten mitgelieferten Szenarien in der Binärdatei enthalten: kshana example listet sie auf (und nennt die wenigen, die nicht enthalten sind, mit Begründung), und kshana example orbit-sgp4-gps > orbit-sgp4-gps.toml schreibt eines aus: die Kopie von scenarios/orbit-sgp4-gps.toml, mit der die Binärdatei gebaut wurde.
Python. Bauen Sie die Erweiterung einmal aus diesem Checkout mit maturin in einer aktiven virtuellen Umgebung und rufen Sie dann kshana.run auf:
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 installiert stattdessen das veröffentlichte Wheel. Es kann hinter diesem Checkout zurückliegen: json.loads(kshana.list_kinds()) zeigt Ihnen, welche Szenarioarten Ihr Build hat.
Playground im Browser. Ohne Installation: Öffnen Sie das Studio, wählen Sie ein Szenario, bearbeiten Sie die Parameter und lesen Sie das Ergebnis. Nichts wird hochgeladen; die Engine läuft clientseitig als WebAssembly.
Die Tutorials zitieren die CLI, aber jeder Befehl hat oben das Äquivalent in Python und im Playground. Jedes Ergebnis ist aus scenario + seed + engine version reproduzierbar: Führen Sie es zweimal aus, und Sie erhalten bitidentische Ausgaben.
Kommentierte Lehrszenarien#
Für jeden Fähigkeitsbereich gibt es eine stark kommentierte Datei .toml unter scenarios/: eine Lehrkopie eines kanonischen Szenarios, in der jedes Feld inline erklärt ist, die zitierte unabhängige Referenz genannt wird und die erwartete einzeilige Zusammenfassung als Kommentar # expected: festgehalten ist. Die Feldwerte sind identisch mit denen des Ursprungs im obersten Verzeichnis scenarios/ des Repositorys (tests/tutorials.rs vergleicht das geparste TOML), sodass die dokumentierte Ausgabe stimmt. Auch die Golden-Hashes bleiben unberührt: Ein Kommentar ändert nie einen Szenario-Hash.
| Bereich | Lehrdatei | Typ | Abgeleitet von |
|---|---|---|---|
| Uhren-Holdover | scenarios/clock.toml | clock |
scenarios/clock-holdover.toml |
| Bahn & Geometrie | scenarios/orbit.toml | orbit |
scenarios/orbit-sgp4-gps.toml |
| Integrität (RAIM, receiver autonomous integrity monitoring) | scenarios/integrity.toml | integrity |
scenarios/integrity-raim.toml |
| Sicherheit (Spoofing) | scenarios/security.toml | spoof |
scenarios/spoof-attack.toml |
| Hybrid-PNT | scenarios/hybrid.toml | hybrid |
scenarios/hybrid-pnt.toml |
| Inertiale Koppelnavigation | scenarios/inertial.toml | inertial |
scenarios/imu-deadreckoning.toml |
| Zeitübertragung | scenarios/timetransfer.toml | timetransfer |
scenarios/timetransfer.toml |
| GNSS-Messungsbereich | scenarios/gnss-sim.toml | gnss-sim |
scenarios/gnss-sim-raim.toml |
Die Lehrdatei für Sicherheit verwendet innen
kind = "spoof": Die Sicherheitskennzahl (1 − P_md, eins minus der Wahrscheinlichkeit einer verpassten Erkennung) wird vom Spoof-Paket erzeugt. Der Dateiname folgt der Fähigkeit (Sicherheit), diekindfolgt dem Paket (Spoof). Der Kopf dieser Datei weist darauf hin.
Der vollständige Katalog der Szenarioarten#
Die Engine verzweigt nach dem Feld kind des Szenarios. Die Tabelle unten listet die am häufigsten verwendeten Arten (die acht Tutorial-Bereiche oben plus ihre nächsten Nachbarn). Sie ist nicht die vollständige Menge: src/api.rs::list_scenario_kinds() gibt alle 92 eingebauten Arten zurück. Diese Funktion (als list_kinds() in den Bindungen für Python und WebAssembly (WASM) und als kshana kinds --json in der Befehlszeile verfügbar) ist der maßgebliche, stets aktuelle Katalog, und SCENARIOS.md ist ihre erzeugte Aufzählung, ein Abschnitt je Art mit den erforderlichen und optionalen TOML-Feldern. tests/tutorials.rs::tutorial_scenarios_use_real_kinds stellt sicher, dass jede in einem Tutorial dokumentierte Art eine reale Dispatch-Art ist, sodass nichts in dieser Tabelle eine nicht existierende Art nennen kann.
| Typ | Was es tut |
|---|---|
clock |
Uhren-Holdover gegen Vorgabe; optionales Monte-Carlo-Ensemble (runs > 1). |
inertial |
1-DOF-Koppelnavigation (ein Freiheitsgrad) während eines GNSS-Ausfalls. |
orbit |
GNSS-Verfügbarkeit + Verdünnung der Genauigkeit (DOP) aus einer Konstellation (Walker / Zweizeilen-Bahnelemente / RINEX, das Receiver Independent Exchange Format). |
integrity |
Snapshot / Solution-Separation / ARAIM (advanced RAIM) mit horizontalen und vertikalen Schutzniveaus (HPL/VPL) + Stanford-Diagramm. |
lunar-integrity |
Durchgang mit ARAIM-Schutzniveaus am Mond-Südpol gegen eine LunaNet-Relaismenge. |
timetransfer |
Optische gegen Hochfrequenz-(HF-)Zweiwege-Zeit-/Frequenzübertragung. |
hybrid |
Hybrid-PNT-Abschluss: Uhr + Inertialmesseinheit (IMU) + Stützung durch Zeitübertragung. |
fusion |
Gemeinsame Kalman-Sensorfusion für PNT über dieselben Hybrid-Eingaben. |
gnss-ins |
Lose und eng gekoppeltes GNSS/INS (Inertialnavigationssystem), erweiterter Kalman-Filter im Fehlerzustand. |
gnss-sim |
Simulation von Pseudoentfernungen im Messbereich (Klobuchar-Ionosphäre, Saastamoinen-/Niell-Troposphäre) + RAIM. |
jamming |
Jamming nach Link-Budget: Störer-zu-Signal-Verhältnis (J/S) → effektive Träger-Rausch-Dichte (C/N₀) → Verlust der Verriegelung. |
spoof |
Stochastischer Zeit-Spoof-Detektor (Neyman–Pearson / χ²₁) mit Monte-Carlo-Wahrscheinlichkeiten für Fehlalarm und verpasste Erkennung (P_fa/P_md). |
sweep |
1-D-Trade-Study-Sweep über einen Uhrenpaket-Parameter. |
sweep-nd |
Generischer N-D-Sweep über ein beliebiges Paket über gepunktete TOML-Schlüssel / JSON-Metrikpfade. |
Über die Tutorials hinaus: neuere Fähigkeiten#
Die drei Tutorials bleiben bei den klassischen Paketen für Uhr, Orbit und Sicherheit. Die Engine ist weit darüber hinausgewachsen. Jede Zeile unten ist ein mitgeliefertes Szenario, das Sie unverändert ausführen können (cargo run -- <file> oder kshana <file>); die Zusammenfassung ist die erste Zeile, die kshana 0.35.0 dafür am 2026-10-10 ausgegeben hat. Anders als die Zahlen der Tutorials sind diese Zeilen die Aufzeichnung eines einzelnen Laufs und nicht durch tests/tutorials.rs festgeschrieben: Führen Sie das Szenario erneut aus, um den aktuellen Wert zu erhalten. Die Ergebnisse geben ihren eigenen Geltungsbereich an (die meisten tragen ein label), und die Verifikationsmatrix gibt an, welche Fähigkeiten gegen eine externe unabhängige Referenz VALIDATED und welche MODELLED sind.
| Fähigkeit | Szenario | Typ | Erste Zeile der Zusammenfassung | Mehr lesen |
|---|---|---|---|---|
| L-Band-Spektrum und Jamming-Wasserfall | 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 |
| Das Sonnensystem zu einer Epoche | 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 |
| Positionierung um einen anderen Körper | scenarios/europa-surface-pnt.toml |
body-pnt |
Positioning around Europa — surface user, 12 relays at 4500 km, 171 epochs |
SCENARIOS.md |
| Konstellationsdesign im großen Maßstab | 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 |
| Kampagnen: Arten, verkettet auf einer Zeitleiste | 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 |
| Ein LEO-PNT-System von Ende zu Ende | scenarios/leo-pnt-end-to-end.toml |
leo-pnt-chain |
LEO-PNT end to end, generic 1080 km constellation |
LEO-PNT.md |
| Fusionierte MEO- und LEO-Positionierung | scenarios/meo-leo-fused-pvt.toml |
leo-pvt |
LEO PVT (joint) at 40.42, -3.70 over 1800 s |
LEO-PNT-FUSION.md |
| LEO-Signale, Durchgänge und Navigationsnachrichten | 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 (der Durchgang) |
LEO-SIGNAL.md, LEO-PASS.md, LEO-NAVMSG.md |
| PPP-Konvergenz mit einer LEO-Schicht; 5G-Positionierung | 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 |
| Resilienz: GNSS gestört, LEO trägt den Nutzer | 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 |
| Vertikale Märkte: Schiene, See, Telekommunikation, Fahrzeuge, Arktis | scenarios/leo-vertical-rail-maritime.toml (und die anderen Dateien leo-vertical-*) |
campaign |
campaign 49575d27b696 | Railway and maritime with a LEO layer | chain: 3 phases over 2520 s, … |
CAMPAIGNS.md |
| Telecom-Holdover gegen die Uhrengrenzwerte nach 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 ist die niedrige Erdumlaufbahn und MEO die mittlere Erdumlaufbahn; PVT ist Position, Geschwindigkeit und Zeit; PPP ist die präzise Punktpositionierung; 5G ist der Mobilfunkstandard der fünften Generation; TDB ist die baryzentrische dynamische Zeit; JD ist das Julianische Datum; TE ist der Zeitfehler.
Die CLI fügt zu jedem Lauf drei Ausgaben hinzu:
- Berichte. Jeder Lauf schreibt
<scenario>.report.htmlund<scenario>.report.json(siehe REPORTS.md).kshana --study <suite.toml>führt eine Suite von Szenarien in ein.study.jsonund ein.study.htmlzusammen, zum Beispielkshana --study scenarios/quantum-pnt-demonstrator.suite.toml. - Animation.
kshana <scenario.toml> --animate <svg|html|frames|all>stellt die Zeitreihen des Laufs dar, zum Beispiel schreibt--animate htmlaufscenarios/orbit-sgp4-gps.tomldie Dateiorbit-sgp4-gps.animation.html. Eine Art ohne abgetastete Zeitachse (wiesolar-system) wird mit einem Fehler abgelehnt; siehe ANIMATION.md. - Interop-Exporte.
--export <czml|kml|geojson|stk|sigmf|all|list>schreibt das Ergebnis für andere Werkzeuge: CZML (Cesium Language), KML (Keyhole Markup Language, für Google Earth), GeoJSON (geografisches JSON), eine STK-Ephemeride (Systems Tool Kit) oder eine SigMF-Aufzeichnung (Signal Metadata Format).--export listnennt, welche Formate für ein Szenario gelten; SigMF gilt nur fürspectrum. Das Orbit-Paket exportiert außerdem--export-sp3,--export-ommund--export-oem(CCSDS, das Consultative Committee for Space Data Systems, Bahnnachrichten). Siehe INTEROP.md.
Abgestufte Übungen#
Arbeiten Sie die Leiter durch. Jede Stufe ist schwerer und belastbarer als die vorige; Referenzlösungen liegen in exercises/.
| Stufe | Ziel | Was Sie tun | Referenzlösung |
|---|---|---|---|
| Stufe 1 — ausführen und lesen | ein mitgeliefertes Szenario unverändert ausführen und eine Kennzahl lesen | Führen Sie scenarios/clock-holdover.toml aus; geben Sie das holdover_s von Quantum gegen Classical aus. CLI, Playground oder ein einzeiliger Python-Aufruf. |
exercises/tier1_run.py |
| Stufe 2 — bearbeiten und durchlaufen | einen Parameter ändern und eine monotone Wirkung beobachten | Verschärfen Sie die Uhrenvorgabe (threshold_ns) oder verlängern Sie den Ausfall und beobachten Sie, wie der Holdover sinkt; oder verwenden Sie kind = "sweep"/"sweep-nd", um ihn zu tabellieren. |
exercises/tier2_sweep.py |
| Stufe 3 — quantifizieren und verteidigen | Monte-Carlo, Konfidenzbänder, Reproduzierbarkeit und ein Schutzniveau | Führen Sie ein Uhren-Ensemble aus (runs = N), lesen Sie das Band [p05–p95], bestätigen Sie, dass zwei Läufe ein identisches scenario_hash ergeben, und lesen Sie ein Integritäts-/Stanford-Ergebnis. |
exercises/tier3_montecarlo.py |
Die Referenzlösungen verwenden die Python-Erweiterung (zuerst maturin develop --features python). Aus dem Wurzelverzeichnis des Repositorys ausgeführt, gibt tier2_sweep.py aus, wie der Holdover der Chip-Scale-Atomuhr von 2610 s bei einer Vorgabe von 20 ns auf 1140 s bei 5 ns fällt.
Frische Daten gewünscht?#
Die Titelzahlen dieser Tutorials laufen vollständig aus Szenarien, die bereits im Repository liegen. Nichts wird abgerufen, wodurch sie reproduzierbar bleiben und sich gefahrlos in der kontinuierlichen Integration (CI) ausführen lassen. Für die „Erweitern Sie es“-Übungen können Sie Live-Daten ziehen:
- GPS-Zweizeilen-Bahnelemente (TLEs) (die Orbit-Konstellation auffrischen): https://celestrak.org/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=tle, Klartext-Elementsätze mit 3 Zeilen (Name + Zeile 1 + Zeile 2). Hilfsskript:
scripts/fetch_tles.sh. Offene Daten (Katalog der 18th Space Defense Squadron der US Space Force, weiterverbreitet von Celestrak, Dr. T. S. Kelso). - Verifikationsreferenz für SGP4 (Simplified General Perturbations 4) (bereits eingebunden, nicht erneut abrufen): die Testvektoren „Revisiting Spacetrack Report #3“ von AIAA (American Institute of Aeronautics and Astronautics) 2006-6753, https://celestrak.org/publications/AIAA/2006-6753/, verwendet von
tests/sgp4_verification.rs; siehedocs/SGP4-VALIDATION.md. - Referenz für Uhrenstabilitätsbeziehungen: NIST (National Institute of Standards and Technology) Special Publication 1065 (Riley, Handbook of Frequency Stability Analysis), https://tf.nist.gov/general/pdf/2220.pdf, die Beziehungen σ_y(τ)↔Phase hinter Tutorial 2.