機械翻訳であり、ネイティブスピーカーによる確認は行われていません。英語版が基準です。

API とインテグレーションGitHub で編集出典:README.npm.md

Kshana:マーク。正確な瞬間を示すコンパスの照準線で、ワードマーク kshana の横に置かれていますKshana:マーク。正確な瞬間を示すコンパスの照準線で、ワードマーク kshana の横に置かれています

Kshana · क्षण · 精密な一瞬
PNT(測位・航法・時刻)レジリエンスのためのオープンソースのシミュレーターです。

リリース v0.40.0 401 件の機能のうち 176 件が、独立した外部のオラクルに対して確認済み 行カバレッジは約 95%、継続的インテグレーションでは 85% を下限として判定 ライセンス:AGPL-3.0-only、または商用ライセンス DOI 10.5281/zenodo.20528627

GNSS が途絶える瞬間をリハーサルする:Kshana のミッションコンソール。GPS、Galileo、BeiDou、GLONASS の 102 機の衛星にわたる、ジャミング、スプーフィング、ホールドオーバー、インテグリティを連鎖させたキャンペーンの、エンジンの実際の実行から描画GNSS が途絶える瞬間をリハーサルする:Kshana のミッションコンソール。GPS、Galileo、BeiDou、GLONASS の 102 機の衛星にわたる、ジャミング、スプーフィング、ホールドオーバー、インテグリティを連鎖させたキャンペーンの、エンジンの実際の実行から描画

GNSS が途絶える瞬間をリハーサルする#

Kshana は、GNSS(全球測位衛星システム)の信号が失われたときのジャミング、スプーフィング、時計のホールドオーバーを再現し、システムが予算の範囲内で時刻と位置をどれだけの間保てるか、そしてどの時計やセンサーが最も多くの余裕をもたらすかを示します。これは WebAssembly パッケージで、エンジン全体を JavaScript で、ブラウザーまたは Node.js で動かします。すべての実行は、シナリオ、シード、エンジンのバージョンからビット単位で再現できます。

まず何もインストールせずに試せます:Kshana Studio は、WebAssembly にコンパイルしたエンジン全体をブラウザー内で実行し、何もアップロードしません。

エビデンス#

401 件の機能のうち 176 件が、独立した外部のオラクルに対して確認済みです。221 件には正直にモデル計算のラベルを付け、4 件はパートナーの所管です。各機能は、機械でチェックされる台帳の中で一つのラベルを持ちます。VALIDATED(独立した外部のオラクルが一致している:実データ、独立した実装、または公表された参照ベクトル)、MODELLED(内部で整合しており、その旨を明示している)、PARTNER(ハードウェアパートナーが所管)です。チェックの例:AIAA(American Institute of Aeronautics and Astronautics、米国航空宇宙学会)2006-6753 の 666 個すべての SGP4(Simplified General Perturbations 4)ベクトルに対して 4.12 mm まで、Cowell 力モデルは Orekit 12.2 に対して 0.08 m まで。

機能がラベルを得る流れ:機能、オラクル、テスト、台帳のラベル。401 件すべての機能にわたる検証状況:確認済み 176 件、モデル計算 221 件、パートナー所管 4 件機能がラベルを得る流れ:機能、オラクル、テスト、台帳のラベル。401 件すべての機能にわたる検証状況:確認済み 176 件、モデル計算 221 件、パートナー所管 4 件

インストール#

npm install kshana

使い方#

このパッケージは、ブラウザー向けに構築された、WebAssembly のペイロードを持つ ES(ECMAScript、標準の JavaScript)モジュールです。一度初期化してから、エンジンを同期的に呼び出します。ブラウザーと Node.js の違いは、WebAssembly のバイナリの読み込み方だけです。

ブラウザーでは(バンドラー経由、または node_modules/kshana/ を配信するページで)、init() がモジュールの隣から kshana_bg.wasm を取得します:

import init, { run, summary, chart_svg, version } from "kshana";

await init();                                   // fetch and compile the WebAssembly binary

Node.js では、init() は TypeError: fetch failed で失敗するため(Node の fetch はローカルファイルを読めません)、バイナリをディスクから読み込んで initSync に渡します:

import { readFileSync } from "node:fs";
import { createRequire } from "node:module";
import { initSync, run, summary, chart_svg, version } from "kshana";

const wasmPath = createRequire(import.meta.url).resolve("kshana/kshana_bg.wasm");
initSync({ module: readFileSync(wasmPath) });      // compile the WebAssembly binary

