チュートリアル
「同梱のシナリオを実行する」から「結果を定量化し擁護する」までを導く、実践的な実例です。三つのチュートリアルで引用されている数値はすべて、実際のエンジンの出力であり、外部の(循環しない)権威あるオラクルを拠り所とし、統合試験によって固定されています(tests/tutorials.rs)。そのため、チュートリアルがエンジンの実際の動作から黙ってずれることはありません。チュートリアルが光時計は 6600 秒保持すると述べていれば、それが成り立たなくなった日に、試験がビルドを失敗させます。
Kshana は、測位・航法・時刻(PNT)のシミュレーターです。チュートリアルでは、初出の箇所で正式名称を示しながら、さらにいくつかの略語を使います。GNSS(全球測位衛星システム)、GPS(全地球測位システム)、CLI(コマンドラインインターフェース)、TOML(Tom's Obvious Minimal Language、シナリオファイルの形式)です。
このプロジェクトが初めてですか。まずコンセプトの入門と用語集を読んでから、ここに戻ってください。
三つの実例#
| # | チュートリアル | 学べること | シナリオのカインド | 難易度 | 所要時間(目安) |
|---|---|---|---|---|---|
| 1 | はじめての軌道:GPS 衛星はどこにいるか | 実際の GPS コンステレーションを伝播させ、可用性、位置の精度低下率(PDOP)、位置精度を読み、衛星が実際にどこにいるかをエクスポートする(SP3 精密軌道フォーマット) | orbit |
初級 | 15 分 |
| 2 | クロックのホールドオーバー:どれだけ持ちこたえられるか | GNSS を拒否した状態でのクロックのホールドオーバーを実行し、タイミングの性能指標を読み、その背後にある √(q_wf·T) の増大則を理解する | clock |
初級 | 20 分 |
| 3 | 量子と従来型の GNSS レジリエンス | 総仕上げ:スプーフィング検出器(spoof)と、融合した PNT の一式(hybrid)、およびセキュリティ / インテグリティ / 推測航法をあわせて読む方法 |
spoof + hybrid |
中級 | 35 分 |
ノートブック#
合成データと、リポジトリ内にのみ保持された公開の要素セットを使う、実行可能な Jupyter ノートブックが notebooks/ にあります。
| ノートブック | 学べること |
|---|---|
| 船舶の信頼性と訓練 | 台本どおりのイベントを含む合成のブリッジ NMEA ストリームを生成し、船舶の信頼性モニターで採点する(助言のみ、型式承認を受けた航法装置ではありません) |
| 干渉マップと航路の暴露 | 航法データが劣化して見えた場所と、それが経路のどれだけに及ぶか |
| compliance マッピングと test-bench のエクスポート | 一連の実行が、どの公開フレームワークの行に対して証拠を裏付けるか(フレームワークが満たされることを示すものでは決してありません)、そして、実験室用 GNSS シミュレーター向けにテキストとしてエクスポートされるシナリオの動きとイベント(信号は書き出されません) |
| 量子と従来型の GDOP | 同じコンステレーションのジオメトリを、量子センサーと従来型センサーで精度低下率によって比較する |
| スカイラインの下での空のジオメトリ | 街路や岸壁のスカイラインの下で、ある地点から見える衛星、その DOP と誤差楕円、要素セットから得た日付つきの空、共分散に対するシード付きモンテカルロ(MODELLED) |
チュートリアルの実行方法#
どのチュートリアルも同じシナリオを三通りの方法で実行します。ご自身に合うものを選んでください。いずれも一つのエンジンを呼び出すため、数値は同一です(README の使い方の節に対応しています)。
コマンドライン。CLI はシナリオの kind フィールドに応じて処理を振り分け、入力の隣に <scenario>.result.json、<scenario>.chart.svg、<scenario>.report.html、<scenario>.report.json を書き出します(JSON は JavaScript Object Notation、SVG は Scalable Vector Graphics、HTML は HyperText Markup Language)。一部のカインドは、再現性の表も <scenario>.table.csv(カンマ区切り値)として出力します。realtime-frame-eop、lunar-time-budget、lunar-jamming、leo-navmsg、telecom-timing、そしてエクスポート地点が設定されている場合の moonlight-service-volume です。三つのチュートリアルはどれもこれらに該当しないため、ここではそのファイルは現れません。
cargo run -- scenarios/orbit-sgp4-gps.toml
cargo run -- は、このチェックアウトから CLI をビルドします。インストール済みのバイナリ(cargo install kshana)では、同じコマンドが kshana scenarios/orbit-sgp4-gps.toml になります。チェックアウトがなくても、同梱されたシナリオのほとんどはバイナリに組み込まれています。kshana example がそれらを一覧し(組み込まれていないわずかなものについては、その理由とともに名前を示します)、kshana example orbit-sgp4-gps > orbit-sgp4-gps.toml が一つを書き出します。これは、バイナリがビルドされた時点の scenarios/orbit-sgp4-gps.toml のコピーです。
Python。このチェックアウトから、有効な仮想環境の中で maturin を使って拡張を一度ビルドし、kshana.run を呼び出します。
pip install maturin
maturin develop --features python
import json, kshana
result = json.loads(kshana.run(open("scenarios/orbit-sgp4-gps.toml").read()))
print(result["geometry"]["best_pdop"])
pip install kshana は、代わりに公開済みのホイールをインストールします。これはこのチェックアウトより遅れていることがあります。お使いのビルドにどのシナリオのカインドがあるかは、json.loads(kshana.list_kinds()) で分かります。
ブラウザーのプレイグラウンド。インストール不要です。Studio を開いてシナリオを選び、パラメーターを編集して、結果を読みます。何もアップロードされず、エンジンは WebAssembly としてクライアント側で動作します。
チュートリアルが引用するのは CLI ですが、どのコマンドにも上記の Python とプレイグラウンドでの対応するものがあります。各結果は scenario + seed + engine version から再現できます。二度実行すれば、ビット単位で同一の出力が得られます。
注釈付きの教材用シナリオ#
各機能領域には、scenarios/ の下に、コメントを豊富に付けた .toml が一つあります。これは正典となるシナリオの教材用のコピーで、すべてのフィールドがインラインで説明され、引用されたオラクルが名指しされ、期待される一行の要約が # expected: のコメントとして記録されています。フィールドの値は、リポジトリのトップレベルの scenarios/ ディレクトリにある親のシナリオと同一であり(tests/tutorials.rs が解析済みの TOML を比較します)、記載された出力は正しいまま保たれます。ゴールデンハッシュも変わりません。コメントがシナリオのハッシュを変えることはないためです。
| 領域 | 教材用ファイル | 種類 | 派生元 |
|---|---|---|---|
| 時計のホールドオーバー | scenarios/clock.toml | clock |
scenarios/clock-holdover.toml |
| 軌道とジオメトリ | scenarios/orbit.toml | orbit |
scenarios/orbit-sgp4-gps.toml |
| インテグリティ(RAIM、受信機自律インテグリティ監視) | scenarios/integrity.toml | integrity |
scenarios/integrity-raim.toml |
| セキュリティ(スプーフィング) | scenarios/security.toml | spoof |
scenarios/spoof-attack.toml |
| ハイブリッド PNT | scenarios/hybrid.toml | hybrid |
scenarios/hybrid-pnt.toml |
| 慣性推測航法 | scenarios/inertial.toml | inertial |
scenarios/imu-deadreckoning.toml |
| 時刻比較・時刻伝送 | scenarios/timetransfer.toml | timetransfer |
scenarios/timetransfer.toml |
| GNSS 観測量の領域 | scenarios/gnss-sim.toml | gnss-sim |
scenarios/gnss-sim-raim.toml |
セキュリティの教材用ファイルは、内部で
kind = "spoof"を使っています。セキュリティの性能指標(1 − P_md、一から見逃し確率を引いたもの)は、spoof パックが生成します。ファイル名は機能(セキュリティ)に従い、kindはパック(spoof)に従います。そのファイルのヘッダーにもこの点が記されています。
シナリオのカインドの完全なカタログ#
エンジンは、シナリオの kind に応じて処理を振り分けます。下の表には、最もよく使われるカインド(上の八つのチュートリアル領域とその近隣のもの)を挙げています。これは完全な集合ではありません。src/api.rs::list_scenario_kinds() は、組み込みの 92 件のカインドをすべて返します。この関数(Python と WebAssembly(WASM)のバインディングでは list_kinds()、コマンドラインでは kshana kinds --json として公開されています)が、常に最新の権威あるカタログであり、SCENARIOS.md はそこから生成された一覧で、カインドごとに一つの節があり、TOML の必須フィールドと任意フィールドが記されています。tests/tutorials.rs::tutorial_scenarios_use_real_kinds は、チュートリアルが記載するすべてのカインドが実在するディスパッチ対象のカインドであることを強制するため、この表が存在しないカインドを名指すことはありません。
| 種類 | 内容 |
|---|---|
clock |
仕様に対するクロックのホールドオーバー。任意のモンテカルロのアンサンブル(runs > 1)。 |
inertial |
GNSS の途絶中の、1-DOF(一自由度)の慣性推測航法。 |
orbit |
コンステレーション(Walker / two-line elements / RINEX、Receiver Independent Exchange フォーマット)からの GNSS の可用性と精度低下率(DOP)。 |
integrity |
スナップショット / 解分離 / ARAIM(高度化 RAIM)。水平および垂直保護レベル(HPL/VPL)とスタンフォード図を伴う。 |
lunar-integrity |
LunaNet のリレー集合に対する、月の南極での ARAIM の保護レベルの通過。 |
timetransfer |
光と無線周波数(RF)による双方向の時刻・周波数伝送の比較。 |
hybrid |
ハイブリッド PNT の総仕上げ:クロック + 慣性計測装置(IMU)+ 時刻伝送による支援。 |
fusion |
同じハイブリッド入力に対する、カルマンフィルターによる統合センサーフュージョン PNT。 |
gnss-ins |
疎結合および密結合の GNSS/INS(慣性航法装置)の誤差状態拡張カルマンフィルター。 |
gnss-sim |
測定領域での疑似距離のシミュレーション(Klobuchar 電離圏、Saastamoinen/Niell 対流圏)+ RAIM。 |
jamming |
リンクバジェットによるジャミング:ジャマー対信号比(J/S)→ 実効の搬送波対雑音密度(C/N₀)→ ロックの喪失。 |
spoof |
確率的な時刻スプーフィング検出器(Neyman–Pearson / χ²₁)。モンテカルロによる誤警報確率と見逃し確率(P_fa/P_md)を含む。 |
sweep |
クロックパックのパラメーターに対する1次元のトレードスタディ掃引。 |
sweep-nd |
ドット区切りの TOML キーまたは JSON メトリクスパスによる、任意のパックに対する汎用の N 次元掃引。 |
チュートリアルを超えて:より新しい機能#
三つのチュートリアルは、従来のクロック、軌道、セキュリティのパックにとどまっています。エンジンはそれらをはるかに超えて成長しました。下の各行は、そのまま実行できる同梱のシナリオです(cargo run -- <file> または kshana <file>)。要約は、kshana 0.35.0 が 2026-10-10 にそのシナリオについて最初に出力した行です。チュートリアルの数値とは異なり、これらの行は一回の実行の記録であり、tests/tutorials.rs によって固定されてはいません。現在の値は、シナリオを再実行して確認してください。結果はそれぞれ自身の範囲を示しており(多くは label を持ちます)、検証マトリクスには、どの機能が外部のオラクルに照らして VALIDATED で、どれが MODELLED かが示されています。
| 機能 | シナリオ | 種類 | 要約の最初の行 | 続きを読む |
|---|---|---|---|---|
| L バンドのスペクトルとジャミングのウォーターフォール | scenarios/l-band-waterfall-jamming.toml |
spectrum |
scenario spectrum | 5 bands | 3 jammers | noise floor -202.0 dBW/Hz | worst band gps-l1ca min C/N0 3.2 dB-Hz (J/S 60.2 dB) |
SPECTRUM.md |
| 一つのエポックにおける太陽系 | scenarios/solar-system-tour.toml |
solar-system |
Solar system at 2026-09-28T00:00:00 (JD 2461311.50080 TDB), 18 bodies, observer Earth |
SCENARIOS.md |
| 他の天体の周りでの測位 | scenarios/europa-surface-pnt.toml |
body-pnt |
Positioning around Europa — surface user, 12 relays at 4500 km, 171 epochs |
SCENARIOS.md |
| 大規模なコンステレーション設計 | scenarios/constellation-multi-gnss-coverage.toml |
constellation-design |
constellation-design: 102 satellites (GPS, Galileo, BeiDou, GLONASS) around the Earth; availability 100.00% (PDOP <= 6 at 10 deg mask), … |
CONSTELLATION-DESIGN.md |
| キャンペーン:一つのタイムライン上に連ねたカインド | scenarios/campaign-jam-spoof-holdover-integrity.toml |
campaign |
campaign f87a4a0e0bab | Jamming, spoofing, holdover and integrity: a chained mission | chain: 6 phases over 4570 s, … |
CAMPAIGNS.md |
| 一つの LEO-PNT システムをエンドツーエンドで | scenarios/leo-pnt-end-to-end.toml |
leo-pnt-chain |
LEO-PNT end to end, generic 1080 km constellation |
LEO-PNT.md |
| MEO と LEO を融合した測位 | scenarios/meo-leo-fused-pvt.toml |
leo-pvt |
LEO PVT (joint) at 40.42, -3.70 over 1800 s |
LEO-PNT-FUSION.md |
| LEO の信号、通過、航法メッセージ | scenarios/leo-band-trade.toml, scenarios/leo-pass-iridium.toml, scenarios/leo-navmsg-encode-decode.toml |
leo-signal, leo-pass, leo-navmsg |
LEO pass link budget, air user at 50.00, -30.00; 1 LEO satellite(s), 900 s window(通過) |
LEO-SIGNAL.md、LEO-PASS.md、LEO-NAVMSG.md |
| LEO レイヤーを伴う PPP の収束、5G による測位 | scenarios/leo-ppp-convergence.toml, scenarios/ntn-5g-positioning.toml |
leo-ppp, ntn-positioning |
PPP convergence to 0.10 m horizontal / 0.10 m vertical, 12 runs per case, 96 GNSS satellites |
SCENARIOS.md |
| レジリエンス:GNSS がジャミングされ、LEO がユーザーを支える | scenarios/leo-resilience-gnss-jammed-leo-carries.toml |
campaign |
campaign 248395b851cc | GNSS jammed, LEO-PNT carries the user, integrity maintained | chain: 3 phases over 2100 s, … |
RESILIENCE-CROSSWALK.md |
| 業界別:鉄道、海事、通信、車両、北極 | scenarios/leo-vertical-rail-maritime.toml(およびその他の leo-vertical-* ファイル) |
campaign |
campaign 49575d27b696 | Railway and maritime with a LEO layer | chain: 3 phases over 2520 s, … |
CAMPAIGNS.md |
| ITU-T(国際電気通信連合 電気通信標準化部門)G.8272 のクロック限界に対する通信のホールドオーバー | scenarios/telecom-prtc-holdover-24h.toml |
telecom-timing |
telecom-timing: max|TE| 603.2 ns over 90000 s; eprtc-a-holdover FAIL, prtc-a FAIL; 100 ns budget exceeded after 8206 s (MODELLED) |
TELECOM-TIMING.md |
LEO は低軌道、MEO は中軌道、PVT は位置・速度・時刻、PPP は精密単独測位、5G は第五世代移動通信規格、TDB は太陽系力学時、JD はユリウス日、TE は時刻誤差です。
CLI は、どの実行にも三つの出力を追加します。
- レポート。すべての実行で
<scenario>.report.htmlと<scenario>.report.jsonが書き出されます(REPORTS.md を参照)。kshana --study <suite.toml>は一連のシナリオを実行して、一つの.study.jsonと.study.htmlにまとめます。例:kshana --study scenarios/quantum-pnt-demonstrator.suite.toml。 - Animation.
kshana <scenario.toml> --animate <svg|html|frames|all>は、実行の時系列を描画します。たとえばscenarios/orbit-sgp4-gps.tomlに対する--animate htmlはorbit-sgp4-gps.animation.htmlを書き出します。サンプリングされた時間軸を持たないカインド(solar-systemなど)は、エラーとして拒否されます。ANIMATION.md を参照してください。 - 相互運用のためのエクスポート。
--export <czml|kml|geojson|stk|sigmf|all|list>は、他のツール向けに結果を書き出します。CZML(Cesium Language)、KML(Keyhole Markup Language、Google Earth 向け)、GeoJSON(地理的な JSON)、STK(Systems Tool Kit)のエフェメリス、または SigMF(Signal Metadata Format)の記録です。--export listは、どの形式がシナリオに適用できるかを示します。SigMF が適用できるのはspectrumのみです。軌道パックは、--export-sp3、--export-omm、--export-oem(CCSDS、Consultative Committee for Space Data Systems の軌道メッセージ)もエクスポートします。INTEROP.md を参照してください。
段階別の演習#
段階を順に進めてください。各ティアは前のものより難しく、より擁護しやすくなっています。模範解答は exercises/ にあります。
| ティア | 目標 | 行うこと | 模範解答 |
|---|---|---|---|
| ティア 1 — 実行して読む | 同梱のシナリオを変更せずに実行し、性能指標を一つ読む | scenarios/clock-holdover.toml を実行し、量子と従来型の holdover_s を出力します。CLI、プレイグラウンド、または一行の Python 呼び出しで行えます。 |
exercises/tier1_run.py |
| ティア 2 — 編集して掃引する | パラメーターを一つ変更し、単調な効果を観察する | クロックの仕様(threshold_ns)を厳しくするか、途絶を長くして、ホールドオーバーが低下するのを確認します。あるいは kind = "sweep"/"sweep-nd" を使って表にします。 |
exercises/tier2_sweep.py |
| ティア 3 — 定量化して擁護する | モンテカルロ、信頼帯、再現性、保護レベル | クロックのアンサンブル(runs = N)を実行し、[p05–p95] の帯を読み、二回の実行が同一の scenario_hash を与えることを確認し、インテグリティ / スタンフォード図の結果を読みます。 |
exercises/tier3_montecarlo.py |
模範解答は Python 拡張を使います(最初に maturin develop --features python)。リポジトリのルートから実行すると、tier2_sweep.py は、チップスケール原子時計のホールドオーバーが、20 ns の仕様での 2610 秒から、5 ns での 1140 秒へ低下する様子を出力します。
新しいデータが必要ですか。#
これらのチュートリアルの代表的な数値は、すべてリポジトリにすでにあるシナリオだけから実行されます。何も取得しないため、再現性が保たれ、継続的インテグレーション(CI)でも安全に実行できます。「拡張」演習では、ライブのデータを取得できます。
- GPS の two-line elements(TLE)(軌道コンステレーションの更新用):https://celestrak.org/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=tle、プレーンテキストの 3-line の要素セット(名前 + 行 1 + 行 2)。補助スクリプト:
scripts/fetch_tles.sh。オープンデータ(米国宇宙軍第 18 宇宙防衛隊のカタログを、Celestrak の Dr T. S. Kelso が再配布)。 - SGP4(Simplified General Perturbations 4)の検証オラクル(すでにベンダリング済みで、再取得は不要):AIAA(American Institute of Aeronautics and Astronautics)2006-6753「Revisiting Spacetrack Report #3」の試験ベクトル、https://celestrak.org/publications/AIAA/2006-6753/、
tests/sgp4_verification.rsが使用します。docs/SGP4-VALIDATION.mdを参照してください。 - クロック安定度の関係のオラクル:NIST(National Institute of Standards and Technology)Special Publication 1065(Riley, Handbook of Frequency Stability Analysis)、https://tf.nist.gov/general/pdf/2220.pdf、チュートリアル 2 の背後にある σ_y(τ) と位相の関係。