Konekäännös, jota äidinkielinen puhuja ei ole tarkistanut. Viitteenä on englanninkielinen versio.

API:t ja integraatiotMuokkaa GitHubissaLähde: docs/ARCHITECTURE.md

Kshana — Arkkitehtuuri

Kshana on yksi moottori, joka on järjestetty kerroksiin jaetun ytimen päälle: anturipaketit (kello, inertia, ajansiirto, hybridi); astrodynamiikan / numeerinen kerros (analyyttinen SGP4/SDP4 (SGP4: Simplified General Perturbations 4; SDP4: Simplified Deep-space Perturbations 4), numeerinen Cowell-propagaattori seitsemän häiriön voimamalleineen, ratamuutossuunnittelu, radanmääritys maa-asemien etäisyyksistä ja voimamallin sovitus virastojen tarkkoihin efemerideihin); aika- ja koordinaatistokerros (IERS (International Earth Rotation and Reference Systems Service) aika-asteikot, IAU (International Astronomical Union) 2006/2000A prekessio–nutaatio ja CIO (Celestial Intermediate Origin) GCRS↔ITRS (GCRS: Geocentric Celestial Reference System; ITRS: International Terrestrial Reference System) -redukointi); fuusiokerros (GNSS/INS (GNSS: maailmanlaajuinen satelliittinavigointijärjestelmä; INS: inertianavigointijärjestelmä) -estimaattorit); sekä eheys-, kestävyys-, vaihtoehtoisen PNT:n (PNT: paikannus, navigointi ja ajanmääritys) ja Kuun kerrokset (RAIM/ARAIM/SBAS (RAIM: receiver autonomous integrity monitoring; ARAIM: advanced receiver autonomous integrity monitoring; SBAS: satelliittipohjainen täydennysjärjestelmä), häirintä ja monikerroksinen harhautuksen havaitseminen, gravitaatio-, maasto- ja magneettikarttasovitus sekä kuunläheinen PNT); ja uudemmat kerrokset: LEO-PNT (matalan Maan kiertoradan PNT), spektri, aurinkokunta ja tähdistösuunnittelu, verkkoajoitus ja kampanjat, sekä raportti-, animaatio- ja yhteentoimivuuskirjoittimet, joita jokainen ajo voi käyttää (§1d). Kaikissa näissä moottori ei tiedä mitään ”kvantti” vs ”klassinen” -erosta: se ajaa anturien virhemalleja GNSS-katkoskenaarion läpi, ajaa estimaattorin ja pisteyttää lopputuloksen. Kvanttilaite ja klassinen laite vertaillaan siksi samassa skenaariossa, ja ne eroavat vain (julkaistujen, siteerattujen) virheparametriensa ja riippumattomien kohinasiemenlukujensa osalta.

Tämä asiakirja kokoaa rakenteelliset ja käyttäytymiskaaviot. §1 on anturipakettiydin; §1a kartoittaa sen jälkeen lisätyt astrodynamiikan, fuusion ja vaihtoehtoisen PNT:n kerrokset; §1b–§1d tutkimus-, aluekerrokset ja tulostekerrokset. Käyttöä varten katso README; sen, mikä on ja mikä ei ole validoitu, osalta VALIDATION; ominaisuuskohtaiselle kypsyystaulukolle CAPABILITY.

Kaavioissa käytetyt lyhenteet, joita ei ole avattu niiden esiintymiskohdassa: ADEV, Allanin poikkeama; BW, kaistanleveys; CAI, kylmäatomi-interferometri; CZML, Cesium Language; Δ-DOR, delta differential one-way ranging; DO-229E, RTCA (Radio Technical Commission for Aeronautics) SBAS-vastaanotinstandardi; EKF, laajennettu Kalman-suodatin; FM, taajuusmodulaatio; GSE, maatukilaitteisto; HPL/VPL, vaaka-/pystysuojaustaso; IMU, inertiamittausyksikkö; IOAG, Interagency Operations Advisory Group; IQ, vaihe-/kvadratuurinäytteet; ISL, satelliittien välinen linkki; ITU-T, Kansainvälisen televiestintäliiton telealan standardointisektori; J2–J6, Maan zonaaliset gravitaatioharmoniset asteilla 2–6; KIF, Kshana Interchange Format; KML, Keyhole Markup Language; KPI, keskeinen suorituskykymittari; L1/L5, GNSS-kantoaaltokaistat (CR3BP-haloratojen L2 on sen sijaan Maa–Kuu-Lagrangen piste 2); LEO, matala Maan kiertorata; LOO, yksi-pois-menetelmä (leave-one-out); LTC, Kuun koordinoitu aika (Coordinated Lunar Time); MEO, keskikorkea Maan kiertorata; MTIE, suurin aikavälivirhe; N2, kertaluvun 2 Hillin diversiteettiluku; NED, pohjoinen-itä-alas; NTN, ei-maanpäällinen verkko; OD, radanmääritys; OPS-SAT, Euroopan avaruusjärjestön kiertoradalla toimiva ohjelmistolaboratoriosatelliitti; PPP, tarkka pistepaikannus; PSD, tehospektritiheys; PVT, paikka, nopeus ja aika; RINEX, Receiver Independent Exchange Format; RK4 / RK5(4), neljännen asteen ja upotettu viidennen (neljännen) asteen Runge–Kutta-integraattorit; SH, palloharmoninen; SigMF, Signal Metadata Format; SIR, sampling importance resampling; SRIF, neliöjuuri-informaatiosuodatin; SRP, auringon säteilypaine; SSC, spektrierotuskerroin; STK, Systems Tool Kit; SVG, Scalable Vector Graphics; TDEV, aikapoikkeama; TDM, CCSDS (Consultative Committee for Space Data Systems) Tracking Data Message; TLE, kaksirivinen elementtijoukko; TPL, ajoituksen suojaustaso; UBX, u-blox-binääriprotokolla; UHF, ultrakorkeat taajuudet; VLBI, pitkäbaselinjainen interferometria; VRW / ARW, nopeuden / kulman satunnaiskävely; WASM, WebAssembly.


1. Moduulirakenne#

