Kshana — アーキテクチャ
Kshana は、共有コアの上に層として構成された一つのエンジンです。センサーパック(時計、慣性、時刻比較、ハイブリッド)、宇宙力学・数値計算層(解析的な SGP4/SDP4(SGP4:Simplified General Perturbations 4、SDP4:Simplified Deep-space Perturbations 4)、七つの摂動による力モデルを備えた数値的な Cowell 伝搬器、マヌーバ設計、地上局の測距による軌道決定、各機関の精密エフェメリスへの力モデルのフィット)、時刻・座標系層(IERS(International Earth Rotation and Reference Systems Service)の時刻系、IAU(国際天文学連合)2006/2000A の歳差・章動、CIO(Celestial Intermediate Origin)による GCRS↔ITRS(GCRS:Geocentric Celestial Reference System、ITRS:International Terrestrial Reference System)の変換)、融合層(GNSS/INS(GNSS:全球測位衛星システム、INS:慣性航法システム)の推定器)、インテグリティ、レジリエンス、alt-PNT(PNT:測位・航法・時刻)、月の各層(RAIM/ARAIM/SBAS(RAIM:受信機自律インテグリティ監視、ARAIM:高度な受信機自律インテグリティ監視、SBAS:衛星航法補強システム)、ジャミングと多層のスプーフィング検出、重力・地形・磁気のマップマッチング、地球・月間空間の PNT)、さらに新しい LEO-PNT(低軌道 PNT)、スペクトル、太陽系とコンステレーション設計、ネットワークタイミング、キャンペーンの各層と、すべての実行で使えるレポート、アニメーション、相互運用の書き出し機能(§1d)から成ります。これらすべてを通じて、エンジンは「量子」と「古典」の違いを知りません。センサーの誤差モデルを GNSS 途絶シナリオに通して駆動し、推定器を実行し、結果を採点します。したがって、量子デバイスと古典デバイスは同じシナリオで比較され、違いは(公表され、出典のある)誤差パラメーターと、独立したノイズのシードだけです。
この文書は、構造と挙動の図を集めたものです。§1 はセンサーパックのコア、§1a はその後に追加された宇宙力学、融合、alt-PNT の各層、§1b–§1d はスタディ、領域、出力の各層を対応付けています。使い方は README、何が照合して確認済みで何がそうでないかは VALIDATION、機能ごとの成熟度の表は CAPABILITY を参照してください。
図中で使われ、出現箇所で説明していない略語:ADEV、アラン偏差。BW、帯域幅。CAI、冷却原子干渉計。CZML、Cesium Language。Δ-DOR、デルタ差分片方向測距。DO-229E、RTCA(Radio Technical Commission for Aeronautics)の SBAS 受信機規格。EKF、拡張カルマンフィルター。FM、周波数変調。GSE、地上支援装置。HPL/VPL、水平/垂直保護レベル。IMU、慣性計測装置。IOAG、Interagency Operations Advisory Group。IQ、同相/直交サンプル。ISL、衛星間リンク。ITU-T、国際電気通信連合の電気通信標準化部門。J2–J6、次数 2 から 6 までの地球の帯状重力調和係数。KIF、Kshana Interchange Format。KML、Keyhole Markup Language。KPI、重要業績評価指標。L1/L5、GNSS の搬送波バンド(CR3BP のハロー軌道の L2 は、これとは別に、地球・月系のラグランジュ点 2)。LEO、低軌道。LOO、一つ抜き交差検証。LTC、協定月時刻。MEO、中軌道。MTIE、最大時間間隔誤差。N2、2 次のヒル多様性数。NED、北・東・下。NTN、非地上系ネットワーク。OD、軌道決定。OPS-SAT、欧州宇宙機関の軌道上ソフトウェア実験衛星。PPP、精密単独測位。PSD、パワースペクトル密度。PVT、位置・速度・時刻。RINEX、Receiver Independent Exchange Format。RK4 / RK5(4)、四次、および埋め込み型の五(四)次のルンゲ・クッタ積分器。SH、球面調和関数。SigMF、Signal Metadata Format。SIR、サンプリング重要度リサンプリング。SRIF、平方根情報フィルター。SRP、太陽放射圧。SSC、スペクトル分離係数。STK、Systems Tool Kit。SVG、Scalable Vector Graphics。TDEV、時間偏差。TDM、CCSDS(Consultative Committee for Space Data Systems)の追跡データメッセージ。TLE、二行軌道要素形式。TPL、タイミング保護レベル。UBX、u-blox のバイナリプロトコル。UHF、極超短波。VLBI、超長基線電波干渉法。VRW / ARW、速度 / 角度ランダムウォーク。WASM、WebAssembly。
1. モジュール構成#
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(コマンドラインインターフェース)と二つのバインディングは、いずれも一つの api::run_toml エントリポイントに集約されるため、互いにずれることがありません。各パックは共有コア(types、scenario、allan)を再利用します。パック 4(hybrid)は、パック 1–3 のモデルと推定器を再実装せずに組み合わせます。orbit は、ジオメトリから GNSS のタイムラインを導き、それがパック 1 の実行に渡されます。navsignal モジュールは、リンクバジェットと測定領域の間の信号レベルに位置し、実際の信号とジャマーのパワースペクトルからスペクトル分離係数 κ を導きます。jamming は現在、代表的な定数を取るのではなく、これを使って耐ジャミングの Q = 1/(R_c·κ) を計算します(CI(継続的インテグリティ)で照合して確認済み)。測距コード(M 系列/Gold)の設計トレードオフも扱います。
さらに三つのモジュールが、GNSS 途絶時のレジリエンスの中核を成します。holdover は、この時計が、時刻誤差が予算を超えるまでにどれだけ自由走行できるかという運用上の問いに直接答えます。ヴァン・ローン法による惰行誤差の閉形式を、ホールドオーバーからしきい値への逆算として公開し、複数ステップの clock_state 共分散の再帰式と照合して確認しています。その慣性側の対は inertial::quantum_imu(QuantumNavBudget)にあり、冷却原子干渉計の白色雑音ドリフトを、バイアスとスケールファクター誤差と組み合わせて、ホールドオーバー中の位置ドリフトの予算にします(バイアス項は、独立した AccelModel 積分器と照合して確認)。verification は、エンジン全体の、要求事項からモジュール、テスト、オラクル、ステータスに至るマトリクスを描画し、独立した外部のオラクルのない外部の参照と照合して確認済みというラベルを禁じる、単体テスト済みの不変条件を備えています。このため、保証の主張がコードからずれることはありません。
1a. 宇宙力学、融合、alt-PNT の各層#
センサーパックのコアに加えて、三つのサブシステムが同じ共有コアを使い、orbit に入力を与える(または入力を受ける)関係にあります。宇宙力学・数値計算層は、解析的な SGP4/SDP4 の経路と並んで、非解析的な Cowell 伝搬器を加えます。融合層は GNSS/INS の推定器を持ちます。alt-PNT 層は、GPS(Global Positioning System)が使えない状況での重力マップマッチングです。これらはライブラリまたはシナリオの機能です(どれがシナリオの kind に接続され、どれが Rust API(アプリケーションプログラミングインターフェース)として利用できるかは CAPABILITY を参照)。
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
数値伝搬器の力の項は既定でオフになっているため、有効にしても、リリース済みのゴールデンデータを乱すことはありません。17 状態の密結合 UKF(無香料カルマンフィルター)は、量子 CAI 加速度計から導いた速度ランダムウォークによって GNSS 途絶を惰行します。軌道決定は、追跡アークにわたって候補状態を伝搬するために、同じ forces/integrator を再利用します。
同じ共有コアは、上の図に描かれていない、さらに四つのサブシステムも備えています(それらのパックは §4 のディスパッチに現れます)。時刻・座標系層(timescales、jd2、precession、nutation、cio、frames、eop)は、TEME↔GCRS↔ITRS(TEME:真赤道・平均春分点)を換算し、ephemeris/地上軌跡パックに入力を与えます。インテグリティ層(raim、sbas)は RAIM/ARAIM/SBAS 向けです。レジリエンス層(jamming、spoof、spoof_detect、spoof_monitors、detection)は、ジャミングと多層のスプーフィング検出向けで、信号レベルの航法信号層(navsignal)を伴います。ここには、BPSK-R(BPSK:二相位相変調)/ サイン BOC(BOC:バイナリオフセットキャリア)のパワースペクトル密度、jamming の耐ジャミング Q を導くスペクトル分離係数 κ、RMS(ガボール)測距帯域幅、コヒーレントな Early–Late DLL(遅延ロックループ)のコード追尾ジッター、マルチパス誤差のエンベロープが含まれます(信号性能の解析であり、RF ペイロード(RF:無線周波数)やアンテナのハードウェア設計ではありません。それはペイロードパートナーの役割です)。さらに、CR3BP(円制限三体問題)の力学を扱う月・地球月間空間層(lunar、lunar_frame、lunar_od、cr3bp)があり、6×6 の状態遷移行列と、真に周期的なハロー/NRHO(NRHO:ほぼ直線的なハロー軌道)を生み出す単一シューティングの微分補正器(cr3bp_jacobian、propagate_state_stm、differential_correct_halo)を含みます。これにより、公表されている L2 南側の 9:2 NRHO(Gateway の軌道)を、周期 ≈ 6.57 d、近月点 ≈ 3,250 km で再現します(公表値は ≈ 6.56 d / ≈ 3,370 km)。補正した軌道の月中心の MCI/MCMF(MCI:月中心慣性系、MCMF:月中心・月固定系)への変換と、ファミリーの連続的な展開は今後の課題として残っており、NRHO は CR3BP(円形で太陽を含まない)の解であって、実際の LANS/Gateway(LANS:Lunar Augmented Navigation Service)のエフェメリスと照合して確認したものではありません。さらに LunaNet のインテグリティも扱います。各機関のエフェメリスへの力モデルのフィット(precise_od、lunar_od、tides、gravity_sh)と、alt-PNT のフィールド一式(igrf、altpnt/terrain、gravimeter)がモジュール一覧を完成させます。モジュールごとの成熟度は CAPABILITY を参照してください。
1b. レジリエンスのスタディ、機械学習の評価、再現可能な成果物#
さらに五つのモジュール群が、プロジェクトの研究論文の背後にある、オープンで再現可能なスタディの層を形成します。シナリオの kind とは異なり、これらは cargo run --example / --bin のジェネレーターとして利用し、バイト単位で決定的な成果物(固定シード、記録されたエンジンのバージョンと設定のハッシュ)を書き出します。すべて MODELLED(合成データ、または公開データセットによる較正)であり、誠実な検証ラベルを付けています。認証に当たるものは一つもありません。
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— 条件付きのタイミング保護レベル:スプーフィング下の検出されない時刻誤差に対する、ホールドオーバーで制限された境界で、k-σ のモニター下限、検出遅延にわたるヴァン・ローン法の惰行分散、CUSUM(累積和)による警報までの時間を組み合わせたもの。実際に記録されたスプーフィング(JammerTest 2024)で較正しています。無条件の有限な境界は存在しません。TPL は、独立したクロスチェックが攻撃を検出することを条件としています。resilience/— フレームワークに沿った PNT レジリエンスの採点エンジン(DHS(国土安全保障省)の RPCF(Resilient PNT Conformance Framework)のカテゴリ)に、意思決定の不安定性スタディを加えたもの:ディリクレ重みシンプレックス、ケンドールの τ による順位の不安定性、1 位の入れ替わり率、共通モードの多様性の崩壊(Hill-N2)を扱い、インテグリティハッシュ付きの保証レポートと、手計算で導いた 35 件のオラクルテストを備えます。RESILIENCE-CROSSWALK を参照してください。RPCF v2.0 に沿わせた合成アーキテクチャであり、自己評価であって、認証ではありません。impairment_eval/impairment_study/impairment_ml/eval_stats— RF 障害の楽観ギャップのスタディ:ラベル付きの合成コーパスと、検出器に依存しない ROC/AUC(ROC:受信者動作特性、AUC:曲線下面積)のハーネス、13 個の検出器のパネル(エネルギー/AGC/SQM/パリティ(AGC:自動利得制御、SQM:信号品質監視)に、シード付きのロジスティック回帰と、隠れ層一層の MLP(MLP:多層パーセプトロン)の検出器を加えたもの)、順列検定によるヌルを伴う分布内と分布外のスケーリング則、分布外での劣化を予測する一つ抜き法の予測器です。評価指標は、scikit-learn とビット単位で照合して確認しています。sdr/realdata— ソフトウェア無線受信機のフロントエンド(生の IQ/IF(IQ:同相/直交、IF:中間周波数)→ 相関器の early/prompt/late タップ → SQM)と、取り込みアダプター(RINEX、u-blox UBX、GnssLogger、JammerTest、Yunnan、SatGrid)で、ローカルで用意した記録に対して同じ検出器を実行できます。データセットはリポジトリにコミットされていません。crossover/quantum_trade— パラメーターの不確かさの下での、量子と古典のレジリエンスの交差マップと、測定した ADEV に基づくホールドオーバーの利点のトレードオフです。トレードオフの数値カーネルは、scipy と照合して確認しています。
1c. インテグリティ、GNSS、深宇宙、月、ミッションの各層#
残りの領域は、同じ api のディスパッチに組み込まれ、共有コア、座標系、ジオメトリを再利用します。ここにあるものはすべて MODELLED です。ただし、verification マトリクスの行が外部のオラクルを挙げている場合は除きます(RAIM カーネルは SciPy と、SBAS は RTKLIB(オープンソースのリアルタイムキネマティック測位ライブラリ)のフォークと、gnss_lib_py の DOP(精度低下率)カーネル、OPS-SAT の評価、月 ARAIM の保護レベルカーネル、プロバイダー間での月エフェメリスの整合性)。月関連のその他と量子デモンストレーターは、モデル計算で、説明用で、公開情報に基づくものであり、TRL(技術成熟度レベル)、実績、機関による支持についての主張は一切行いません。
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、スペクトル、太陽系、ネットワークタイミング、キャンペーン、出力#
最新の層も同じパターンに従います。それぞれ、api からディスパッチされる一つ以上のシナリオの kind で、共有コアの上に構築され、マトリクスの行が外部のオラクルを挙げていない限り MODELLED です。
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
種類ごとの詳細は、LEO-PNT、LEO-SIGNAL、LEO-PASS、LEO-NAVMSG、LEO-PNT-FUSION、SPECTRUM、CONSTELLATION-DESIGN、TELECOM-TIMING、SLOT-TIMING、CAMPAIGNS、REPORTS、ANIMATION、INTEROP にあります。
1e. 受信機の信頼性、エビデンス、テレメトリ、訓練、compliance の各層(0.35)#
これらの層は、受信機自身のログを読むか、他のツール向けにファイルを書き出します。無線周波数信号を合成したり送信したりするものはありません。シナリオの種類の配下ではなく api の隣に位置しますが、receiver-trust 自体はシナリオの種類です。マトリクスの行が外部のオラクルを挙げていない限り、すべて MODELLED であり、船舶向けの出力は助言であって、型式承認を受けた航法装置ではありません。
| モジュール | 内容 | 記載先 |
|---|---|---|
receiver_trust |
信頼性モニターで受信機ログをエポックごとに採点する。船舶プラットフォームでは、海事向けのモニターと、理由付きの 0-100 のスコアが加わる | RECEIVER-TRUST、MARITIME-TRUST |
receiver_trust::live |
届いたストリーム(標準入力、追記されているファイル、TCP または UDP)に対する同じ採点、$PKSHT センテンス、任意のゲート。LiveEngine は、入力も出力もないその全体 |
MARITIME-TRUST |
evidence |
ログ区間、その設定、エンジンの結果を、署名とハッシュチェーンでまとめたパックで、オフラインで検証できる。任意の RFC 3161 タイムスタンプトークン付き | EVIDENCE-PACKS |
telemetry |
トラストストリームを Prometheus メトリクス、syslog イベント(CEF または LEEF)、オプションの OpenTelemetry(otlp フィーチャー、デフォルトではオフ)として出力します |
TRUST-TELEMETRY |
nmea_synth |
乗組員の訓練用に、ジャミング、ドラッグオフ、時刻スプーフィング、リプレイの各イベントをスクリプトで再現する合成の船橋 NMEA 0183 と教官ログを出力します(テキストのみ) | NMEA-TRAINING |
interference_map |
オープンライセンスの航空機・船舶の報告から、航法が劣化した状況を集計したマップと、航路がそれにさらされる度合いを示します。ローカルファイルのみ | INTERFERENCE-MAP |
osnma |
Galileo OSNMA の受信機側検証ツールです。I/NAV ページ(プレーンなページ、ベクトル CSV、UBX ストリーム)を読み込み、署名付き鍵、TESLA チェーン、MAC を検査して、衛星ごとに航法データが認証されているかどうかを報告します。osnma::cli::verify_report は、コマンドライン、Python、WebAssembly が共通して使う唯一の経路です。認証の状態のみを示すもので、インテグリティサービスではありません |
OSNMA |
compliance |
Kshana の出力を公開されているレジリエンスのフレームワークに対応付け、結果ドキュメントからその対応表を埋めます。run_from_text と assess_texts が受け取るのはパスではなくテキストです |
compliance/ |
interop::testbench |
シナリオの機体の動きとイベントを、実験室用 GNSS シミュレーター向けに、モーション CSV、NMEA、ウェイポイントテキスト、イベントファイルとして出力します。信号は書き出しません | TEST-BENCH |
船舶向けの連携機能(Signal K プラグイン、OpenCPN ゲートモード、リファレンスビルド)はコマンドラインツールを呼び出します。MARINE-INTEGRATIONS を参照してください。
2. エンジンのパイプライン(実行ごと)#
各実行では、単一のセンサーモデルを時間グリッド上で進めます。GNSS が正常な間はセンサーを規律し、停止期間中は自由走行させます(ホールドオーバー/推測航法)。
flowchart TD
A["for each time step t"] --> B{"i > 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)"]
シナリオはこのパイプラインを 二回実行します。量子センサー用に一回、古典センサー用に一回で、独立したシード(classical_seed = seed + 0x9e3779b97f4a7c15)を使うため、二つのノイズ実現値は無相関になります。
3. 誤差モデルのインターフェース(拡張ポイント)#
すべてのセンサーは同じ考え方で実装されます。状態を持つオブジェクトであり、その step() が内部の確率的誤差を進め、蓄積された状態が各ティックで読み出されます。時計は蓄積された位相を、加速度計は 二回積分した位置を、リンクは測定ごとのジッターを公開します。
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 } は結果に引き継がれるため、出力に含まれるすべての数値を、provenance に記された公開済みの出典までたどれます。
解析的な HoldoverEstimator に加えて、時計パックは 二状態(位相、周波数)のカルマンフィルター(KalmanClock)を実行します。そのプロセスノイズは真値モデルと一致しています。停止期間中に惰性で進むと、位相誤差の分散はちょうど q_wf·T + q_rw·T³/3(解析的なホールドオーバーの関係式)まで増加し、そのオンラインの 1-σ 境界はインテグリティの性能指標(誤差が k-σ 境界内に収まる停止期間中のサンプルの割合)を求めるために使われます。
4. ディスパッチ(CLI とバインディング)#
api::run_toml(src) が唯一のエントリーポイントです。最上位の kind を先読みし、対応するシナリオをデシリアライズし、パックを実行して、{ json, svg, summary, csv } を返します(csv が含まれるのは、再現性の表を公開する種類の場合のみです)。CLI はこれらをファイルに書き出し、あわせてレポート(report.html、report.json)と、指定された --export / --animate の出力も書き出します。Python と WebAssembly のバインディングは、これらをホストに返します。ディスパッチは一つだけで、ずれは生じません。
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"]
ディスパッチは型付きの ScenarioKind 列挙型に対して行われ、網羅的にマッチされます(次の小節を参照)。そのため、パックを追加しても、コンパイル時に検査される変更で済みます。kind が指定されていない場合は clock パックにフォールバックするので、既存の単一種類のシナリオは変更なしでデシリアライズされます(serde は各シナリオ構造体の kind フィールドを無視します)。認識できない kind は KshanaError::InvalidInput で拒否され、名前が誤記と思われる場合は、最も近い組み込みの種類が示されます。
型付きディスパッチと構造化 API#
ディスパッチは、生の文字列によるマッチではなく、型付きの ScenarioKind 列挙型に対して行われます。ScenarioKind::classify(src) が kind フィールドをバリアントに解決し、ディスパッチャーはそれを網羅的にマッチします。パックの追加は、文字列の打ち間違いではなく、コンパイル時に検査される変更です。文字列を返す run_toml(CLI と既存のバインディング向けに維持)と並んで、型付きのインターフェースが二つあります。
run_scenario(src) -> Result<RunOutput, KshanaError>:型付きのエントリーで、構造化されたエラー分類(InvalidInput、NonConvergence、Unsupported、IoError)を備えます。各エラーは安定したkind_tag()を持つため、呼び出し側はメッセージを解析せずに、失敗の種類で分岐できます。バインディングでは、これをerror_kind(toml)として公開しています。list_scenario_kinds() -> Vec<ScenarioMeta>(およびlist_scenario_kinds_json()。バインディングではlist_kinds()として公開):プログラムによる内省で、各種類の名前、説明、必須・任意のフィールドを返し、UI(ユーザーインターフェース)やノートブックの自動補完に使われます。
外部パックによる Kshana の拡張#
サードパーティのパックは、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: &[],
}
}
}
ExternalPack にはデフォルトの register_into(&mut PackRegistry) メソッドもあり、パックが src/registry.rs のレジストリディスパッチの接続点を利用しない限り、何も行いません。組み込みの jamming パックは、実装例として Scenario を通じて接続されています。ツリー外のパックも、コアをフォークせずに同じ契約に従います(§3 の ErrorModel 拡張ポイントと同様で、非公開のレジリエンスオーバーレイがこれを使っています)。
このように Kshana には安定した拡張の接続点が二つあります。ErrorModel を実装してセンサーを追加する方法(§3)と、Scenario と ExternalPack を実装してシナリオの種類ごと追加する方法です。どちらもセマンティックバージョニングで安定しており、コアのフォークは不要です。
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. ハイブリッドの総合パック#
ハイブリッドパックはスイート(時計一つと慣性センサー一つ)を実行し、タイミングと位置の両方が仕様内にとどまることを要求します。pnt_holdover は、どちらかが逸脱するまでの時間です。オプションとして、光衛星間リンクが停止期間中に時計を再同期します。これは時刻補助のみで、位置は再同期されません。時刻比較が与えるのは時刻であり、位置ではないためです。これにより、慣性センサーが制限要因であることが切り分けられます。
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. 幾何から導出する GNSS の可用性#
orbit.rs は、決定論的で依存関係のない幾何レイヤーです。Propagator は、解析的なケプラー軌道の Orbit(二体問題、オプションで永年 J2 項を含む)か、完全な二行軌道要素セットから構築した完全な Sgp4 プロパゲーターのいずれかです。Walker-delta ジェネレーターは合成のコンステレーションを生成し、視線方向の可視性は、地球による掩蔽と仰角マスクで決まります。可視衛星数は GNSS の状態に対応付けられ(≥4 で正常、1~3 で劣化、0 で利用不可)、build_timeline がそれを、標準の時計ホールドオーバーの実行を駆動する可用性タイムラインに変換します。このように、可用性は手作業で書くのではなく幾何から導出され、実行、推定器、採点は変わりません。
完全な TLE として与えられたコンステレーションは、sgp4.rs の SGP4/SDP4 モデルで伝播されます(AIAA(米国航空宇宙学会)2006-6753 のベクトルに対して validated)。2 行目のみの要素は、解析的な二体問題の経路のままです。両者は一つのコンステレーションブロック内に混在させられます。
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. バインディング#
コアは、変更なしでネイティブ、Python 拡張、WebAssembly にコンパイルされます。Python(python.rs、PyO3 abi3)と WebAssembly(wasm.rs、wasm-bindgen)のモジュールは、フィーチャーで切り替えるオプションの依存関係(--features python / --features wasm)です。デフォルトのビルドとテストスイートはこれらをコンパイルしませんが、依存関係の監査ゲート(cargo deny --all-features)は、これらのクレートがホイールと npm パッケージに同梱されるため、依存関係ツリーを検査します。どちらも api::run_toml を呼び出すので、どの面からでも同一の結果が返ります。WebAssembly モジュールは web/ のブラウザープレイグラウンドを支え、十三個の関数を公開しています。run、run_all(結果、グラフ、要約、表をまとめて返す 一回のエンジン実行)、chart_svg、summary、table_csv、list_kinds、error_kind、version、encode_permalink / decode_permalink の共有可能な URL(ウェブアドレス)コーデック、そしてプレイグラウンドのエクスポートメニューを支える 三つのエクスポーター export_sp3 / export_omm / export_oem です。同じ api に到達する窓口がさらに二つあります。MCP(Model Context Protocol)サーバー(mcp/kshana-mcp。ワークスペースから除外された rmcp クレートで、十五個のツール 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 を公開します。二つのサンプルツールは、ライブラリのデフォルトでオフの bundled-scenarios フィーチャー経由で同梱シナリオを読み込み、このフィーチャーを有効にするのはこのサーバーだけです)と、JetBrains IDE(統合開発環境)プラグイン(ide/jetbrains。Kotlin プロジェクトで、ライブラリにリンクせず kshana CLI をシェル経由で呼び出します)です。
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"]
フィーチャーゲート:Python と WASM は --features python / --features wasm、同梱シナリオ表は --features bundled-scenarios(MCP サーバーが使う唯一のフィーチャー)です。MCP サーバーと xval/* のクロスチェックは、ワークスペースから EXCLUDED されたクレートです。IDE プラグインは何にもリンクせず、CLI を実行します。
8. 決定性と再現性#
- すべての乱数は、実行ごとに一つのシード付き
ChaCha8Rngから生成され、ステップの順序は固定されているため、(scenario, seed, engine version) → identical bitsとなります。 - 結果には SHA-256(SHA:Secure Hash Algorithm)の
scenario_hashが含まれます。scripts/check-reproducible.shは参照シナリオを 二回実行し、出力がバイト単位で同一であることを検証します。 - 同じエンジンが、ネイティブ、Python 拡張、ブラウザー内実行用の
wasm32-unknown-unknownにコンパイルされ、同じ数値を生成します。
9. 先送りした事項・今後の構成#
§1a の天体力学、融合、alt-PNT の各レイヤー(完全な SGP4/SDP4 プロパゲーター、七つの摂動力モデルと二つの適応積分器を備えた数値 Cowell プロパゲーター、マヌーバ・軌道設計、軌道決定、15・8・17 状態の GNSS/INS 推定器、時計と位置の結合フィルター、重力マップ照合)は、いずれもすでに出荷済みです。あわせて、能動的なスプーフィングのデモンストレーターを備えたセキュリティ性能指標、実際の TLE・複数コンステレーションの幾何、モンテカルロのバンド、トレードスタディのスイープ、機械可読な対となるファイルを備えた印刷可能な HTML(HyperText Markup Language)レポート、そしてリリース、公開、ホイール、ページの各ワークフローも出荷済みです。
かつてここに今後の課題として挙げていた機能のうち、いくつかは出荷済みで、上記または VALIDATION で扱っています。完全な IAU 2000A 章動と、分点に依存しない CIO 方式の GCRS↔ITRS / ITRF(International Terrestrial Reference Frame)還元(SOFA/ERFA(SOFA:Standards of Fundamental Astronomy、ERFA:Essential Routines for Fundamental Astronomy)に対してビット単位で validated)、次数・位数 70 までの EGM2008(Earth Gravitational Model 2008)ジオポテンシャル、Lense–Thirring 慣性系引きずり項、固体・海洋・大気の潮汐、DE 級(DE440/ANISE(DE440:Development Ephemeris 440、ANISE:Attitude, Navigation, Instrument, Spacecraft, Ephemeris。純 Rust の惑星幾何ツールキット))のエフェメリスのクロスバリデーション、数値 Cowell プロパゲーター(24 h で 0.08 m)とバッチ・逐次軌道決定に対する外部の Orekit 12.2 によるクロスバリデーション、そして hybrid-ukf シナリオの種類として提供される 17 状態の密結合ナビゲーターです。
残る後続項目は、CHANGELOG の [Unreleased] と、機能ごとのロードマップ CAPABILITY で管理しています。EGM(Earth Gravitational Model)高次評価器の極軸上ちょうどでの外部オラクルの値と、pyshtools と整合する極付近の比較(次数 2190 までの評価器と、その実行時の .gfc ローダーは出荷済みで、MODELLED です。xval/high-degree-gravity/ を参照)、オプトインの NRLMSISE-00(NRLMSISE:Naval Research Laboratory Mass Spectrometer and Incoherent Scatter Radar Extended atmosphere model)抗力密度ティアのための時間変化する宇宙天気ドライバー(デフォルトの抗力密度は静的な指数モデルであり、space-weather の種類の Jacchia-71 密度は NRLMSISE-00 に対して特性評価されていますが、置き換えられてはいません)、オプトインの太陽周縁減光による影の外部検証、搬送波位相の GNSS/INS 密結合、そして alt-PNT マッチャー用の実際の EGM2008/EIGEN(EIGEN:European Improved Gravity model of the Earth by New techniques)重力マップです。
非公開のオーバーレイリポジトリには、輸出管理の対象となるレジリエンス関連の詳細機能が収められています。同じ ErrorModel インターフェース(および §4 の ExternalPack 契約)を通じて接続されるため、公開エンジンは変更されません。