Maskinoversettelse, ikke gjennomgått av en morsmålsbruker. Engelsk er referansen.

Kom i gangRediger på GitHubKilde: docs/tutorials/01-first-orbit.md

Veiledning 1 — Min første bane: hvor er GPS-satellittene

Kind: orbit · Scenario: scenarios/orbit-sgp4-gps.toml (undervisningskopi: scenarios/orbit.toml) · Vanskelighetsgrad: nybegynner · ~15 min

Til slutt har du propagert den virkelige operative GPS-konstellasjonen, lest tilgjengeligheten og geometrien og eksportert en tabell over hvor hver satellitt faktisk er i rommet — og du vet at tabellen er validert mot en ekstern referanse, ikke mot seg selv.

Hva dette scenarioet er#

GPS-satellitter (Global Positioning System) forteller en bruker hvor den er og hva klokken er. Før noe av det trenger du å vite hvor satellittene er og hvor mange av dem en bruker kan se. Det er geometri, og geometrien setter gulvet for hvor nøyaktig du kan posisjoneres (presisjonsfortynningen, eller DOP). Denne veiledningen:

  1. tar et ekte Celestrak-øyeblikksbilde gps-ops av GPS-konstellasjonen (2021-07-28, 30 satellitter, ekte two-line elements, TLE-er),
  2. propagerer hver satellitt med den validerte SGP4/SDP4-modellen (Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4),
  3. regner ut ved hvert tidssteg hvilke satellitter en bruker i lav jordbane kan se (siktlinje, jordokkultasjon og en elevasjonsmaske på 5°),
  4. gjør geometrien om til en PDOP (presisjonsfortynning for posisjon) og en posisjonsnøyaktighet, og
  5. eksporterer satellittenes faktiske jordsentrerte, jordfaste (ECEF) posisjoner til en SP3-fil (Standard Product 3, det presise baneformatet til International GNSS Service, IGS; GNSS er Global Navigation Satellite System).

Ryggraden er: TLE → SGP4-propagering → ECEF per epoke → synlighet → antall synlige satellitter → PDOP → posisjons-sigma = PDOP · σ_UERE, der σ_UERE er brukerens tilsvarende avstandsfeil (1-σ-avstandsfeilen per satellitt).

Kjø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 åpne Studio i nettleseren og velg bane-scenarioet.

Les oppsummeringen på én linje#

Den deterministiske kjøringen (seed = 17) skriver ut:

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 — scenariohashen på 12 tegn. Den er et fingeravtrykk av de nøyaktige inndataene (seed, terskler, modellparametere, TLE-blokken). Endrer du en inndata, endres den; holder du dem like, gjengir du kjøringen bit for bit. Den samme hashen stemples i diagrammets bunntekst og i resultatfilen i JSON (JavaScript Object Notation).
  • 345/361 samples GNSS-nominal — av de 361 tidsstegene har brukeren en brukbar posisjonsbestemmelse i 345 av dem (95,6 %). Kjøringen er en passering på 12 h (43 200 s) med et steg på 120 s.
  • best PDOP 1.07 — den beste (laveste) presisjonsfortynningen for posisjon over passeringen. PDOP nær 1 er utmerket geometri; jo lavere, desto bedre.
  • pos 1.07m — den beste posisjonsnøyaktigheten: posisjons-sigma = PDOP · σ_UERE. I dette scenarioet er sigma_uere_m = 1.0, så de to tallene er numerisk like her — men regelen er PDOP × UERE, ikke «posisjon = PDOP». Med en UERE på 3 m ville posisjons-sigma vært ~3,2 m. (Se fallgruven på slutten.)
  • Klokketallene (holdover, p95, integrity, security) følger med fordi baneskjemaet også har en klokke gjennom passeringen; de er hovedsaken i veiledning 2, ikke i denne. (security viser n/a (no attack) fordi ingen angrep er satt opp.)

Geometriblokken i JSON-en har de underliggende tallene:

"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 satellittene? (gevinsten)#

