kshana 0.17.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -202
- package/README.md +158 -71
- package/kshana_bg.wasm +0 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -12,11 +12,14 @@
|
|
|
12
12
|
<p align="center">
|
|
13
13
|
<a href="https://ashfordeou.github.io/kshana/"><img src="https://img.shields.io/badge/playground-try%20in%20browser-c79e63" alt="Live playground — run in your browser, no install"></a>
|
|
14
14
|
<a href="tests/sgp4_verification.rs"><img src="https://img.shields.io/badge/SGP4-666%2F666%20AIAA%20vectors%20%C2%B7%204.12mm-3fb950" alt="SGP4 validated against all 666 AIAA 2006-6753 vectors, worst 4.12 mm"></a>
|
|
15
|
-
<a href="
|
|
15
|
+
<a href="#validation-at-a-glance"><img src="https://img.shields.io/badge/validated-13%20external%20oracles-3fb950" alt="13 capabilities validated against independent external oracles (real data, independent libraries, or published reference vectors); 12 more are honestly labelled MODELLED — see Validation at a glance"></a>
|
|
16
|
+
<a href="https://github.com/ashfordeOU/kshana/actions/workflows/ci.yml"><img src="https://img.shields.io/badge/coverage-~96%25%20line-3fb950" alt="~96% line coverage on src/ (cargo-tarpaulin LLVM engine), gated at 85% in CI"></a>
|
|
16
17
|
<a href="https://github.com/ashfordeOU/kshana/actions/workflows/ci.yml"><img src="https://github.com/ashfordeOU/kshana/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
17
|
-
<a href="https://github.com/ashfordeOU/kshana/releases"><img src="https://img.shields.io/badge/release-v0.
|
|
18
|
+
<a href="https://github.com/ashfordeOU/kshana/releases"><img src="https://img.shields.io/badge/release-v0.19.0-c79e63" alt="Release v0.19.0"></a>
|
|
18
19
|
<a href="https://plugins.jetbrains.com/plugin/32181-kshana--pnt-simulator"><img src="https://img.shields.io/badge/JetBrains-Marketplace-c79e63" alt="Kshana on the JetBrains Marketplace"></a>
|
|
19
|
-
<a href="
|
|
20
|
+
<a href="https://glama.ai/mcp/servers/ashfordeOU/kshana"><img src="https://glama.ai/mcp/servers/ashfordeOU/kshana/badges/score.svg" alt="kshana-mcp on Glama — MCP server quality score"></a>
|
|
21
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/License-AGPL_v3-blue.svg" alt="License: AGPL-3.0-only"></a>
|
|
22
|
+
<a href="LICENSING.md"><img src="https://img.shields.io/badge/commercial_licence-available-2ea043" alt="Commercial licence available from Ashforde OÜ"></a>
|
|
20
23
|
<a href="Cargo.toml"><img src="https://img.shields.io/badge/rust-1.75%2B-orange.svg" alt="Rust 1.75+"></a>
|
|
21
24
|
<a href="https://doi.org/10.5281/zenodo.20528627"><img src="https://img.shields.io/badge/DOI-10.5281%2Fzenodo.20528627-blue.svg" alt="DOI 10.5281/zenodo.20528627"></a>
|
|
22
25
|
</p>
|
|
@@ -41,10 +44,12 @@ navigation. Every result is reproducible from `scenario + seed + engine version`
|
|
|
41
44
|
and every sensor parameter is traceable to a published source — consolidated in one
|
|
42
45
|
citable table in [`docs/PROVENANCE.md`](docs/PROVENANCE.md).
|
|
43
46
|
|
|
44
|
-
*Free and open source under
|
|
45
|
-
Ashforde OÜ
|
|
47
|
+
*Free and open source under the GNU AGPL-3.0 — with a commercial licence available
|
|
48
|
+
from Ashforde OÜ for proprietary/closed integration (see [`LICENSING.md`](LICENSING.md)).
|
|
49
|
+
Professionally developed and maintained by Ashforde OÜ; commercial support,
|
|
50
|
+
integration, and proprietary extensions available.*
|
|
46
51
|
|
|
47
|
-
> **Status: v0.
|
|
52
|
+
> **Status: v0.19.0 · a simulation substrate, not yet a product.** A validated,
|
|
48
53
|
> fully reproducible engine spanning the PNT stack — orbit geometry and constellation
|
|
49
54
|
> design, a numerical (Cowell) propagator with a six-perturbation force model, maneuver
|
|
50
55
|
> and trajectory design, time systems, inertial navigation (incl. map-aided and
|
|
@@ -52,8 +57,11 @@ Ashforde OÜ — commercial support, integration, and proprietary extensions ava
|
|
|
52
57
|
> clock+position, 17-state), orbit determination, ARAIM integrity, clocks, advanced
|
|
53
58
|
> time-and-frequency transfer, the GNSS measurement domain, resilience (jamming +
|
|
54
59
|
> multi-layer spoofing), and an open **deep-space / Mars radiometric navigation**
|
|
55
|
-
> engine (light-time + Shapiro, CCSDS-TDM, reduced-dynamic SRIF, one-/two-way fusion)
|
|
56
|
-
>
|
|
60
|
+
> engine (light-time + Shapiro, CCSDS-TDM, reduced-dynamic SRIF, one-/two-way fusion);
|
|
61
|
+
> plus first-order **mission-analysis** budgets (launch / re-entry / EO-coverage / pointing /
|
|
62
|
+
> ground-station passes / link), a **space-weather** environment model, an **AI/ML
|
|
63
|
+
> RF-impairment** evaluation testbed, and the versioned **Kshana Interchange Format (KIF)**.
|
|
64
|
+
> Honest by design: every figure of merit is labelled *validated* or *modelled*, and
|
|
57
65
|
> optical-clock figures are space goals on ground hardware (no strontium optical clock has flown).
|
|
58
66
|
>
|
|
59
67
|
> **Validation ladder** (maturity is *not* uniform across domains — and saying so is the point):
|
|
@@ -128,9 +136,11 @@ consume published Allan/noise-budget coefficients; the CAI accelerometer has a
|
|
|
128
136
|
first-principles layer — Mach–Zehnder phase, projection noise, contrast decay, and
|
|
129
137
|
vibration coupling — but Coriolis and light-shift systematics remain a **P2** roadmap
|
|
130
138
|
layer, see [`ROADMAP.md`](ROADMAP.md) and [`docs/QUANTUM-MODELS.md`](docs/QUANTUM-MODELS.md));
|
|
131
|
-
a GNSS receiver
|
|
132
|
-
|
|
133
|
-
|
|
139
|
+
a full GNSS *signal-acquisition* receiver (it now solves a single-point **PVT** position
|
|
140
|
+
fix from real RINEX code observations — validated on real IGS data — but does **not**
|
|
141
|
+
acquire or track raw signal); or a full mission-design suite (it has Lambert / porkchop /
|
|
142
|
+
maneuver / orbit-determination building blocks, but is the performance-simulation layer
|
|
143
|
+
*above* GMAT/Orekit, not a replacement). Owning this scope is deliberate. If you need first-principles cold-atom
|
|
134
144
|
interferometer error budgets (e.g. CARIOQA-PMP-grade or X-37B-style validation), see
|
|
135
145
|
the P2 roadmap and [get in touch](#support--professional-services) to collaborate.
|
|
136
146
|
|
|
@@ -138,7 +148,7 @@ the P2 roadmap and [get in touch](#support--professional-services) to collaborat
|
|
|
138
148
|
|
|
139
149
|
| Domain | Capability |
|
|
140
150
|
|--------|------------|
|
|
141
|
-
| **Orbit & geometry** | SGP4/SDP4 propagation (validated to 4.12 mm against all 666 AIAA 2006-6753 vectors); real two-line elements (a committed, date-stamped Celestrak `gps-ops` snapshot) or synthetic Walker-delta constellations whose mean elements realise the `i:T/P/F` formula to under 1 km over a 24 h propagation; multi-constellation visibility, dilution of precision, and GNSS availability; a gradient-free constellation-design optimiser, streets-of-coverage minimum-satellite sizing, a multi-constellation comparison tool, and a Walker **design sweep** that tabulates coverage / PDOP / revisit-time over a planes × satellites grid and reports the Pareto-optimal designs. |
|
|
151
|
+
| **Orbit & geometry** | SGP4/SDP4 propagation (validated to 4.12 mm against all 666 AIAA 2006-6753 vectors); real two-line elements (a committed, date-stamped Celestrak `gps-ops` snapshot) or synthetic Walker-delta constellations whose mean elements realise the `i:T/P/F` formula to under 1 km over a 24 h propagation; multi-constellation visibility, **dilution of precision (GDOP/PDOP/HDOP/VDOP/TDOP, validated to 1e-6 against gnss_lib_py 1.0.4, Stanford NAV Lab)**, and GNSS availability; a gradient-free constellation-design optimiser, streets-of-coverage minimum-satellite sizing, a multi-constellation comparison tool, and a Walker **design sweep** that tabulates coverage / PDOP / revisit-time over a planes × satellites grid and reports the Pareto-optimal designs. |
|
|
142
152
|
| **Numerical propagator** | A **Cowell** numerical propagator (`src/propagator.rs`) complementing the analytic SGP4/SDP4 path, with a hierarchical **six-perturbation** force model (`src/forces.rs`): two-body + the full **J2–J6 zonal** field (the exact analytic gradient of its disturbing potential), an optional **EGM2008 tesseral spherical-harmonic geopotential to degree/order 70** (`src/gravity_sh.rs`; real NGA coefficients, Holmes–Featherstone normalized-Legendre recurrence, cross-checked against the closed-form Legendre functions and the analytic ∇V identity), **epoch-driven Sun and Moon third-body** gravity (a built-in low-precision ephemeris, no DE/SPK kernel), **solar-radiation pressure** (cannonball model with a conical umbra+penumbra shadow), **atmospheric drag** (Vallado piecewise-exponential density, co-rotating atmosphere), the **post-Newtonian Schwarzschild relativistic correction**, and the **Lense–Thirring frame-dragging** term (IERS 2010 §10, linear in Earth's angular momentum, ~1–2 orders below Schwarzschild) — driven by a choice of two adaptive integrators (RK4 step-doubling or the **Dormand–Prince RK5(4)** embedded pair). Validated against analytic truth stronger than a cross-tool would give: the unperturbed orbit matches the exact universal-variable Kepler solution to **sub-metre over 24 h**, energy/angular-momentum conserve to ~1e-9, and each perturbation matches a hand-derived closed-form signature. |
|
|
143
153
|
| **Maneuvers & trajectory design** | Impulsive ΔV nodes with 6×6 covariance propagation (ECI / LVLH execution-error frames), finite-burn integration checked against the closed-form **Tsiolkovsky** rocket equation to < 0.01 %, an **Izzo-2015** single-revolution **Lambert** solver, an exact universal-variable **Kepler** propagator, and a **porkchop** (launch × arrival) C3 / arrival-V∞ sweep emitted as a JSON contour grid — the performance-simulation layer above GMAT/Orekit, with every Lambert output round-tripped against two-body truth and the porkchop minimum checked against the analytic Hohmann floor. |
|
|
144
154
|
| **Time systems & reference frames** | IERS leap-second **UTC / TAI / TT / UT1** scales, a Julian-date API, the IAU-2000 **Earth Rotation Angle**, GMST-based **TEME ↔ ECEF** with WGS-84 geodetic frames, IAU 2006 precession (Fukushima–Williams), full **IAU 2000A/2000B nutation**, IERS **polar motion**, and the equinox-free **CIO-based IAU 2006/2000A GCRS↔ITRS** reduction — all validated **bit-for-bit** against the SOFA/ERFA vectors, and **independently cross-checked against ANISE** (the pure-Rust NAIF/SPICE reimplementation): kshana's GCRS→ITRS vs ANISE's ITRF93 from JPL's `earth_latest_high_prec.bpc`, the same IERS Earth-orientation parameters fed to both, agree to **≤ 0.86 m on the ground / ≤ 3.6 m at GNSS orbit** (max 0.028″) across eight epochs 2020–2023. |
|
|
@@ -146,17 +156,28 @@ the P2 roadmap and [get in touch](#support--professional-services) to collaborat
|
|
|
146
156
|
| **Alt-PNT (GPS-denied)** | A cold-atom **gravimeter measurement model** whose white-noise floor (`σ = ASD/√τ`) is derived from the CAI accelerometer physics; a low-degree, fully-normalised **spherical-harmonic gravity-anomaly field** (validated against the closed-form Legendre functions and a hand-derived single-term anomaly) plus synthetic mascons; and a **gravity-map-matching particle filter** that recovers a GPS-denied track from the anomaly sequence it flies through. It extends to **terrain-referenced navigation** (TERCOM/SITAN against an SRTM `.hgt` DEM, `src/altpnt/terrain.rs`), an **IGRF-14 geomagnetic main field** to degree/order 13 (`src/igrf.rs`, validated against the tilted-dipole closed form and ∇V finite differences), and a **combined gravity + magnetic + terrain** navigator that fuses all three scalar channels through one particle filter (information is additive — no channel makes the fix worse). A **60-minute GPS-denied benchmark** (a ~700 km / one-hour outage where the inertial solution drifts to ~70 km) is recovered to **~145 m (< 500 m)** by a hierarchical coarse-to-fine matcher — the ESA NAVISP *Quantum Wayfarer* target. |
|
|
147
157
|
| **Fusion** | Loosely-coupled 15-state GNSS/INS error-state EKF with closed-loop feedback (the `gnss-ins` pack); a **tightly-coupled** pseudorange update that keeps correcting with fewer than four satellites; a coupled **clock + position** filter; a general **unscented (sigma-point) Kalman** estimator for strongly nonlinear measurements; a tightly-coupled GNSS/INS **UKF navigator** (pseudorange + Doppler) whose force-model orbital coast is validated to **0.77 m RMS** over a 30-minute curving LEO pass that includes a 120-second GNSS outage; and a full **17-state tightly-coupled GNSS/INS UKF** (position, velocity, attitude error, accelerometer and gyro biases, clock bias and drift) whose **quantum-CAI dead-reckoning** coasts a 120-second outage on the cold-atom accelerometer's derived velocity-random-walk. |
|
|
148
158
|
| **Orbit determination** | Recovery of an orbital state `[r, v]` from ground-station range tracking, composing the two-body + J2 force model and RK4 integrator with a **Gauss–Newton batch** corrector (`determine_orbit_batch`, sub-metre / mm·s⁻¹ from noiseless ranges, ~2 m at a 5 m noise floor) and a **sequential** unscented-filter variant (`determine_orbit_sequential`). |
|
|
149
|
-
| **Lunar & cislunar** | An Earth–Moon **circular restricted three-body (CR3BP)** propagator in the rotating frame — conserved Jacobi constant and all five Lagrange points (`src/cr3bp.rs`) — plus **LunaNet / LNIS** cislunar PNT geometry (MCI↔MCMF reduction, selenographic coordinates) with a **lunar south-pole ARAIM** pass that honestly surfaces the integrity gap: a ~30 m σ_URE drives the protection level well above a 50 m alert limit (`src/lunar.rs`, `scenarios/lunanet-araim.toml`). |
|
|
150
|
-
| **
|
|
159
|
+
| **Lunar & cislunar** | An Earth–Moon **circular restricted three-body (CR3BP)** propagator in the rotating frame — conserved Jacobi constant and all five Lagrange points (`src/cr3bp.rs`) — now with a **6×6 state-transition matrix and a single-shooting differential corrector** (`cr3bp_jacobian`, `propagate_state_stm`, `differential_correct_halo`) that produces genuinely periodic **halo / NRHO** orbits: the STM is validated against finite differences, corrected orbits close to machine precision, and seeding the published apolune state reproduces the **L2 southern 9:2 NRHO** (the Gateway orbit) at period ≈ 6.57 d / perilune ≈ 3,250 km, consistent with the published ≈ 6.56 d / ≈ 3,370 km (a CR3BP — circular, Sun-free — solution, **not** validated against a real LANS/Gateway ephemeris; the selenocentric MCI/MCMF transform of the corrected orbit is a follow-on); plus **LunaNet / LNIS** cislunar PNT geometry (MCI↔MCMF reduction, selenographic coordinates) with a **lunar south-pole ARAIM** pass that honestly surfaces the integrity gap: a ~30 m σ_URE drives the protection level well above a 50 m alert limit (`src/lunar.rs`, `scenarios/lunanet-araim.toml`). |
|
|
160
|
+
| **Deep-space & Mars PNT** | An open **radiometric navigation engine**: iterative light-time + **Shapiro** relativistic delay, two-/one-/three-way **Doppler & range** (Moyer two-leg), coherent transponder turnaround ratios, regenerative/PN ranging (CCSDS 414), and **Δ-DOR** plane-of-sky (CCSDS 506), with solar-plasma/tropo/iono media; **CCSDS-TDM (503)** tracking-data-message parse + emit; a **reduced-dynamic Square-Root Information Filter** (RTN empirical accelerations + a 3-state onboard clock + Mars atmospheric drag) that does **Mars-LMO orbit determination to ≈ 0.2 m** in a synthetic closed loop; a joint **one-way + two-way fusion** estimator; a multi-body dynamics core (`Body{μ, re, zonals, gravity, IAU-pole}`, Mars GMM-3 gravity, an IAU body-fixed Mars frame, a pluggable `EphemerisProvider` seam, two-part Julian dates + TT↔TDB); and the **`mars-pnt`** relay-PNT scenario (a MARCONI areostationary relay constellation) with an end-to-end **GSE performance simulator** (geometry → link budget → observables → SRIF → covariance). **Simulation-validated** (covariance / closed-loop figures of merit); the Sun-central Mars dynamics are cross-checked against JPL **DE440** (137 m @ 1-day arc, `xval/anise-mars-od`). Real DSN/ESTRACK tracking-data validation is on the roadmap. |
|
|
161
|
+
| **Integrity** | Snapshot and solution-separation (ARAIM-style) RAIM with horizontal/vertical protection levels (HPL/VPL), fault detection & exclusion, and Stanford integrity diagrams; an explicit integrity-risk-budget (**MHSS**) protection level, including the **dual-/multi-constellation constellation-wide fault mode** (EU ARAIM / DO-316), exercised on a real GPS + Galileo snapshot (`scenarios/araim-gps-galileo.toml`). The protection level applies the one-sided **nominal-bias** projection `b_k = Σ_i|s_i|·b_nom` per fault mode and the **integrity** sigma σ_URA (distinct from the accuracy σ_URE) from the Integrity Support Message — see [`docs/ARAIM_REFERENCE.md`](docs/ARAIM_REFERENCE.md). |
|
|
151
162
|
| **Augmentation (SBAS)** | **SBAS / WAAS protection levels** in the DO-229E weighted-least-squares form (precision-approach and en-route K-factors) and the **L1/L5 dual-frequency ionosphere-free** combination (IS-GPS-705, γ₁₅ ≈ 1.793) that underpins DO-316 — `src/sbas.rs`, with the protection-level geometry cross-checked against a NumPy `inv(GᵀG)` reference. |
|
|
152
|
-
| **Clock & timing** | Two-state Kalman holdover (Joseph-form covariance, NIS/NEES consistency health); Allan-family stability (ADEV / MDEV / TDEV / HDEV) with noise-type-specific confidence intervals and a full **IEEE-1139 five-coefficient power-law fit**; geometric corrections (Sagnac, GNSS common-view); and the operational transfer methods — **TWSTFT** with the BIPM Sagnac closed form, **GNSS common-view**, **PPP** ionosphere-free time transfer, a free-space **optical** link with turbulence scintillation, and an inverse-variance **clock-ensemble (paper) timescale** below the best contributing clock. |
|
|
163
|
+
| **Clock & timing** | Two-state Kalman holdover (Joseph-form covariance, NIS/NEES consistency health); Allan-family stability (ADEV / MDEV / TDEV / HDEV) with noise-type-specific confidence intervals and a full **IEEE-1139 five-coefficient power-law fit**; geometric corrections (Sagnac, GNSS common-view); and the operational transfer methods — **TWSTFT** with the BIPM Sagnac closed form, **GNSS common-view**, **PPP** ionosphere-free time transfer, a free-space **optical** link with turbulence scintillation, and an inverse-variance **clock-ensemble (paper) timescale** below the best contributing clock. A **GNSS-denied clock-holdover calculator** (`src/holdover.rs`) exposes the closed-form van-Loan coast-error growth as a *holdover-to-threshold* inversion — how long a clock free-runs before its timing error exceeds budget — across representative classical and quantum-clock classes; **modelled** (cross-checked against the multi-step `clock_state` covariance recursion), and honest that for a very stable clock the holdover to a tight threshold is set by the *assumed* long-tau noise floor, not the cited ADEV. |
|
|
153
164
|
| **GNSS measurement domain** | Forward pseudorange / Doppler synthesis with **Klobuchar** (broadcast) and **IONEX / TEC-grid** (measured) ionosphere — including an IONEX file parser, time interpolation between maps, and the thin-shell slant-obliquity mapping — **Saastamoinen + Niell** troposphere, and snapshot RAIM (HPL/VPL). |
|
|
154
|
-
| **Resilience** | Link-budget **jamming** (J/S → effective C/N₀ → loss of lock); a stochastic **time-spoof detector** (Neyman–Pearson / χ²₁ energy test with closed-form and Monte-Carlo P_fa/P_md and a Security FoM of 1 − P_md); and a **multi-layer spoof detector** fusing a RAIM-consistency parity test (with the common-mode blind spot modelled honestly), an RF AGC-power monitor, and a signal-quality (SQM early-minus-late) monitor. |
|
|
155
|
-
| **
|
|
165
|
+
| **Resilience** | Link-budget **jamming** (J/S → effective C/N₀ → loss of lock, with the anti-jam spectral-separation factor `Q` now **derived from the actual signal and jammer power spectra** via `src/navsignal.rs` — `Q = 1/(R_c·κ)`, cross-checked in CI against the previous representative constant); a stochastic **time-spoof detector** (Neyman–Pearson / χ²₁ energy test with closed-form and Monte-Carlo P_fa/P_md and a Security FoM of 1 − P_md); and a **multi-layer spoof detector** fusing a RAIM-consistency parity test (with the common-mode blind spot modelled honestly), an RF AGC-power monitor, and a signal-quality (SQM early-minus-late) monitor; and a **quantum-inertial dead-reckoning error budget** (`QuantumNavBudget`, `src/inertial/quantum_imu.rs`) composing the cold-atom-interferometer white-noise velocity-random-walk with residual bias (cross-checked against the independent `AccelModel` integrator) and scale-factor error into a position-drift-over-holdover figure — the inertial twin of the clock holdover. |
|
|
166
|
+
| **Nav-signal & code tracking** | The **signal level** between the link budget and the measurement domain (`src/navsignal.rs`): unit-area **power spectral densities** for **BPSK-R(n)** and **sine-BOC(m,n)**; the **spectral-separation coefficient** κ = ∫ G_s·G_i df, which **derives the anti-jam `Q`** the jamming model uses (`Q = 1/(R_c·κ)`) from the actual signal/jammer spectra instead of a representative constant; the **RMS (Gabor) bandwidth** (BOC > BPSK — the ranging-information / Cramér–Rao measure); the **coherent early–late DLL code-tracking thermal-noise jitter** (Kaplan & Hegarty; ~sub-metre for C/A at 45 dB-Hz); and the **multipath error envelope** (coherent EML — narrow-correlator suppression). Validated against closed-form anchors (BPSK self-SSC = 2/(3·R_c), unit-area PSDs, sub-metre C/A jitter). This is signal-**performance** analysis, **not** antenna / RF-payload hardware design (a payload partner's role). |
|
|
167
|
+
| **Interoperability** | **RINEX-3** multi-GNSS broadcast-ephemeris ingestion (GPS, Galileo, QZSS, BeiDou MEO/IGSO via IS-GPS-200; GLONASS via PZ-90 state-vector RK4) usable as a constellation source (RINEX in, PNT geometry out); a **RINEX-3/4** observation parser (pseudorange, carrier phase, Doppler, signal strength) that now **feeds a single-point-positioning solver** (`pvt`) — real code observations in, a real **receiver position** out, validated on IGS data; an **SP3-c/d** precise-ephemeris reader/writer with 9th-order Lagrange interpolation; and **CCSDS OEM 2.0 + OMM** (mean-elements) export for flight-dynamics tools (GMAT, Orekit, STK); and **CCSDS-TDM (503)** tracking-data-message parse + emit for deep-space radiometric tracking. |
|
|
168
|
+
| **Mission analysis (systems engineering)** | First-order mission-design budgets, each a runnable kind: two-body **launch & ascent geometry** (`launch-window` — launch azimuth `sin Az = cos i/cos lat`, minimum inclination, Earth-rotation bonus, dogleg plane-change Δv, daily opportunities; `src/launch.rs`); an **Allen–Eggers ballistic re-entry corridor** (`reentry` — peak deceleration, peak-g velocity/altitude, peak-heating velocity; `src/reentry.rs`); **Earth-observation coverage geometry** (`eo-coverage` — swath / nadir GSD / off-nadir access / revisit via the SMAD space triangle; `src/eo_payload.rs`); a **3-DOF attitude & pointing error budget** (`attitude-budget` — worst-case gravity-gradient torque + RSS pointing budget; `src/attitude_budget.rs`); **ground-station pass prediction** (`passes` — AOS/TCA/LOS, max elevation, access time; `src/passes.rs`); and a **one-way link budget** over the CCSDS 401 / DSN 810-005 link equation (`link-budget` — FSPL, C/N₀, Eb/N₀, margin, closure; `src/linkbudget.rs`). **MODELLED** first-order analytic budgets — the pre-hardware layer below STK/GMAT/Basilisk, not a 6-DoF or radiometric replacement. |
|
|
169
|
+
| **Space environment** | A **space-weather environment model** (`space-weather`, `src/space_weather.rs`): solar (F10.7 / centred-81-day F10.7a) and geomagnetic (Kp, with the definitional Kp↔ap table) activity indices, the **Jacchia-1971** exospheric temperature they drive (validated vs published solar min/mean/max), and the activity-corrected vs static thermospheric neutral density at altitude — the solar-cycle density dependence the static USSA76 atmosphere omits. **MODELLED**: a calibrated first-order scale-height coupling, **not** a data-validated (NRLMSISE) atmosphere. |
|
|
170
|
+
| **AI/ML evaluation & trade** | An **RF-impairment detection evaluation testbed** (`impairment-eval`, `src/impairment_eval.rs`): a labelled, parameter-grounded **synthetic** corpus (nominal / jamming / spoof-time / spoof-position / multipath), a detector-agnostic **ROC/AUC** harness scoring any detector (energy \| agc \| sqm \| parity \| fused) with per-class Pd at a target Pfa, and the in- vs out-of-distribution **optimism gap** (distribution-shift mode). Plus a **quantum-vs-classical PNT trade** (`quantum-trade`, `src/quantum_trade.rs`) quantifying a candidate clock's timing/inertial holdover benefit from a **measured-ADEV** curve vs a classical baseline, with the long-τ floor caveat carried on the artifact and a GNSS-denied resilience-vs-time envelope. The evaluation **metrics** (AUC / confusion / Pd-Pmd) are **validated to an exact match against scikit-learn 1.9.0**, and the trade engine's numerical **kernels** (ADEV NNLS fit, χ² consistency bands, van-Loan clock Q) **against scipy 1.17.1**; the device-benefit numbers built on top stay **MODELLED** operating characteristics — never field/IQ data, no good/bad verdict. |
|
|
171
|
+
| **Frugal engineering & integrity impact** | A **cost-per-coverage ROI** lens (`src/frugal.rs`) — cost per unit of delivered coverage for an architecture trade — and a **detection-miss → integrity-impact** mapping (`src/integrity_impact.rs`) that turns a monitor's missed-detection rate into its integrity-risk contribution. **MODELLED** decision-support budgets, additive. |
|
|
172
|
+
| **Artifact interchange** | The **Kshana Interchange Format (KIF)** (`src/interchange.rs`) — a versioned, self-describing envelope wrapping a scenario result with its kind, schema version, and MODELLED/VALIDATED labels, so a stored artifact stays self-documenting and older envelopes remain forward-compatibly readable. |
|
|
156
173
|
|
|
157
174
|
Each capability is reachable as a Rust API, a runnable scenario `kind`, or both.
|
|
158
175
|
Maturity per capability — *validated*, *runnable*, or *library* — is tracked in
|
|
159
|
-
[`docs/CAPABILITY.md`](docs/CAPABILITY.md).
|
|
176
|
+
[`docs/CAPABILITY.md`](docs/CAPABILITY.md). A **machine-checked verification matrix**
|
|
177
|
+
(`src/verification.rs`) renders the requirement → module → test → oracle → status
|
|
178
|
+
cross-reference, with unit-tested honesty invariants that permit a *validated* label
|
|
179
|
+
only where an independent **external** oracle backs it — and that record the
|
|
180
|
+
hardware/PA capabilities Kshana deliberately does **not** provide.
|
|
160
181
|
|
|
161
182
|
## Results
|
|
162
183
|
|
|
@@ -252,6 +273,9 @@ cargo run -- scenarios/orbit-sgp4-gps.toml --export-sp3 gps.sp3
|
|
|
252
273
|
# Export the constellation's mean elements to a CCSDS OMM catalogue (one OMM
|
|
253
274
|
# message per TLE-defined satellite, with its real NORAD id / COSPAR designator):
|
|
254
275
|
cargo run -- scenarios/orbit-sgp4-gps.toml --export-omm gps.omm
|
|
276
|
+
|
|
277
|
+
# Export the velocity-carrying state to a CCSDS OEM 2.0 ephemeris (GMAT/Orekit/STK):
|
|
278
|
+
cargo run -- scenarios/orbit-sgp4-gps.toml --export-oem gps.oem
|
|
255
279
|
```
|
|
256
280
|
|
|
257
281
|
**Interoperability role.** Kshana is the *performance-simulation* layer that sits
|
|
@@ -334,6 +358,8 @@ console.log(version(), result.classical.fom.timing_p95_ns);
|
|
|
334
358
|
|
|
335
359
|
### AI agents (MCP)
|
|
336
360
|
|
|
361
|
+
[](https://glama.ai/mcp/servers/ashfordeOU/kshana)
|
|
362
|
+
|
|
337
363
|
Kshana ships an [MCP](https://modelcontextprotocol.io) server, [`kshana-mcp`](mcp/kshana-mcp/),
|
|
338
364
|
so AI assistants and agents can run the **validated** engine instead of guessing the
|
|
339
365
|
math — usable from **Cursor, JetBrains AI Assistant / Junie, and any MCP-compatible
|
|
@@ -358,11 +384,25 @@ plugin from the JetBrains Marketplace (or *Settings → Plugins → Marketplace
|
|
|
358
384
|
|
|
359
385
|
## Scenario format
|
|
360
386
|
|
|
361
|
-
Scenarios are declarative TOML. A top-level `kind` selects the pack — **
|
|
362
|
-
all (`clock` is the default if omitted): `inertial`, `timetransfer`, `hybrid`, `fusion`,
|
|
387
|
+
Scenarios are declarative TOML. A top-level `kind` selects the pack — **thirty-four** in
|
|
388
|
+
all (`clock` is the default if omitted): `inertial`, `timetransfer`, `hybrid`, `hybrid-ukf`, `fusion`,
|
|
363
389
|
`gnss-ins`, `orbit`, `ephemeris`, `gnss-sim`, `integrity`, `lunar-integrity`, `spoof`,
|
|
364
|
-
`spoof-detect`, `jamming`, `sweep`, `sweep-nd`, `gravity-map`, `terrain-nav`,
|
|
365
|
-
`combined-altpnt`,
|
|
390
|
+
`spoof-detect`, `jamming`, `sweep`, `sweep-nd`, `gravity-map`, `terrain-nav`, `terrain-slam`,
|
|
391
|
+
`combined-altpnt`, `pvt`, `mars-pnt`, `impairment-eval` (AI/ML RF-impairment detection
|
|
392
|
+
evaluation testbed — labelled synthetic corpus + detector-agnostic ROC/AUC harness +
|
|
393
|
+
in/out-of-distribution optimism gap), `quantum-trade` (quantum-vs-classical PNT
|
|
394
|
+
trade with measured-ADEV ingestion + GNSS-denied resilience envelope; MODELLED),
|
|
395
|
+
`space-weather` (solar/geomagnetic indices + Jacchia-71 exospheric temperature +
|
|
396
|
+
activity-driven thermospheric density over the static atmosphere; MODELLED),
|
|
397
|
+
`oem-interop` (CCSDS OEM import/round-trip bridge for GMAT/Orekit/STK ephemerides;
|
|
398
|
+
MODELLED), the mission-analysis trio `launch-window` (two-body launch azimuth /
|
|
399
|
+
plane-change / opportunities), `reentry` (Allen-Eggers ballistic re-entry corridor),
|
|
400
|
+
`eo-coverage` (EO swath / GSD / access / revisit geometry), `space-packet` (CCSDS
|
|
401
|
+
133.0 TM/TC Space Packet framing — exact bit layout, round-trip verified), and
|
|
402
|
+
`attitude-budget` (3-DOF gravity-gradient torque + RSS pointing error budget),
|
|
403
|
+
`passes` (ground-station rise/set pass prediction — AOS/TCA/LOS, max elevation,
|
|
404
|
+
access), and `link-budget` (one-way CCSDS/DSN link equation — FSPL / Eb·N₀ /
|
|
405
|
+
margin / closure) — all MODELLED.
|
|
366
406
|
Common fields: `seed`, a `[time]` grid, a `[gnss]` availability timeline (the outage
|
|
367
407
|
driver), and per-sensor blocks with `provenance` strings citing the source of every
|
|
368
408
|
figure. Example (clock):
|
|
@@ -593,7 +633,7 @@ flowchart LR
|
|
|
593
633
|
|
|
594
634
|
```mermaid
|
|
595
635
|
flowchart TD
|
|
596
|
-
cli["CLI · Python · WebAssembly · MCP server · JetBrains plugin"] --> api["api — run_toml: typed dispatch over
|
|
636
|
+
cli["CLI · Python · WebAssembly · MCP server · JetBrains plugin"] --> api["api — run_toml: typed dispatch over 34 kinds"]
|
|
597
637
|
subgraph shared["Shared core"]
|
|
598
638
|
types["types · scenario · GNSS timeline"]
|
|
599
639
|
allan["allan — ADEV/MDEV/TDEV/HDEV"]
|
|
@@ -617,13 +657,14 @@ flowchart TD
|
|
|
617
657
|
gsh["gravity_sh — EGM2008 d/o 70"]
|
|
618
658
|
integ["integrator — RK4 · DOPRI"]
|
|
619
659
|
man["maneuver · orbit_determination"]
|
|
620
|
-
cr["cr3bp — Earth–Moon CR3BP"]
|
|
660
|
+
cr["cr3bp — Earth–Moon CR3BP + halo/NRHO corrector"]
|
|
621
661
|
end
|
|
622
662
|
subgraph intg["Integrity & GNSS"]
|
|
623
663
|
raim["raim — RAIM/ARAIM · HPL/VPL"]
|
|
624
664
|
sbas["sbas — DO-229E PL · L1/L5"]
|
|
625
665
|
gsim["gnss_sim · ionex — measurement domain"]
|
|
626
666
|
jam["jamming — J/S → C/N₀"]
|
|
667
|
+
nsig["navsignal — PSD · SSC → anti-jam Q · DLL jitter"]
|
|
627
668
|
lun["lunar — cislunar ARAIM"]
|
|
628
669
|
end
|
|
629
670
|
subgraph fnav["Fusion & alt-PNT"]
|
|
@@ -631,13 +672,19 @@ flowchart TD
|
|
|
631
672
|
grav["gravimeter · mapmatch · particle_filter"]
|
|
632
673
|
terr["altpnt/terrain · igrf — terrain + magnetic"]
|
|
633
674
|
end
|
|
675
|
+
subgraph ds["Deep-space & Mars"]
|
|
676
|
+
dsr["radiometric · ccsds_tdm — light-time · Δ-DOR · TDM"]
|
|
677
|
+
dso["deepspace_od — reduced-dynamic SRIF"]
|
|
678
|
+
dsm["mars_pnt · gse_sim — relay-PNT + GSE sim"]
|
|
679
|
+
end
|
|
634
680
|
subgraph io["Interop formats"]
|
|
635
|
-
iofmt["rinex · sp3 · oem · omm · glonass"]
|
|
681
|
+
iofmt["rinex · sp3 · oem · omm · glonass · ccsds_tdm"]
|
|
636
682
|
end
|
|
637
683
|
api --> packs
|
|
638
684
|
api --> astro
|
|
639
685
|
api --> intg
|
|
640
686
|
api --> fnav
|
|
687
|
+
api --> ds
|
|
641
688
|
packs --> shared
|
|
642
689
|
astro --> frames
|
|
643
690
|
orbit --> sgp4
|
|
@@ -645,6 +692,7 @@ flowchart TD
|
|
|
645
692
|
prop --> gsh
|
|
646
693
|
prop --> integ
|
|
647
694
|
cr --> integ
|
|
695
|
+
nsig --> jam
|
|
648
696
|
fus --> p2
|
|
649
697
|
grav --> p2
|
|
650
698
|
terr --> grav
|
|
@@ -666,7 +714,7 @@ flowchart LR
|
|
|
666
714
|
core["kshana core<br/>library + CLI"]
|
|
667
715
|
mcp["mcp/kshana-mcp<br/>MCP server (excluded crate)"]
|
|
668
716
|
ide["ide/jetbrains<br/>Kotlin IDE plugin"]
|
|
669
|
-
xval["xval/anise-frames<br/>SPICE cross-
|
|
717
|
+
xval["xval/anise-{frames,lunar-od,mars-od}<br/>SPICE/DE440 cross-checks (excluded)"]
|
|
670
718
|
end
|
|
671
719
|
core --> crates["crates.io"]
|
|
672
720
|
core --> pypi["PyPI — wheels"]
|
|
@@ -685,7 +733,7 @@ flowchart LR
|
|
|
685
733
|
```
|
|
686
734
|
kshana/
|
|
687
735
|
├── src/ # the kshana core crate (library + CLI)
|
|
688
|
-
│ ├── api.rs · main.rs · lib.rs # typed dispatch (
|
|
736
|
+
│ ├── api.rs · main.rs · lib.rs # typed dispatch (34 kinds) + CLI + crate root
|
|
689
737
|
│ ├── python.rs · wasm.rs # optional PyO3 / wasm-bindgen bindings
|
|
690
738
|
│ ├── types.rs · scenario.rs · allan.rs # shared core (time grid, GNSS timeline, Allan)
|
|
691
739
|
│ │
|
|
@@ -703,18 +751,25 @@ kshana/
|
|
|
703
751
|
│ ├── orbit.rs · sgp4.rs · tle.rs · walker.rs # geometry, SGP4/SDP4, TLE, Walker design
|
|
704
752
|
│ ├── propagator.rs · forces.rs · gravity_sh.rs · integrator.rs # Cowell + perturbations (EGM2008 d/o70, GR) + RK4/DOPRI
|
|
705
753
|
│ ├── maneuver.rs · batch_ls.rs · orbit_determination.rs # burns/Lambert/porkchop, Gauss-Newton, OD
|
|
706
|
-
│ ├── cr3bp.rs · lunar.rs # Earth–Moon CR3BP, cislunar/LunaNet ARAIM
|
|
754
|
+
│ ├── cr3bp.rs · lunar.rs # Earth–Moon CR3BP + halo/NRHO STM corrector, cislunar/LunaNet ARAIM
|
|
755
|
+
│ ├── body.rs · mars_frame.rs · ephem_provider.rs · radiometric.rs · ccsds_tdm.rs # deep-space: multi-body · Mars frame · ephemeris seam · radiometric obs + CCSDS-TDM
|
|
756
|
+
│ ├── deepspace_od.rs · clock_state.rs · mars_atmos.rs · mars_pnt.rs · linkbudget.rs · gse_sim.rs # SRIF OD · onboard clock · Mars drag · relay-PNT · link budget · GSE sim
|
|
707
757
|
│ │
|
|
708
758
|
│ ├── fusion/ # GNSS/INS — EKF · UKF · tightly_coupled(17) · coupled · closed_loop
|
|
709
759
|
│ ├── raim.rs · sbas.rs # RAIM/ARAIM HPL/VPL, SBAS DO-229E PLs + L1/L5 iono-free
|
|
710
|
-
│ ├── gnss_sim.rs · ionex.rs · jamming.rs
|
|
760
|
+
│ ├── gnss_sim.rs · ionex.rs · pvt.rs · jamming.rs # measurement domain · ionosphere maps · single-point positioning · jamming
|
|
761
|
+
│ ├── navsignal.rs # nav-signal PSD (BPSK-R/BOC) · spectral-separation → anti-jam Q · DLL code-tracking jitter · multipath envelope
|
|
711
762
|
│ ├── gravimeter.rs · igrf.rs · mapmatch.rs · particle_filter.rs · altpnt/ # gravity/magnetic/terrain alt-PNT
|
|
712
763
|
│ ├── rinex.rs · rinex_obs.rs · glonass.rs · sp3.rs · oem.rs · omm.rs · permalink.rs # interop formats
|
|
764
|
+
│ ├── launch.rs · reentry.rs · eo_payload.rs · attitude_budget.rs · passes.rs · space_packet.rs # mission-analysis budgets + CCSDS Space Packet
|
|
765
|
+
│ ├── space_weather.rs · holdover.rs # space-weather environment · GNSS-denied clock-holdover calculator
|
|
766
|
+
│ ├── impairment_eval.rs · quantum_trade.rs · frugal.rs · integrity_impact.rs # AI/ML RF-impairment eval · PNT trade · cost-per-coverage ROI · integrity impact
|
|
767
|
+
│ ├── interchange.rs · verification.rs # KIF artifact envelope · machine-checked verification matrix
|
|
713
768
|
│ └── bin/validation_report.rs # builds the release validation-summary HTML
|
|
714
769
|
│
|
|
715
770
|
├── mcp/kshana-mcp/ # standalone, workspace-EXCLUDED crate — the MCP server (+ Dockerfile, server.json)
|
|
716
771
|
├── ide/jetbrains/ # standalone Kotlin/Gradle IntelliJ-Platform plugin
|
|
717
|
-
├── xval/anise-frames/
|
|
772
|
+
├── xval/anise-{frames,lunar-od,mars-od}/ # standalone, workspace-EXCLUDED ANISE/SPICE cross-checks (frames · lunar DE440 · Mars DE440)
|
|
718
773
|
│
|
|
719
774
|
├── scenarios/ # one cited .toml per kind + geometry-driven + GPS-denied
|
|
720
775
|
├── scripts/ # reproducibility + repo-hygiene + SBOM guards
|
|
@@ -738,18 +793,25 @@ kshana/
|
|
|
738
793
|
| [Validation status](docs/VALIDATION.md) | reviewers / citers | what is `validated` vs `not modeled`, with evidence |
|
|
739
794
|
| [Provenance](docs/PROVENANCE.md) | reviewers / citers | every sensor parameter, model, and dataset traced to its published source, in one citable table |
|
|
740
795
|
| [Reproducibility & provenance](docs/REPRODUCIBILITY.md) | reviewers / packagers | determinism guarantees, golden-pinning, SBOM, build provenance |
|
|
796
|
+
| [Wheel platform tags](docs/WHEEL_TAGS.md) | packagers | the abi3 Python wheel matrix — which platform tag `pip install kshana` resolves |
|
|
741
797
|
| [Positioning](docs/POSITIONING.md) | evaluators | where Kshana sits vs RTKLIB/gLAB (complementary), and the zero-install browser tier |
|
|
742
798
|
| [Technical report](paper/kshana-technical-report.md) · [JOSS paper](paper/paper.md) | reviewers / citers / evaluators | the full extended research paper — architecture, per-domain models, validation, case studies, and limitations — plus the concise JOSS submission |
|
|
743
799
|
| [SGP4 validation](docs/SGP4-VALIDATION.md) | reviewers / citers | agreement with the AIAA 2006-6753 reference (666 states, ~4 mm) **and** a head-to-head against the independent `sgp4` crate (agree to sub-micron / 4.12 mm) |
|
|
800
|
+
| [Force-model validation](docs/AGENCY-ORBIT-VALIDATION.md) | reviewers / citers | the full-force engine (`src/precise_od.rs`) fit to agency ephemerides — methodology and validated residuals |
|
|
801
|
+
| [Real TLE guide](docs/REAL_TLE_GUIDE.md) | users | driving scenarios from real Celestrak / Space-Track constellation TLEs (vs the bundled synthetic Walker set) |
|
|
744
802
|
| [Integrity FoM](docs/INTEGRITY.md) | evaluators | what the `integrity` / `security` figures mean — and what they are **not** vs aviation HPL/VPL |
|
|
803
|
+
| [ARAIM reference](docs/ARAIM_REFERENCE.md) | reviewers / integrators | the open MHSS ARAIM protection-level implementation — the `b_k` nominal-bias projection, σ_URA vs σ_URE, and the fault-mode priors |
|
|
745
804
|
| [Quantum models](docs/QUANTUM.md) · [details](docs/QUANTUM-MODELS.md) | reviewers | the cold-atom-interferometer physics layer, and where coefficients are still looked up |
|
|
746
805
|
| [Compliance](docs/COMPLIANCE.md) | evaluators | DO-229E / DO-316 algorithm scope, and what is **not** a conformance claim |
|
|
806
|
+
| [Standards & interoperability](docs/STANDARDS.md) | integrators | the GNSS / flight-dynamics / agency interchange formats Kshana reads and writes (RINEX, SP3, CCSDS OEM/OMM/TDM/Space-Packet, …) |
|
|
747
807
|
| [Result schema](docs/SCHEMA.md) | integrators | every field of the result JSON, with units and a source pointer |
|
|
808
|
+
| [Python API](docs/PYTHON_API.md) | Python users | the PyO3 binding surface — calling the engine, the scenario/result types, and examples |
|
|
748
809
|
| [Claims vs reality](docs/CLAIMS-VS-REALITY.md) | reviewers | the overclaim-closure ledger + the CI guard (`tests/no_overclaims.rs`) that keeps it resolved |
|
|
749
810
|
| [Roadmap](ROADMAP.md) | everyone | the phased roadmap — what has shipped and what is next |
|
|
750
811
|
| [MCP server](mcp/kshana-mcp/README.md) · [JetBrains plugin](ide/jetbrains/README.md) | agents / IDE users | run Kshana from an AI assistant or a JetBrains IDE |
|
|
751
812
|
| [Changelog](CHANGELOG.md) | everyone | released history (Keep a Changelog + SemVer) |
|
|
752
813
|
| [Contributing](CONTRIBUTING.md) | contributors | build, guards, test/citation discipline, DCO |
|
|
814
|
+
| [Governance](GOVERNANCE.md) | contributors / community | how Kshana is governed — who decides, how, and the open/closed boundary |
|
|
753
815
|
| [Code of Conduct](CODE_OF_CONDUCT.md) | community | expected conduct (Contributor Covenant) |
|
|
754
816
|
| [Security policy](SECURITY.md) | reporters | how to report a vulnerability; dual-use note |
|
|
755
817
|
|
|
@@ -773,28 +835,37 @@ modelled) is in [`docs/VALIDATION.md`](docs/VALIDATION.md) and the per-release
|
|
|
773
835
|
[`kshana-validation-summary.html`](https://github.com/AshfordeOU/kshana/releases)
|
|
774
836
|
artifact (generated by `cargo run --bin validation_report`, SLSA-attested).
|
|
775
837
|
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
|
779
|
-
|
|
780
|
-
|
|
|
781
|
-
|
|
|
782
|
-
|
|
|
783
|
-
|
|
|
784
|
-
|
|
|
785
|
-
|
|
|
786
|
-
|
|
|
787
|
-
|
|
|
788
|
-
|
|
|
789
|
-
| Force-model fit vs
|
|
790
|
-
|
|
|
791
|
-
|
|
|
792
|
-
|
|
|
793
|
-
|
|
|
794
|
-
|
|
|
795
|
-
|
|
|
796
|
-
|
|
|
797
|
-
|
|
|
838
|
+
The **Status** column states the *kind* of evidence, matching the validation ladder above: **VALIDATED** = checked against an independent external oracle (real data, an independent library, or published reference vectors); **MODELLED** = checked against analytic truth or simulation self-consistency (no independent external dataset). VALIDATED describes the *method* of checking, not a pass/fail — an honest miss against real data (the LRO row) is still VALIDATED. `CI` rows are process guards, not figures of merit.
|
|
839
|
+
|
|
840
|
+
| Status | Capability | Agreement | Reference / oracle |
|
|
841
|
+
|--------|------------|-----------|--------------------|
|
|
842
|
+
| **VALIDATED** | SGP4/SDP4 propagation | 666/666 vectors, worst **4.12 mm** | AIAA 2006-6753 (Vallado `tcppver.out`) + head-to-head vs the independent `sgp4` crate |
|
|
843
|
+
| **VALIDATED** | Reference frames — IAU 2000A/B nutation, IAU 2006/2000A CIO chain, ERA | **bit-for-bit** (X,Y to 1e-14, s to 1e-18, ERA to 1e-12) | ERFA/SOFA `eraXys06a` · `eraC2ixys` · `eraEra00` · `eraNut00a/b` |
|
|
844
|
+
| **VALIDATED** | GCRS→ITRS vs an independent SPICE engine | max **0.028″** → ≤ 0.86 m ground, ≤ 3.6 m GNSS orbit | ANISE (pure-Rust NAIF/SPICE), same IERS `finals2000A` EOP, 8 epochs 2020–2023 |
|
|
845
|
+
| **MODELLED** | EGM2008 geopotential (degree/order 70) | acceleration = ∇V to **< 1e-6**; zonal collapse to validated J2 | NGA EGM2008 coefficients + analytic ∇V identity |
|
|
846
|
+
| **VALIDATED** | Allan estimators (ADEV/MDEV/TDEV/HDEV) + confidence bands | reproduce reference deviations; χ² bands match | NIST SP 1065 (Riley), 1000-point Table 31/32 |
|
|
847
|
+
| **MODELLED** | IMU error model — ARW / VRW / bias-instability | recovered to **< 5 %** (bias-instability < 15 %) | Analog Devices ADIS16465 datasheet; NaveGo reference profile |
|
|
848
|
+
| **MODELLED** | Numerical (Cowell) propagator, unperturbed | **sub-metre over 24 h**; energy/momentum conserve ~1e-9 | exact universal-variable Kepler |
|
|
849
|
+
| **MODELLED** | Lambert · Tsiolkovsky · porkchop | round-trip to two-body truth; ΔV **< 0.01 %** | Izzo 2015 · rocket equation · analytic Hohmann floor |
|
|
850
|
+
| **MODELLED** | Orbit determination (Gauss–Newton batch) | sub-m / mm·s⁻¹ noiseless; ~2 m at a 5 m noise floor | two-body + J2 over an RK4 arc |
|
|
851
|
+
| **VALIDATED** | Force-model fit vs Galileo precise ephemeris (full-arc) | **0.61 m** 3-D RMS, 24 h, d/o-70, force-only | ESA/ESOC `ESA0MGNFIN` final orbit (E11), real `finals2000A` EOP |
|
|
852
|
+
| **VALIDATED** | Force-model fit vs Swarm-A precise ephemeris (reduced-dynamic) | **0.10 m** 3-D RMS (empirical-tier bound, not a measure) | ESA `SW_OPER_SP3ACOM_2_` precise orbit |
|
|
853
|
+
| **VALIDATED** | Force-model fit vs LRO lunar (honest miss) | **6.6 m** reduced-dynamic, *above* the 5 m target | JPL Horizons LRO (NAIF −85) + GRAIL `GRGM660PRIM` |
|
|
854
|
+
| **MODELLED** | Deep-space Mars OD (reduced-dynamic SRIF) | **≈ 0.2 m** Mars-LMO (simulation FoM, *not* real-mission) | synthetic closed-loop OD — estimator-machinery validation |
|
|
855
|
+
| **VALIDATED** | Sun-central Mars dynamics vs JPL DE440 | **137 m @ 1-day arc** (grows with arc = unmodelled n-body) | JPL DE440 via ANISE (`xval/anise-mars-od`, kernel-gated) |
|
|
856
|
+
| **VALIDATED** | Single-point positioning vs a surveyed IGS coordinate (real observations) | **5.7 m** 3-D RMS / **1.1 m** horizontal, dual-frequency iono-free code SPP | IGS station ABMF survey + GPS broadcast ephemeris, 2018-05-13 (`tests/pvt_abmf.rs`) |
|
|
857
|
+
| **MODELLED** | Tightly-coupled GNSS/INS UKF | **0.77 m RMS** over a 30-min LEO pass incl. a 120 s outage | force-model coast, hand-derived |
|
|
858
|
+
| **MODELLED** | GPS-denied gravity-map navigation | ~70 km INS drift → **~145 m** recovered | ESA NAVISP *Quantum Wayfarer* target |
|
|
859
|
+
| **MODELLED** | Terrain-referenced navigation (TERCOM/SITAN) | 70 km drift → **< 500 m** (grid-resolution floor ~140 m) | SRTM `.hgt` DEM; hand-injected drift (non-circular check) |
|
|
860
|
+
| **MODELLED** | IGRF-14 main field (degree/order 13) | pole ~80.7°N, dipole ~29.7 µT, physical 22–67 µT band | IAGA `igrf14coeffs.txt` (Schmidt semi-normalised) |
|
|
861
|
+
| **MODELLED** | Nav-signal modulation & code tracking | BPSK self-SSC = **2/(3·R_c)**; unit-area PSDs; **sub-metre** C/A DLL jitter @ 45 dB-Hz | Closed-form SSC/PSD anchors + Kaplan & Hegarty DLL thermal-noise formula |
|
|
862
|
+
| **MODELLED** | CR3BP halo/NRHO differential corrector | STM = finite differences; orbit closes to **machine precision**; L2 9:2 NRHO **≈ 6.57 d / perilune ≈ 3,250 km** | finite-difference STM check + published L2 southern 9:2 NRHO (≈ 6.56 d / ≈ 3,370 km) — CR3BP, not a real Gateway ephemeris |
|
|
863
|
+
| **VALIDATED** | ARAIM dual-constellation integrity | constellation-wide fault mode on real GPS + Galileo | EU ARAIM TR / DO-316; Celestrak `gps-ops` 2021-07-28 |
|
|
864
|
+
| **VALIDATED** | GNSS geometry / DOP (GDOP/PDOP/HDOP/VDOP/TDOP) | match to **1e-6 relative** across 8 geometries (well-conditioned → near-singular) | gnss_lib_py 1.0.4 (Stanford NAV Lab) — independent library (`tests/dop_reference.rs`) |
|
|
865
|
+
| **VALIDATED** | ML detector-evaluation metrics (AUC/ROC/confusion/Pd-Pmd/precision/F1) | **exact counts + < 1e-9** over 5 datasets × 24 thresholds | scikit-learn 1.9.0 (Pedregosa et al., JMLR 2011) — independent library (`tests/eval_metrics_reference.rs`) |
|
|
866
|
+
| **VALIDATED** | Quantum-trade numerical kernels (ADEV NNLS fit · χ² consistency bands · van-Loan clock Q) | NNLS + Q **exact**; χ² **< 5e-4** at operating dof ≥ 48 | scipy 1.17.1 — `optimize.nnls` / `stats.chi2.ppf` / `linalg.expm` (`tests/scipy_reference.rs`) |
|
|
867
|
+
| CI | Cross-platform reproducibility | bit-identical input + shape goldens on 3 OSes | Linux / macOS / Windows CI matrix, SHA-256 goldens |
|
|
868
|
+
| CI | Test coverage | **~96 % line** on `src/`, gated ≥ 85 % | cargo-tarpaulin (LLVM engine) |
|
|
798
869
|
|
|
799
870
|
## FAQ
|
|
800
871
|
|
|
@@ -825,8 +896,12 @@ Write a scenario `.toml` with your sensor's published figures in the `provenance
|
|
|
825
896
|
fields. See [Scenario format](#scenario-format) and the examples in `scenarios/`.
|
|
826
897
|
|
|
827
898
|
**Is it free for commercial use?**
|
|
828
|
-
Yes
|
|
829
|
-
|
|
899
|
+
Yes — under the AGPL-3.0, including in commercial settings, as long as you honour the
|
|
900
|
+
AGPL's copyleft (notably: if you modify Kshana and offer it over a network, you must
|
|
901
|
+
offer those users your modified source). If that does not suit you — e.g. you need to
|
|
902
|
+
embed Kshana in a proprietary product or run a closed network service — a commercial
|
|
903
|
+
licence is available from Ashforde OÜ; see [`LICENSING.md`](LICENSING.md) and
|
|
904
|
+
[Support](#support--professional-services).
|
|
830
905
|
|
|
831
906
|
## Troubleshooting
|
|
832
907
|
|
|
@@ -855,9 +930,9 @@ for released history, and [`docs/CAPABILITY.md`](docs/CAPABILITY.md) for the
|
|
|
855
930
|
per-capability roadmap. The **ITRF-precise frame reduction** is now delivered — the
|
|
856
931
|
full CIO-based IAU 2006/2000A GCRS↔ITRS chain (polar motion + sub-arcsecond nutation),
|
|
857
932
|
validated bit-for-bit against SOFA/ERFA and independently cross-checked against ANISE
|
|
858
|
-
(pure-Rust SPICE) to ≤ 3.6 m at GNSS orbit. Near-term items include
|
|
859
|
-
|
|
860
|
-
|
|
933
|
+
(pure-Rust SPICE) to ≤ 3.6 m at GNSS orbit. Near-term items include tightly-coupled carrier-phase fusion and surfacing the
|
|
934
|
+
loosely-/tightly-coupled GNSS/INS navigator across more packs; the **deep-space / Mars
|
|
935
|
+
radiometric-navigation** engine landed in v0.17.0 (simulation-validated). The
|
|
861
936
|
**quantum physics layer** is a **P2** item: the CAI accelerometer is now simulated from
|
|
862
937
|
first principles (Mach–Zehnder phase, projection noise, contrast decay, vibration
|
|
863
938
|
coupling), while the clock/time-transfer sensors are still driven by published
|
|
@@ -888,7 +963,7 @@ entry for every user-visible change. Participation is governed by our
|
|
|
888
963
|
|
|
889
964
|
If you use Kshana in academic or technical work, please cite it. Machine-readable
|
|
890
965
|
metadata is in [`CITATION.cff`](CITATION.cff) (GitHub renders a "Cite this repository"
|
|
891
|
-
button from it); cite the version you used (e.g. `v0.
|
|
966
|
+
button from it); cite the version you used (e.g. `v0.19.0`) together with the
|
|
892
967
|
scenario and seed for full reproducibility. Every release is archived on Zenodo with
|
|
893
968
|
a citable DOI — the concept DOI [10.5281/zenodo.20528627](https://doi.org/10.5281/zenodo.20528627)
|
|
894
969
|
always resolves to the latest version.
|
|
@@ -906,7 +981,7 @@ the [`CHANGELOG.md`](CHANGELOG.md). Every result is reproducible from
|
|
|
906
981
|
|
|
907
982
|
| Channel | Install / get | Contents |
|
|
908
983
|
|---------|---------------|----------|
|
|
909
|
-
| [crates.io](https://crates.io/crates/kshana) | `cargo install kshana` · `kshana = "0.
|
|
984
|
+
| [crates.io](https://crates.io/crates/kshana) | `cargo install kshana` · `kshana = "0.18"` | Rust library + CLI |
|
|
910
985
|
| [crates.io](https://crates.io/crates/kshana-mcp) | `cargo install kshana-mcp` | the MCP server |
|
|
911
986
|
| [PyPI](https://pypi.org/project/kshana/) | `pip install kshana` | abi3 wheels (Linux/macOS/Windows) + sdist |
|
|
912
987
|
| [npm](https://www.npmjs.com/package/kshana) | `npm install kshana` | WebAssembly module + JS wrapper |
|
|
@@ -923,16 +998,22 @@ library); the JetBrains plugin versions independently (it shells out to your ins
|
|
|
923
998
|
|
|
924
999
|
## License
|
|
925
1000
|
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
1001
|
+
**Dual-licensed.** Use Kshana under **either** the GNU **AGPL-3.0-only** (see
|
|
1002
|
+
[`LICENSE`](LICENSE)) **or** a **commercial licence** from Ashforde OÜ for
|
|
1003
|
+
proprietary/closed integration that the AGPL does not suit. Which one applies, and
|
|
1004
|
+
why it is set up this way, is explained in [`LICENSING.md`](LICENSING.md).
|
|
1005
|
+
|
|
1006
|
+
Contributions are licensed inbound under the AGPL **and** grant Ashforde OÜ the right
|
|
1007
|
+
to include them in the commercially-licensed edition (so the dual-licence keeps
|
|
1008
|
+
working) — see [`CONTRIBUTING.md`](CONTRIBUTING.md). Sign off each commit per the
|
|
1009
|
+
Developer Certificate of Origin with `git commit -s`.
|
|
929
1010
|
|
|
930
|
-
**Trademark.** "Kshana" and its marks are trademarks of Ashforde OÜ. The
|
|
1011
|
+
**Trademark.** "Kshana" and its marks are trademarks of Ashforde OÜ. The licence
|
|
931
1012
|
covers the code, not the name — please rename forks and derivative distributions.
|
|
932
1013
|
|
|
933
1014
|
## Support & professional services
|
|
934
1015
|
|
|
935
|
-
Kshana is free and open source under
|
|
1016
|
+
Kshana is free and open source under the AGPL-3.0 and **professionally developed and
|
|
936
1017
|
maintained by Ashforde OÜ** (Estonia). The open engine is complete and usable on its
|
|
937
1018
|
own. For organisations that need more, Ashforde OÜ offers:
|
|
938
1019
|
|
|
@@ -952,25 +1033,31 @@ Contact **contact@ashforde.org**.
|
|
|
952
1033
|
|
|
953
1034
|
**Validation oracles & standards** — the external authorities Kshana's checks are anchored to:
|
|
954
1035
|
|
|
955
|
-
- Vallado, Crawford, Hujsak & Kelso — *Revisiting Spacetrack Report #3* ([AIAA 2006-6753](https://celestrak.org/publications/AIAA/2006-6753/)): the SGP4/SDP4 verification set Kshana matches to 4.12 mm, and the worked frame examples the TEME→ITRF chain is checked against.
|
|
1036
|
+
- Vallado, Crawford, Hujsak & Kelso — *Revisiting Spacetrack Report #3* ([AIAA 2006-6753](https://doi.org/10.2514/6.2006-6753); [test data](https://celestrak.org/publications/AIAA/2006-6753/)): the SGP4/SDP4 verification set Kshana matches to 4.12 mm, and the worked frame examples the TEME→ITRF chain is checked against.
|
|
956
1037
|
- IAU [SOFA](https://www.iausofa.org/) / [ERFA](https://github.com/liberfa/erfa) — the reference time and frame routines the IAU 2000A nutation and the CIO GCRS↔ITRS reduction are validated bit-for-bit against.
|
|
957
1038
|
- Petit & Luzum (eds.) — *IERS Conventions (2010)*, [IERS TN 36](https://www.iers.org/IERS/EN/Publications/TechnicalNotes/tn36.html) (Earth-orientation, polar motion, and frame standards).
|
|
958
|
-
- Riley — *Handbook of Frequency Stability Analysis*, [NIST SP 1065](https://
|
|
959
|
-
-
|
|
1039
|
+
- Riley — *Handbook of Frequency Stability Analysis*, [NIST SP 1065](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication1065.pdf) (Allan-deviation relations and the NBS14 reference series).
|
|
1040
|
+
- Pedregosa et al. — *scikit-learn: Machine Learning in Python*, [JMLR 12 (2011)](https://jmlr.org/papers/v12/pedregosa11a.html): the reference ROC/AUC, confusion-matrix and precision/recall/F1 implementations the RF-impairment evaluation testbed is matched to exactly (`tests/eval_metrics_reference.rs`).
|
|
1041
|
+
- Virtanen et al. — *SciPy 1.0*, [Nature Methods 17 (2020)](https://doi.org/10.1038/s41592-019-0686-2): `optimize.nnls`, `stats.chi2` and `linalg.expm` — the reference routines the quantum-trade measured-ADEV NNLS fit, the χ² consistency bands, and the van-Loan clock process-noise covariance are validated against (`tests/scipy_reference.rs`).
|
|
1042
|
+
- Knowles, Kanhere, Neamati & Gao — *gnss_lib_py*, [SoftwareX 27 (2024)](https://doi.org/10.1016/j.softx.2024.101811): used both as open prior art (see *Comparison & open prior art* below) and as the **independent DOP oracle** the GDOP/PDOP/HDOP/VDOP/TDOP computation is matched to 1e-6 (`tests/dop_reference.rs`).
|
|
1043
|
+
- Montenbruck & Gill — *Satellite Orbits: Models, Methods and Applications* ([Springer](https://doi.org/10.1007/978-3-642-58351-3)): the force models behind the force-model fit to agency precise ephemerides.
|
|
1044
|
+
- Howell — *Three-dimensional, periodic, halo orbits*, Celestial Mechanics 32(1) (1984), [doi:10.1007/BF01358403](https://doi.org/10.1007/BF01358403); Zimovan-Spreen, Howell & Davis — *Near rectilinear halo orbits and nearby higher-period dynamical structures*, Astrodynamics 6 (2022), [doi:10.1007/s42064-021-0125-x](https://doi.org/10.1007/s42064-021-0125-x) (the halo/NRHO families the CR3BP differential corrector reproduces).
|
|
960
1045
|
|
|
961
1046
|
**Device & method physics** — the cited sources behind the sensor models:
|
|
962
1047
|
|
|
963
1048
|
- Origlia, Schiller, Bongs et al. — [arXiv:1503.08457](https://arxiv.org/abs/1503.08457) (strontium optical lattice clock, space-oriented goal).
|
|
964
|
-
- Oelker et al., *Nature Photonics* (2019) — [
|
|
1049
|
+
- Oelker et al., *Nature Photonics* (2019) — [doi:10.1038/s41566-019-0493-4](https://doi.org/10.1038/s41566-019-0493-4) (laboratory Sr clock, 4.8×10⁻¹⁷).
|
|
965
1050
|
- Templier et al., *Science Advances* (2022) — [arXiv:2209.13209](https://arxiv.org/abs/2209.13209) (hybrid quantum accelerometer triad).
|
|
966
1051
|
- Groves, *Principles of GNSS, Inertial, and Multisensor Integrated Navigation* — [IEEE AESS tutorial (UCL Discovery)](https://discovery.ucl.ac.uk/id/eprint/1470141/) (dead-reckoning error growth).
|
|
967
1052
|
- Giorgetta et al., *Nature Photonics* 7, 434 (2013) — [arXiv:1211.4902](https://arxiv.org/abs/1211.4902); Deschênes et al., *Phys. Rev. X* 6, 021016 (2016) — [APS](https://journals.aps.org/prx/abstract/10.1103/PhysRevX.6.021016) (optical two-way time-frequency transfer; the optical inter-satellite link models its non-reciprocity budget after these).
|
|
1053
|
+
- Betz — *Binary Offset Carrier Modulations for Radionavigation*, NAVIGATION 48(4) (2001), [doi:10.1002/j.2161-4296.2001.tb00247.x](https://doi.org/10.1002/j.2161-4296.2001.tb00247.x) (the BOC modulation and spectral-separation theory behind `src/navsignal.rs`).
|
|
1054
|
+
- Kaplan & Hegarty (eds.) — *Understanding GPS/GNSS: Principles and Applications* (3rd ed., Artech House, 2017): the anti-jam effective-C/N₀ equation and the early–late DLL code-tracking thermal-noise jitter the nav-signal and jamming models use.
|
|
968
1055
|
|
|
969
1056
|
**Comparison & open prior art** — the tools and surveys Kshana is positioned against:
|
|
970
1057
|
|
|
971
|
-
- Humphreys et al. — *TEXBAT* (ION GNSS 2012): the spoofing test-battery parameters the multi-layer detector is characterised against.
|
|
1058
|
+
- Humphreys et al. — [*TEXBAT*](https://radionavlab.ae.utexas.edu/texbat/) (ION GNSS 2012): the spoofing test-battery parameters the multi-layer detector is characterised against.
|
|
972
1059
|
- González et al. — [NaveGo](https://github.com/rodralez/NaveGo) (2017): the open, validated inertial-navigation error profiles used as the classical baseline.
|
|
973
|
-
- Iiyama, Casadesús Vila & Gao — *LuPNT* (ION GNSS+ 2023, Stanford NavLab): open lunar-PNT simulator.
|
|
1060
|
+
- Iiyama, Casadesús Vila & Gao — [*LuPNT*](https://github.com/Stanford-NavLab/LuPNT) (ION GNSS+ 2023, Stanford NavLab): open lunar-PNT simulator.
|
|
974
1061
|
- Knowles, Kanhere, Neamati & Gao — *gnss\_lib\_py*, SoftwareX 27 (2024), [doi:10.1016/j.softx.2024.101811](https://doi.org/10.1016/j.softx.2024.101811): open GNSS data analysis.
|
|
975
1062
|
- Li, Zaminpardaz, Kealy & Greentree — *Quantum sensors for enhanced positioning and navigation: a comprehensive review*, GPS Solutions 30(1):62 (2026), [doi:10.1007/s10291-026-02030-y](https://doi.org/10.1007/s10291-026-02030-y).
|
|
976
|
-
- Bertone et al. — *
|
|
1063
|
+
- Bertone et al. — *Earth and Space Science* 8(6) (2021), [doi:10.1029/2020EA001454](https://doi.org/10.1029/2020EA001454): GRAIL reduced-dynamic OD, the empirical-acceleration floor the LRO fit reproduces.
|
package/kshana_bg.wasm
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"Chakshu Baweja <contact@ashforde.org>"
|
|
6
6
|
],
|
|
7
7
|
"description": "Open, reproducible PNT-resilience simulator with quantum-sensor performance models",
|
|
8
|
-
"version": "0.
|
|
9
|
-
"license": "
|
|
8
|
+
"version": "0.19.0",
|
|
9
|
+
"license": "AGPL-3.0-only",
|
|
10
10
|
"repository": {
|
|
11
11
|
"type": "git",
|
|
12
12
|
"url": "https://github.com/AshfordeOU/kshana"
|