Node.js 版は .mjs ファイルとして保存するか(または package.json に "type": "module" を設定して)、import が動作するようにします。そこから先は両者とも同じです:

// A complete scenario, not a sketch: scenarios/clock-holdover.toml without its comment
// lines. It runs 2 h, 10 min of GNSS then about 1.8 h with GNSS denied, and asks how long
// a strontium optical clock and a chip-scale atomic clock (CSAC) each hold time to within
// 20 ns. sigma_y(1s) is a clock's Allan deviation at an averaging time of one second;
// q_wf, the white-frequency-noise intensity, is its square.
const toml = `
seed = 42
threshold_ns = 20.0

[time]
step_s = 10.0
duration_s = 7200.0

[gnss]
windows = [
  { t0 = 0.0,    t1 = 600.0,  state = "nominal" },
  { t0 = 600.0,  t1 = 7200.0, state = "denied" },
]

[clock_quantum]
id = "optical-sr-lattice"
provenance = "Strontium optical lattice clock, space-oriented goal sigma_y(1s)=1e-15 (Origlia/Schiller/Bongs et al., arXiv:1503.08457); q_wf=sigma_y(1s)^2; ground-demonstrator maturity, not flown; flicker/aging not modeled"
y0   = 5.0e-17
q_wf = 1.0e-30
q_rw = 0.0

[clock_classical]
id = "csac-sa45s"
provenance = "Microchip SA65 / SA.45s CSAC datasheet sigma_y(1s)=3e-10; q_wf=sigma_y(1s)^2; flicker/aging not modeled"
y0   = 5.0e-10
q_wf = 9.0e-20
q_rw = 0.0
`;

const result = JSON.parse(run(toml));           // the full result document
// timing_p95_ns: the 95th-percentile timing error over the GNSS outage, in nanoseconds
console.log(version(), result.classical.fom.timing_p95_ns);

console.log(summary(toml));                     // the one-line result string
const svg = chart_svg(toml);                    // the same chart the command-line interface (CLI) writes

TypeScript は型付きの結果を認識します:run_typed(toml) は RunOutput(json、svg、summary、csv: string | null、data: ResultDocument)を返し、scenario_kinds() は、name がすべての種別の ScenarioKind ユニオンである KindMeta[] を返し、error_kind() は ErrorKind(成功時は "")を返します。各結果ドキュメント自身のフィールドは種別ごとに異なります。ResultDocument は共有のエンベロープ(schema_version、engine_version、そして FieldUnit からなる units ブロック)を型付けします。

import { run_typed, scenario_kinds, type ScenarioKind } from "kshana";

const out = run_typed(toml);
const units = out.data.units;                                // Record<string, FieldUnit>
const kinds: ScenarioKind[] = scenario_kinds().map((k) => k.name);

さらに四つの関数が、エンジンをフロントエンドに説明します。kind_modules() は、種別から、その検証マトリクスの行が挙げるモジュールへの JSON オブジェクトを返し、field_importance() は、種別から、その問いに答える結果フィールドへの JSON オブジェクトを返し(表示用メタデータであり、エンジンは決して読みません)、iq_signals() は iq_run_short が受け付ける信号名を返し、iq_run_short(fs_hz, duration_s, signal, ids, dopplers_hz, cn0_dbhz, seed) は、メモリ上で捕捉と追跡を行う短い合成 IQ シーンを返します(最大 0.25 s、1,000,000 サンプル、8 機の衛星)。答えはネイティブビルドと同じです。

import { list_examples, get_example, export_scenario, animate_scenario } from "kshana";

const names = JSON.parse(list_examples("")).scenarios.map((s) => s.name);   // the bundled scenarios
const toml = get_example("orbit-gnss-challenged");                           // its TOML, byte for byte
const czml = JSON.parse(export_scenario(toml, "czml")).files[0].content;      // a CZML file, in memory
const player = JSON.parse(animate_scenario(toml, "html", 0, NaN, 0)).files;   // {name: html text}