flowchart TD
    main["main.rs<br/>CLI (thin wrapper)"]
    py["python.rs<br/>PyO3 (feature)"]
    wasm["wasm.rs<br/>wasm-bindgen (feature)"]
    api["api.rs<br/>run_toml: parse · dispatch by kind · json+svg+summary"]

    subgraph shared["Shared core"]
      types["types.rs<br/>Seconds · TimeGrid · ModelSpec"]
      scenario["scenario.rs<br/>GnssState · GnssTimeline · ClockCfg · Scenario"]
      allan["allan.rs<br/>overlapping Allan deviation"]
    end

    subgraph pack1["Pack 1 · Clock holdover"]
      models["models.rs<br/>ErrorModel · ClockModel (incl. flicker FM)"]
      estimator["estimator.rs<br/>HoldoverEstimator"]
      kalman["kalman.rs<br/>KalmanClock → Integrity bound"]
      security["security.rs<br/>clock-aided spoof detection → Security"]
      fom["fom.rs<br/>Sample · FoMScores · score · worst_case_holdover"]
      report["report.rs<br/>RunResult · hash · to_svg"]
      run["run.rs<br/>run / run_clock / run_orbit_clock"]
    end

    inertial["inertial/<br/>Pack 2 · AccelModel (accel + gyro + bias instability/RW) · run_inertial · quantum_imu CAI + QuantumNavBudget dead-reckoning-over-holdover"]
    timetransfer["timetransfer.rs<br/>Pack 3 · TimeTransferLink · run_timetransfer"]
    hybrid["hybrid.rs<br/>Pack 4 · run_suite · score_hybrid · run_hybrid (+ integrity/security)"]
    fusion["fusion/<br/>joint Kalman PNT estimator · run_fusion"]
    orbit["orbit.rs<br/>Propagator (Kepler | SGP4) · Walker / TLE / multi-constellation · visibility · DOP"]
    tle["tle.rs<br/>two-line element parsing (line 2 → Kepler, full TLE → SGP4)"]
    sgp4mod["sgp4.rs<br/>SGP4 / SDP4 propagator (deep-space + resonance)"]
    ensemble["ensemble.rs<br/>Monte Carlo confidence bands"]
    sweep["sweep.rs<br/>trade-study parameter sweeps"]
    spoof["spoof.rs<br/>active spoofing-attack demonstrator"]
    jamming["jamming.rs<br/>link-budget anti-jam C/N₀ (J/S · processing gain · Q)"]
    navsignal["navsignal.rs<br/>signal level: BPSK-R / BOC PSD · SSC κ · Gabor BW · DLL jitter · multipath · ranging-code (m-seq/Gold) design-trade"]
    holdover["holdover.rs<br/>GNSS-denied clock holdover: van-Loan coast → holdover-to-threshold · quantum-clock classes"]
    verification["verification.rs<br/>machine-checked requirement→module→test→oracle→status matrix"]

    main --> api
    py --> api
    wasm --> api
    api --> run
    api --> inertial
    api --> timetransfer
    api --> hybrid
    api --> ensemble
    api --> sweep
    api --> fusion
    api --> spoof
    spoof --> security
    api --> jamming
    api --> holdover
    api --> verification
    navsignal -. derives anti-jam Q (κ → Q=1/(R_c·κ)) .-> jamming
    jamming -. uses PSD / SSC .-> navsignal
    holdover -. coast-variance vs van-Loan recursion .-> kalman
    ensemble --> run
    sweep --> run
    orbit --> tle
    tle --> sgp4mod
    orbit -. SGP4 propagator .-> sgp4mod
    fusion -. composes .-> models
    fusion -. composes .-> inertial
    fusion --> kalman

    run --> models
    run --> estimator
    run --> kalman
    run --> security
    run --> fom
    run --> report
    run --> orbit
    models --> types
    scenario --> types
    inertial --> scenario
    timetransfer --> types
    orbit --> scenario
    hybrid -. composes .-> models
    hybrid -. composes .-> estimator
    hybrid -. composes .-> inertial
    hybrid -. composes .-> timetransfer
    pack1 --> shared
    inertial --> allan

CLI (komentoriviliittymä) ja molemmat sidokset kulkevat yhden sisäänkäyntipisteen api::run_toml kautta, joten ne eivät koskaan eriydy. Paketit käyttävät jaettua ydintä uudelleen (types, scenario, allan); paketti 4 (hybrid) yhdistää pakettien 1–3 mallit ja estimaattorit eikä toteuta niitä uudelleen; orbit johtaa GNSS-aikajanan geometriasta, joka syöttää sitten paketin 1 ajon. Moduuli navsignal sijaitsee signaalitasolla linkkibudjetin ja mittausalueen välissä: se johtaa spektrierotuskertoimen κ todellisista signaalin ja häirintälähteen tehospektreistä, ja siitä jamming laskee nyt häirinnänestonsa Q = 1/(R_c·κ) edustavan vakion ottamisen sijaan (ristiintarkistettu CI:ssä (jatkuva integrointi)); se sisältää myös paikannuskoodin (m-sekvenssi/Gold) suunnittelukompromissin.

Kolme muuta moduulia muodostavat GNSS-estoympäristön kestävyyden selkärangan. holdover vastaa operatiiviseen kysymykseen suoraan — kuinka kauan tämä kello voi käydä vapaasti, ennen kuin sen aikavirhe ylittää budjetin? — esittämällä van-Loanin vapaaliikevirheen suljetun muodon holdover-kynnys-inversiona, ristiintarkistettuna monivaiheista kovarianssirekursiota clock_state vastaan. Sen inertiakaksonen sijaitsee moduulissa inertial::quantum_imu (QuantumNavBudget), joka yhdistää kylmäatomi-interferometrin valkoisen kohinan ajautuman harhan ja skaalakerroinvirheen kanssa sijainnin ajautuma-holdover-budjetiksi (harhatermi ristiintarkistettu riippumatonta integraattoria AccelModel vastaan). verification renderöi koko moottorin vaatimus–moduuli–testi–oraakkeli–tila-matriisin, jossa yksikkötestatut invariantit kieltävät validoitu-merkinnän ilman riippumatonta ulkoista oraakkelia — joten varmuusväite ei voi ajautua koodista.

1a. Astrodynamiikan, fuusion ja vaihtoehtoisen PNT:n kerrokset#

Anturipakettiytimen lisäksi kolme alijärjestelmää jakavat saman jaetun ytimen ja syöttävät (tai saavat syötteen) moduulilta orbit. Astrodynamiikan / numeerinen kerros lisää ei-analyyttisen Cowell-propagaattorin analyyttisen SGP4/SDP4-polun rinnalle; fuusiokerros kantaa GNSS/INS-estimaattorit; ja vaihtoehtoisen PNT:n kerros on GPS-estoympäristön (GPS: Global Positioning System) gravitaatiokarttasovitus. Nämä ovat kirjasto-/skenaariokykyjä (katso CAPABILITY, mitkä on kytketty skenaariotyyppiin kind ja mitkä ovat tavoitettavissa Rust-API:na (ohjelmointirajapinta)).

