Kshana · क्षण · 精确的一瞬
一款开源的PNT(定位、导航与授时)韧性仿真器。
发布版本v0.40.0 401项能力中有176项已对照独立的外部参考基准(oracle)验证 行覆盖率约95%,持续集成中的门槛为85% 许可证:仅AGPL-3.0,或商业许可证 DOI 10.5281/zenodo.20528627
预演GNSS失效的那一分钟#
Kshana重放GNSS(全球导航卫星系统)信号失效时的压制干扰、欺骗干扰和时钟守时(holdover),并告诉你一个系统能在预算内保持授时和定位多久,以及哪种时钟或传感器能带来最大的裕量。这是Rust crate:作为库的引擎,以及kshana命令。每次运行都可由场景、随机种子和引擎版本逐位复现。
无需安装即可先试用:Kshana Studio在你的浏览器中运行整个引擎,已编译为WebAssembly,不上传任何内容。
证据#
401项能力中有176项已对照独立的外部参考基准(oracle)验证;221项如实标注为已建模,4项由合作方负责。每项能力在经机器核对的台账中带有一个标签:VALIDATED(独立的外部参考基准(oracle)一致:真实数据、独立实现或已发布的参考向量)、MODELLED(内部自洽,并明确说明)或PARTNER(由硬件合作方负责)。核对项包括:AIAA(美国航空航天学会)2006-6753的全部666个SGP4(简化通用摄动4)向量,一致至4.12 mm,以及Cowell力模型对照Orekit 12.2一致至0.08 m。
安装#
cargo add kshana # use the engine as a library
cargo install kshana # or install the command-line interface (CLI)
用法:库#
该示例是一个完整的程序:它自带以TOML(Tom的显而易见的最小语言)编写的场景,因此在cargo add kshana之后,可在全新的cargo new项目中作为src/main.rs运行,磁盘上无需任何其他文件。
use kshana::api;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 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.
let toml = r#"
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
"#;
let out = api::run_toml(toml)?; // RunOutput { json, svg, summary, csv }
println!("{}", out.summary); // the one-line result string
std::fs::write("clock-holdover.result.json", &out.json)?; // the full result document
Ok(())
}
out.json是JSON(JavaScript对象表示法)格式的结果文档,out.svg是SVG(可缩放矢量图形)格式的图表,而对于发布表格的类型,out.csv是CSV(逗号分隔值)格式的该表格。
API参考,由src/api.rs生成#
引擎v0.40.0中kshana::api的每个公共函数,均在构建时从源代码读取。
| 函数 | 签名 | 作用 |
|---|---|---|
kshana::api::without_figure_tiers | (json: &str) -> Option<String> | 移除了末尾figure_tiers块的json,与该块出现之前的文档逐字节一致;若文档没有这样的块,或其中的这个块不是最后一个键,则返回None(本crate从不输出这种情形,因此调用方应将其视为失败,而不是剥离自己无法解释的内容)。 |
kshana::api::list_scenario_kinds | () -> Vec<ScenarioMeta> | 列出每个内置场景类型及其元数据。 |
kshana::api::list_scenario_kinds_json | () -> String | 以JSON数组形式给出的内置场景类型及其元数据,即语言绑定为程序化自省所提供的形式。 |
kshana::api::kind_description_in | (lang: &crate::i18n::Lang, kind: &str) -> Option<String> | 内置场景类型kind在语言lang下的描述,来自目录(该语言没有其翻译时为英文);对不是内置类型的名称返回None。 |
kshana::api::kind_description | (kind: &str) -> Option<String> | [kind_description_in],使用当前语言([crate::i18n::current])。 |
kshana::api::list_scenario_kinds_json_lang | (lang: &str) -> Result<String, String> | [list_scenario_kinds_json],每条描述使用语言lang(--lang接受的标签,如de或zh-Hans);名称和字段列表在每种语言中相同,对于英文,该文档与[list_scenario_kinds_json]逐字节一致。 |
kshana::api::kind_modules_json | () -> String | 作为JSON对象的 [KIND_MODULES],由类型映射到模块名数组,按表中顺序排列。 |
kshana::api::field_importance_json | () -> String | 作为JSON的 [HEADLINE_FIELDS]:{kind: {"headline": [path, ...]}},按表中顺序排列。 |
kshana::api::scenarios_reference_md | () -> String | 将内置场景类型目录渲染为独立的Markdown参考文档(docs/SCENARIOS.md):每个可调度的类型,附其一行描述及其必需/可选的TOML字段。 |
kshana::api::validate_scenario | (src: &str) -> Vec<String> | 依据本crate自身的自省来检查场景TOML,并返回问题列表,使调用方能在(可能很长的)运行开始之前就得知问题所在,而不是在运行后期才遇到失败。 |
kshana::api::export_sp3 | (src: &str) -> Result<String, String> | 将轨道/星座场景所传播的星座导出为SP3-c文本。 |
kshana::api::auto_export_sp3 | (src: &str) -> Result<Option<String>, String> | 若src是设置了export_sp3 = true的轨道场景,则返回其SP3-c文本;否则返回None。 |
kshana::api::export_omm | (src: &str) -> Result<String, String> | 将轨道场景的TLE平均根数导出为CCSDS OMM目录:每颗由TLE定义的卫星一条OMM(轨道平均根数电文),采用KVN形式,带有取自每个TLE的真实NORAD目录编号、COSPAR标识符和历元。 |
kshana::api::auto_export_omm | (src: &str) -> Result<Option<String>, String> | 若src是设置了export_omm = true的轨道场景,则返回其OMM目录文本;否则返回None。 |
kshana::api::export_oem | (src: &str) -> Result<String, String> | 将轨道场景所传播的星座导出为CCSDS OEM文本:即惯性系(TEME)状态时间序列,包含位置和速度,采用GMAT/Orekit/STK等飞行动力学工具所读取的航天器星历交换格式。 |
kshana::api::auto_export_oem | (src: &str) -> Result<Option<String>, String> | 若src是设置了export_oem = true的轨道场景,则返回其OEM文本;否则返回None。 |
kshana::api::inject_eop | (src: &str, finals2000a_body: &str) -> Result<String, String> | 将真实的IERS finals2000A正文内联到场景的eop_finals2000a字段中(即 --eop <file>命令行路径),并返回合并后的TOML。 |
kshana::api::with_study_meta | (json: &str, meta: &crate::report::StudyMeta) -> String | 将研究元数据块拼接进已渲染的结果JSON文档,返回在起始花括号之后立即插入了顶层“meta”键的文档。 |
kshana::api::run_scenario | (src: &str) -> Result<RunOutput, KshanaError> | 运行场景并返回带结构化错误的类型化结果;绑定调用方应优先使用这个入口,而不是返回字符串错误的 [run_toml]。 |
kshana::api::run_toml | (src: &str) -> Result<RunOutput, String> | 解析、调度并运行以TOML字符串给出的场景。 |
kshana::api::run_toml_lang | (src: &str, lang: &str) -> Result<RunOutput, String> | 为使用语言lang的用户运行[run_toml](标签如de、pt-BR、zh-Hans、en-XA)。 |
kshana::api::run_toml_bilingual | (src: &str, lang: &str) -> Result<(RunOutput, Option<RunOutput>), String> | [run_toml_lang]的两次运行分开保存:英文运行,其json和csv为机器文件;对于其他语言,则是用该语言运行的结果,供人阅读的一切内容都出自它。 |
kshana::api::run_toml_human | (src: &str, lang: &str) -> Result<HumanOutput, String> | [run_toml_bilingual]的第二遍单独执行:用语言lang将场景运行一次,只返回供人阅读的内容。 |
kshana::api::run_scenario_lang | (src: &str, lang: &str) -> Result<RunOutput, KshanaError> | 为使用语言lang的用户运行[run_scenario];见[run_toml_lang]。 |
kshana::api::error_info_json | (src: &str, lang: &str) -> String | 用语言lang运行src,如果失败,则把失败描述为一个JSON对象{"kind": <kind_tag>, "code": <稳定代码或null>, "message": <该语言的文本>}。 |
kshana::api::without_evidence | (json: &str) -> String | 去掉证据标签([crate::evidence_label])的json;若不带标签则保持不变。 |
kshana::api::without_evidence_labels | (mut out: RunOutput) -> RunOutput | 从其JSON、SVG和CSV中去掉证据标签的out,与标签出现之前该次运行生成的内容逐字节一致;不带标签的输出保持不变。 |
kshana::api::run_toml_untiered | (src: &str) -> Result<RunOutput, String> | 不带 [run_toml_inner] 所追加的各类型figure_tiers块(RM-04)的 [run_toml]:用于其文档嵌入在另一类型结果中的运行(测评活动成员),使外层文档保持其字节不变。 |
kshana::api::append_figure_tiers | (json: &str, block: &serde_json::Value) -> Result<String, String> | 把block作为其最后一个键figure_tiers追加后的json,与Documented包装器所序列化的结果逐字节一致:两空格的美化打印,该块嵌套一层。 |
本crate中的交换格式:CCSDS跟踪数据电文(TDM)的解析器与写入器(kshana::ccsds_tdm);Kshana交换格式(KIF)(kshana::interchange)。
用法:命令行#
通过包注册表安装时没有scenarios/目录,因此命令行界面自带参考场景;kshana example会列出它们,并说明少数未包含者及原因(每个只读取随代码仓库提供的数据,或遵循某个发布版本可能不提供的预设)。
kshana example clock-holdover > clock-holdover.toml # write a bundled scenario to a file
kshana clock-holdover.toml # run it
kshana --validate clock-holdover.toml # lint it without running
kshana example # list every bundled scenario
kshana kinds # list every scenario kind
kshana example orbit-sgp4-gps > orbit-sgp4-gps.toml # the GPS constellation, real orbital elements
kshana orbit-sgp4-gps.toml --export list # which exchange formats apply
kshana orbit-sgp4-gps.toml --export all # every exchange file that applies
kshana orbit-sgp4-gps.toml --animate html # a self-contained animation page
一次运行依据场景的kind调度,并在场景文件旁写出<scenario>.result.json、.chart.svg、.report.html(HTML(超文本标记语言)格式的可打印报告页)和.report.json(同一份报告,机器可读),对于发布表格的类型还会写出.table.csv。--export会增加交换文件:供地球仪查看器使用的CZML(Cesium语言)和KML(Keyhole标记语言),供地图使用的GeoJSON,STK(系统工具包)星历文件,以及spectrum类型的SigMF(信号元数据格式)录制文件。--animate会增加SVG、HTML或逐帧动画。
在代码仓库的克隆中,同样的命令可直接使用scenarios/下的文件,包括多场景研究(kshana --study scenarios/quantum-pnt-demonstrator.suite.toml)和lunar-llr-datum,后者是唯一读取真实激光测距数据的场景,该数据仅随代码仓库提供。
验证矩阵中的每项能力都被标为已与外部参考核对(对照独立的外部基准(oracle)核对)、由模型计算得出或由合作方负责;光钟的数字是在地面硬件上的空间目标(尚无锶光钟上过天)。各领域的成熟度并不一致——地球PNT已对照真实数据核对;深空和火星导航是由模型计算得出的,只有其构件(光行时、行星位置)已对照外部基准(oracle)核对;真实任务的深空OD(定轨)还在路线图上。
能力#
引擎有92种场景类型;kshana kinds列出它们及其字段。0.38.0中新增:gnss-ssv(针对在GNSS轨道之上、周围和以外的航天器的GNSS信号)和lunar-infrastructure(作为导航与大地测量基础设施的月球轨道与月面),均为MODELLED,以及holdover-test(对照ITU-T模板的时间误差记录)。
- 频谱:干扰源如何逐个频段占据GNSS的L频段。
- 时钟与授时:对照阈值的守时、时间传递,以及对照国际电信联盟标准化部门(ITU-T)模板的电信守时。
- 围绕任意天体的星座:围绕地球、月球或火星的覆盖、精度因子和可用性,以及某一历元的太阳系。
- 低地球轨道导航:信号、过境和链路、导航电文,以及逐阶段给出的融合定位结果。
- Campaign:在一个场景中进行串联任务、扫描或蒙特卡罗系综。
- 报告、动画与导出:每个数字都带单位和标签;运行的动画图;SP3(标准产品3)、CCSDS(空间数据系统咨询委员会)轨道消息、CZML(Cesium语言)、KML(Keyhole标记语言)、GeoJSON、STK(系统工具包)和SigMF(信号元数据格式)文件。
- 船舶GNSS信任度(
receiver_trust,包括receiver_trust::live):依据接收机的NMEA(实时或来自日志)给出带理由的0-100分;咨询性,不是经型式认可的导航设备。 - 证据包(
evidence):对某一日志窗口的签名技术记录,可离线验证。 - 信任度遥测(
telemetry):以Prometheus指标、SIEM事件和可选的OpenTelemetry形式给出的信任度数据流。 - 训练数据流(
nmea_synth):带有预设压制干扰和欺骗干扰以及教员日志的合成驾驶台NMEA。仅限文本;绝不用于船舶的实际导航系统。 - 干扰地图(
interference_map):汇总的导航降级地图和航线暴露情况。 - Test bench与compliance映射(
interop::testbench、compliance):供实验室GNSS模拟器使用的场景载体运动和事件,以及依据结果文档填写的公开框架映射。 - GNSS IQ实验室(
iq):针对录制的和合成的IQ的场景、捕获、跟踪、监测器和测评活动。
架构#
同一场景文件在每个界面上给出相同的字节。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(作为可观测性问题的地月空间导航:弧长、Gramian条件数和多普勒杠杆)。参见研究。
版本#
整个引擎依AGPL-3.0免费提供。Kshana Pro是一个依赖开放引擎、且从不分叉它的专有叠加层,它和定制研究可通过合同从Ashforde® OÜ 获得:contact@ashforde.org。不列价格;参见docs/PRO.md。
了解更多#
- 完整的README → https://github.com/AshfordeOU/kshana
- Kshana Studio(在你浏览器中的引擎,以WebAssembly形式)→ https://kshana.dev
- 能力 → docs/CAPABILITY.md
- 验证与出处 → docs/VALIDATION.md · docs/PROVENANCE.md
- 验证矩阵 → docs/VERIFICATION-MATRIX.md
- 引用 → CITATION.cff · DOI 10.5281/zenodo.20528627
许可#
依GNU AGPL-3.0-only(GNU Affero通用公共许可证,仅第3版)免费开源。商业许可证可从Ashforde® OÜ(一家爱沙尼亚私人有限公司;OÜ = osaühing)获得,用于闭源集成;参见LICENSING.md。由Ashforde® OÜ 专业开发和维护。