Tutorial 1 — Mijn eerste baan: waar zijn de GPS-satellieten
Kind: orbit · Scenario: scenarios/orbit-sgp4-gps.toml (leerversie: scenarios/orbit.toml) · Moeilijkheid: beginner · ~15 min
Aan het einde hebt u de echte operationele GPS-constellatie gepropageerd, de beschikbaarheid en geometrie ervan gelezen en een tabel geëxporteerd met waar elke satelliet werkelijk in de ruimte is — en u weet dat die tabel is getoetst aan een externe referentie en niet aan zichzelf.
Wat dit scenario is#
GPS-satellieten (Global Positioning System) vertellen een gebruiker waar hij is en hoe laat het is. Daarvoor moet u eerst weten waar de satellieten zijn en hoeveel ervan een gebruiker kan zien. Dat is geometrie, en geometrie bepaalt de ondergrens voor hoe nauwkeurig u gepositioneerd kunt worden (de dilution of precision, DOP). Deze tutorial:
- neemt een echte momentopname van de GPS-constellatie uit Celestrak
gps-ops(2021-07-28, 30 satellieten, echte two-line elements, TLE's), - propageert elke satelliet met het getoetste SGP4/SDP4-model (Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4),
- bepaalt bij elke tijdstap welke satellieten een gebruiker in een lage baan om de aarde kan zien (zichtlijn, bedekking door de aarde en een elevatiemasker van 5°),
- zet die geometrie om in een PDOP (position dilution of precision) en een positienauwkeurigheid, en
- exporteert de werkelijke aardgebonden (Earth-centred, Earth-fixed, ECEF) posities van de satellieten naar een SP3-bestand (Standard Product 3, het formaat voor nauwkeurige banen van de International GNSS Service, IGS; GNSS is Global Navigation Satellite System).
De ruggengraat is: TLE → SGP4-propagatie → ECEF per epoch → zichtbaarheid → aantal zichtbare satellieten → PDOP → positie-sigma = PDOP · σ_UERE, waarbij σ_UERE de user equivalent range error is (de 1-σ-afstandsfout per satelliet).
Uitvoeren#
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"])
Of open de Studio in de browser en kies het baanscenario.
Lees de samenvatting van één regel#
De deterministische run (seed = 17) drukt af:
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)
Veld voor veld:
scenario 4c51512369a6— de scenariohash van 12 tekens. Hij is een vingerafdruk van de exacte invoer (seed, drempels, modelparameters, het TLE-blok). Verander een invoer en dit verandert; houd ze gelijk en u reproduceert de run bit voor bit. Dezelfde hash staat in de voettekst van de grafiek en in het resultaatbestand in JSON (JavaScript Object Notation).345/361 samples GNSS-nominal— van de 361 tijdstappen heeft de gebruiker bij 345 ervan een bruikbare positiebepaling (95,6 %). De run is een passage van 12 h (43.200 s) met een stap van 120 s.best PDOP 1.07— de beste (laagste) position dilution of precision over de passage. PDOP dicht bij 1 is uitstekende geometrie; hoe lager, hoe beter.pos 1.07m— de beste positienauwkeurigheid: positie-sigma = PDOP · σ_UERE. In dit scenario geldtsigma_uere_m = 1.0, dus de twee getallen zijn hier numeriek gelijk — maar de regel is PDOP × UERE, niet “positie = PDOP.” Met een UERE van 3 m zou het positie-sigma ~3,2 m zijn. (Zie de valkuil aan het einde.)- De klokcijfers (
holdover,p95,integrity,security) komen er bij omdat het baanpakket ook een klok meeneemt door de passage; ze staan centraal in Tutorial 2, niet in deze. (securitygeeftn/a (no attack)omdat er geen aanval is geconfigureerd.)
Het geometrieblok in de JSON bevat de onderliggende getallen:
"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
}
Waar zijn de satellieten? (de uitkomst)#
De geometrie is goed omdat de satellieten werkelijk in de GPS-schil zitten. Bewijs het — exporteer hun aardgebonden posities:
cargo run -- scenarios/orbit-sgp4-gps.toml --export-sp3 gps.sp3
De eerste drie satellieten bij de eerste samplestap, ECEF in km (het SP3-bestand heeft een vierde kolom, voor de klok, geschreven als de markering “geen waarde” 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
Neem de geocentrische straal van PG01:
|r(PG01)| = sqrt(9771.575585^2 + 24612.128830^2 + 0.003744^2) = 26480.9 km
De niet-circulaire onafhankelijke referentie: is dit echt een GPS-baan?#
Een tutorial die de engine tegen zichzelf controleert, bewijst niets. Hier is het externe, niet-circulaire anker voor elke bewering hierboven.
1. De satellieten zitten op de echte GPS-schil in de middelhoge baan om de aarde (medium Earth orbit, MEO). De nominale halve lange as van GPS is a = 26.560 km, hoogte ≈ 20.180 km boven de gemiddelde aardstraal van 6.378 km (IS-GPS-200, de GPS-interfacespecificatie; de GPS Standard Positioning Service (SPS) Performance Standard, Amerikaanse ministerie van Defensie (DoD); Misra & Enge, Global Positioning System, 2e druk). De momentane straal van PG01 van 26.480,9 km ligt op enkele honderden km van a — precies wat de echte excentriciteit van GPS (~0,005–0,02) oplevert. De test tests/tutorials.rs::tutorial1_satellites_are_in_the_gps_meo_shell toetst 26000 km < |r(PG01)| < 27200 km aan deze gepubliceerde a, die extern is aan Kshana.
2. De passagelengte is één GPS-omloop. De derde wet van Kepler geeft de periode T = 2π√(a³/μ) met a = 26,560 km en μ = 398,600.4418 km³/s² (World Geodetic System 1984, WGS-84; technisch rapport NIMA TR8350.2 van de National Imagery and Mapping Agency): T = 43,078 s = 11.967 h, een halve siderische dag. De scenarioduur van 43.200 s (“~één GPS-omloop”) komt daarmee overeen op minder dan 0,3 % na, en het grondspoor van GPS herhaalt zich elke siderische dag (twee omlopen), volgens IS-GPS-200.
3. De gepropageerde posities zijn getoetst aan een externe referentie, niet alleen intern consistent. De SGP4/SDP4-propagator die deze ECEF-tabel produceerde, komt overeen met alle 666 verificatievectoren van AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 met een slechtste geval van 4,12 mm (tests/sgp4_verification.rs, docs/SGP4-VALIDATION.md) en komt tot op sub-micron overeen met de onafhankelijke crate sgp4. De tabel die u hebt geëxporteerd, is dus gecontroleerd aan een externe referentie-implementatie en niet aan de eigen rekenkunde van Kshana.
Een opmerking over de SP3-datums. De SP3-epochkop toont een plaatsvervangende kalenderdatum (2000-01-01); de propagatie loopt in werkelijkheid vanaf de eigen epoch van elke TLE (2021). Lees de tabel als “ECEF-posities bij de eerste samplestap,” niet als “op 1 jan 2000.”
Wat de test vastlegt#
tests/tutorials.rs maakt van elk getal hierboven een CI-contract:
tutorial1_orbit_headline_holds—best_pdop ≈ 1.071,best_position_sigma_m == best_pdop(omdatsigma_uere_m = 1.0),samples_total == 361, en de samenvatting bevat345/361.tutorial1_satellites_are_in_the_gps_meo_shell— de straal van PG01 ligt in de band van de GPS-schil, gecontroleerd aan de gepubliceerdea = 26,560 km.
Als de engine ooit stopt met het produceren van een echte GPS-schil, wordt de build rood.
Valkuilen en eenheden#
- Positie-sigma is PDOP × UERE, niet PDOP. De twee zijn gelijk alleen doordat hier
sigma_uere_m = 1.0geldt. Verander de UERE en ze gaan uiteen. - De tijdsynchronisatiecijfers zijn in nanoseconden, het positiecijfer in meters. Haal ze niet door elkaar.
holdover_sis op het raster gekwantiseerd (een ondergrens bij de stap van het tijdraster). In deze passage heeft de gebruiker vrijwel altijd een positiebepaling, dus de holdover is 0 s (geen uitval om doorheen te lopen) — dat is het goede geval.
Hoe nu verder#
- Scherp het elevatiemasker (
mask_deg) aan of verruim het en zie de beschikbaarheid veranderen — dat is een oefening van Tier-2. - Gebruik een verse TLE-momentopname met
scripts/fetch_tles.sh(Tier-2 “gebruik verse gegevens”). - Ga verder met Tutorial 2 — Klok-holdover, waar het GNSS-signaal wordt weggenomen en de klok aan boord moet doorlopen.