flowchart TD
    subgraph astro["Astrodynamics & numerical"]
      orbit2["orbit · sgp4 · tle · walker<br/>analytic SGP4/SDP4 · Walker design"]
      prop["propagator<br/>Cowell driver (accel_at / accel_rv)"]
      forces["forces<br/>two-body · J2–J6 · EGM2008 d/o-70 · 3rd-body · SRP · drag · Schwarzschild + Lense–Thirring · tides"]
      integ["integrator<br/>RK4 step-doubling · Dormand–Prince RK5(4)"]
      ephem["ephem<br/>low-precision Sun & Moon"]
      man["maneuver<br/>impulsive/finite burns · Izzo Lambert · porkchop"]
      od["orbit_determination<br/>Gauss–Newton batch (batch_ls) · sequential UKF"]
    end
    subgraph fusion["Fusion (GNSS/INS)"]
      ekf["fusion/gnss_ins_ekf · closed_loop · pack<br/>15-state loosely-coupled EKF"]
      tc["fusion/tightly_coupled (8-state)<br/>fusion/tightly_coupled17 (17-state, quantum-CAI)"]
      ukf["fusion/ukf — sigma-point core"]
      coup["fusion/coupled — clock+position cross-covariance"]
    end
    subgraph alt["Alt-PNT (GPS-denied)"]
      grav["gravimeter<br/>cold-atom model + SH anomaly field + mascons"]
      pf["particle_filter — SIR"]
      mm["mapmatch — field-match likelihood"]
    end
    prop --> forces
    prop --> integ
    forces --> ephem
    man --> integ
    od --> forces
    od --> integ
    od --> ukf
    tc --> ukf
    tc -. coasts on .-> forces
    grav --> pf
    mm --> pf
    grav --> mm
    ekf -. drives .-> strap["inertial/ strapdown (quaternion · NED · IMU errors)"]
    tc -. drives .-> strap
    grav -. CAI floor .-> strap

Numeerisen propagaattorin voimatermit ovat oletuksena pois päältä, joten niiden käyttöönotto ei koskaan häiritse julkaistuja golden-tiedostoja. 17-tilainen tiukasti kytketty UKF (unscented Kalman filter) ylittää GNSS-katkon kvantti-CAI-kiihtyvyysmittarin johdetun nopeuden satunnaiskävelyn varassa; radanmääritys käyttää samoja forces/integrator ehdokastilan propagointiin seurantakaaren yli.

Sama jaettu ydin kantaa myös neljää muuta alijärjestelmää, joita ei ole piirretty yllä (niiden paketit esiintyvät kohdan §4 dispatchissa): aika- ja koordinaatistokerros (timescales, jd2, precession, nutation, cio, frames, eop), joka redusoi TEME↔GCRS↔ITRS (TEME: true equator, mean equinox) ja syöttää pakettia ephemeris / maanpintajälki; eheyskerros (raim, sbas) RAIM/ARAIM/SBAS:lle; kestävyyskerros (jamming, spoof, spoof_detect, spoof_monitors, detection) häirinnälle ja monikerroksiselle harhautuksen havaitsemiselle, sekä navigointisignaalikerros (navsignal) signaalitasolla — BPSK-R (BPSK: binary phase-shift keying) / sini-BOC (BOC: binary offset carrier) -tehospektritiheydet, spektrierotuskerroin κ, joka johtaa nyt moduulin jamming häirinnänestosuhteen Q, RMS (Gabor) -paikannuskaistanleveys, koherentti early–late DLL (delay-locked loop) -koodinseurantajitteri ja monitie-virheen verhokäyrä (signaalisuorituskykyanalyysi, ei RF-hyötykuorman (RF: radiotaajuus) / antennilaitteiston suunnittelua — hyötykuormakumppanin rooli); ja Kuun / kuunläheinen kerros (lunar, lunar_frame, lunar_od, cr3bp) CR3BP (circular restricted three-body problem) -dynamiikalle — mukaan lukien 6×6 tilansiirtomatriisi ja yhden ammunnan differentiaalikorjain (cr3bp_jacobian, propagate_state_stm, differential_correct_halo), joka tuottaa aidosti jaksollisia halo-/NRHO (NRHO: near-rectilinear halo orbit) -ratoja, toistaen julkaistun L2-eteläisen 9:2 NRHO:n (Gateway-rata) jaksolla ≈ 6,57 d / perilune ≈ 3 250 km (julkaistu ≈ 6,56 d / ≈ 3 370 km); korjatun radan selenosentrinen MCI/MCMF (MCI: Kuun keskipisteeseen sidottu inertiaali; MCMF: Kuun keskipisteeseen sidottu, Kuuhun kiinnitetty) -muunnos ja perhejatkuminen ovat jatkotöitä, ja NRHO on CR3BP-ratkaisu (ympyrärata, Auringoton), ei validoitu todellista LANS/Gateway (LANS: Lunar Augmented Navigation Service) -efemeridiä vasten — sekä LunaNet-eheys. Virastoefemeridin voimamallisovitus (precise_od, lunar_od, tides, gravity_sh) ja täysi vaihtoehtoisen PNT:n kenttäjoukko (igrf, altpnt/terrain, gravimeter) täydentävät moduulilistan; katso moduulikohtainen kypsyys CAPABILITY.

1b. Kestävyystutkimukset, koneoppimisen arviointi ja toistettavat artefaktit#

Viisi muuta moduuliryhmää muodostavat projektin tutkimusjulkaisujen takana olevan avoimen, toistettavan tutkimuksen kerroksen. Toisin kuin skenaariotyypit (kind), näihin päästään generaattoreina cargo run --example / --bin, jotka kirjoittavat tavu tavulta deterministisiä artefakteja (kiinteät siemenluvut, tallennettu moottorin versio + konfiguraation hash). Kaikki ovat MODELLED (synteettinen tai julkisen aineiston kalibrointi) ja niillä on rehelliset validointimerkinnät — mikään niistä ei ole sertifiointi.

