Traducción automática, no revisada por un hablante nativo. El inglés es la referencia.

EscenariosEditar en GitHubFuente: docs/CAMPAIGNS.md

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: jamming da alarma mientras siguen a menos de cuatro satélites (su propia definición de disponibilidad); integrity da alarma en las épocas que marca como no disponibles;
  • reglas predefinidas sobre los canales de la fase, evaluadas después de carry: clock da alarma mientras el error de tiempo absoluto supera guard_ns; gnss-ins mientras el error de posición supera position_threshold_m; las reglas explícitas van en [[phases.runs.alarms]];
  • eventos de alarma: spoof genera uno en el detect_time_s de su monitor asistido por reloj; spoof-detect genera 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 por duration_s. La misión incluida termina su fase de spoofing en classical.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 de steps por 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 admite max_evals, un step inicial y las tolerancias de parada ftol y xtol.

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, integrity y jamming, el documento de resultados del miembro es idéntico byte a byte a run_toml sobre 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 k es exactamente la ejecución independiente en seed + k; el hash de la campaña ignora el orden de las claves.
  • Un caso analítico. scenarios/campaign-monte-carlo-clock-holdover.toml ejecuta 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.