Geometrien er god fordi satellittene virkelig ligger i GPS-skallet. Bevis det — eksporter de jordfaste posisjonene deres:

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

De tre første satellittene ved første samplingssteg, ECEF i km (SP3-filen har en fjerde kolonne, klokken, skrevet som «ingen verdi»-markøren 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

Ta PG01s geosentriske radius:

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

Den ikke-sirkulære referansen: er dette virkelig en GPS-bane?#

En veiledning som kontrollerer motoren mot seg selv, beviser ingenting. Her er det eksterne, ikke-sirkulære ankeret for hver påstand ovenfor.

1. Satellittene ligger på det virkelige GPS-skallet i middels høy jordbane (MEO). GPS-ens nominelle store halvakse er a = 26 560 km, høyde ≈ 20 180 km over jordens middelradius på 6 378 km (IS-GPS-200, GPS-grensesnittspesifikasjonen; GPS Standard Positioning Service (SPS) Performance Standard, det amerikanske forsvarsdepartementet (DoD); Misra & Enge, Global Positioning System, 2. utg.). PG01s øyeblikkelige radius på 26 480,9 km ligger noen hundre km fra a — nøyaktig det virkelig GPS-eksentrisitet (~0,005–0,02) gir. Testen tests/tutorials.rs::tutorial1_satellites_are_in_the_gps_meo_shell krever 26000 km < |r(PG01)| < 27200 km mot dette publiserte a, som er eksternt for Kshana.

2. Passeringens lengde er én GPS-omdreining. Keplers tredje lov gir 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 siderisk døgn. Scenariets varighet på 43 200 s («~én GPS-omdreining») stemmer med det innenfor 0,3 %, og GPS-ens sporing på bakken gjentas hvert siderisk døgn (to omdreininger), ifølge IS-GPS-200.

3. De propagerte posisjonene er validert, ikke bare selvkonsistente. SGP4/SDP4-propagatoren som lagde denne ECEF-tabellen stemmer med alle 666 verifikasjonsvektorene i AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 med et verste tilfelle på 4,12 mm (tests/sgp4_verification.rs, docs/SGP4-VALIDATION.md) og stemmer med den uavhengige craten sgp4 til under en mikrometer. Så tabellen du eksporterte, er kontrollert mot en ekstern referanseimplementasjon, ikke mot Kshanas egen aritmetikk.

En merknad om SP3-datoene. SP3-epokehodet viser en plassholder for kalenderdato (2000-01-01); propageringen går faktisk fra hver TLEs egen epoke (2021). Les tabellen som «ECEF-posisjoner ved første samplingssteg», ikke «den 1. januar 2000».

Hva testen fester#

tests/tutorials.rs gjør hvert tall 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 oppsummeringen inneholder 345/361.
  • tutorial1_satellites_are_in_the_gps_meo_shell — PG01s radius ligger i GPS-skallets bånd, kontrollert mot det publiserte a = 26,560 km.

Hvis motoren noen gang slutter å lage et virkelig GPS-skall, blir bygget rødt.

Fallgruver og enheter#

  • Posisjons-sigma er PDOP × UERE, ikke PDOP. De to er like bare fordi sigma_uere_m = 1.0 her. Endre UERE, og de skilles.
  • Tidstallene er i nanosekunder, posisjonstallet i meter. Ikke bland dem.
  • holdover_s er kvantisert til rutenettet (en nedre grense ved tidsrutenettets steg). I denne passeringen har brukeren i praksis alltid posisjonsbestemmelse, så holdover er 0 s (intet utfall å seile gjennom) — det er det gode tilfellet.

Veien videre#

  • Stram inn eller utvid elevasjonsmasken (mask_deg) og se tilgjengeligheten endre seg — det er en øvelse på nivå 2.
  • Bytt inn et ferskt TLE-øyeblikksbilde med scripts/fetch_tles.sh (nivå 2, «bruk ferske data»).
  • Gå videre til veiledning 2 — Klokkens holdover, der GNSS-signalet tas bort og klokken om bord må seile på egen kraft.