flowchart TD
    gen["study generators<br/>examples/ · bin/ (cargo run) → byte-deterministic artifacts"]

    subgraph timing["Timing integrity"]
      tplm["tpl<br/>conditional Timing Protection Level: k-σ floor · van-Loan coast · CUSUM"]
    end
    subgraph resilm["Resilience scoring & decision-instability"]
      arch["resilience/arch · score<br/>architecture model + RPCF-aligned scoring"]
      stats["resilience/stats<br/>Dirichlet · Kendall-τ · flip-rate · bootstrap"]
      div["resilience/diversity · timeline<br/>Hill-N2 common-mode collapse · KPIs"]
      study["resilience/study · report · panel<br/>instability study + integrity-hashed assurance report"]
    end
    subgraph aiml["RF-impairment optimism-gap (Machine learning)"]
      ie["impairment_eval<br/>labelled synthetic corpus · ROC/AUC harness"]
      is["impairment_study<br/>13-detector panel · scaling laws · LOO predictor"]
      ml["impairment_ml<br/>logistic-regression + one-hidden-layer MLP"]
      es["eval_stats<br/>bootstrap CI · DeLong · Spearman · ridge"]
      sdrm["sdr · realdata<br/>IQ/IF → E/P/L taps → SQM + ingest adapters"]
    end
    subgraph trade["Quantum-vs-classical"]
      cross["crossover<br/>resilience crossover map under parameter uncertainty"]
      qt["quantum_trade<br/>measured-ADEV holdover benefit vs classical"]
    end

    gen --> timing
    gen --> resilm
    gen --> aiml
    gen --> trade
    tplm -. cross-checked vs .-> recursion["holdover · clock_state · allan"]
    is --> ie
    is --> ml
    is --> es
    ie -. real recordings via .-> sdrm
    cross -. composes .-> packs2["clock · inertial packs"]
  • tpl — ehdollinen ajoituksen suojaustaso (TPL): holdover-rajoitettu raja havaitsemattomalle aikavirheelle harhautuksen alla, joka yhdistää k-σ-monitorilattian, van-Loanin vapaaliikevarianssin havaitsemisviiveen yli ja CUSUMin (cumulative sum) hälytysajan; kalibroitu todelliseen tallennettuun harhautukseen (JammerTest 2024). Äärellistä ehdotonta rajaa ei ole — TPL on ehdollinen sille, että riippumaton ristiintarkistus havaitsee hyökkäyksen.
  • resilience/ — kehykseen kohdistettu PNT-kestävyyden pisteytysmoottori (DHS (Department of Homeland Security) RPCF (Resilient PNT Conformance Framework) -kategoriat) sekä päätösepästabiilisuustutkimus: Dirichlet-painotussimpleksi, Kendall-τ-järjestysepästabiilisuus, top-1-voittajan vaihtumistaajuus ja yhteismoodinen diversiteettiromahdus (Hill-N2), eheyshashattu varmuusraportti ja 35 käsin johdettua oraakkelitestiä. Katso RESILIENCE-CROSSWALK. Synteettiset RPCF v2.0:aan kohdistetut arkkitehtuurit — itsearviointi, ei sertifiointi.
  • impairment_eval / impairment_study / impairment_ml / eval_stats — RF-häiriöiden optimismikuilututkimus: nimetty synteettinen korpus ja detektoriagnostinen ROC/AUC (ROC: receiver operating characteristic; AUC: area under the curve) -testikehys, 13 detektorin paneeli (energia/AGC/SQM/pariteetti (AGC: automatic gain control; SQM: signal-quality monitoring) sekä siemenluvulla alustetut logistinen regressio ja yhden piilokerroksen MLP (MLP: multi-layer perceptron) -detektorit), jakaumassa ja jakauman ulkopuolella skaalauslait permutaationollalla sekä leave-one-out-ennustaja jakauman ulkopuolisen heikkenemisen ennustamiseen. Arviointimittarit on validoitu bitti bitiltä scikit-learnia vasten.
  • sdr / realdata — ohjelmistovastaanottimen etupää (raaka IQ/IF (IQ: vaihe/kvadratuuri; IF: välitaajuus) → korrelaattorin early/prompt/late-tapit → SQM) ja sisäänluku-adapterit (RINEX, u-blox UBX, GnssLogger, JammerTest, Yunnan, SatGrid), joiden avulla samat detektorit voivat toimia paikallisesti toimitettujen tallenteiden yli; repositorioon ei ole commitoitu aineistoja.
  • crossover / quantum_trade — kvantti vs klassinen -kestävyyden ristikkäisyyskartta parametrien epävarmuuden alla sekä mitatun ADEV:n holdover-hyötykompromissi; kompromissin numeeriset ytimet on validoitu scipyä vasten.

1c. Eheys-, GNSS-, syväavaruus-, Kuu- ja tehtäväkerrokset#

Loput alueet kytkeytyvät samaan dispatchiin (api) ja käyttävät uudelleen jaettua ydintä, koordinaatistoja ja geometriaa. Kaikki tässä on MODELLED, ellei matriisin (verification) rivi viittaa ulkoiseen oraakkeliin (RAIM-ydin vs SciPy, SBAS vs RTKLIB (avoimen lähdekoodin reaaliaikaisen kinemaattisen paikannuksen kirjasto) -fork, gnss_lib_py DOP (tarkkuuden heikkenemiskerroin) -ydin, OPS-SAT-arviointi, Kuun ARAIM-suojaustasoydin, palveluntarjoajien välinen Kuun efemeridien johdonmukaisuus) — loput Kuun sarjasta ja kvanttidemonstraattori ovat mallinnettuja, havainnollistavia, julkisiin lähteisiin perustuvia, eikä niissä esitetä TRL (technology readiness level) -, perintö- tai virastohyväksyntäväitettä.

flowchart TD
    api["api.rs — run_toml / run_scenario · 92 kinds"]

    subgraph gnss["Integrity & GNSS measurement"]
      raim["raim — RAIM/ARAIM · HPL/VPL (kernel vs SciPy)"]
      sbas["sbas — DO-229E PL · L1/L5 (vs RTKLIB fork)"]
      meas["gnss_sim · ionex · pvt · glonass — pseudorange · iono maps · single-point PVT"]
      imp["integrity_impact · frugal — miss→integrity · cost-per-coverage"]
    end

    subgraph deep["Deep-space & Mars"]
      core2["body · ephem_provider · clock_state — multi-body · ephemeris seam · onboard clock"]
      radio["radiometric · ccsds_tdm — light-time · Doppler/range · Δ-DOR · TDM"]
      mars["deepspace_od · mars_frame · mars_atmos · mars_pnt · linkbudget · gse_sim — SRIF OD · Mars frame · relay-PNT · GSE sim"]
    end

    subgraph lunar["Lunar PNT suite (evidence tier per piece in the matrix · illustrative public-source)"]
      cis["cr3bp · lunar · lunar_frame · lunar_od — CR3BP · halo/NRHO · cislunar ARAIM · MCI↔MCMF"]
      suite["lunar_time · lunar_vlbi · lunar_combination · lunar_frame_realise — LTC time · VLBI · joint OD+clock · frame realisation"]
      suite2["lunar_service · lunar_dpnt · lunar_interop — Moonlight service-volume · differential PNT · LunaNet/IOAG interop"]
    end

    subgraph quantum["Quantum-Enabled PNT demonstrator (MODELLED)"]
      qd["quantum_devices · quantum_faults · quantum_nav_od — device error models · fault catalogue · GNSS-free OD"]
      qt["qtrade · timetransfer_chain · representativeness — unified trade · time-transfer chain · gaps-to-flight ledger"]
    end

    subgraph mission["Mission analysis, environment & interop"]
      ma["launch · reentry · eo_payload · attitude_budget · passes · linkbudget — first-order budgets"]
      env["space_weather — Jacchia-71 density"]
      iop["rinex · rinex_obs · sp3 · oem · omm · ccsds_tdm · space_packet · interchange · permalink — interop formats + KIF"]
      ver["verification — requirement→module→test→oracle→status matrix"]
    end

    api --> gnss & deep & lunar & quantum & mission
    raim -. reuses .-> meas
    suite -. reuses validated DOP / SBAS kernels .-> gnss
    qt -. rides validated kernels (scipy / sklearn) .-> quantum

1d. LEO PNT, spektri, aurinkokunta, verkkoajoitus, kampanjat ja tulosteet#

Uusimmat kerrokset noudattavat samaa mallia: kukin on yksi tai useampi skenaariotyyppi (kind), joka ohjataan moduulin api kautta, rakennettu jaetun ytimen päälle, ja MODELLED, ellei matriisirivi nimeä ulkoista oraakkelia.

