Campañas
Un escenario individual responde a una pregunta sobre una situación. Una misión es una secuencia de situaciones, y un estudio de diseño es una familia de ellas. El tipo de escenario campaign compone los tipos de escenario existentes en una sola ejecución sin reimplementar ninguno: cada miembro es una tabla de escenario ordinaria con su propio kind, despachada mediante api::run_toml exactamente como la ejecutaría kshana <file>.toml, y la campaña solo vuelve a leer números de los documentos de resultados.
Una campaña es MODELLED. Sus identidades de composición se prueban (más abajo), pero encadenar fases es una decisión de modelado, y cada fase vale tanto como el tipo de escenario que la ejecutó.
Ejecute una como cualquier otro escenario:
kshana scenarios/campaign-jam-spoof-holdover-integrity.toml
# writes .result.json, .chart.svg, .report.html and .report.json next to the file
Una campaña puede contener cualquier combinación de cuatro secciones; una sin ninguna se ejecuta y su resumen indica que no compuso nada.
[[phases]]: una misión encadenada en una sola línea temporal#
Cada fase ejecuta uno o más escenarios sobre una ventana de una línea temporal de misión compartida, por ejemplo un reloj en holdover y un sistema de navegación inercial (INS) avanzando por inercia al mismo tiempo. Las salidas de cada ejecución se leen en canales con nombre, se sitúan en el instante de inicio de la fase y se remuestrean a una rejilla común ([timeline] step_s) mediante retención de orden cero: un instante de la rejilla toma la última muestra de la ejecución de la fase propietaria en ese instante o antes, y es nulo donde ninguna ejecución de esa fase proporciona el canal.
| Canal | Unidad | Qué es | Fuente predefinida |
|---|---|---|---|
time_error_ns |
ns | error de tiempo del reloj | clock: <side>.series[].error_ns; spoof: <side>.series[].offset_ns |
guard_ns |
ns | guarda de error de tiempo | el threshold_ns propio de la ejecución |
cn0_dbhz |
dB-Hz | relación media efectiva portadora-densidad de ruido (C/N0) sobre los satélites visibles | jamming: media de epochs[].sats[].cn0_effective_dbhz |
cn0_floor_dbhz |
dB-Hz | límite de pérdida de seguimiento | jamming: el tracking_threshold_dbhz del escenario, cuando lo indica |
tracking |
recuento | satélites que siguen en seguimiento | jamming: epochs[].tracking |
protection_level_m |
m | nivel de protección vertical | integrity: epochs[].vpl_m |
alert_limit_m |
m | límite de alerta vertical | integrity: al_v_m |
position_error_m |
m | error de posición | gnss-ins: <side>.series[].error_m |
position_threshold_m |
m | umbral de error de posición | gnss-ins: threshold_m |
alarm |
1 | 1 mientras cualquier monitor de la fase da alarma | véase más abajo |
<side> es classical salvo que la ejecución establezca side = "quantum". Cualquier otra magnitud se lee con una entrada [[phases.runs.series]] explícita: una ruta de tiempo con un [] que nombra las filas (epochs[].t), una ruta de valor que comparte esas filas o un escalar difundido a cada fila (el prefijo input: lee el escenario de la ejecución en lugar de su resultado), una reducción opcional (mean, min, max, count) para varios valores bajo una misma fila, una escala y una unidad para un canal que la campaña no conoce.
Las alarmas proceden de tres lugares, combinados con OR lógico dentro de una fase:
- indicadores predefinidos leídos de la ejecución:
jammingda alarma mientras siguen a menos de cuatro satélites (su propia definición de disponibilidad);integrityda alarma en las épocas que marca como no disponibles; - reglas predefinidas sobre los canales de la fase, evaluadas después de
carry:clockda alarma mientras el error de tiempo absoluto superaguard_ns;gnss-insmientras el error de posición superaposition_threshold_m; las reglas explícitas van en[[phases.runs.alarms]]; - eventos de alarma:
spoofgenera uno en eldetect_time_sde su monitor asistido por reloj;spoof-detectgenera uno al inicio de la fase cuando su decisión fusionada da alerta.
El estado se transmite entre fases de tres maneras explícitas:
carry = ["time_error_ns"]suma el valor del canal al final de la fase anterior a los valores de esta fase. La fase de reloj que un spoofer desplazó es el punto desde el que arranca el holdover. Sumar el desfase es exacto para la fase del reloj, que integra la frecuencia; para un error de posición supone que los dos errores son colineales, el caso pesimista.[[phases.handoff]]escribe un número de la fase anterior (channel:<name>para el valor final de un canal, o cualquier ruta de resultado de una ejecución anterior) en una clave con puntos del escenario de esta fase antes de que se ejecute, con una escala y un desfase opcionales.end_at = "<result path>"termina la fase en un instante calculado por una ejecución, limitado porduration_s. La misión incluida termina su fase de spoofing enclassical.detect_time_s.
skip_s descarta los primeros segundos de la propia línea temporal de una ejecución (un calentamiento) antes del instante cero de la fase.
La misión incluida#
scenarios/campaign-jam-spoof-holdover-integrity.toml ejecuta 18 escenarios miembros en seis fases sobre una rejilla de 10 s:
| Fase | Ejecuciones | Qué muestra la línea temporal |
|---|---|---|
| nominal, 600 s | clock, jamming (sin inhibidor), integrity |
error de tiempo 0 ns; C/N0 43,0 dB-Hz frente a un límite de 25 dB-Hz; nivel de protección vertical de 9,1 a 21,6 m frente a un límite de alerta de 50 m |
| jamming, 600 s | igual, inhibidor a -30 dBW, 1 km | el C/N0 baja a 27,7 dB-Hz, los 8 satélites siguen en seguimiento |
spoofing, terminado a los 370 s por end_at |
spoof (rampa de tiempo de 0,1 ns/s), spoof-detect, jamming |
el error de tiempo sube en rampa hasta 36 ns; el detector de radiofrecuencia da alarma al inicio de la fase, el monitor asistido por reloj a los 370 s |
| holdover, 1800 s | clock (denegado, arrastra 37,0 ns), gnss-ins (unidad táctica avanzando por inercia), jamming a 10 dBW |
todos los satélites perdidos (C/N0 de unos -12 dB-Hz); error de tiempo de 36,4 a 62,7 ns frente a la guarda de 50 ns; error de posición hasta 24 km |
| integrity-alarm, 600 s | clock (arrastra 59,6 ns), jamming y integrity con una máscara de 25 deg |
5 satélites en seguimiento; nivel de protección de 19 a 135 m, ausente en 18 de 60 instantes de la rejilla; el error de tiempo arrastrado, de 52,1 a 61,7 ns, permanece por encima de la guarda de 50 ns, de modo que la alarma está activa durante toda la fase |
| recovery, 600 s | clock, jamming (sin inhibidor), integrity |
el error de tiempo vuelve a 0 ns; alarma en silencio |
Las ejecuciones de integridad usan la propia trayectoria de usuario del ejemplo integrity (una trayectoria circular a 0,4 km de altitud), no el emplazamiento fijo del receptor de jamming, y la máscara de 25 deg representa el cielo parcial de un receptor que se está readquiriendo. Son decisiones de escenario, indicadas en el archivo.
Una misión impulsada por el espectro de banda L#
scenarios/campaign-spectrum-holdover-integrity.toml ejecuta 8 escenarios miembros en tres fases sobre una rejilla de 1 s, con el C/N0 de GPS L1 C/A y de Galileo E1 leído del tipo de escenario spectrum (véase SPECTRUM.md) en lugar de la tabla por satélite del tipo de escenario jamming. Los inhibidores son los de scenarios/l-band-waterfall-jamming.toml.
| Fase | Ejecuciones | Qué muestra la línea temporal |
|---|---|---|
onset, terminada a los 10 s por end_at |
clock, spectrum (chirp desde los 10 s), integrity |
L1 C/A 43,48 y E1 44,73 dB-Hz; la fase termina en la primera pérdida de L1 C/A de la propia ejecución de espectro (timeline.bands[0].first_loss_t_s); nivel de protección de 21,6 m frente a 50 m |
| holdover, 600 s | clock (denegado, arrastra el error del onset, aquí 0 ns), spectrum (chirp activo) |
L1 C/A 3,38 y E1 4,44 dB-Hz, ambos por debajo del límite de 25 dB-Hz; error de tiempo de -0.07 a 5,06 ns frente a la guarda de 50 ns; alarma activa |
| galileo-fallback, 300 s | clock (resincronizado), spectrum (tono CW en la portadora L1), integrity sobre un Walker 24/3/1 de tipo Galileo |
L1 C/A se mantiene en 17,98 dB-Hz, E1 vuelve a 44,73 dB-Hz; nivel de protección de 6,1 a 17,7 m; alarma en silencio |
La recuperación de E1 bajo el tono CW se apoya en el tratamiento de espectro continuo del tipo de escenario de espectro: el tono cae en el nulo del espectro MBOC y no acopla nada. Un tono real acoplaría a través de las líneas espectrales del código; esto se indica en el archivo y en SPECTRUM.md.
[sweep]: una rejilla de parámetros sobre cualquier tipo de escenario#
De una a tres claves de escenario con puntos, cada una sobre un rango lineal o logarítmico, sobre los mismos valores de eje que usa el tipo de escenario sweep-nd. Cada eje tiene un nombre y una unidad; cada métrica tiene un nombre y una ruta de resultado, y su unidad se lee del propio bloque de unidades del tipo de escenario barrido, salvo que la campaña declare una. Con runs > 1, cada nodo es un conjunto de Monte Carlo con semilla (la realización k con la semilla del nodo más k), que se informa con las estadísticas siguientes. scenarios/campaign-sweep-jammer-power.toml barre un inhibidor a 1 km del receptor desde -50 hasta +10 dBW: la relación media inhibidor-señal se mueve exactamente 1 dB por dB (de 12,2 a 72,2 dB), y la disponibilidad cae de 1 a 0 entre -30 y -25 dBW.
Una clave con puntos puede indexar por posición una matriz de tablas: system.2.sisre_m es el sisre_m de la tercera tabla [[system]], y case.0.system.0.shell.0.altitude_km llega tres niveles más abajo.
[monte_carlo]: un conjunto con semilla#
La realización k ejecuta el escenario con su clave de semilla establecida en base_seed + k, la convención que ya usa el conjunto de relojes, de modo que el conjunto se reproduce exactamente. Cada métrica informa la media, la desviación típica poblacional, los percentiles 5, 50 y 95 por rango más cercano, un intervalo de confianza del 95% de la media por bootstrap de percentiles con semilla fija (2000 remuestreos) y, por defecto, todas las muestras en orden de semilla. Las rutas de resultado pueden indexar matrices: classical.series[-1].error_ns es la última muestra.
[compose]: varios escenarios bajo condiciones compartidas#
Los valores compartidos con nombre (un número o una matriz de números, con una unidad) se escriben en cada miembro en las claves a las que los vincula, de modo que los miembros no puedan discrepar sobre la condición compartida. Cada miembro se ejecuta y, para cada métrica, el resumen combinado da el valor más pequeño, el más grande y la media entre los miembros, nombrando el mejor y el peor. scenarios/campaign-shared-jammer-sea-road.toml coloca un inhibidor de 8 dBW entre un barco en el golfo de Finlandia (a unos 30 km) y un coche en una carretera costera de Helsinki (a unos 50 km): el barco pierde todos los satélites (relación media inhibidor-señal de 39,0 dB) mientras que el coche conserva al menos cuatro (34,6 dB).
[optimize]: el mejor valor de una métrica#
De una a tres claves de escenario con puntos, cada una acotada a [lo, hi] en una escala lin o log, se exploran en busca del mejor valor de una métrica (goal = "minimize", "maximize" o "target", que minimiza la distancia a target).
Hay dos métodos:
method = "grid"ejecuta todos los nodos de una rejilla destepspor clave, sobre los valores de eje del barrido.method = "nelder-mead"(el predeterminado) ejecuta un símplex de Nelder–Mead determinista en coordenadas normalizadas a [0, 1] por clave. Los puntos de prueba se proyectan sobre la caja. La sección admitemax_evals, unstepinicial y las tolerancias de paradaftolyxtol.
Una ejecución cuya métrica falta o no es finita obtiene la peor puntuación, y se conserva en la traza. Con runs > 1, la métrica es la media sobre las mismas semillas en cada evaluación. El resultado da best_coords, best_metric, best_score, evals, stop_reason y todas las evaluaciones en trace.
scenarios/campaign-optimize-link-budget.toml busca el alcance y la tasa de datos para un margen de enlace de 3 dB. El óptimo es local a la caja y al punto de partida. Es MODELLED, nunca una afirmación global.
El protocolo y sus umbrales preregistrados están en docs/design/evidence/cap32-optimize/. La prueba es tests/campaign_optimize_reference.rs. Los resultados:
- una resolución de objetivo 1-D coincide con la forma cerrada hasta 6e-15;
- el método de rejilla coincide bit a bit con un bucle de fuerza bruta independiente;
- el símplex lo hace al menos igual de bien que la rejilla de 41 × 41, con aproximadamente una décima parte de sus ejecuciones.
El umbral 1-D de la ronda 1 queda registrado como NOT MET: la caja preregistrada excluía la solución.
Reproducibilidad#
Todo resultado de campaña lleva scenario_hash, el SHA-256 (Secure Hash Algorithm 2, resumen de 256 bits) de la forma canónica en JavaScript Object Notation (JSON) del documento de la campaña (el orden de las claves y el formato no lo cambian), y un bloque reproducibility con el número de ejecuciones de miembros y run_digest, un SHA-256 sobre el resumen de cada resultado de miembro en orden de despacho. Dos ejecuciones con el mismo resumen produjeron resultados de miembros idénticos byte a byte. Cada ejecución de fase registra además su tipo de escenario, su propio scenario_hash cuando el tipo de escenario lo tiene, y el SHA-256 de su documento de resultados. Cada número del documento tiene una entrada de unidades.
El núcleo es secuencial y no lee archivos, de modo que una campaña se ejecuta sin cambios en la compilación a WebAssembly. Las campañas no pueden contener campañas.
Exportaciones#
--export sobre una campaña escribe cada escenario miembro que tiene geometría como su propio conjunto de archivos, con la etiqueta del miembro insertada antes del sufijo del formato: cada ejecución de fase (<phase>, o <phase>-<k> cuando la fase tiene varias ejecuciones), el escenario base del barrido (sweep), el escenario de Monte Carlo (monte-carlo) y cada miembro compuesto (con su propia etiqueta y los valores compartidos que vincula ya escritos). Un miembro idéntico a uno anterior se escribe una sola vez; los traspasos y los valores de barrido o de semilla aplicados en tiempo de ejecución no figuran en los escenarios exportados.
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
Un formato que ninguno de los miembros puede describir se rechaza indicando ese motivo. La tabla por escenario está en INTEROP.md.
Campañas LEO-PNT#
Quince campañas incluidas plantean cuestiones de posicionamiento, navegación y temporización (PNT) en órbita terrestre baja (LEO); LEO-PNT.md describe lo que muestra cada una. Lo que ejecuta cada una, tal como lo resume la línea de comandos:
| Escenario | Modo | Pregunta |
|---|---|---|
leo-focus-data-services.toml |
compose, 4 miembros | datos de servicio del mensaje de navegación frente a la longitud de trama |
leo-focus-fused-pnt-sisre.toml |
barrido de leo-pvt, 7 nodos |
posicionamiento fusionado MEO y LEO frente al error de alcance de la señal en el espacio (SISRE) de LEO |
leo-focus-indoor-uhf.toml |
compose, 2 miembros | LEO-PNT en interiores por banda y clase de edificio |
leo-focus-iot-eirp.toml |
barrido de leo-pass, 9 nodos |
energía por fijación del Internet de las cosas (IoT) frente a la potencia de transmisión UHF de LEO |
leo-focus-ntn-bandwidth.toml |
barrido de ntn-positioning, 9 nodos |
posicionamiento en redes no terrestres (NTN) frente al ancho de banda de la señal de referencia |
leo-focus-ppp-altitude.toml |
barrido de leo-ppp, 3 nodos |
convergencia del posicionamiento preciso de punto (PPP) frente a la altitud de una capa LEO de 192 satélites |
leo-resilience-gnss-jammed-leo-carries.toml |
chain, 3 fases durante 2100 s | Sistema global de navegación por satélite (GNSS) inhibido, la capa LEO lleva al usuario, integridad mantenida |
leo-resilience-multiband-diversity.toml |
barrido de spectrum, 13 nodos |
diversidad de bandas LEO frente a un inhibidor de barrera en banda L |
leo-resilience-spoof-monitors.toml |
compose, 4 miembros | los monitores de spoofing frente a cuatro spoofers |
leo-vertical-5g-network-timing.toml |
chain, 1 fase durante 86.400 s | temporización de estaciones base 5G: holdover y tiempo LEO |
leo-vertical-asset-tracking-iot.toml |
chain, 3 fases durante 1440 s | seguimiento de contenedores con UHF LEO: energía por fijación a lo largo de un trayecto |
leo-vertical-autonomous-vehicle.toml |
chain, 2 fases durante 1500 s | un vehículo autónomo en un cañón urbano con una capa LEO |
leo-vertical-autonomous-vehicle-skyline.toml |
chain, 2 fases durante 1800 s | el mismo cañón urbano como un corte plano de 35 deg y como un perfil del horizonte city-street |
leo-vertical-critical-infrastructure-timing.toml |
chain, 2 fases durante 87.000 s | temporización de infraestructuras críticas: holdover con tiempo LEO |
leo-vertical-polar-arctic.toml |
chain, 3 fases durante 10.800 s | usuarios polares y árticos con una capa LEO polar |
leo-vertical-rail-maritime.toml |
chain, 3 fases durante 2520 s | usuarios ferroviarios y marítimos con una capa LEO |
MEO es órbita terrestre media, UHF ultra alta frecuencia y 5G la quinta generación de redes móviles.
Qué se comprueba#
tests/campaign_composition_reference.rs fija las identidades de composición:
- Una campaña de una sola fase reproduce la ejecución independiente bit a bit. Para
clock,integrityyjamming, el documento de resultados del miembro es idéntico byte a byte arun_tomlsobre el archivo del escenario, su resumen es el que informa la campaña y, con la rejilla al paso propio de la ejecución, cada valor alineado es igual al valor de la serie independiente (el C/N0 de jamming es igual a la media calculada de forma independiente a partir del documento independiente). - Un barrido de un nodo y una composición de un miembro leen exactamente el número independiente.
- Un conjunto con semilla fija es estable byte a byte, y la realización
kes exactamente la ejecución independiente enseed + k; el hash de la campaña ignora el orden de las claves. - Un caso analítico.
scenarios/campaign-monte-carlo-clock-holdover.tomlejecuta 200 semillas de un reloj atómico a escala de chip con solo ruido blanco de frecuencia (q_wf = 9e-20 s^2/s, Microchip SA.45s sigma_y(1 s) = 3e-10), sincronizado hasta 590 s y avanzando por inercia hasta 3600 s. El error de tiempo final es gaussiano con media 0 y desviación típica sqrt(q_wf * 3010 s) = 16,459 ns (el paseo aleatorio de la fase bajo ruido blanco de frecuencia, National Institute of Standards and Technology (NIST) Technical Note 1337). El intervalo informado, [-2.52, 1,59] ns, contiene la media verdadera 0; la desviación típica muestral, 14,93 ns, da un estadístico chi cuadrado de 164,5 con 199 grados de libertad, dentro del intervalo bilateral del 99% [151,37, 254,14]. Con 3000 semillas el mismo escenario da 16,31 ns. - La cadena impulsada por el espectro lee los números independientes: la fase de onset dura exactamente el tiempo de primera pérdida de la ejecución de espectro, y cada valor de L1 C/A y E1 de la línea temporal es igual, con una diferencia de 1e-9 dB, a la fila del ejemplo de cascada independiente para el mismo estado del inhibidor (nominal, solo chirp, solo tono CW).
- La cadena transmite el estado como está documentado: la fase de spoofing dura exactamente el tiempo de detección de la ejecución de spoofing, el holdover arrastra exactamente el desfase de la ejecución de spoofing en la detección, la recuperación no arrastra nada, y la alarma está activa siempre que el nivel de protección falta o supera el límite de alerta.
Estas comprobaciones verifican que componer no cambia nada que no deba cambiar. No validan una misión encadenada frente a una medida, y por eso las tres filas de campaña de VERIFICATION-MATRIX.md son MODELLED.