WebAssembly 側では、すべてのエントリーポイントが別々の呼び出しです:run(結果ドキュメントを JSON 文字列で)、summary、chart_svg、table_csv(シナリオの CSV(カンマ区切り値)の表を文字列で、表を公開しない種別では undefined;無効なシナリオでは例外を投げる)、run_all(エンジンの一回の実行で {json, svg, summary, csv} を JSON 文字列で返す — 出力が一つより多く必要な場合に使います。他のすべての呼び出しは、その都度シナリオを最初から実行するためです)、run_typed(同じ出力を一つの型付きオブジェクトとして返し、ドキュメントは data として解析済み)、version、list_kinds / scenario_kinds / error_kind(内省;scenario_kinds は解析済みの一覧を返す)、encode_permalink / decode_permalink — Kshana Studio がシナリオ全体をアドレスバーのフラグメントで往復させるために使う、共有リンク(URL、統一資源位置指定子)のコーデック — と、export_sp3 / export_omm / export_oem、すなわち CLI が書き出す SP3-c(Standard Product 3 形式のリビジョン c)と CCSDS(宇宙データシステム諮問委員会)のエフェメリス成果物 — OMM(Orbit Mean-elements Message)と OEM(Orbit Ephemeris Message)— と、receiver_trust(receiver-trust シナリオで記述された実際の受信機ログを評価し、{json, csv, svg, summary} を JSON 文字列で返す。ブラウザーにはファイルシステムがないため、ログと航法ファイルはシナリオ内に text または base64 としてインラインで置く必要があり、[platform] kind = "vessel" テーブルは海事のモニターと 0-100 の信頼スコアを追加する。助言のみ)、export_formats / export_scenario(シナリオがどの相互運用形式に対応するかを、実行せずに返すものと、メモリ上での一回のエクスポート:czml、kml、geojson、stk、または sigmf を JSON の {format, spec_url, files} として、同じシナリオではバイト単位で同一、何もアップロードしない)、import_route(GeoJSON の航路をウェイポイント航跡のシナリオに書き込む、コマンドラインの --import-route に相当)、animate_scenario(実行の時系列をアニメーション SVG、単一の HTML プレーヤー、または SVG フレームとして)、list_examples / get_example(同梱の参照シナリオとその TOML)、evidence_attach_timestamp(RFC 3161 のトークンをメモリ上でエビデンスパックに結び付ける;パックは引き続き検証に通る必要があり、タイムスタンプ局の署名は検査しない)、osnma_verify(I/NAV ページファイルまたは UBX ストリームが、どの衛星の Galileo 航法データを認証するかを、信頼するマークルルートまたは公開鍵と、任意の独立した参照時刻とともに返す;データを認証するものであり、スプーフィング対策の性能は主張しない;何もアップロードしない)、receiver_trust_replay(限られた NMEA の抜粋を、ライブモードと同じ方法で採点する;ゲートなし)、assess_vessel_log(船舶の NMEA ログをバッチ実行として)、trust_telemetry(信頼ストリームまたは結果を Prometheus テキスト、CEF または LEEF の syslog 行、または OTLP ペイロードとして;何も送信しない)、evidence_verify(署名付きのエビデンスパックを検査する;何もアップロードしない;パックは CLI、Python、MCP で作成する)、bench_export(シナリオの運動とイベントを、実験室のシミュレーター向けのテキストとして;信号は書き出さない)、compliance_report と compliance_mapping(結果ドキュメントが、公的なフレームワークのどの要求事項の行の証拠を裏付けるかを、各行のギャップとともに返す;フレームワークの要件を満たしたという所見ではない)、interference_map(ADS-B または AIS の CSV テキストを、UTC の日ごとに kshana-interference-map/v1 の GeoJSON に;集計のみ)、route_exposure(それらのマップの劣化したセルを経由する航路の割合;予報ではない)、nmea_training(乗組員の訓練のための、合成のブリッジ NMEA と教官ログ;テキストのみで、船舶の実際の航法システムには決して使わない)、そして、建物、岸壁、地形が空の一部を遮るとき、観測地点がどの衛星を見るかを、DOP(精度低下率)、水平誤差楕円、シード付きのモンテカルロ点群、SVG テキストのスカイプロットとともに返す、スカイジオメトリ関数 sky_geometry、sky_monte_carlo、skyline_presets、skyline_profile、skyplot_svg(可視性の判定と楕円は独立したライブラリと照合して確認済み;プリセットは測量ではなく代表的な幾何であり、スカイラインは見通し線上の衛星を取り除くだけで、それ以上のことはしない)です。ブラウザー版にないもの:ゲートと TCP リスナーを備えた receiver-trust live、ストリーム配信される訓練用 NMEA、テレメトリのエクスポーター(Prometheus、OpenTelemetry、syslog)は、長時間稼働するネットワークプロセスであり、コマンドラインツールに残ります;エビデンスパックの作成には署名鍵が必要であり、これは CLI または Python の側にあります。ここには一回の呼び出しで済む run_full はなく、その束縛は Python の wheel にのみ存在します。