flowchart TD
    api["api.rs — run_toml / run_scenario"]

    subgraph leo["LEO PNT (low Earth orbit positioning, navigation and timing)"]
      lsig["leo_signal — signal design: acquisition, code tracking, GNSS compatibility, band trade"]
      lpass["leo_pass · leo_link (geometry · antenna · itu · iono · energy · spoof · presets) — pass and per-band link budget"]
      lnav["leo_navmsg (elements · fit · codec · sisre · services · text) — broadcast ephemeris and clock message"]
      lfus["leo_fusion (doppler · joint_pvt · ppp · ntn · timing · polar · presets) — fused MEO+LEO PVT · PPP · 5G NTN"]
      lchain["leo_pnt_chain — one system end to end, each stage handing its output to the next"]
    end

    subgraph rf["Spectrum"]
      spec["spectrum · navsignal — L-band (and UHF/S/C) PSD waterfall under a jammer timeline"]
      sig["sigmf — SigMF recording read/write · Welch PSD of complex IQ"]
    end

    subgraph sky["Solar system & constellations"]
      ss["solar_system · body · ephem · ephem_provider — bodies, constants, light time at one epoch"]
      bp["body_pnt — positioning around any body with a local constellation"]
      cd["constellation · walker — Walker delta/star, multi-shell, published GNSS slots, coverage/DOP maps"]
    end

    subgraph net["Network timing"]
      tel["telecom_timing — time error, MTIE, TDEV vs ITU-T masks"]
      slot["slot_timing — seconds until a free-running clock leaves a slot guard"]
    end

    subgraph comp["Composition & outputs"]
      camp["campaign · study · suite — chained phases, sweeps, Monte Carlo, shared conditions"]
      rep["advanced_report — report.html + report.json with a reproducibility record"]
      anim["animation — SVG / HTML / frame animations"]
      iop["interop (czml · kml · geojson · stk) · sigmf — exchange files for --export"]
    end

    api --> leo & rf & sky & net & comp
    lchain -. composes .-> lsig & lpass & lnav & lfus
    lsig -. SSC chain .-> spec
    lfus -. GNSS presets .-> cd
    bp -. reuses .-> ss
    camp -. runs other kinds through .-> api

Tyyppikohtaiset yksityiskohdat ovat tiedostoissa LEO-PNT, LEO-SIGNAL, LEO-PASS, LEO-NAVMSG, LEO-PNT-FUSION, SPECTRUM, CONSTELLATION-DESIGN, TELECOM-TIMING, SLOT-TIMING, CAMPAIGNS, REPORTS, ANIMATION ja INTEROP.

1e. Vastaanottimen luottamus-, todiste-, telemetria-, harjoitus- ja compliance-kerrokset (0,35)#

Nämä kerrokset lukevat vastaanottimen oman lokin tai kirjoittavat tiedostoja muille työkaluille; mikään niistä ei syntetisoi eikä lähetä radiotaajuista signaalia. Ne sijaitsevat moduulin api rinnalla eikä skenaariotyyppien alla, lukuun ottamatta tyyppiä receiver-trust itseään, joka on skenaariotyyppi. Kaikki ovat MODELLED, ellei matriisirivi nimeä ulkoista oraakkelia, ja meriliikenteen tulosteet ovat ohjeellisia, eivät tyyppihyväksyttyä navigointilaitetta.

Moduuli Mitä se tekee Dokumentaatio
receiver_trust pisteyttää vastaanottimen lokin epookki epookilta luottamusmonitoreilla; alusalusta lisää merenkulun monitorit ja 0–100-pistemäärän syineen RECEIVER-TRUST, MARITIME-TRUST
receiver_trust::live sama pisteytys virralle sen saapuessa (stdin, liitettävä tiedosto, TCP tai UDP), lause $PKSHT ja valinnainen portti; LiveEngine on sen ydin ilman syötettä tai tulostetta MARITIME-TRUST
evidence allekirjoitettu, hash-ketjutettu paketti lokin ikkunasta, sen konfiguraatiosta ja moottorin tuloksesta, todennettavissa offline-tilassa; valinnainen RFC 3161 -aikaleimatunniste EVIDENCE-PACKS
telemetry luottamusvirta Prometheus-mittareina, syslog-tapahtumina (CEF tai LEEF) ja valinnaisena OpenTelemetry-tietona (ominaisuus otlp, oletuksena pois käytöstä) TRUST-TELEMETRY
nmea_synth synteettinen sillan NMEA 0183 käsikirjoitetuin häirintä-, drag-off-, aikaharhautus- ja toistotapahtumin sekä ohjaajan lokilla, miehistön koulutukseen (vain teksti) NMEA-TRAINING
interference_map koosteiset heikentyneen navigoinnin kartat avoimesti lisensoiduista ilma-alusten ja alusten raporteista sekä reitin altistuminen niille; vain paikalliset tiedostot INTERFERENCE-MAP
osnma vastaanotinpuolen varmennin Galileo OSNMA:lle: lukee I/NAV-sivut (pelkät sivut, vektori-CSV, UBX-virta), tarkistaa allekirjoitetun avaimen, TESLA-ketjun ja MAC-arvot ja ilmoittaa satelliittikohtaisesti, onko navigointidata todennettu; osnma::cli::verify_report on se yksi polku, jonka komentorivi, Python ja WebAssembly jakavat; vain todennuksen tila, ei eheyspalvelu OSNMA
compliance kartoittaa Kshana-tulosteet julkisiin kestävyyden viitekehyksiin ja täyttää kartoituksen tulosasiakirjoista; run_from_text ja assess_texts ottavat vastaan tekstejä, eivät polkuja compliance/
interop::testbench skenaarion ajoneuvon liike ja tapahtumat liike-CSV:nä, NMEA:na, reittipistetekstinä ja tapahtumatiedostoina laboratorion GNSS-simulaattoria varten; signaalia ei kirjoiteta TEST-BENCH

Veneiden integraatiot (Signal K -lisäosa, OpenCPN gate mode ja viiterakennus) kutsuvat komentorivityökalua; katso MARINE-INTEGRATIONS.

2. Moottorin käsittelyketju (ajoa kohden)#

Jokainen ajo askeltaa yhtä anturimallia aikaruudukon läpi: sitä ohjataan aina, kun GNSS on nominaali, ja sen annetaan käydä vapaasti (holdover / dead-reckoning) katkon aikana.

flowchart TD
    A["for each time step t"] --> B{"i &gt; 0 ?"}
    B -- yes --> C["model.step(dt, rng)<br/>evolve noise state"]
    B -- no --> D
    C --> D{"GNSS state at t ?"}
    D -- "Nominal" --> E["discipline to truth<br/>(estimator sync / dead-reckoning reset)<br/>error = 0"]
    D -- "Denied/Degraded" --> F["estimator predicts;<br/>error = truth − prediction"]
    E --> G["record Sample(t, error, gnss)"]
    F --> G
    G --> A
    A -. after loop .-> H["score(series, spec)<br/>→ figures of merit"]
    H --> I["assemble Result<br/>(specs · series · FoM · scenario hash)"]

