Maskinoversættelse, ikke gennemgået af en modersmålstalende. Engelsk er referencen.

Kom i gangRedigér på GitHubKilde: docs/tutorials/01-first-orbit.md

Tutorial 1 — Min første bane: hvor er GPS-satellitterne

Kind: orbit · Scenarie: scenarios/orbit-sgp4-gps.toml (undervisningskopi: scenarios/orbit.toml) · Sværhedsgrad: begynder · ~15 min

Til sidst har du propageret den virkelige operationelle GPS-konstellation, aflæst dens tilgængelighed og geometri og eksporteret en tabel over, hvor hver satellit faktisk befinder sig i rummet — og du ved, at tabellen er valideret mod en ekstern reference, ikke mod sig selv.

Hvad dette scenarie er#

GPS-satellitter (Global Positioning System) fortæller en bruger, hvor den er, og hvad klokken er. Før noget af det skal du vide, hvor satellitterne er, og hvor mange af dem en bruger kan se. Det er geometri, og geometrien sætter et gulv for, hvor nøjagtigt du kan positionsbestemmes (præcisionsfortyndingen, dilution of precision eller DOP). Denne tutorial:

  1. tager et ægte Celestrak-udtræk af gps-ops for GPS-konstellationen (2021-07-28, 30 satellitter, rigtige two-line elements, TLE'er),
  2. propagerer hver satellit med den validerede SGP4/SDP4-model (Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4),
  3. finder ved hvert tidstrin ud af, hvilke satellitter en bruger i lav jordbane kan se (sigtelinje, jordens afskærmning og en elevationsmaske på 5°),
  4. omsætter geometrien til en PDOP (position dilution of precision) og en positionsnøjagtighed, og
  5. eksporterer satellitternes faktiske jordcentrerede, jordfaste (ECEF) positioner til en SP3-fil (Standard Product 3, det præcise baneformat fra International GNSS Service, IGS; GNSS er Global Navigation Satellite System).

Rygraden er: TLE → SGP4-propagering → ECEF pr. epoke → synlighed → antal synlige satellitter → PDOP → positions-sigma = PDOP · σ_UERE, hvor σ_UERE er brugerens ækvivalente afstandsfejl (user equivalent range error, 1-σ-afstandsfejlen pr. satellit).

Kør den#

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"])

Eller åbn Studio i browseren og vælg bane-scenariet.

Læs opsummeringen på én linje#

Den deterministiske kørsel (seed = 17) udskriver:

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)

Felt for felt:

  • scenario 4c51512369a6 — scenariets hash på 12 tegn. Den er et fingeraftryk af de præcise inputs (seed, tærskler, modelparametre, TLE-blokken). Ændrer du et input, ændres den; holder du dem ens, gengiver du kørslen bit for bit. Den samme hash er stemplet i diagrammets fod og i resultatfilen i JSON (JavaScript Object Notation).
  • 345/361 samples GNSS-nominal — af de 361 tidstrin har brugeren en brugbar positionsbestemmelse i 345 af dem (95,6 %). Kørslen er et gennemløb på 12 t (43.200 s) med et trin på 120 s.
  • best PDOP 1.07 — den bedste (laveste) præcisionsfortynding for position over gennemløbet. En PDOP nær 1 er fremragende geometri; jo lavere, desto bedre.
  • pos 1.07m — den bedste positionsnøjagtighed: positions-sigma = PDOP · σ_UERE. I dette scenarie er sigma_uere_m = 1.0, så de to tal er her numerisk lige store — men reglen er PDOP × UERE, ikke “position = PDOP.” Med en UERE på 3 m ville positions-sigma være ca. 3,2 m. (Se faldgruben til sidst.)
  • Urtallene (holdover, p95, integrity, security) følger med, fordi bane-pakken også lader et ur køre gennem gennemløbet; de er omdrejningspunktet i Tutorial 2, ikke i denne. (security viser n/a (no attack), fordi der ikke er konfigureret noget angreb.)

Geometriblokken i JSON indeholder de underliggende tal:

"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
}

Hvor er satellitterne? (udbyttet)#

Geometrien er god, fordi satellitterne virkelig befinder sig i GPS-skallen. Bevis det — eksportér deres jordfaste positioner:

cargo run -- scenarios/orbit-sgp4-gps.toml --export-sp3 gps.sp3

