Tutorial 1 — Mi primera órbita: dónde están los satélites GPS
Kind: orbit · Escenario: scenarios/orbit-sgp4-gps.toml (copia didáctica: scenarios/orbit.toml) · Dificultad: principiante · ~15 min
Al terminar habrá propagado la constelación GPS operativa real, habrá leído su disponibilidad y geometría, y habrá exportado una tabla de dónde está realmente cada satélite en el espacio; y sabrá que esa tabla está validada frente a una referencia externa, no frente a sí misma.
Qué es este escenario#
Los satélites GPS (Sistema de Posicionamiento Global) indican a un usuario dónde está y qué hora es. Antes de nada de eso, hay que saber dónde están los satélites y cuántos de ellos puede ver un usuario. Eso es geometría, y la geometría fija el límite inferior de la exactitud con la que se puede posicionar (la dilución de la precisión, o DOP). Este tutorial:
- toma una instantánea genuina
gps-opsde Celestrak de la constelación GPS (2021-07-28, 30 satélites, elementos de dos líneas reales, TLE), - propaga cada satélite con el modelo validado SGP4/SDP4 (Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4),
- en cada paso de tiempo calcula qué satélites puede ver un usuario en órbita terrestre baja (línea de visión, ocultación por la Tierra y una máscara de elevación de 5°),
- convierte esa geometría en un PDOP (dilución de la precisión de la posición) y una exactitud de posición, y
- exporta las posiciones reales de los satélites, centradas en la Tierra y fijas a ella (ECEF), a un archivo SP3 (Standard Product 3, el formato de órbita precisa del Servicio Internacional de GNSS, IGS; GNSS es el Sistema Global de Navegación por Satélite).
La columna vertebral es: TLE → propagación SGP4 → ECEF por época → visibilidad → número de satélites visibles → PDOP → sigma de posición = PDOP · σ_UERE, donde σ_UERE es el error equivalente de distancia del usuario (el error de medición de distancia de 1-σ por satélite).
Ejecútelo#
cargo run -- scenarios/orbit-sgp4-gps.toml
Python:
import json, kshana
result = json.loads(kshana.run(open("scenarios/orbit-sgp4-gps.toml").read()))
print(result["geometry"]["best_pdop"], result["geometry"]["best_position_sigma_m"])
O abra el Studio en el navegador y elija el escenario de órbita.
Lea el resumen de una línea#
La ejecución determinista (semilla = 17) imprime:
scenario 4c51512369a6 | 345/361 samples GNSS-nominal | best PDOP 1.07 pos 1.07m | quantum holdover 0s p95 2.59e-5ns integrity 1.000 security n/a (no attack) | classical holdover 0s p95 6.7ns integrity 1.000 security n/a (no attack)
Campo por campo:
scenario 4c51512369a6: el hash del escenario, de 12 caracteres. Es la huella de las entradas exactas (semilla, umbrales, parámetros del modelo, el bloque TLE). Si cambia cualquier entrada, esto cambia; si las mantiene iguales, reproduce la ejecución bit a bit. El mismo hash se estampa en el pie del gráfico y en el archivo JSON (JavaScript Object Notation) de resultados.345/361 samples GNSS-nominal: de los 361 pasos de tiempo, el usuario tiene una posición utilizable en 345 de ellos (95,6 %). La ejecución es un paso de 12 h (43.200 s) con un paso de 120 s.best PDOP 1.07: la mejor (menor) dilución de la precisión de la posición a lo largo del paso. Un PDOP cercano a 1 es una geometría excelente; cuanto menor, mejor.pos 1.07m: la mejor exactitud de posición: sigma de posición = PDOP · σ_UERE. En este escenariosigma_uere_m = 1.0, de modo que los dos números son numéricamente iguales aquí, pero la regla es PDOP × UERE, no “posición = PDOP”. Con un UERE de 3 m, el sigma de posición sería de ~3,2 m. (Véase el error frecuente al final.)- Las cifras del reloj (
holdover,p95,integrity,security) aparecen porque el paquete de órbita también lleva un reloj a lo largo del paso; son el centro del Tutorial 2, no de este. (securityindican/a (no attack)porque no se configura ningún ataque.)
El bloque de geometría del JSON contiene los números subyacentes:
"geometry": {
"samples_total": 361,
"samples_with_fix": 345,
"sigma_uere_m": 1.0,
"best_pdop": 1.0713624151805556,
"median_pdop": 2.318376881311817,
"best_position_sigma_m": 1.0713624151805556,
"median_position_sigma_m": 2.318376881311817
}
¿Dónde están los satélites? (la recompensa)#
La geometría es buena porque los satélites están realmente en la capa GPS. Compruébelo: exporte sus posiciones fijas a la Tierra:
cargo run -- scenarios/orbit-sgp4-gps.toml --export-sp3 gps.sp3
Los tres primeros satélites en el primer paso de muestreo, ECEF en km (el archivo SP3 lleva una cuarta columna, la del reloj, escrita con el marcador de “sin valor” 999999,999999):
PG01 9771.575585 24612.128830 0.003744 999999.999999
PG02 20449.643959 -11875.958365 -12379.457079 999999.999999
PG03 26467.367408 45.510223 4010.411755 999999.999999
Tome el radio geocéntrico de PG01:
|r(PG01)| = sqrt(9771.575585^2 + 24612.128830^2 + 0.003744^2) = 26480.9 km
La referencia independiente no circular: ¿es esto realmente una órbita GPS?#
Un tutorial que comprueba el motor frente a sí mismo no prueba nada. Este es el ancla externa y no circular de cada afirmación anterior.
1. Los satélites están en la capa real de órbita terrestre media (MEO) de GPS. El semieje mayor nominal de GPS es a = 26.560 km, con una altitud ≈ 20.180 km sobre el radio medio de la Tierra de 6.378 km (IS-GPS-200, la especificación de interfaz de GPS; el GPS Standard Positioning Service (SPS) Performance Standard, Departamento de Defensa de EE. UU. (DoD); Misra y Enge, Global Positioning System, 2.ª ed.). El radio instantáneo de PG01, de 26.480,9 km, queda a pocos cientos de km de a, justo lo que produce la excentricidad real de GPS (~0,005–0,02). La prueba tests/tutorials.rs::tutorial1_satellites_are_in_the_gps_meo_shell afirma 26000 km < |r(PG01)| < 27200 km frente a este a publicado, que es externo a Kshana.
2. La duración del paso es una revolución de GPS. La tercera ley de Kepler da el período T = 2π√(a³/μ) con a = 26,560 km y μ = 398,600.4418 km³/s² (Sistema Geodésico Mundial 1984, WGS-84; informe técnico de la National Imagery and Mapping Agency NIMA TR8350.2): T = 43,078 s = 11.967 h, medio día sidéreo. La duración del escenario de 43.200 s (“~una revolución de GPS”) coincide con eso con una diferencia inferior al 0,3 %, y la traza en tierra de GPS se repite cada día sidéreo (dos revoluciones), según IS-GPS-200.
3. Las posiciones propagadas están validadas, no solo son autoconsistentes. El propagador SGP4/SDP4 que produjo esta tabla ECEF coincide con los 666 vectores de verificación de AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 con una diferencia en el peor caso de 4,12 mm (tests/sgp4_verification.rs, docs/SGP4-VALIDATION.md) y coincide con el crate independiente sgp4 a nivel submicrométrico. Así, la tabla que exportó se comprueba frente a una implementación de referencia externa, no frente a la aritmética propia de Kshana.
Una nota sobre las fechas de SP3. La cabecera de época de SP3 muestra una fecha de calendario de relleno (2000-01-01); la propagación se ejecuta en realidad desde la época propia de cada TLE (2021). Lea la tabla como “posiciones ECEF en el primer paso de muestreo”, no “el 1 de enero de 2000”.
Qué fija la prueba#
tests/tutorials.rs convierte cada número anterior en un contrato de CI:
tutorial1_orbit_headline_holds:best_pdop ≈ 1.071,best_position_sigma_m == best_pdop(porquesigma_uere_m = 1.0),samples_total == 361, y el resumen contiene345/361.tutorial1_satellites_are_in_the_gps_meo_shell: el radio de PG01 está en la banda de la capa GPS, comprobado frente ala = 26,560 kmpublicado.
Si el motor deja alguna vez de producir una capa GPS real, la compilación se pone en rojo.
Errores frecuentes y unidades#
- El sigma de posición es PDOP × UERE, no PDOP. Los dos son iguales solo porque
sigma_uere_m = 1.0aquí. Cambie el UERE y se separan. - Las cifras de temporización están en nanosegundos, la cifra de posición en metros. No las mezcle.
holdover_sestá cuantizado por la rejilla (una cota inferior al paso de la rejilla de tiempo). En este paso, el usuario está prácticamente siempre con posición, de modo que el holdover es de 0 s (no hay interrupción que atravesar a la deriva); ese es el caso bueno.
Siguientes pasos#
- Reduzca o amplíe la máscara de elevación (
mask_deg) y observe cómo cambia la disponibilidad: es un ejercicio de nivel 2. - Sustituya por una instantánea de TLE nueva con
scripts/fetch_tles.sh(nivel 2, “usar datos nuevos”). - Pase al Tutorial 2 — Holdover del reloj, donde se retira la señal GNSS y el reloj de a bordo tiene que mantenerse a la deriva.