Skenaario ajaa tämän ketjun kahdesti — kerran kvanttianturille, kerran klassiselle anturille — riippumattomilla siemenluvuilla (classical_seed = seed + 0x9e3779b97f4a7c15), jotta nämä kaksi kohinatoteumaa ovat korreloimattomia.

3. Virhemallirajapinta (laajennuskohta)#

Jokainen anturi toteuttaa saman ajatuksen: tilallinen olio, jonka metodi step() etenee sen sisäistä stokastista virhettä ja jonka kertynyt tila luetaan ulos jokaisella tahdilla. Kellot paljastavat kertyneen vaiheen; kiihtyvyysmittarit kaksoisintegroidun paikan; linkit mittauskohtaisen jitterin.

classDiagram
    class ErrorModel {
      <<trait>>
      +step(dt, rng)
      +spec() ModelSpec
    }
    class ClockModel {
      +y0, q_wf, q_rw, drift, flicker
      +phase() s
      +det_freq()  +drift_rate()
    }
    class AccelModel {
      +bias, q_va, gyro_bias, q_arw
      +pos() m  +theta() rad
      +reset()
    }
    class TimeTransferLink {
      +sigma_j
      +sample(rng) s
    }
    ErrorModel <|.. ClockModel
    ClockModel : white FM + random-walk FM + flicker FM + aging
    AccelModel : accel bias + VRW + gyro bias + ARW (gravity-tilt)
    TimeTransferLink : white timing jitter

ModelSpec { id, kind, provenance, params } kulkeutuu tulokseen, joten jokainen tulosteen luku on jäljitettävissä julkaistuun lähteeseen, joka mainitaan kentässä provenance.

Analyyttisen estimaattorin HoldoverEstimator rinnalla kellopaketti ajaa kaksitilaisen (vaihe, taajuus) Kalman-suotimen (KalmanClock), jonka prosessikohina vastaa totuusmallia. Katkon läpi liukuessaan sen vaihevirheen varianssi kasvaa täsmälleen arvoon q_wf·T + q_rw·T³/3 — analyyttinen holdover-relaatio — ja sen online-1-σ-rajaa käytetään täyttämään Eheys-laatumittari (osuus katkon näytteistä, joissa virhe pysyy k-σ-rajan sisällä).

4. Välitys (CLI ja sidonnat)#

api::run_toml(src) on yksittäinen sisääntulopiste: se katsoo ylätason kentän kind, deserialisoi vastaavan skenaarion, ajaa paketin ja palauttaa { json, svg, summary, csv } (csv on mukana vain niissä lajeissa, jotka julkaisevat toistettavuustaulukon). CLI kirjoittaa nämä tiedostoihin sekä raportin (report.html, report.json) ja mahdolliset tulosteet, jotka tuotetaan valitsimilla --export / --animate; Python- ja WebAssembly-sidonnat palauttavat ne isännälle. Yksi välitys, ei ajautumista erilleen.

flowchart TD
    F["api::run_toml(src) · run_scenario(src)"] --> K{"ScenarioKind::classify<br/>typed · exhaustive · 92 kinds<br/>(absent kind → clock; unknown kind → InvalidInput)"}
    K --> G1["Timing<br/>clock · timetransfer · quantum-time-transfer · telecom-timing · slot-timing"]
    K --> G2["Inertial & fusion<br/>inertial · hybrid · hybrid-ukf · fusion · gnss-ins · quantum-gnss-free-nav · ins-trn-coast · hybrid-optical-rf"]
    K --> G3["Orbit, geometry & positioning<br/>orbit · ephemeris · constellation-design · gnss-sim · pvt"]
    K --> G4["Integrity<br/>integrity · lunar-integrity · araim-reference-check"]
    K --> G5["Resilience & spectrum<br/>jamming · spoof · spoof-detect · quantum-anomaly-detect · tracking-loop · spectrum · conflict-resilience"]
    K --> G6["Alt-PNT (GPS-denied)<br/>gravity-map · terrain-nav · terrain-slam · combined-altpnt"]
    K --> G7["LEO PNT<br/>leo-signal · leo-pass · leo-navmsg · leo-pvt · leo-ppp · ntn-positioning · leo-pnt-chain"]
    K --> G8["Lunar / cislunar suite (MODELLED)<br/>lunar-time-offset · lunar-time-budget · lunar-vlbi · lunar-vlbi-fim · lunar-joint-od-clock<br/>lunar-frame-realisation · lunar-frame-campaign · lunar-llr-datum · realtime-frame-eop<br/>moonlight-service-volume · lunar-differential-pnt · lunar-interop-export · lunar-beacon<br/>lunar-jamming · lunar-attack-surface · earth-gnss-lunar · cislunar-observability · cislunar-arc-recovery"]
    K --> G9["Deep space & solar system<br/>mars-pnt · solar-system · body-pnt"]
    K --> G10["Machine learning & trade<br/>impairment-eval · quantum-trade"]
    K --> G11["Mission analysis & environment<br/>launch-window · reentry · eo-coverage · attitude-budget · aperture-duty-cycle<br/>passes · link-budget · space-packet · space-weather"]
    K --> G12["Trade studies, campaigns & interop<br/>sweep · sweep-nd · campaign · oem-interop"]
    G1 & G2 & G3 & G4 & G5 & G6 & G7 & G8 & G9 & G10 & G11 & G12 --> W["RunOutput { json, svg, summary, csv }<br/>+ SHA-256 scenario_hash"]

Välitys perustuu tyypitettyyn enum-tyyppiin ScenarioKind, joka käydään läpi tyhjentävästi (ks. seuraava alaluku), joten paketin lisääminen on kääntäjän tarkistama muutos. Puuttuva kind korvautuu paketilla clock, joten nykyiset yhden lajin skenaariot deserialisoituvat muuttumattomina (serde ohittaa kentän kind jokaisessa skenaariorakenteessa). Tunnistamaton kind hylätään virheellä KshanaError::InvalidInput, joka nimeää lähimmän sisäänrakennetun lajin, kun nimi näyttää kirjoitusvirheeltä.

Tyypitetty välitys ja jäsennelty API#

Välitys perustuu tyypitettyyn enum-tyyppiin ScenarioKind, ei raakaan merkkijonovertailuun: ScenarioKind::classify(src) ratkaisee kentän kind varianttiin, ja välittäjä käsittelee sen tyhjentävästi — paketin lisääminen on kääntäjän tarkistama muutos, ei merkkijonon kirjoitusvirhe. Kaksi tyypitettyä pintaa on merkkijonon palauttavan funktion run_toml rinnalla (säilytetty CLI:tä ja nykyisiä sidontoja varten):

  • run_scenario(src) -> Result<RunOutput, KshanaError> — tyypitetty sisääntulo, jossa on jäsennelty virhetaksonomia (InvalidInput, NonConvergence, Unsupported, IoError). Jokaisella virheellä on vakaa kind_tag(), jotta kutsuja voi haarautua virheluokan mukaan viestiä jäsentämättä. Sidonnat tarjoavat tämän nimellä error_kind(toml).
  • list_scenario_kinds() -> Vec<ScenarioMeta> (ja list_scenario_kinds_json(), joka on sidonnoissa nimellä list_kinds()) — ohjelmallinen introspektio: kunkin lajin nimi, kuvaus sekä pakolliset ja valinnaiset kentät käyttöliittymän (UI) ja muistikirjan automaattitäydennystä varten.