De første tre satellitter ved det første sampletrin, ECEF i km (SP3-filen har en fjerde kolonne til ur, skrevet som markøren “ingen værdi” 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

Tag PG01's geocentriske radius:

|r(PG01)| = sqrt(9771.575585^2 + 24612.128830^2 + 0.003744^2) = 26480.9 km

Den ikke-cirkulære uafhængige reference: er det virkelig en GPS-bane?#

En tutorial, der kontrollerer motoren mod sig selv, beviser ingenting. Her er det eksterne, ikke-cirkulære ankerpunkt for hver påstand ovenfor.

1. Satellitterne ligger på den virkelige GPS-skal i mellemhøj jordbane (MEO). GPS's nominelle halve storakse er a = 26.560 km, højde ≈ 20.180 km over jordens middelradius på 6.378 km (IS-GPS-200, GPS-grænsefladespecifikationen; GPS Standard Positioning Service (SPS) Performance Standard, US Department of Defense (DoD); Misra & Enge, Global Positioning System, 2. udg.). PG01's øjeblikkelige radius på 26.480,9 km ligger få hundrede km fra a — præcis hvad en virkelig GPS-excentricitet (~0,005–0,02) giver. Testen tests/tutorials.rs::tutorial1_satellites_are_in_the_gps_meo_shell hævder 26000 km < |r(PG01)| < 27200 km mod dette offentliggjorte a, som er eksternt i forhold til Kshana.

2. Gennemløbets længde er ét GPS-omløb. Keplers tredje lov giver perioden T = 2π√(a³/μ) med a = 26,560 km og μ = 398,600.4418 km³/s² (World Geodetic System 1984, WGS-84; teknisk rapport NIMA TR8350.2 fra National Imagery and Mapping Agency): T = 43,078 s = 11.967 h, et halvt stjernedøgn. Scenariets varighed på 43.200 s (“~ét GPS-omløb”) stemmer med det inden for 0,3 %, og GPS-sporet på jorden gentages hvert stjernedøgn (to omløb), ifølge IS-GPS-200.

3. De propagerede positioner er validerede, ikke blot selvkonsistente. SGP4/SDP4-propagatoren, der frembragte denne ECEF-tabel, stemmer med alle 666 verifikationsvektorer i AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 med en værste afvigelse på 4,12 mm (tests/sgp4_verification.rs, docs/SGP4-VALIDATION.md) og stemmer med den uafhængige sgp4-crate på under en mikrometer. Tabellen, du eksporterede, er altså kontrolleret mod en ekstern referenceimplementering, ikke mod Kshanas egen regning.

En note om datoerne i SP3. SP3-epokens header viser en pladsholderdato (2000-01-01); propageringen kører i virkeligheden fra hver TLE's egen epoke (2021). Læs tabellen som “ECEF-positioner ved det første sampletrin”, ikke “den 1. jan 2000.”

Hvad testen fastlåser#

tests/tutorials.rs gør hvert tal ovenfor til en CI-kontrakt:

  • tutorial1_orbit_headline_holds — best_pdop ≈ 1.071, best_position_sigma_m == best_pdop (fordi sigma_uere_m = 1.0), samples_total == 361, og opsummeringen indeholder 345/361.
  • tutorial1_satellites_are_in_the_gps_meo_shell — PG01's radius ligger i GPS-skallens bånd, kontrolleret mod det offentliggjorte a = 26,560 km.

Hvis motoren nogensinde holder op med at frembringe en rigtig GPS-skal, bliver buildet rødt.

Faldgruber og enheder#

  • Positions-sigma er PDOP × UERE, ikke PDOP. De to er kun lige store, fordi sigma_uere_m = 1.0 her. Ændr UERE, og de skilles.
  • Tidsangivelserne er i nanosekunder, positionstallet i meter. Bland dem ikke sammen.
  • holdover_s er kvantiseret til tidsgitteret (en nedre grænse ved tidsgitterets trin). I dette gennemløb har brugeren stort set altid en positionsbestemmelse, så holdover er 0 s (intet udfald at holde igennem) — det er det gode tilfælde.

Hvad så#

  • Skærp eller udvid elevationsmasken (mask_deg) og se tilgængeligheden ændre sig — det er en øvelse på niveau 2.
  • Skift til et nyt TLE-udtræk med scripts/fetch_tles.sh (niveau 2, “brug friske data”).
  • Gå videre til Tutorial 2 — Ur-holdover, hvor GNSS-signalet bliver taget væk, og uret om bord må holde sig selv i gang.