Maskinöversättning, inte granskad av en modersmålstalare. Engelska är referensen.

Kom igångRedigera på GitHubKälla: docs/tutorials/01-first-orbit.md

Handledning 1 – Min första bana: var finns GPS-satelliterna

Kind: orbit · Scenario: scenarios/orbit-sgp4-gps.toml (undervisningskopia: scenarios/orbit.toml) · Svårighetsgrad: nybörjare · ~15 min

I slutet har du propagerat den verkliga operativa GPS-konstellationen, läst av dess tillgänglighet och geometri och exporterat en tabell över var varje satellit faktiskt befinner sig i rymden – och du vet att tabellen är validerad mot en extern referens, inte mot sig själv.

Vad det här scenariot är#

GPS-satelliter (Global Positioning System) talar om för en användare var den befinner sig och vad klockan är. Innan dess behöver du veta var satelliterna finns och hur många av dem en användare kan se. Det är geometri, och geometrin sätter golvet för hur noggrant du kan positioneras (precisionsförsämringen, dilution of precision, DOP). Den här handledningen:

  1. tar en äkta ögonblicksbild av GPS-konstellationen från Celestrak gps-ops (2021-07-28, 30 satelliter, verkliga tvåradiga elementmängder, TLE),
  2. propagerar varje satellit med den validerade SGP4/SDP4-modellen (Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4),
  3. räknar vid varje tidssteg ut vilka satelliter en användare i låg jordbana kan se (siktlinje, jordens skymning och en elevationsmask på 5°),
  4. omvandlar den geometrin till en PDOP (positionens precisionsförsämring) och en positionsnoggrannhet, och
  5. exporterar satelliternas faktiska jordcentrerade, jordfasta (ECEF) positioner till en SP3-fil (Standard Product 3, det precisa banformatet från International GNSS Service, IGS; GNSS är Global Navigation Satellite System).