Kshana-ohjelmiston laajentaminen ulkoisella paketilla#

Kolmannen osapuolen paketti toteuttaa kaksi pientä, semver-vakaata traittia moduulista api:

use kshana::api::{ExternalPack, KshanaError, RunOutput, Scenario, ScenarioMeta};

struct MyPack {
    threshold: f64, // the deserialized scenario fields
}

impl Scenario for MyPack {
    fn run(&self) -> Result<RunOutput, KshanaError> {
        // Run the model, then build the unified output envelope.
        Ok(RunOutput {
            json: format!("{{\"threshold\": {}}}", self.threshold),
            svg: String::from("<svg xmlns=\"http://www.w3.org/2000/svg\"/>"),
            summary: format!("my-pack | threshold {}", self.threshold),
            csv: None,
        })
    }
}

impl ExternalPack for MyPack {
    fn kind_name(&self) -> &'static str {
        "my-pack"
    }
    fn meta(&self) -> ScenarioMeta {
        ScenarioMeta {
            name: "my-pack",
            description: "An out-of-tree example pack.",
            required_fields: &["threshold"],
            optional_fields: &[],
        }
    }
}

Tyyppi ExternalPack sisältää myös oletusmetodin register_into(&mut PackRegistry), joka ei tee mitään, ellei paketti ota käyttöön rekisterivälityksen saumaa kohdassa src/registry.rs. Sisäänrakennettu paketti jamming on kytketty tyypin Scenario kautta esimerkiksi; ulkopuoliset paketit noudattavat samaa sopimusta ilman ytimen haarauttamista (peilaten laajennuskohtaa ErrorModel luvussa §3, jota yksityinen kestävyyskerros käyttää).

Näin ollen Kshana-ohjelmistossa on kaksi vakaata laajennussaumaa — lisää anturi toteuttamalla ErrorModel (§3), tai lisää kokonainen skenaariolaji toteuttamalla Scenario + ExternalPack — molemmat ovat semver-vakaita, eikä kumpikaan vaadi ytimen haarauttamista:

classDiagram
    class ErrorModel {
      <<trait — sensor seam>>
      +step(dt, rng)
      +spec() ModelSpec
    }
    class Scenario {
      <<trait — pack seam>>
      +run() RunOutput
    }
    class ExternalPack {
      <<trait : Scenario>>
      +kind_name() str
      +meta() ScenarioMeta
    }
    ErrorModel <|.. ClockModel
    ErrorModel <|.. AccelModel
    ErrorModel <|.. TimeTransferLink
    Scenario <|.. ExternalPack
    Scenario <|.. JammingPack : worked example
    ExternalPack <|.. ThirdPartyPack : out-of-tree, no core fork

5. Hybridin huipentuma#

Hybridipaketti ajaa sarjan (yksi kello + yksi inertiaanturi) ja vaatii, että sekä aika että paikka pysyvät spesifikaatiossa; pnt_holdover on aika, kunnes jompikumpi ylittää rajan. Valinnaisesti optinen satelliittien välinen linkki synkronoi kellon uudelleen katkon aikana — vain ajan tuki; paikkaa ei synkronoida uudelleen, koska ajansiirto antaa ajan, ei paikkaa. Tämä erottaa inertiaanturin rajoittavaksi tekijäksi.

flowchart LR
    subgraph suite["PNT suite (per technology)"]
      clk["clock → timing error"]
      acc["inertial sensor → position error"]
      isl["optical ISL<br/>re-sync clock at interval"] -. aids .-> clk
    end
    clk --> J["both within spec ?"]
    acc --> J
    J --> P["pnt_holdover = first breach<br/>(timing OR position)"]

6. Geometriasta johdettu GNSS-saatavuus#

orbit.rs on deterministinen, riippuvuuksista vapaa geometriakerros. Propagator on joko analyyttinen Kepler-rata Orbit (kahden kappaleen, valinnaisesti sekulaarinen J2) tai täysi Sgp4-propagaattori, joka on rakennettu täydestä kaksirivisestä elementtijoukosta; Walker-delta-generaattori tuottaa synteettisiä tähdistöjä, ja näkölinjan näkyvyys = Maan peittämä alue + korkeuskulmamaski. Näkyvien satelliittien lukumäärä kuvautuu GNSS-tilaksi (≥4 = nominaali, 1–3 = heikentynyt, 0 = estetty), ja build_timeline muuttaa sen saatavuusaikajanaksi, joka ohjaa tavallista kellon holdover-ajoa. Saatavuus on siis johdettu geometriasta eikä käsin kirjoitettu, kun taas ajo, estimaattori ja pisteytys pysyvät ennallaan.

Täysinä TLE-tietoina annettu tähdistö propagoidaan SGP4/SDP4-mallilla tiedostossa sgp4.rs (validoitu AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 -vektoreita vastaan); vain rivin 2 elementit säilyttävät analyyttisen kahden kappaleen polun. Nämä kaksi voi sekoittaa yhdessä tähdistölohkossa.

flowchart LR
    U["user orbit"] --> V
    C["Walker constellation"] --> V["visible_count(t)<br/>occultation + mask"]
    V --> S["gnss_state: ≥4 / 1–3 / 0"]
    S --> T["build_timeline → GnssTimeline"]
    T --> R["run_orbit_clock → clock holdover"]

7. Sidonnat#

Ydin kääntyy muuttumattomana natiiviksi, Python-laajennukseksi ja WebAssemblyksi. Python-moduuli (python.rs, PyO3 abi3) ja WebAssembly-moduuli (wasm.rs, wasm-bindgen) ovat valinnaisia, ominaisuuslipuilla rajattuja riippuvuuksia (--features python / --features wasm): oletusrakennus ja testisarja eivät koskaan käännä niitä, kun taas riippuvuustarkastusportti (cargo deny --all-features) tarkastaa niiden riippuvuuspuut, koska nämä crate-kirjastot toimitetaan wheelin ja npm-paketin sisällä. Molemmat kutsuvat funktiota api::run_toml, joten jokainen pinta palauttaa identtiset tulokset. WebAssembly-moduuli tukee selainhiekkalaatikkoa hakemistossa web/ ja vie kolmetoista funktiota: run, run_all (yksi moottoriajo, joka palauttaa tuloksen, kaavion, yhteenvedon ja taulukon yhdessä), chart_svg, summary, table_csv, list_kinds, error_kind, version, jaettavan URL-osoitteen (URL: web address) koodekki encode_permalink / decode_permalink sekä kolme viejää export_sp3 / export_omm / export_oem, jotka tukevat hiekkalaatikon vientivalikkoa. Kaksi muuta etuovea ulottuu samaan rajapintaan api: MCP-palvelin (Model Context Protocol) (mcp/kshana-mcp, työtilan ulkopuolelle rajattu crate rmcp, joka tarjoaa viisitoista työkalua — run_scenario, list_scenario_kinds, validate_scenario, list_example_scenarios, get_example_scenario, report_scenario, animate_scenario, list_export_formats, export_interop, import_route, export_sp3, export_omm, export_oem, export_table_csv, assess_receiver_log; kaksi esimerkkityökalua lukee mukana toimitetut skenaariot kirjaston oletuksena pois päältä olevan ominaisuuden bundled-scenarios kautta, jonka vain tämä palvelin ottaa käyttöön) ja JetBrains IDE -lisäosa (integrated development environment) (ide/jetbrains, Kotlin-projekti, joka kutsuu CLI-työkalua kshana kirjastoon linkittämisen sijaan).

