Mensaje de navegación en LEO
El tipo de escenario leo-navmsg construye el mensaje de efemérides y reloj de difusión de un satélite de posicionamiento, navegación y temporización (PNT) en órbita terrestre baja (LEO) y responde a las preguntas que se hace quien diseña un mensaje: cuánto tiempo puede cubrir un mensaje, qué aporta cada parámetro adicional, qué ve un usuario cuando el mensaje cambia en mitad de una pasada y cuántos bits hacen falta para transportarlo con precisión de centímetro.
Es independiente del sistema. Cualquier órbita, cualquier portadora y cualquiera de los cuatro modelos de efemérides se ejecutan sin ningún preajuste; los preajustes con nombre son datos opcionales (véase Preajustes).
Imprima un ejemplo incluido con kshana example <name> (un nombre por llamada) y ejecútelo con kshana scenarios/<name>.toml: leo-navmsg-fit-interval-trade, leo-navmsg-model-comparison, leo-navmsg-midpass-update y leo-navmsg-encode-decode. El tipo de escenario es también la etapa de mensaje del tipo de escenario leo-pnt-chain (LEO-PNT.md) y el miembro de la campaña leo-focus-data-services, que compone cuatro configuraciones de mensaje e informa de la longitud de trama de cada una (146, 154, 159 y 171 bytes).
Código: src/leo_navmsg/ — elements.rs (registros y algoritmo de usuario), truth.rs (órbita y reloj de referencia), fit.rs (ajustador), sisre.rs (error de distancia de la señal en el espacio), services.rs (ionosfera y Tiempo Universal Coordinado (UTC)), codec.rs (formato binario), text.rs (exportaciones de estilo Receiver Independent Exchange Format (RINEX) y de valores separados por comas (CSV)), presets/ (un archivo por preajuste), mod.rs (el tipo de escenario).
Qué transporta un mensaje#
| Parte | Contenido |
|---|---|
| Auxiliar | identificador del vehículo espacial (SVID), edición de datos (IOD), identificador de banda, estado de salud de la señal (convención de Galileo: 0 correcto, 1 fuera de servicio, 2 operaciones ampliadas, 3 en prueba) |
| Sincronización | número de semana, tiempo de semana (TOW) de transmisión y un polinomio de reloj de segundo orden af0 + af1·(t − toc) + af2·(t − toc)² |
| Efemérides | uno de los cuatro modelos siguientes |
| Otros servicios | un conjunto ionosférico de difusión de Klobuchar, los coeficientes de NeQuick-G de Galileo ai0, ai1, ai2 con cinco indicadores de tormenta y los parámetros de tiempo del sistema a UTC A0, A1, ΔtLS, t0t, WNot, WNLSF, DN, ΔtLSF |
Modelos de efemérides#
| Código | Modelo | Parámetros |
|---|---|---|
kepler16 |
el conjunto kepleriano del Open Service Signal-in-Space Interface Control Document (OS SIS ICD) de Galileo: √A, e, i0, Ω0, ω, M0, Δn, Ω̇, i̇, Cuc, Cus, Crc, Crs, Cic, Cis, toe |
16 |
kepler-rac |
lo mismo, más polinomios de corrección a lo largo de la traza, transversal y radial (RAC) a0…, c0…, r0… en τ = tk / tau_s, coeficientes en metros, tau_s la potencia de dos igual o superior a la mitad del intervalo de ajuste (transmitida), grados fijados por rac_degrees (por defecto 7, 5, 6) |
16 + 21 por defecto, más la escala de tiempo |
liu22 |
el modelo de 22 parámetros de Liu, Su, Xie, Zhou y Qu (2025, Remote Sensing 17(16):2894, doi 10.3390/rs17162894): los 16 más ȧ, ṅ, Crs3, Crc3, Crs1, Crc1 |
22 |
ecef-poly |
el modelo de «reloj cero» ATOMIC (Autonomous Time and Orbit Determination for Microsatellite Constellations): un polinomio terrestre fijo (ECEF) por eje en τ = (t − t_ref) / 64 s (grado por defecto 6), sin términos de reloj porque el reloj del satélite se gobierna al tiempo del sistema (InsideGNSS) |
22 por defecto |
El algoritmo de usuario (elements::sat_state) es la secuencia del ICD de Galileo (ecuación de Kepler, correcciones de segundo armónico, nodo fijo a la Tierra) seguida, para kepler-rac, de los tres polinomios a lo largo del propio marco de la órbita kepleriana: radial a lo largo de la posición evaluada, transversal a lo largo de la normal a la órbita a partir de la inclinación y el nodo corregidos, y a lo largo de la traza completando la terna. El reloj añade el término relativista del ICD F·e·√A·sin E; para ecef-poly es la forma general −2 r·v / c² a partir del polinomio y su derivada.
Los términos de Liu et al. siguen el algoritmo de usuario del artículo (Sección 2,2, Ec. 1-7): A = A0 + ȧ·tk, n = √(μ/A0³) + Δn + ṅ·tk (las versiones anteriores a la 0,30 usaban la convención de navegación civil del Global Positioning System (GPS) ½·ṅ·tk, de modo que un ṅ escrito por ellas equivale al doble del del artículo), y Crs1·sin Φ + Crc1·cos Φ + Crs3·sin 3Φ + Crc3·cos 3Φ sumado al radio, Φ el argumento de latitud sin corregir. La convención de escala de ṅ está transcrita de la Ec. 1 del artículo; la comparación con el artículo sobre órbitas reales no depende de ella (un factor ½ en ṅ deja sin cambios todas las cifras ajustadas), de modo que el significado de un valor de nDot transmitido no está validado ahí.
Dos lecturas son propias de Kshana y se declaran como tales:
- El marco RAC y la normalización de
τ = tk / tau_s. Ningún documento público define un marco de corrección LEO para un mensaje de difusión. - El reloj de un mensaje de reloj cero es cero en total: se da por hecho que el lazo de gobierno mantiene el reloj aparente, término relativista incluido, en el tiempo del sistema.
El ajustador#
truth.rs integra la órbita con un Runge–Kutta de cuarto orden de paso fijo en un marco que pasa a ejes fijos a la Tierra mediante una única rotación, θ(t) = θ0 + Ω̇e·t, la misma rotación única que aplica un algoritmo de usuario de difusión. La gravedad es de dos cuerpos (gravity_degree = 0), los armónicos zonales de J2 a J6 (2 a 6) o el campo del Earth Gravitational Model 2008 (EGM2008) hasta grado y orden de 7 a 70, cuyos términos teserales llevan la firma de periodo corto que hace difícil un ajuste LEO. La resistencia atmosférica es opcional (densidad exponencial estática). El reloj es de funcionamiento libre (sesgo, deriva, tasa de deriva y ruido blanco de frecuencia con una desviación de Allan declarada a un segundo, más el término relativista periódico) o gobernado (un residuo gauss-markoviano de primer orden).
fit.rs ajusta el conjunto kepleriano con Levenberg–Marquardt sobre elementos no singulares (e·cos ω, e·sin ω, λ0 = M0 + ω): una órbita LEO es casi circular, de modo que ω y M0 por separado son casi indistinguibles. Parte del estado osculador en toe con la tasa del nodo por J2. A priori débiles centrados en cero acotan las tasas y los armónicos que un arco corto no puede resolver; con un peso de observación de 1 cm solo actúan en esas direcciones nulas. El ajuste liu22 toma en cambio el inicio y el estimador de la Sección 2,3 del artículo: parte con todos los términos de corrección en cero, no tiene a priori (mínimos cuadrados simples) y conserva el tope de 100 iteraciones del artículo. Se detiene con la regla de convergencia de parámetros propia de Kshana, cuando cada paso de parámetro es inferior a 1e-3 de su desviación típica formal; el artículo se detiene en cambio cuando el RMS cambia en menos de 0,1 mm. Después se ajustan los polinomios RAC a los residuos a lo largo de la traza, transversales y radiales por mínimos cuadrados lineales, y el polinomio de reloj al reloj de referencia menos el término relativista que añadirá el usuario.
Un hallazgo que codifican los valores por defecto: tras un ajuste kepleriano por mínimos cuadrados, el residuo es por construcción lo que los 16 parámetros no pueden abarcar, de modo que oscila a lo largo de la ventana (varios cruces por cero en cada componente) en lugar de derivar. Un polinomio de corrección lo elimina solo cuando su grado supera lo que el conjunto kepleriano ya abarca: a lo largo de la traza 7, transversal 5 y radial 6 reducen un residuo de 15 minutos de centímetros a aproximadamente un milímetro, mientras que grados transversales menores no eliminan casi nada (el residuo transversal es impar respecto al centro de la ventana). Un sistema que obtiene su parte kepleriana de otro modo deja un residuo de forma distinta, y los grados que necesita se derivan de ello. Los grados de corrección propios del preajuste Celeste (inferiores a estos; solo viven en el archivo del preajuste, src/celeste_iod.rs) se ejecutan aquí sobre la base de mínimos cuadrados de Kshana, por lo que sus términos transversales aportan poco en este motor: una afirmación sobre el ajustador de Kshana, no sobre ningún sistema real. toe y toc son segundos enteros, tal como los transporta el formato binario.
Cada mensaje se usa durante un periodo centrado en su ventana de ajuste (la primera tabla de compromiso usa la ventana completa). Lo que miden las cifras del error de distancia de la señal en el espacio (SISRE) es el error de representación del mensaje frente a la referencia a la que se ajustó, como raíz cuadrática media (RMS) y como máximo sobre el intervalo. El error de determinación y de predicción de órbita, que un segmento terreno o de a bordo real añade por encima, no se modela.
Error de distancia de la señal en el espacio#
sisre.rs usa el SISRE de promedio global de Montenbruck, Steigenberger y Hauschild (2018, Advances in Space Research 61(12):3020–3038, doi 10.1016/j.asr.2018.03.041):
SISRE_orb = sqrt( w_R² R² + w_AC² (A² + C²) )
SISRE = sqrt( (w_R R − c·dT)² + w_AC² (A² + C²) )
Los pesos son los promedios sobre usuarios distribuidos uniformemente en el casquete visible de la Tierra de cos² η y ½ sin² η, siendo η el ángulo de nadir de la línea de visión en el satélite, calculados para el radio propio de la órbita y su máscara de elevación. Con una máscara de 0° el cálculo reproduce la tabla del artículo para la órbita terrestre media (GPS 0,98 y 1/49, GLONASS 1/45, Galileo 1/61, BeiDou 1/54) y la órbita geoestacionaria (0,99 y 1/126): esa es la comprobación VALIDATED. En LEO el mismo promedio da
| Altitud | w_R |
1 / w_AC² |
ángulo de nadir del horizonte |
|---|---|---|---|
| 320 km | 0.384 | 2.35 | 72.2° |
| 510 km | 0.459 | 2.53 | 67.8° |
| 550 km | 0.472 | 2.57 | 67.0° |
| 786 km | 0.536 | 2.81 | 62.9° |
| 1080 km | 0.597 | 3.11 | 58.8° |
| 1336 km | 0.638 | 3.37 | 55.8° |
de modo que un usuario LEO, que ve el satélite lejos del nadir, siente los errores a lo largo de la traza y transversales mucho más que un usuario de órbita media.
Análisis#
analysis = [...] elige cualquiera de los cuatro (por defecto, todos).
Compromiso del intervalo de ajuste#
[trade] fija el intervalo, los intervalos de ajuste, los periodos de actualización y los modelos. scenarios/leo-navmsg-fit-interval-trade.toml (550 km, 97,6°, EGM2008 hasta grado 20 y resistencia atmosférica, 30 minutos de mensajes) da, con el periodo de uso igual al intervalo de ajuste:
| Modelo | Intervalo de ajuste | SISRE de órbita, RMS | SISRE de órbita, máx. | SISRE con reloj, RMS | radial / a lo largo de la traza / transversal, RMS |
|---|---|---|---|---|---|
kepler16 |
60 s | 0,041 cm | 0,179 cm | 0,069 cm | 0,09 / 0,01 / 0,00 cm |
kepler16 |
120 s | 0,032 cm | 0,160 cm | 0,079 cm | 0,06 / 0,01 / 0,01 cm |
kepler16 |
180 s | 0,093 cm | 0,540 cm | 0,134 cm | 0,18 / 0,06 / 0,00 cm |
kepler16 |
300 s | 0,310 cm | 1,033 cm | 0,329 cm | 0,09 / 0,49 / 0,02 cm |
kepler16 |
450 s | 1,690 cm | 7,542 cm | 1,696 cm | 0,72 / 2,65 / 0,04 cm |
kepler16 |
600 s | 2,875 cm | 10,219 cm | 2,866 cm | 1,72 / 4,42 / 0,26 cm |
kepler16 |
900 s | 9,345 cm | 34,032 cm | 9,349 cm | 6,46 / 14,14 / 0,91 cm |
kepler-rac |
60 s | 0,000 cm | 0,000 cm | 0,057 cm | 0,00 / 0,00 / 0,00 cm |
kepler-rac |
120 s | 0,000 cm | 0,000 cm | 0,074 cm | 0,00 / 0,00 / 0,00 cm |
kepler-rac |
180 s | 0,000 cm | 0,001 cm | 0,090 cm | 0,00 / 0,00 / 0,00 cm |
kepler-rac |
300 s | 0,004 cm | 0,014 cm | 0,106 cm | 0,00 / 0,00 / 0,01 cm |
kepler-rac |
450 s | 0,037 cm | 0,176 cm | 0,127 cm | 0,05 / 0,01 / 0,04 cm |
kepler-rac |
600 s | 0,214 cm | 0,643 cm | 0,229 cm | 0,28 / 0,09 / 0,26 cm |
kepler-rac |
900 s | 1,015 cm | 3,695 cm | 1,062 cm | 1,52 / 0,70 / 0,91 cm |
Y con un ajuste de 300 s, variando la frecuencia con que un nuevo mensaje toma el relevo:
| Modelo | Periodo de actualización | SISRE de órbita, RMS | SISRE de órbita, máx. |
|---|---|---|---|
kepler16 |
30 s | 0,314 cm | 0,850 cm |
kepler16 |
60 s | 0,288 cm | 0,859 cm |
kepler16 |
150 s | 0,219 cm | 0,830 cm |
kepler16 |
300 s | 0,310 cm | 1,033 cm |
kepler-rac |
30 s | 0,004 cm | 0,009 cm |
kepler-rac |
60 s | 0,004 cm | 0,009 cm |
kepler-rac |
150 s | 0,004 cm | 0,010 cm |
kepler-rac |
300 s | 0,004 cm | 0,014 cm |
El conjunto kepleriano de 16 parámetros se degrada de 0,04 cm a 60 s a 9,35 cm a 900 s: un conjunto kepleriano con armónicos de dos veces por revolución no puede seguir durante más de unos minutos los términos de gravedad de mayor frecuencia ni la resistencia atmosférica de un arco LEO, y su residuo de mínimos cuadrados oscila a lo largo de la ventana. Los polinomios a lo largo de la traza, transversal y radial (grados 7, 5, 6) absorben lo que queda: 1,01 cm a 900 s, 0,21 cm a 600 s. En los intervalos más cortos las cifras keplerianas son submilimétricas y ya no están estrictamente ordenadas (el ajuste queda entonces limitado por el condicionamiento, no por el modelo).
Comparación de modelos#
scenarios/leo-navmsg-model-comparison.toml ejecuta los cuatro modelos a 1, 5 y 10 minutos sobre la misma órbita, con el número de parámetros y los bits de efemérides y reloj en la codificación de Kshana:
| Modelo | Intervalo de ajuste | Parámetros | Bits de efemérides + reloj | SISRE de órbita, RMS | SISRE con reloj, RMS |
|---|---|---|---|---|---|
kepler16 |
60 s | 16 | 570 | 0,022 cm | 0,049 cm |
kepler16 |
300 s | 16 | 570 | 0,230 cm | 0,260 cm |
kepler16 |
600 s | 16 | 570 | 3,061 cm | 3,071 cm |
kepler-rac |
60 s | 37 | 1045 | 0,000 cm | 0,044 cm |
kepler-rac |
300 s | 37 | 1045 | 0,005 cm | 0,120 cm |
kepler-rac |
600 s | 37 | 1045 | 0,160 cm | 0,208 cm |
liu22 |
60 s | 22 | 730 | 0,014 cm | 0,046 cm |
liu22 |
300 s | 22 | 730 | 0,074 cm | 0,142 cm |
liu22 |
600 s | 22 | 730 | 0,258 cm | 0,290 cm |
ecef-poly (reloj cero) |
60 s | 22 | 750 | 0,000 cm | 28,784 cm |
ecef-poly (reloj cero) |
300 s | 22 | 750 | 0,005 cm | 28,784 cm |
ecef-poly (reloj cero) |
600 s | 22 | 750 | 0,561 cm | 28,774 cm |
La fila de reloj cero se puntúa frente a un reloj gobernado con un residuo de 0,24 m (la cifra de ATOMIC); las demás, frente al reloj de funcionamiento libre al que se ajustan.
Liu et al. 2025, SISRE frente a la altitud (MODELLED). El mismo escenario ajusta el modelo de 22 parámetros de Kshana sobre arcos de 20 minutos a las cinco altitudes del artículo, con la inclinación de cada satélite:
| Satélite | Altitud | Inclinación | Liu et al. 2025 | Kshana (RMS solo de órbita) | razón |
|---|---|---|---|---|---|
| GRACE-A | 320 km | 89.00° | 8,88 cm | 4,25 cm | 0.48 |
| GRACE-C | 475 km | 89.00° | 6,21 cm | 2,87 cm | 0.46 |
| Sentinel-2A | 786 km | 98.57° | 2,87 cm | 2,20 cm | 0.77 |
| HY-2A | 966 km | 99.34° | 2,11 cm | 1,25 cm | 0.59 |
| Sentinel-6A | 1336 km | 66.04° | 0,75 cm | 0,51 cm | 0.67 |
Esto no es una validación. El artículo ajustó órbitas científicas precisas reales de los satélites nombrados (con su historial completo de gravedad, resistencia atmosférica y fuerzas no gravitatorias); Kshana ajusta su propia órbita integrada, evalúa los seis parámetros añadidos como se ha descrito más arriba y usa sus propios pesos de SISRE. La comparación muestra la tendencia y el orden de magnitud. La comparación sobre las mismas órbitas reales que ajustó el artículo es tests/leo_navmsg_fit_real_orbit_oracle.rs (desde la 0,30 el ajuste de 22 parámetros concuerda ahí dentro del factor preregistrado 1,5, en los días del artículo y en ocho días reservados).
Actualización a mitad de pasada#
[midpass] sitúa a un usuario (por defecto 45° N, 10° E), busca la pasada más alta sobre la máscara dentro de search_s y programa mensajes cada update_period_s. En cada cambio dentro de la pasada informa del salto de posición, del salto de reloj, del salto de pseudodistancia del usuario (mensaje nuevo menos antiguo), del mayor salto que podría ver cualquier usuario visible (forma cerrada sobre el cono de nadir), del error de distancia antes y después, y de PASS o FAIL frente a threshold_m. scenarios/leo-navmsg-midpass-update.toml (ajustes de 300 s actualizados cada 150 s):
La pasada más alta del día alcanza 43,7° y dura 455 s. Sus cambios:
| Cambio | Elevación | Salto de posición | Salto de reloj | Salto de distancia del usuario | Salto en la peor geometría |
|---|---|---|---|---|---|
| IOD 270 → 271 | 12.7° | 0,07 mm | 0,19 mm | -0.17 mm | 0,27 mm |
| IOD 271 → 272 | 37.4° | 0,14 mm | 0,14 mm | -0.24 mm | 0,27 mm |
| IOD 272 → 273 | 28.2° | 0,27 mm | -0.22 mm | 0,35 mm | 0,48 mm |
El mayor salto de distancia del usuario es de 0,35 mm frente a un umbral de 5 cm: PASS.
Codificación y decodificación#
scenarios/leo-navmsg-encode-decode.toml codifica el primero de tres mensajes, lo decodifica, comprueba el CRC y rechaza una copia corrupta, imprime el presupuesto de cuantización y escribe y vuelve a leer el bloque de estilo RINEX y la tabla CSV:
- trama: 171 bytes (1310 bits de carga útil, de los cuales 1045 son de efemérides y reloj), comprobación de redundancia cíclica de 24 bits (CRC-24Q)
0x19105F; - mayor efecto de medio paso de un solo campo:
af0, 0,545 mm; - mensaje completo tras la cuantización: posición a menos de 1,126 mm y reloj a menos de 0,185 mm del mensaje exacto; SISRE 0,113 cm exacto, 0,129 cm decodificado;
- una trama con un bit invertido es rechazada: true;
- ida y vuelta RINEX-style dentro de 5.0e-06 m, ida y vuelta CSV dentro de 0.0e+00 m.
Independencia de la plataforma#
Una trama se transmite como enteros, así que han de ser los mismos enteros dondequiera y comoquiera que se ejecute el escenario: el binario nativo en cualquier sistema operativo, una compilación de depuración o de publicación y la compilación WebAssembly (WASM) en un navegador. Tres cosas lo impedían. El seno, el coseno, la arcotangente y la exponencial de la biblioteca matemática de un anfitrión no tienen por qué estar correctamente redondeados y difieren entre anfitriones en la última cifra. Una compilación optimizada en macOS toma el seno y el coseno de un mismo argumento de la rutina combinada del sistema, que no siempre devuelve el valor del seno aislado, de modo que también diferían una compilación de depuración y una de publicación. Y el muestreador normal habitual llama a la exponencial y al logaritmo del anfitrión en sus ramas poco frecuentes. El ajuste convierte una diferencia tan pequeña en campos cuantizados distintos. Por ello todo el tipo de escenario (órbita y reloj de referencia, ajuste, algoritmo de usuario, error de distancia de la señal en el espacio (SISRE), códec) calcula cada una de esas funciones con la biblioteca libm de Rust puro mediante src/portable_math.rs, las potencias enteras como productos explícitos y las desviaciones normales por el método polar sobre la salida bruta del generador. leo_navmsg::tests::the_encoded_frame_is_the_same_bytes_on_every_platform fija la trama de 171 bytes del escenario de codificación y decodificación que sigue y un valor de comprobación por modelo de efemérides; una compilación de depuración, una de publicación y la compilación WASM dan documentos de resultados idénticos byte a byte para los cinco escenarios leo-navmsg incluidos.
Formato binario#
Esta es la codificación documentada propia de Kshana. Transporta los componentes que nombran las descripciones publicadas de los mensajes de navegación LEO, modelada sobre el conjunto de campos del ICD de Galileo. No es la disposición de bits de Celeste ni de ningún otro sistema: ninguna es pública.
Trama: preámbulo 0xA7 (8 bits), versión 1 (4), modelo (4: 1 kepler16, 2 kepler-rac, 3 liu22, 4 ecef-poly), longitud de la carga útil en bytes (12), carga útil rellenada con ceros hasta un byte, CRC-24Q (una comprobación de redundancia cíclica de 24 bits, 24 bits) sobre todos los bytes precedentes. CRC-24Q es la comprobación del estándar RTCM 10403 de la Radio Technical Commission for Maritime Services y del ICD de Galileo (polinomio 0x1864CFB, valor inicial 0); el código reproduce el valor de comprobación de catálogo 0xCDE703 para 123456789 y los bytes de comprobación de la trama de ejemplo del mensaje de tipo 1005 de RTCM 10403 (VALIDATED).
Los pasos del ICD de Galileo se eligieron para la órbita terrestre media y son demasiado gruesos para un mensaje LEO de nivel centimétrico: Crs en pasos de 2⁻⁵ m (3,1 cm), Cuc 2⁻²⁹ rad (1,3 cm al radio de LEO), los ángulos 2⁻³¹ semicírculos (1,0 cm) y af0 2⁻³⁴ s (1,7 cm). Kshana conserva las unidades del ICD y la convención del semicírculo, afina los pasos para que el error de medio paso de cada campo se mantenga por debajo de 1 mm de posición o de distancia en una ventana de 15 minutos, y ensancha los campos para conservar los rangos que necesita un ajuste LEO:
| Bloque | Campo | Bits | Paso | Unidad |
|---|---|---|---|---|
| auxiliar y sincronización | SVID |
8 | 1 | - |
| auxiliar y sincronización | IOD |
10 | 1 | - |
| auxiliar y sincronización | Band |
4 | 1 | - |
| auxiliar y sincronización | Health |
2 | 1 | - |
| auxiliar y sincronización | WeekNumber |
13 | 1 | semana |
| auxiliar y sincronización | ToW |
20 | 1 | s |
| auxiliar y sincronización | Flags |
4 | 1 | - |
| reloj (bit indicador 0) | toc |
20 | 1 | s |
| reloj (bit indicador 0) | af0 |
34 | 2^-38 | s |
| reloj (bit indicador 0) | af1 |
28 | 2^-50 | s/s |
| reloj (bit indicador 0) | af2 |
20 | 2^-62 | s/s^2 |
| kepleriano (modelos 1-3) | toe |
20 | 1 | s |
| kepleriano (modelos 1-3) | M0 |
36 | 2^-35 | semicírculo |
| kepleriano (modelos 1-3) | e |
32 | 2^-33 | - |
| kepleriano (modelos 1-3) | sqrtA |
36 | 2^-23 | m^0,5 |
| kepleriano (modelos 1-3) | Omega0 |
36 | 2^-35 | semicírculo |
| kepleriano (modelos 1-3) | i0 |
36 | 2^-35 | semicírculo |
| kepleriano (modelos 1-3) | omega |
36 | 2^-35 | semicírculo |
| kepleriano (modelos 1-3) | deltaN |
29 | 2^-43 | semicircle/s |
| kepleriano (modelos 1-3) | OmegaDot |
29 | 2^-43 | semicircle/s |
| kepleriano (modelos 1-3) | iDot |
22 | 2^-43 | semicircle/s |
| kepleriano (modelos 1-3) | Cuc |
26 | 2^-34 | rad |
| kepleriano (modelos 1-3) | Cus |
26 | 2^-34 | rad |
| kepleriano (modelos 1-3) | Crc |
26 | 2^-10 | m |
| kepleriano (modelos 1-3) | Crs |
26 | 2^-10 | m |
| kepleriano (modelos 1-3) | Cic |
26 | 2^-34 | rad |
| kepleriano (modelos 1-3) | Cis |
26 | 2^-34 | rad |
| correcciones a lo largo de la traza/transversal/radial (modelo 2) | degA |
3 | 1 | - |
| correcciones a lo largo de la traza/transversal/radial (modelo 2) | degC |
3 | 1 | - |
| correcciones a lo largo de la traza/transversal/radial (modelo 2) | degR |
3 | 1 | - |
| correcciones a lo largo de la traza/transversal/radial (modelo 2) | racTauExp |
4 | 1 | log2(s) |
| correcciones a lo largo de la traza/transversal/radial (modelo 2) | a_k, c_k, r_k |
22 | 2^-14 | m |
| extras de Liu et al. 2025 (modelo 3) | aDot |
26 | 2^-20 | m/s |
| extras de Liu et al. 2025 (modelo 3) | nDot |
30 | 2^-58 | semicircle/s^2 |
| extras de Liu et al. 2025 (modelo 3) | Crs3 |
26 | 2^-10 | m |
| extras de Liu et al. 2025 (modelo 3) | Crc3 |
26 | 2^-10 | m |
| extras de Liu et al. 2025 (modelo 3) | Crs1 |
26 | 2^-10 | m |
| extras de Liu et al. 2025 (modelo 3) | Crc1 |
26 | 2^-10 | m |
| polinomio ECEF (modelo 4) | tref |
20 | 1 | s |
| polinomio ECEF (modelo 4) | degP |
4 | 1 | - |
| polinomio ECEF (modelo 4) | x0, y0, z0 |
38 | 2^-11 | m |
| polinomio ECEF (modelo 4) | x_k, y_k, z_k (k >= 1) |
34 | 2^-12 | m |
| Klobuchar (bit indicador 1) | alpha0 |
8 | 2^-30 | s |
| Klobuchar (bit indicador 1) | alpha1 |
8 | 2^-27 | s/semicircle |
| Klobuchar (bit indicador 1) | alpha2 |
8 | 2^-24 | s/semicircle^2 |
| Klobuchar (bit indicador 1) | alpha3 |
8 | 2^-24 | s/semicircle^3 |
| Klobuchar (bit indicador 1) | beta0 |
8 | 2^11 | s |
| Klobuchar (bit indicador 1) | beta1 |
8 | 2^14 | s/semicircle |
| Klobuchar (bit indicador 1) | beta2 |
8 | 2^16 | s/semicircle^2 |
| Klobuchar (bit indicador 1) | beta3 |
8 | 2^16 | s/semicircle^3 |
| NeQuick-G (bit indicador 2) | ai0 |
11 | 2^-2 | sfu |
| NeQuick-G (bit indicador 2) | ai1 |
11 | 2^-8 | sfu/deg |
| NeQuick-G (bit indicador 2) | ai2 |
14 | 2^-15 | sfu/deg^2 |
| NeQuick-G (bit indicador 2) | SF1-5 |
5 | 1 | - |
| UTC (bit indicador 3) | A0 |
32 | 2^-30 | s |
| UTC (bit indicador 3) | A1 |
24 | 2^-50 | s/s |
| UTC (bit indicador 3) | dtLS |
8 | 1 | s |
| UTC (bit indicador 3) | t0t |
8 | 3600 | s |
| UTC (bit indicador 3) | WNot |
8 | 1 | semana |
| UTC (bit indicador 3) | WNLSF |
8 | 1 | semana |
| UTC (bit indicador 3) | DN |
3 | 1 | día |
| UTC (bit indicador 3) | dtLSF |
8 | 1 | s |
Un valor fuera del rango de su campo se rechaza, no se envuelve. Los rangos se comprobaron codificando ajustes a 300 hasta 2000 km, inclinaciones de 0° a 140° e intervalos de ajuste de hasta 20 minutos: deltaN y OmegaDot son amplios porque en una órbita casi ecuatorial el nodo está mal definido y el ajuste reparte entre ambos la deriva por J2 del argumento de latitud, y aDot y nDot porque el ajuste de 22 parámetros sobre 20 minutos absorbe parte de la oscilación de periodo corto del semieje mayor. Desde la 0,30 el ajuste de 22 parámetros es el de mínimos cuadrados simples del artículo, sin a priori, y un ajuste ecuatorial a 800 km necesita entonces nDot de unos 6.3e-10 semicírculos/s^2, por lo que su escala pasó de 2^-60 a 2^-58. Las correcciones a lo largo de la traza de grado 7 de kepler-rac caben en el rango de coeficientes de 22 bits hasta 15 minutos; un ajuste más largo puede superarlo y entonces se rechaza. quantisation_budget informa, para cada campo de efemérides y reloj, del mayor cambio de posición y de distancia que produce un cambio de medio paso a lo largo del periodo de uso, y del cambio del mensaje completo tras la cuantización.
Exportaciones de texto#
RINEX 4,02 no define registros de navegación LEO (sus letras de sistema son G, R, E, J, C, I y S; International Global Navigation Satellite System (GNSS) Service (IGS) RINEX 4,02). El bloque que escribe text.rs toma prestada la forma de RINEX 4 —una cabecera de registro > EPH, una línea de satélite y época con tres términos de reloj, líneas de órbita de difusión de cuatro campos D19.12— y es una extensión documentada de Kshana: letra de sistema L, tipos de registro KP16, KRAC, LU22, APOL y tres comentarios de cabecera que lo indican. Antecedentes de órbitas LEO en registros de navegación de estilo RINEX-4: arXiv 2401,17767.
> EPH L04 KRAC
L04 yyyy mm dd hh mm ss af0 af1 af2
IOD Crs deltaN M0
Cuc e Cus sqrtA
toe Cic Omega0 Cis
i0 Crc omega OmegaDot
IDOT Band Week Health
txTOW clock degA degC
degR tau_s a0 a1 then the rest of a_k, c_k and r_k, four per line
La tabla CSV lleva los mensajes kepler16 y kepler-rac, uno por fila. Las columnas por defecto usan los nombres del ICD de Galileo (SVID, IOD, Band, WeekNumber, ToW, Health, toc, af0, af1, af2, toe, M0, sqrtA, e, deltaN, Omega0, OmegaDot, iDot, i0, omega, Crc, Crs, Cic, Cis, Cuc, Cus, a0…, c0…, r0…, racTau); csv_schema selecciona en su lugar la grafía de un preajuste. Ambos formatos se pueden volver a leer.
Ionosfera y UTC#
- Klobuchar: el modelo L1 del motor (
gnss_sim::klobuchar_delay_m, comprobado frente a RTKLIB) escalado a la portadora por la ley de primer orden(f_L1 / f)². - NeQuick-G: los coeficientes viajan en el mensaje y
effective_ionisation_leveldevuelveAz = ai0 + ai1·μ + ai2·μ²para una latitud de inclinación modificadaμ, con las reglas del algoritmo (unos coeficientes todos nulos dan 63,7 unidades de flujo solar, sfu; el resultado se acota a [0, 400] sfu). El modelo de densidad electrónica NeQuick y su integración oblicua, que conviertenAzen un retardo, no están implementados. - Un satélite a unos cientos de kilómetros vuela dentro de la ionosfera. Ninguno de los modelos de difusión tiene en cuenta el contenido de electrones por encima del satélite, y no se aplica ninguna corrección por él.
- UTC:
system_to_utcaplica los tres casos del §5.1.7 del ICD de Galileo (antes de un evento de segundo intercalar, a menos de seis horas de él y después); un segundo insertado se lee 86400.
Preajustes#
Los preajustes son datos, un archivo cada uno en src/leo_navmsg/presets/, con sus fuentes. El motor y todos los escenarios incluidos, salvo el de Celeste, se ejecutan sin ellos.
| Clave | Fuente | Órbita | Portadora | Modelo de mensaje |
|---|---|---|---|---|
xona-pulsar |
PUBLIC, arXiv 2509,19551 | 1080 km, 53° | X1 1593,3225 MHz | no publicado |
xona-pulsar-0 |
PUBLIC, arXiv 2509,19551 | 520 km, 97° | X1 | no publicado |
iridium |
PUBLIC, informe de RNTF, descripción de la constelación | 781 km, 86,4° | 1621 MHz (1616–1626 MHz band) | ninguno difundido |
starlink |
PUBLIC, NAVIGATION 72(1), descripción de la constelación | 550 km, 53° | banda Ku, valor de banda media (representativo) | ninguno (señales de oportunidad) |
centispace |
PUBLIC, Sensors 2023, Satellite Navigation 2026 | 700 km, 55° | cerca de B1 (enmascarada en la fuente; L1 como sustituto) | no publicado |
cband-generic |
REPRESENTATIVE | 600 km, 97,8° | 5020 MHz (centro de la banda C de RNSS) | no publicado |
atomic |
PUBLIC, InsideGNSS | 500 km (representativo) | L1 (representativo) | ecef-poly, grado 6, 60 s, renovado cada 30 s, reloj cero, residuo de gobierno de 0,24 m |
celeste-iod |
WORKSHOP y PUBLIC | 510 km, 97,4° | 1191,795 MHz | kepler-rac, grados y espaciado de registros en el archivo del preajuste |
RNSS es el servicio de radionavegación por satélite; RNTF es la Resilient Navigation and Timing Foundation.
Celeste IOD. El preajuste de la demostración en órbita (IOD) Celeste de la Agencia Espacial Europea (ESA) es el único que usa material presentado en el taller LEO-PNT del Navigation Innovation and Support Programme (NAVISP) de la ESA, 2026: la estructura del mensaje (conjunto kepleriano de Galileo más polinomios de corrección a lo largo de la traza/transversal/radial, polinomio de reloj, SVID, salud, IOD, parámetros ionosféricos y de UTC), el espaciado de registros y los nombres de las columnas CSV. La órbita (510 km, heliosíncrona casi polar) y la portadora proceden de fuentes públicas citadas en el archivo. La disposición de bits de Celeste no es pública y no se reproduce; las fases posteriores de Celeste y el sistema LEO-PNT de la Unión Europea (UE) pueden diferir. Cada valor derivado del taller se encuentra en el módulo navmsg de src/celeste_iod.rs, usado por scenarios/leo-navmsg-celeste-iod.toml. Cómo se retiene el preajuste: todo número del motor derivado del taller vive en un único archivo, src/celeste_iod.rs, que build.rs compila solo cuando existe, y en los escenarios exclusivos del repositorio scenarios/*celeste-iod*.toml. Eliminar ese archivo y esos escenarios retiene el preajuste sin editar ninguna fuente; el resto de pruebas, referencias independientes y escenarios se ejecutan sin él, y el recuento de archivos de escenario del README sigue contando los archivos retenidos.
Verificación#
| Fila | Etiqueta | Referencia independiente |
|---|---|---|
| Pesos de SISRE | VALIDATED | tabla de Montenbruck et al. 2018 (GPS, GLONASS, Galileo, BeiDou, geoestacionaria) |
| algoritmo de usuario del ICD de Galileo | VALIDATED | RTKLIB eph2pos sobre cuatro efemérides de difusión reales de Galileo, 1 mm por eje (tests/leo_navmsg_reference.rs) |
| CRC-24Q | VALIDATED | valor de comprobación de catálogo 0xCDE703; trama de ejemplo RTCM 10403 1005 |
| Ajustador y compromiso de SISRE | MODELLED | referencia de dos cuerpos recuperada a 1 mm; ajuste J2–J6 corregido a 1 mm; crecimiento monótono con el intervalo |
| Continuidad a mitad de pasada | MODELLED | identidad del salto; cota de cono en forma cerrada frente a muestreo |
| Formato binario y presupuesto | MODELLED | ida y vuelta; el medio paso de cada campo por debajo de 1 mm |
| RINEX-style y CSV | MODELLED | ida y vuelta |
| modelo y ajuste de 22 parámetros de Liu et al. 2025 | VALIDATED | órbitas precisas ITSG de TU Graz de cuatro satélites frente a las Tablas 4, 5, 6 y 8 del artículo: razones a lo largo de la traza, transversal, radial y SISRE de 0,755 a 1,138 en los días del artículo y de 0,683 a 1,186 en ocho días reservados, dentro de 1.5x (tests/leo_navmsg_fit_real_orbit_oracle.rs) |
| polinomio de reloj cero de ATOMIC y la tabla de cinco altitudes | MODELLED | hechos de ATOMIC según InsideGNSS; la tabla publicada de Liu impresa junto al ajuste de órbita integrada de Kshana, no fijada |
| Ionosfera y UTC | MODELLED | formas cerradas del ICD; el modelo de Klobuchar comprobado con RTKLIB |
Limitaciones#
- SISRE es solo error de representación: sin error de determinación ni de predicción de órbita.
- La referencia es una integración de Kshana (sin tercer cuerpo, presión de radiación solar ni mareas), no la órbita precisa de un satélite real.
- El formato binario y el bloque de estilo RINEX son propios de Kshana.
- NeQuick-G se transporta, no se integra en un retardo; no hay corrección para un satélite dentro de la ionosfera.
- La comparación con Liu et al. difiere en órbitas, lectura de parámetros y pesos.