Kedjan är: TLE → SGP4-propagering → ECEF per epok → synlighet → antal synliga satelliter → PDOP → positions-sigma = PDOP · σ_UERE, där σ_UERE är användarens ekvivalenta avståndsfel (avståndsfelet på 1 σ per 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 öppna webbläsarens Studio och välj omloppsscenariot.

Läs enradssammanfattningen#

Den deterministiska körningen (frö = 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)

Fält för fält:

  • scenario 4c51512369a6 – scenariots hash på 12 tecken. Den är ett fingeravtryck av exakt de indata som används (frö, trösklar, modellparametrar, TLE-blocket). Ändra en indata så ändras hashen; behåll dem och du återskapar körningen bit för bit. Samma hash är instämplad i diagrammets sidfot och i resultatfilen i JSON (JavaScript Object Notation).
  • 345/361 samples GNSS-nominal – av 361 tidssteg har användaren en användbar positionsbestämning vid 345 av dem (95,6 %). Körningen är ett pass på 12 h (43 200 s) med steget 120 s.
  • best PDOP 1.07 – den bästa (lägsta) positionsprecisionsförsämringen under passet. En PDOP nära 1 är utmärkt geometri; ju lägre desto bättre.
  • pos 1.07m – den bästa positionsnoggrannheten: positions-sigma = PDOP · σ_UERE. I det här scenariot gäller sigma_uere_m = 1.0, så de två talen är här numeriskt lika – men regeln är PDOP × UERE, inte ”position = PDOP”. Med en UERE på 3 m skulle positions-sigma vara ~3,2 m. (Se fallgropen i slutet.)
  • Klockvärdena (holdover, p95, integrity, security) följer med eftersom omloppspaketet också bär en klocka genom passet; de är fokus i handledning 2, inte i den här. (security visar n/a (no attack) eftersom ingen attack är konfigurerad.)

Geometriblocket i JSON innehåller de underliggande talen:

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

Var finns satelliterna? (belöningen)#

Geometrin är bra därför att satelliterna verkligen befinner sig i GPS-skalet. Bevisa det – exportera deras jordfasta positioner:

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

De tre första satelliterna vid det första samplingssteget, ECEF i km (SP3-filen har en fjärde klockkolumn, skriven med markören 999999,999999 för ”inget värde”):

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 PG01:s geocentriska radie:

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

Den icke-cirkulära oberoende referensen: är detta verkligen en GPS-bana?#

En handledning som kontrollerar motorn mot sig själv bevisar ingenting. Här är det externa, icke-cirkulära stödet för varje påstående ovan.

1. Satelliterna ligger i det verkliga GPS-skalet i medelhög jordbana (MEO). GPS nominella halva storaxel är a = 26 560 km, höjd ≈ 20 180 km över jordens medelradie på 6 378 km (IS-GPS-200, gränssnittsspecifikationen för GPS; GPS Standard Positioning Service (SPS) Performance Standard, US Department of Defense (DoD); Misra & Enge, Global Positioning System, 2:a uppl.). PG01:s momentana radie på 26 480,9 km ligger inom några hundra km från a – precis vad verklig GPS-excentricitet (~0,005–0,02) ger. Testet tests/tutorials.rs::tutorial1_satellites_are_in_the_gps_meo_shell kontrollerar 26000 km < |r(PG01)| < 27200 km mot detta publicerade a, som är externt i förhållande till Kshana.

2. Passets längd är ett GPS-varv. Keplers tredje lag ger omloppstiden T = 2π√(a³/μ) med a = 26,560 km och μ = 398,600.4418 km³/s² (World Geodetic System 1984, WGS-84; tekniska rapporten NIMA TR8350.2 från National Imagery and Mapping Agency): T = 43,078 s = 11.967 h, ett halvt siderisk dygn. Scenariots varaktighet på 43 200 s (”ungefär ett GPS-varv”) stämmer med det inom 0,3 %, och GPS markspår upprepas varje siderisk dygn (två varv), enligt IS-GPS-200.

3. De propagerade positionerna är validerade, inte bara självkonsistenta. SGP4/SDP4-propagatorn som tog fram denna ECEF-tabell stämmer med alla 666 verifieringsvektorer i AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 med ett värsta fall på 4,12 mm (tests/sgp4_verification.rs, docs/SGP4-VALIDATION.md) och stämmer med den oberoende sgp4-craten inom en bråkdel av en mikrometer. Tabellen du exporterade är alltså kontrollerad mot en extern referensimplementering, inte mot Kshanas egen aritmetik.

En anmärkning om SP3-datumen. SP3-epokhuvudet visar ett platshållardatum (2000-01-01); propageringen utgår i själva verket från varje TLE:s egen epok (2021). Läs tabellen som ”ECEF-positioner vid det första samplingssteget”, inte ”den 1 jan 2000”.

Vad testet fastställer#

tests/tutorials.rs gör varje tal ovan till ett CI-kontrakt:

  • tutorial1_orbit_headline_holds – best_pdop ≈ 1.071, best_position_sigma_m == best_pdop (eftersom sigma_uere_m = 1.0), samples_total == 361, och sammanfattningen innehåller 345/361.
  • tutorial1_satellites_are_in_the_gps_meo_shell – PG01:s radie ligger i GPS-skalets band, kontrollerat mot det publicerade a = 26,560 km.

Om motorn någonsin slutar producera ett verkligt GPS-skal blir bygget rött.

Fallgropar och enheter#

  • Positions-sigma är PDOP × UERE, inte PDOP. De är lika bara därför att sigma_uere_m = 1.0 här. Ändra UERE så skiljer de sig åt.
  • Tidssynkroniseringsvärdena anges i nanosekunder, positionsvärdet i meter. Blanda inte ihop dem.
  • holdover_s är kvantiserat till rutnätet (en nedre gräns vid tidsrutnätets steg). I det här passet har användaren i princip alltid positionsbestämning, så holdover är 0 s (inget avbrott att ta sig igenom) – det är det goda fallet.

Vad händer härnäst#

  • Skärp eller vidga elevationsmasken (mask_deg) och se hur tillgängligheten ändras – det är en övning på nivå 2.
  • Byt in en färsk TLE-ögonblicksbild med scripts/fetch_tles.sh (nivå 2, ”använd färska data”).
  • Gå vidare till handledning 2 – Klock-holdover, där GNSS-signalen tas bort och den inbyggda klockan måste klara sig själv.