検証マトリクスのすべての機能には、外部の参照と照合して確認済み(独立した外部のオラクルに対して検査済み)、モデルから計算、パートナーが担当のいずれかのラベルが付いています。光学時計の数値は、地上のハードウェア上での宇宙向けの目標です(ストロンチウム光学時計はまだ飛行していません)。成熟度は領域ごとに一様ではありません — 地球の PNT は実データに対して、独立した外部の参照と照合して確認済みです。深宇宙と火星の航法はモデルから計算したもので、その構成要素(光行時間、惑星位置)だけが外部のオラクルと照合して確認済みです。実際のミッションの深宇宙 OD(軌道決定)はロードマップにあります。

機能#

エンジンには 92 種類のシナリオ種別があり、kshana kinds がそれらをフィールドとともに一覧表示します。0.38.0 での新規:gnss-ssv(GNSS 軌道の上、周囲、その先を飛ぶ宇宙機のための GNSS 信号)と lunar-infrastructure(航法・測地インフラとしての月の軌道と表面)で、どちらも MODELLED です。また holdover-test(ITU-T マスクに対する時刻誤差の記録)も加わりました。

  • スペクトル:ジャマーが GNSS の L バンドをバンドごとにどう占有するか。
  • 時計とタイミング:しきい値に対するホールドオーバー、時刻比較・時刻伝送、そして国際電気通信連合の標準化部門(ITU-T)のマスクに対する通信のホールドオーバー。
  • あらゆる天体の周りのコンステレーション:地球、月、火星の周りのカバレッジ、DOP(精度低下率)、可用性、そして一つのエポックにおける太陽系。
  • 低軌道の航法:信号、パスとリンク、航法メッセージ、そして融合した測位解を、段階ごとに。
  • キャンペーン:連鎖したミッション、スイープ、またはモンテカルロのアンサンブルを、一つのシナリオで。
  • レポート、アニメーション、エクスポート:すべての数値を単位とラベルとともに;実行のアニメーション描画;SP3(Standard Product 3)、CCSDS(宇宙データシステム諮問委員会)の軌道メッセージ、CZML(Cesium Language)、KML(Keyhole Markup Language)、GeoJSON、STK(Systems Tool Kit)、SigMF(Signal Metadata Format)のファイル。

アーキテクチャ#

中央にオープンなエンジンが一つあり、kshana 0.40.0 で、75 種別にわたる型付きのディスパッチを備えます。その周りにコマンドライン、Rust ライブラリ、Python、WebAssembly と Kshana Studio、MCP サーバー、Docker イメージ、JetBrains プラグインがあり、その下に Kshana Pro があります。これはオープンなエンジンに依存し、決してフォークしない独自のオーバーレイです中央にオープンなエンジンが一つあり、kshana 0.40.0 で、75 種別にわたる型付きのディスパッチを備えます。その周りにコマンドライン、Rust ライブラリ、Python、WebAssembly と Kshana Studio、MCP サーバー、Docker イメージ、JetBrains プラグインがあり、その下に Kshana Pro があります。これはオープンなエンジンに依存し、決してフォークしない独自のオーバーレイです

同じシナリオファイルは、どのサーフェスでも同じバイト列を与えます。MCP は Model Context Protocol であり、kshana-mcp によって AI(人工知能)アシスタントがエンジンを実行できます。

研究#

arXiv の六本の論文がオープンなエンジンの上に構築されており、それぞれにその背後のコマンドが付いています:arXiv:2606.22054(干渉検出器の楽観ギャップ)、arXiv:2606.24210(条件付きのタイミング保護レベル)、arXiv:2607.05415(PNT レジリエンススコアはどれだけ安定か)、arXiv:2607.02566(超長基線電波干渉計による月面局の可観測性)、arXiv:2607.06212(月の南極域の幾何と表面ビーコン)、arXiv:2610.23871(可観測性の問題としての地球・月間空間(シスルナー)航法:アーク長、グラミアンの条件、ドップラーのてこ)。研究を参照してください。

エディション#

エンジン全体は AGPL-3.0 の下で無償です。オープンなエンジンに依存し、決してフォークしない独自のオーバーレイである Kshana Pro と、カスタムの研究は、Ashforde® OÜ から契約に基づいて提供されます:contact@ashforde.org。価格の掲載はありません。docs/PRO.md を参照してください。

詳しく見る#

ライセンス#

GNU AGPL-3.0-only(GNU Affero General Public License、バージョン 3 のみ)の下で、無償かつオープンソースです。クローズドな統合向けには、Ashforde® OÜ(エストニアの非公開有限会社;OÜ = osaühing)から商用ライセンスを提供しています。LICENSING.md を参照してください。Ashforde® OÜ が専門的に開発・保守しています。