Validación de SGP4/SDP4 frente a la referencia de la comunidad
El propagador de órbitas de Kshana se ha validado frente a la referencia canónica de la comunidad para SGP4/SDP4 (SGP4: Perturbaciones Generales Simplificadas 4; SDP4: Perturbaciones Simplificadas de Espacio Profundo 4): los vectores de verificación publicados con Vallado et al., "Revisiting Spacetrack Report #3" (AIAA (Instituto Americano de Aeronáutica y Astronáutica) 2006-6753), distribuidos como SGP4-VER.TLE (los TLE de prueba (conjuntos de elementos de dos líneas)) y tcppver.out (el estado TEME (ecuador verdadero, equinoccio medio) esperado en cada instante). Es la misma referencia con la que se validan las implementaciones públicas en C++/Python/MATLAB, de modo que la concordancia aquí es concordancia con el estándar de facto.
Resultado#
| Magnitud | Valor |
|---|---|
| Estados de referencia comparados | 666 (todas las filas de tcppver.out, fijadas en la prueba) |
| Peor error de posición | 4,12 mm (4.120e-6 km, satélite 23333; < 2e-5 km de tolerancia) |
| Peor error de velocidad | 1.85e-9 km/s (satélite 23333; < 1e-6 km/s de tolerancia) |
| Casos cubiertos | SGP4 de órbita cercana a la Tierra, SDP4 de espacio profundo (lunisolar + resonancia de 12 h/24 h) y los casos deliberados de código de error |
Los casos de espacio profundo y de resonancia importan especialmente para este proyecto: los satélites GNSS (sistema global de navegación por satélite) están en órbitas de ~12 h que son de espacio profundo y resonantes, algo que un modelo de dos cuerpos + J2 secular no puede reproducir; SGP4/SDP4 sí.
Método#
- La implementación (
src/sgp4.rs) es un port en Rust, sin dependencias, del algoritmo de Vallado de dominio público; el tratamiento de épocas es en días desde 1950, se usa el modoimproved(noafspc) y se aplican las constantes de gravedad WGS-72 (WGS: Sistema Geodésico Mundial) tal como establece la referencia. - La prueba (
tests/sgp4_verification.rs) analiza los archivosSGP4-VER.TLEytcppver.outincorporados (tests/fixtures/sgp4/), propaga cada satélite de prueba a cada instante de referencia y comprueba que la posición y la velocidad TEME coinciden dentro de las tolerancias indicadas. El recuento de filas comparadas está fijado en exactamente 666, de modo que una regresión en los datos de prueba o en el comportamiento de omisión no pueda reducir la cobertura sin que se note.
Reproducirlo#
cargo test --test sgp4_verification -- --nocapture
La prueba imprime el número de filas comparadas y los errores de posición y de velocidad en el peor caso. Los datos de prueba están confirmados en el repositorio, por lo que la comprobación es totalmente fuera de línea y determinista.
Comprobación cruzada independiente con el crate sgp4#
Coincidir con la referencia publicada demuestra la corrección frente a una tabla. Para demostrarla también frente a una implementación independiente, tests/sgp4_crate_comparison.rs ejecuta una biblioteca SGP4 independiente en Rust de uso muy extendido, el crate sgp4 (neuromorphicsystems/sgp4, versión 2,4), sobre los mismos 666 vectores de la AIAA y compara las dos bases de código cara a cara. Ambas se ejecutan con el modelo de gravedad WGS72 (Sistema Geodésico Mundial 1972) en el que se definen los vectores (el from_elements predeterminado del crate usa WGS84 (Sistema Geodésico Mundial 1984), que difiere de la referencia WGS72 en ~km: una decisión de modelado, expuesta con honestidad, no un error).
| Régimen | kshana ↔ referencia | crate ↔ referencia | kshana ↔ crate |
|---|---|---|---|
| cercano a la Tierra (LEO/MEO (LEO: órbita terrestre baja; MEO: órbita terrestre media)) | 7.3e-9 km | 7.3e-9 km | 4.4e-10 km |
| espacio profundo (no resonante) | 4.1e-6 km | 2.1e-7 km | 4.1e-6 km |
| resonancia de espacio profundo (½ día) | 8.1e-9 km | 7.7e-9 km | 2.2e-9 km |
| resonancia de espacio profundo (1 día) | 8.2e-9 km | 7.8e-9 km | 2.2e-9 km |
Dos implementaciones independientes coinciden a nivel submicrométrico en órbitas cercanas a la Tierra y resonantes y a 4,12 mm en el peor caso en todos los regímenes: los mismos 4,12 mm que son la propia desviación de Kshana respecto de la referencia, es decir, la discrepancia es ese único caso de espacio profundo, con el crate situado entre Kshana y la tabla. La tabla completa (con los recuentos de filas por régimen y los cuatro casos patológicos que el crate rechaza en la construcción) está confirmada en tests/fixtures/sgp4_comparison.md y se regenera mediante KSHANA_REGEN_FIXTURES=1 cargo test --test sgp4_crate_comparison.
Estado de la «publicación» de este resultado#
La validación cruzada en sí está completa y en el repositorio. Presentar el resultado en foros externos (un catálogo de la comunidad, una nota breve, un registro archivado con DOI (identificador digital de objeto)) es una acción de los responsables del mantenimiento que se sigue por separado en la hoja de ruta; este documento es el registro dentro del repositorio al que apuntarían esas presentaciones.