Machinevertaling, niet beoordeeld door een moedertaalspreker. Engels is de referentie.

Aan de slagBewerken op GitHubBron: docs/tutorials/01-first-orbit.md

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:

  1. neemt een echte momentopname van de GPS-constellatie uit Celestrak gps-ops (2021-07-28, 30 satellieten, echte two-line elements, TLE's),
  2. propageert elke satelliet met het getoetste SGP4/SDP4-model (Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4),
  3. 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°),
  4. zet die geometrie om in een PDOP (position dilution of precision) en een positienauwkeurigheid, en
  5. 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 geldt sigma_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. (security geeft n/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 (omdat sigma_uere_m = 1.0), samples_total == 361, en de samenvatting bevat 345/361.
  • tutorial1_satellites_are_in_the_gps_meo_shell — de straal van PG01 ligt in de band van de GPS-schil, gecontroleerd aan de gepubliceerde a = 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.0 geldt. Verander de UERE en ze gaan uiteen.
  • De tijdsynchronisatiecijfers zijn in nanoseconden, het positiecijfer in meters. Haal ze niet door elkaar.
  • holdover_s is 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.