Tutoriales
Ejemplos prácticos que le llevan de “ejecutar un escenario incluido” a “cuantificar y defender un resultado”. Cada número citado en los tres tutoriales es una salida real del motor, anclada a una referencia independiente externa de autoridad reconocida (no circular), y fijada por una prueba de integración (tests/tutorials.rs), de modo que un tutorial nunca puede desviarse en silencio de lo que el motor hace realmente. Si un tutorial dice que el reloj óptico mantiene 6600 s, la prueba hace fallar la compilación el día en que eso deje de ser cierto.
Kshana es un simulador de posicionamiento, navegación y temporización (PNT). Los tutoriales usan algunas abreviaturas más, cada una desarrollada donde aparece por primera vez: GNSS (Sistema Global de Navegación por Satélite), GPS (Sistema de Posicionamiento Global), CLI (interfaz de línea de comandos) y TOML (Tom's Obvious Minimal Language, el formato de archivo de escenario).
¿Es nuevo en el proyecto? Lea primero la introducción a los conceptos y el glosario, y luego vuelva aquí.
Los tres ejemplos prácticos#
| # | Tutorial | Qué se aprende | Tipo de escenario | Dificultad | ~Tiempo |
|---|---|---|---|---|---|
| 1 | Mi primera órbita: dónde están los satélites GPS | propagar una constelación GPS real, leer la disponibilidad, la dilución de la precisión de la posición (PDOP) y la exactitud de posición, y exportar dónde están realmente los satélites (formato de órbita precisa SP3) | orbit |
principiante | 15 min |
| 2 | Holdover del reloj: cuánto tiempo puede mantenerse a la deriva | ejecutar un holdover de reloj sin GNSS, leer la cifra de mérito de temporización y comprender la ley de crecimiento √(q_wf·T) que hay detrás | clock |
principiante | 20 min |
| 3 | Resiliencia GNSS cuántica frente a clásica | el colofón: un detector de suplantación (spoof) y un conjunto PNT fusionado completo (hybrid), y cómo leer juntas la seguridad, la integridad y la navegación a estima |
spoof + hybrid |
intermedia | 35 min |
Cuadernos#
Los notebooks de Jupyter ejecutables, con datos sintéticos y conjuntos de elementos públicos conservados solo en el repositorio, están en notebooks/:
| Notebook | Qué se aprende |
|---|---|
| Confianza y entrenamiento de buques | generar un flujo NMEA sintético de puente con un suceso programado y luego puntuarlo con los monitores de confianza de buques (de carácter consultivo, no un equipo de navegación homologado) |
| Mapa de interferencia y exposición de la ruta | dónde los datos de navegación han parecido degradados y qué parte de una ruta afectan |
| Correspondencia de compliance y exportación de test-bench | a qué filas de marcos públicos aporta evidencias a favor un conjunto de ejecuciones (nunca que un marco se satisfaga), y el movimiento y los sucesos de un escenario exportados como texto para un simulador GNSS de laboratorio (no se escribe ninguna señal) |
| GDOP cuántico frente a clásico | la misma geometría de constelación con un sensor cuántico y uno clásico, comparados por dilución de la precisión |
| Geometría del cielo bajo un perfil del horizonte | los satélites que ve un emplazamiento bajo el perfil del horizonte de una calle o un muelle, su DOP y su elipse de error, un cielo fechado a partir de conjuntos de elementos y un Monte Carlo con semilla frente a la covarianza (MODELLED) |
Cómo ejecutar un tutorial#
Cada tutorial ejecuta el mismo escenario de tres maneras; elija la que le convenga. Todas llaman al único motor, de modo que los números son idénticos (refleja la sección Uso del README).
Línea de comandos. La CLI despacha según el campo kind del escenario y escribe <scenario>.result.json, <scenario>.chart.svg, <scenario>.report.html y <scenario>.report.json junto a la entrada (JSON es JavaScript Object Notation, SVG Scalable Vector Graphics, HTML HyperText Markup Language). Algunos tipos de escenario publican además una tabla de reproducibilidad como <scenario>.table.csv (valores separados por comas): realtime-frame-eop, lunar-time-budget, lunar-jamming, leo-navmsg, telecom-timing y moonlight-service-volume cuando se fija un sitio de exportación. Ninguno de los tres tutoriales es uno de ellos, de modo que no verá ese archivo aquí.
cargo run -- scenarios/orbit-sgp4-gps.toml
cargo run -- compila la CLI a partir de esta copia de trabajo. Con un binario instalado (cargo install kshana), el mismo comando es kshana scenarios/orbit-sgp4-gps.toml. Sin una copia de trabajo, la mayoría de los escenarios incluidos vienen en el binario: kshana example los enumera (y nombra los pocos que no vienen incluidos, con el motivo), y kshana example orbit-sgp4-gps > orbit-sgp4-gps.toml escribe uno: la copia de scenarios/orbit-sgp4-gps.toml con la que se compiló el binario.
Python. Compile la extensión a partir de esta copia de trabajo una vez con maturin, dentro de un entorno virtual activo, y luego llame a kshana.run:
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 instala en su lugar la rueda publicada. Puede ir por detrás de esta copia de trabajo: json.loads(kshana.list_kinds()) le indica qué tipos de escenario tiene su compilación.
Playground del navegador. Sin instalación: abra el Studio, elija un escenario, edite los parámetros y lea el resultado. No se sube nada; el motor se ejecuta en el cliente como WebAssembly.
Los tutoriales citan la CLI, pero cada comando tiene el equivalente de Python y del playground indicado arriba. Cada resultado es reproducible a partir de scenario + seed + engine version: ejecútelo dos veces y obtendrá una salida idéntica bit a bit.
Escenarios didácticos anotados#
Para cada dominio de capacidad hay un .toml muy comentado en scenarios/: una copia didáctica de un escenario canónico con cada campo explicado en línea, la referencia independiente citada indicada por nombre y el resumen esperado de una línea registrado como un comentario # expected:. Los valores de los campos son idénticos a los del original en el directorio scenarios/ de nivel superior del repositorio (tests/tutorials.rs compara el TOML analizado), de modo que la salida documentada sigue siendo cierta. Los hashes de referencia tampoco se tocan: un comentario nunca cambia el hash de un escenario.
| Dominio | Archivo didáctico | Tipo | Derivado de |
|---|---|---|---|
| Holdover del reloj | scenarios/clock.toml | clock |
scenarios/clock-holdover.toml |
| Órbita y geometría | scenarios/orbit.toml | orbit |
scenarios/orbit-sgp4-gps.toml |
| Integridad (RAIM, monitorización autónoma de integridad del receptor) | scenarios/integrity.toml | integrity |
scenarios/integrity-raim.toml |
| Seguridad (spoofing) | scenarios/security.toml | spoof |
scenarios/spoof-attack.toml |
| PNT híbrido | scenarios/hybrid.toml | hybrid |
scenarios/hybrid-pnt.toml |
| Navegación inercial a estima | scenarios/inertial.toml | inertial |
scenarios/imu-deadreckoning.toml |
| Transferencia de tiempo | scenarios/timetransfer.toml | timetransfer |
scenarios/timetransfer.toml |
| Dominio de medición GNSS | scenarios/gnss-sim.toml | gnss-sim |
scenarios/gnss-sim-raim.toml |
El archivo didáctico de seguridad usa
kind = "spoof"en su interior: la cifra de mérito de seguridad (1 − P_md, uno menos la probabilidad de detección fallida) la produce el paquete spoof. El nombre del archivo sigue a la capacidad (seguridad), mientras que elkindsigue al paquete (spoof). La cabecera de ese archivo lo señala.
El catálogo completo de tipos de escenario#
El motor despacha según el kind del escenario. La tabla siguiente enumera los tipos de escenario de uso más habitual (los ocho dominios de los tutoriales anteriores y sus vecinos más próximos). No es el conjunto completo: src/api.rs::list_scenario_kinds() devuelve los 92 tipos de escenario integrados. Esa función (expuesta como list_kinds() en los enlaces de Python y de WebAssembly (WASM), y como kshana kinds --json en la línea de comandos) es el catálogo de referencia, siempre actualizado, y SCENARIOS.md es su enumeración generada, con una sección por tipo y los campos TOML obligatorios y opcionales. tests/tutorials.rs::tutorial_scenarios_use_real_kinds exige que todo tipo de escenario que documenta un tutorial sea un tipo de despacho real, de modo que nada de esta tabla puede nombrar un tipo de escenario que no exista.
| Tipo | Qué hace |
|---|---|
clock |
Holdover del reloj frente a la especificación; conjunto Monte Carlo opcional (runs > 1). |
inertial |
Navegación inercial a estima de 1-DOF (un grado de libertad) durante una interrupción de GNSS. |
orbit |
Disponibilidad de GNSS y dilución de la precisión (DOP) a partir de una constelación (Walker / elementos de dos líneas / RINEX, el formato Receiver Independent Exchange). |
integrity |
Instantánea / separación de soluciones / ARAIM (RAIM avanzado) con niveles de protección horizontal y vertical (HPL/VPL) y diagrama de Stanford. |
lunar-integrity |
Paso de nivel de protección ARAIM en el polo sur lunar frente a un conjunto de relés LunaNet. |
timetransfer |
Transferencia bidireccional de tiempo/frecuencia óptica frente a de radiofrecuencia (RF). |
hybrid |
Colofón de PNT híbrido: reloj + unidad de medida inercial (IMU) + ayuda de transferencia de tiempo. |
fusion |
PNT con fusión de sensores mediante un filtro de Kalman conjunto sobre las mismas entradas híbridas. |
gnss-ins |
Filtro de Kalman extendido de estado de error para GNSS/INS (sistema de navegación inercial) débil y fuertemente acoplado. |
gnss-sim |
Simulación de pseudodistancias en el dominio de la medida (ionosfera de Klobuchar, troposfera de Saastamoinen/Niell) + RAIM. |
jamming |
Interferencia (jamming) con balance de enlace: relación interferencia/señal (J/S) → densidad efectiva de portadora a ruido (C/N₀) → pérdida de enganche. |
spoof |
Detector estocástico de suplantación de hora (Neyman–Pearson / χ²₁) con probabilidades de falsa alarma y de detección fallida por Monte Carlo (P_fa/P_md). |
sweep |
Barrido 1-D de estudio de compromisos sobre un parámetro del paquete de relojes. |
sweep-nd |
Barrido genérico N-D sobre cualquier paquete mediante claves TOML con puntos o rutas de métricas JSON. |
Más allá de los tutoriales: capacidades más recientes#
Los tres tutoriales se quedan en los paquetes clásicos de reloj, órbita y seguridad. El motor ha crecido mucho más allá de ellos. Cada fila siguiente es un escenario incluido que puede ejecutar tal cual (cargo run -- <file> o kshana <file>); el resumen es la primera línea que kshana 0.35.0 imprimió para él el 2026-10-10. A diferencia de las cifras de los tutoriales, estas líneas son el registro de una ejecución, no están fijadas por tests/tutorials.rs: vuelva a ejecutar el escenario para obtener el valor actual. Los resultados declaran su propio alcance (la mayoría llevan un label), y la matriz de verificación indica qué capacidades están VALIDATED frente a una referencia independiente externa y cuáles están MODELLED.
| Capacidad | Escenario | Tipo | Primera línea del resumen | Leer más |
|---|---|---|---|---|
| Espectro de banda L y cascada de interferencia (jamming) | 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 |
| El sistema solar en una época | 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 |
| Posicionamiento alrededor de otro cuerpo | scenarios/europa-surface-pnt.toml |
body-pnt |
Positioning around Europa — surface user, 12 relays at 4500 km, 171 epochs |
SCENARIOS.md |
| Diseño de constelaciones a gran escala | 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 |
| Campañas: tipos de escenario encadenados en una línea temporal | 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 |
| Un sistema LEO-PNT de extremo a extremo | scenarios/leo-pnt-end-to-end.toml |
leo-pnt-chain |
LEO-PNT end to end, generic 1080 km constellation |
LEO-PNT.md |
| Posicionamiento fusionado MEO + LEO | scenarios/meo-leo-fused-pvt.toml |
leo-pvt |
LEO PVT (joint) at 40.42, -3.70 over 1800 s |
LEO-PNT-FUSION.md |
| Señales LEO, pasos y mensajes de navegación | 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 (el paso) |
LEO-SIGNAL.md, LEO-PASS.md, LEO-NAVMSG.md |
| Convergencia de PPP con una capa LEO; posicionamiento 5G | 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 |
| Resiliencia: GNSS interferido, LEO sostiene al usuario | 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 |
| Verticales: ferrocarril, marítimo, telecomunicaciones, vehículos, Ártico | scenarios/leo-vertical-rail-maritime.toml (y los demás archivos leo-vertical-*) |
campaign |
campaign 49575d27b696 | Railway and maritime with a LEO layer | chain: 3 phases over 2520 s, … |
CAMPAIGNS.md |
| Holdover de telecomunicaciones frente a los límites de reloj de la ITU-T (Unión Internacional de Telecomunicaciones, Sector de Normalización de las Telecomunicaciones) 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 es órbita terrestre baja y MEO órbita terrestre media; PVT es posición, velocidad y tiempo; PPP es posicionamiento preciso de punto; 5G es el estándar móvil de quinta generación; TDB es el Tiempo Dinámico Baricéntrico; JD es la Fecha Juliana; TE es error de tiempo.
La CLI añade tres salidas a cualquier ejecución:
- Informes. Cada ejecución escribe
<scenario>.report.htmly<scenario>.report.json(véase REPORTS.md).kshana --study <suite.toml>ejecuta una suite de escenarios en un único.study.jsony.study.html, por ejemplokshana --study scenarios/quantum-pnt-demonstrator.suite.toml. - Animation.
kshana <scenario.toml> --animate <svg|html|frames|all>representa las series temporales de la ejecución; por ejemplo,--animate htmlsobrescenarios/orbit-sgp4-gps.tomlescribeorbit-sgp4-gps.animation.html. Un tipo de escenario sin eje de tiempo muestreado (comosolar-system) se rechaza con un error; véase ANIMATION.md. - Exportaciones de interoperabilidad.
--export <czml|kml|geojson|stk|sigmf|all|list>escribe el resultado para otras herramientas: CZML (Cesium Language), KML (Keyhole Markup Language, para Google Earth), GeoJSON (JSON geográfico), unas efemérides STK (Systems Tool Kit) o una grabación SigMF (Signal Metadata Format).--export listindica qué formatos se aplican a un escenario; SigMF se aplica solo aspectrum. El paquete de órbita también exporta--export-sp3,--export-ommy--export-oem(mensajes de órbita de CCSDS, el Comité Consultivo para Sistemas de Datos Espaciales). Véase INTEROP.md.
Ejercicios graduados#
Recorra la escalera. Cada nivel es más difícil y más defendible que el anterior; las soluciones de referencia están en exercises/.
| Nivel | Objetivo | Qué hace | Solución de referencia |
|---|---|---|---|
| Nivel 1 — ejecutar y leer | ejecutar sin cambios un escenario incluido y leer una cifra de mérito | Ejecute scenarios/clock-holdover.toml; imprima el holdover_s cuántico frente al clásico. CLI, playground o una llamada de Python de una línea. |
exercises/tier1_run.py |
| Nivel 2 — editar y barrer | cambiar un parámetro y observar un efecto monótono | Reduzca la especificación del reloj (threshold_ns) o alargue la interrupción y observe cómo cae el holdover; o use kind = "sweep"/"sweep-nd" para tabularlo. |
exercises/tier2_sweep.py |
| Nivel 3 — cuantificar y defender | Monte Carlo, bandas de confianza, reproducibilidad y un nivel de protección | Ejecute un conjunto de relojes (runs = N), lea la banda [p05–p95], confirme que dos ejecuciones dan un scenario_hash idéntico y lea un resultado de integridad / diagrama de Stanford. |
exercises/tier3_montecarlo.py |
Las soluciones de referencia usan la extensión de Python (antes, maturin develop --features python). Ejecutado desde la raíz del repositorio, tier2_sweep.py imprime el holdover del reloj atómico a escala de chip cayendo de 2610 s con una especificación de 20 ns a 1140 s con 5 ns.
¿Quiere datos nuevos?#
Las cifras principales de estos tutoriales se ejecutan por completo a partir de escenarios que ya están en el repositorio. No se descarga nada, lo que las mantiene reproducibles y seguras de ejecutar en integración continua (CI). Para los ejercicios de “ampliación” puede obtener datos en vivo:
- Elementos de dos líneas (TLE) de GPS (actualizan la constelación de órbita): https://celestrak.org/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=tle, conjuntos de elementos de 3 líneas en texto plano (nombre + línea 1 + línea 2). Auxiliar:
scripts/fetch_tles.sh. Datos abiertos (catálogo del 18.º Escuadrón de Defensa Espacial de la Fuerza Espacial de EE. UU., redistribuido por Celestrak, Dr. T. S. Kelso). - Referencia independiente de verificación de SGP4 (Simplified General Perturbations 4) (ya incorporada, no la vuelva a descargar): vectores de prueba de AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 “Revisiting Spacetrack Report #3”, https://celestrak.org/publications/AIAA/2006-6753/, usados por
tests/sgp4_verification.rs; véasedocs/SGP4-VALIDATION.md. - Referencia independiente de las relaciones de estabilidad de reloj: Publicación Especial 1065 del NIST (National Institute of Standards and Technology) (Riley, Handbook of Frequency Stability Analysis), https://tf.nist.gov/general/pdf/2220.pdf, las relaciones entre σ_y(τ) y la fase en que se basa el Tutorial 2.