Uso de TLE de constelaciones reales
El scenarios/orbit-sgp4-gps.toml incluido ya lleva TLE reales (conjuntos de elementos de dos líneas): la instantánea gps-ops de Celestrak de la constelación operativa GPS (Global Positioning System) catalogada el 2021-07-28, 30 satélites, con strict_checksum = true. Cada satélite se propaga con SGP4/SDP4 (Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4), validado frente a los vectores oficiales de AIAA (American Institute of Aeronautics and Astronautics) 2006-6753. La misma instantánea se incorpora como tests/fixtures/celestrak/gps-ops_2021-07-28.txt, y scripts/fetch_tles.sh descarga una nueva. Lea la sección 3 antes de citar una cifra de geometría obtenida de ella: ese escenario propaga cada satélite desde su propia época.
Como ejemplo sintético y autónomo, scenarios/orbit-real-tle.toml da seis satélites de tipo GPS como registros de línea 2 sueltos, propagados como elementos keplerianos analíticos, y todo escenario orbit sin un bloque tle construye una constelación Walker.
Para estudiar la constelación GPS actual (o cualquier otra), incorpore una instantánea reciente.
1. Descargar una instantánea actual#
Celestrak redistribuye los conjuntos de elementos del catálogo de NORAD (Mando de Defensa Aeroespacial de Norteamérica), actualizados al menos a diario. Para GPS:
curl -o gps-ops.txt "https://celestrak.org/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=tle"
Otros grupos útiles: galileo, glo-ops (GLONASS, el Sistema Global de Navegación por Satélite de Rusia), beidou, stations (la ISS, Estación Espacial Internacional, y otras estaciones tripuladas).
El archivo es una secuencia de registros de tres líneas (nombre, línea 1, línea 2). El analizador de Kshana ignora las líneas de nombre, de modo que puede pegar el archivo tal cual.
2. Incorporarla a un escenario#
En cualquier escenario de órbita, fije el bloque tle de la constelación con el contenido de la instantánea:
[constellation]
# Paste the Celestrak gps-ops block here (name/line1/line2 triples). Two real records
# from tests/fixtures/celestrak/gps-ops_2026-06-07.txt are shown; a real block has ~30.
strict_checksum = true # real Celestrak TLEs carry valid checksums; enforce them
tle = """
GPS BIIR-5 (PRN 22)
1 26407U 00040A 26158.26673196 .00000043 00000+0 00000+0 0 9990
2 26407 54.8526 215.5566 0121168 302.4173 18.5084 2.00557626189748
GPS BIIR-8 (PRN 16)
1 27663U 03005A 26157.61055816 .00000039 00000+0 00000+0 0 9995
2 27663 54.8837 215.3893 0147927 53.0597 289.9583 2.00561160171094
"""
(PRN es el número de código de ruido pseudoaleatorio que transmite un satélite GPS.)
Un par de línea 1 + línea 2 se propaga con SGP4/SDP4 (términos de arrastre y de espacio profundo); una línea 2 suelta se trata como elementos medios keplerianos analíticos. Ambos pueden mezclarse.
strict_checksum = true rechaza cualquier línea cuya suma de verificación módulo 10 de la columna 69 sea incorrecta: una buena comprobación de integridad en un archivo recién descargado. Su valor por defecto es false porque los escenarios didácticos sintéticos usan sumas de verificación de relleno.
3. Notas sobre las épocas: léalas antes de citar una cifra de geometría#
SGP4 propaga cada satélite desde su propia época de TLE, y parse_propagators (en src/tle.rs) devuelve solo propagadores, de modo que el tiempo del escenario t se aplica como tsince = t a cada satélite de forma independiente. Esa es la convención correcta solo si todos los conjuntos de elementos del archivo comparten una época.
Un archivo de grupo de Celestrak no le ofrece eso. El archivo se descarga en un único instante, pero el conjunto de elementos de cada satélite se actualiza con su propio ritmo, de modo que las épocas que contiene se reparten a lo largo de días. Medido en los conjuntos incorporados a este repositorio (línea 1, columnas 19–32):
| fixture | conjuntos | dispersión de épocas |
|---|---|---|
tests/fixtures/celestrak/gps-ops_2026-06-07.txt |
32 | 70,6 h |
tests/fixtures/celestrak/gps-ops_2021-07-28.txt |
30 | 76,4 h |
tests/fixtures/celestrak/galileo_2026-06-07.txt |
33 | 335,7 h |
70,6 h son 5,9 revoluciones de GPS. Propagado tal cual, el fasado en el plano queda revuelto: los satélites están a las altitudes e inclinaciones correctas, pero no donde estaban en ningún día concreto, de modo que el conjunto visible, el DOP (dilución de la precisión) y cualquier disponibilidad calculada a partir de ellos describen una constelación que nunca existió. Nada en el analizador mide por usted esta dispersión, y los tipos de escenario orbit e integrity no alinean épocas: un bloque TLE de un escenario se propaga siempre con la época de cada satélite.
Haga esto en su lugar. Conserve la época junto al propagador, elija un instante de referencia único y desplace a él el tsince de cada satélite. Tle::epoch_days_1950 es público, de modo que el bucle de análisis es corto; tests/igs_real_data.rs (real_gps_tle_snapshot) es el ejemplo resuelto de este árbol:
use kshana::orbit::Propagator;
use kshana::sgp4::wgs72;
use kshana::tle::parse_tle;
/// TEME position (m) of one satellite at `t` seconds after the common reference
/// instant `t_ref_jd` (a Julian date), not after its own TLE epoch.
fn aligned_teme_m(line1: &str, line2: &str, t_ref_jd: f64, t: f64) -> Result<[f64; 3], String> {
let tle = parse_tle(line1, line2)?;
let jd_epoch = 2_433_281.5 + tle.epoch_days_1950;
let prop = Propagator::Sgp4(Box::new(tle.to_sgp4(wgs72(), false)));
let tsince_s = (t_ref_jd - jd_epoch) * 86_400.0 + t;
Ok(prop.position_eci(tsince_s))
}
TEME es el marco de ecuador verdadero y equinoccio medio en el que trabaja SGP4; tests/igs_real_data.rs lo rota a coordenadas fijas a la Tierra con teme_to_ecef.
Si no alinea las épocas, dígalo al informar de la cifra: es una afirmación sobre capas orbitales, no sobre un cielo real.
Cuánto importa esto se mide en tests/araim_dual_real_data.rs, que aplica los mismos desplazamientos (instante de referencia: la última época de los datos de prueba combinados de GPS + Galileo, 2026-06-07T07:21:04 UTC (Tiempo Universal Coordinado)) a una ejecución de disponibilidad de ARAIM (monitorización autónoma avanzada de la integridad en el receptor) de doble constelación de 24 h. Con un VAL (límite de alerta vertical) de 12 m, el cielo alineado da 0,993 solo con GPS, 1,000 con GPS+Galileo combinados y 0,990 con doble constelación robusta ante fallos de constelación; la convención no alineada de época por satélite da 0,208, 0,671 y 0,031 para las mismas entradas: una conclusión distinta, no un error pequeño.
Véase también#
README.md: los escenarios de órbita.SCENARIOS.md: los campos del tipo de escenarioorbit; los tipos de escenariointegrity,gnss-sim,jammingyconstellation-designtoman la misma tablaconstellation, yephemeristoma un únicotle.INTEGRITY.md: el motor ARAIM que ejecuta la prueba de cielo real.src/tle.rs: el analizador (parse_propagators,ParseOpts { strict_checksum }).