flowchart LR
    cli["CLI · main.rs<br/>native binary"] --> api
    py["Python · python.rs (PyO3 abi3)<br/>RunOutput class + run · run_full · run_typed · scenario_kinds · list_kinds · validate_toml · error_kind · version"] --> api
    wasm["WebAssembly · wasm.rs (wasm-bindgen)<br/>run · run_all · chart_svg · summary · table_csv · list_kinds · error_kind · version · encode/decode_permalink<br/>export_sp3 · export_omm · export_oem"] --> api
    mcp["MCP server · mcp/kshana-mcp (rmcp)<br/>tools: run_scenario · list_scenario_kinds · validate_scenario<br/>list_example_scenarios · get_example_scenario<br/>report_scenario · animate_scenario<br/>list_export_formats · export_interop · import_route<br/>export_sp3 · export_omm · export_oem · export_table_csv"] --> api
    ide["JetBrains plugin · ide/jetbrains (Kotlin)"] -- spawns process --> cli
    api["api::run_toml / run_scenario / list_scenario_kinds"] --> out["identical { json, svg, summary } on every surface"]

Ominaisuuslippujen käyttö: Python ja WASM ovat --features python / --features wasm; mukana toimitettu skenaariotaulukko on --features bundled-scenarios (MCP-palvelimen ainoa käyttötapa); MCP-palvelin ja ristiintarkistukset (xval/*) ovat työtilan ULKOPUOLELLE JÄTETTYJÄ crate-kirjastoja; IDE-lisäosa ei linkitä mitään — se ajaa CLI:tä.

8. Determinismi ja toistettavuus#

  • Kaikki satunnaisuus kulkee yhden, siemenluvulla alustetun generaattorin ChaCha8Rng kautta ajoa kohden; askeltamisjärjestys on kiinteä, joten (scenario, seed, engine version) → identical bits.
  • Tulos sisältää SHA-256-arvon (SHA: Secure Hash Algorithm) scenario_hash; skripti scripts/check-reproducible.sh ajaa viiteskenaarion kahdesti ja varmistaa, että tuloste on tavu tavulta identtinen.
  • Sama moottori kääntyy natiiviksi, Python-laajennukseksi ja kohteeksi wasm32-unknown-unknown selaimen sisäisiä ajoja varten, ja tuottaa samat luvut.

9. Lykätty / tuleva rakenne#

Luvun §1a astrodynamiikka-, fuusio- ja alt-PNT-kerrokset — täysi SGP4/SDP4-propagaattori, numeerinen Cowell-propagaattori seitsemän häiriön voimamallilla ja kahdella adaptiivisella integraattorilla, manööveri-/lentoratasuunnittelu, radanmääritys, 15-/8-/17-tilaiset GNSS/INS-estimaattorit, kytketty kello+paikka-suodin ja painovoimakarttasovitus — on kaikki toimitettu, samoin kuin turvallisuuden laatumittari aktiivisella harhautusdemonstraattorilla, aito TLE-/monitähdistögeometria, Monte Carlo -kaistat, kompromissitutkimusten pyyhkäisyt, tulostettava HTML-raportti (HyperText Markup Language) koneluettavine kaksoisversioineen sekä release-/publish-/wheels-/pages-työnkulut.

Useat tähän aiemmin tulevaksi työksi listatuista ominaisuuksista on sittemmin toimitettu, ja ne käsitellään edellä tai asiakirjassa VALIDATION: täysi IAU 2000A -nutaatio ja ekvinoksivapaa CIO-pohjainen GCRS↔ITRS / ITRF (International Terrestrial Reference Frame) -redusointi (validoitu bitti bitiltä SOFA/ERFA:a vastaan (SOFA: Standards of Fundamental Astronomy; ERFA: Essential Routines for Fundamental Astronomy)), EGM2008 (Earth Gravitational Model 2008) -geopotentiaali asteeseen/kertalukuun 70, Lense–Thirring-termi (koordinaatiston mukaanvetäminen), kiinteän maan/meren/ilmakehän vuorovedet, DE-tasoinen (DE440/ANISE (DE440: Development Ephemeris 440; ANISE: Attitude, Navigation, Instrument, Spacecraft, Ephemeris — puhdas Rust-planeettageometriatyökalupakki)) efemeridin ristiinvalidointi, ulkoinen Orekit-ristiinvalidointi (versio 12,2) numeeriselle Cowell-propagaattorille (0,08 m 24 tunnin aikana) sekä erä- ja sekventiaaliselle radanmääritykselle, ja 17-tilainen tiukasti kytketty navigaattori, joka on tuotu esiin skenaariolajina hybrid-ukf.

Jäljellä olevat jatkotyöt on kirjattu asiakirjaan CHANGELOG kohtaan [Unreleased] ja kykykohtainen etenemissuunnitelma asiakirjaan CAPABILITY: ulkoinen oraakkeliarvo EGM:n (Earth Gravitational Model) korkea-asteiselle evaluaattorille täsmälleen napa-akselilla ja pyshtools-puhdas napa-alueen lähivertailu (evaluaattori asteeseen 2190 ja sen ajonaikainen lataaja .gfc on toimitettu, MODELLED; ks. xval/high-degree-gravity/), ajassa muuttuva avaruussääajuri valinnaiselle NRLMSISE-00 (NRLMSISE: Naval Research Laboratory Mass Spectrometer and Incoherent Scatter Radar Extended atmosphere model) -vastustiheystasolle (oletusvastustiheys on staattinen eksponenttimalli, ja skenaariolajin space-weather Jacchia-71-tiheys on karakterisoitu NRLMSISE-00:aa vastaan mutta sitä ei korvata sillä), ulkoinen tarkistus valinnaiselle auringon reunatummenemisvarjolle, kantoaaltovaiheen GNSS/INS-tiukka kytkentä sekä aito EGM2008/EIGEN (EIGEN: European Improved Gravity model of the Earth by New techniques) -painovoimakartta alt-PNT-sovittimelle.

Yksityinen kerrosrepo sisältää vientiherkkää kestävyyssyvyyttä; se liittyy saman rajapinnan ErrorModel kautta (ja luvun §4 sopimuksen ExternalPack kautta) muuttamatta julkista moottoria.