机器翻译,未经母语人士审校。以英文版为准。

API与集成在GitHub上编辑来源:README.crates.md

Kshana:标志,一个标示精确时刻的罗盘准星,位于字标kshana旁Kshana:标志,一个标示精确时刻的罗盘准星,位于字标kshana旁

Kshana · क्षण · 精确的一瞬
一款开源的PNT(定位、导航与授时)韧性仿真器。

发布版本v0.40.0 401项能力中有176项已对照独立的外部参考基准(oracle)验证 行覆盖率约95%,持续集成中的门槛为85% 许可证:仅AGPL-3.0,或商业许可证 DOI 10.5281/zenodo.20528627

预演GNSS失效的那一分钟:Kshana的任务控制台,取自引擎的一次真实运行,这是针对GPS、Galileo、北斗和GLONASS共102颗卫星的、串联了压制干扰、欺骗干扰、守时和完好性的campaign预演GNSS失效的那一分钟:Kshana的任务控制台,取自引擎的一次真实运行,这是针对GPS、Galileo、北斗和GLONASS共102颗卫星的、串联了压制干扰、欺骗干扰、守时和完好性的campaign

预演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。

一项能力如何赢得其标签:能力、参考基准(oracle)、测试、台账标签。全部401项能力的验证状态:176项已验证,221项已建模,4项由合作方负责一项能力如何赢得其标签:能力、参考基准(oracle)、测试、台账标签。全部401项能力的验证状态:176项已验证,221项已建模,4项由合作方负责

安装#

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的场景、捕获、跟踪、监测器和测评活动。

架构#

中心是一个开放的引擎,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(作为可观测性问题的地月空间导航:弧长、Gramian条件数和多普勒杠杆)。参见研究。

版本#

整个引擎依AGPL-3.0免费提供。Kshana Pro是一个依赖开放引擎、且从不分叉它的专有叠加层,它和定制研究可通过合同从Ashforde® OÜ 获得:contact@ashforde.org。不列价格;参见docs/PRO.md。

了解更多#

许可#

依GNU AGPL-3.0-only(GNU Affero通用公共许可证,仅第3版)免费开源。商业许可证可从Ashforde® OÜ(一家爱沙尼亚私人有限公司;OÜ = osaühing)获得,用于闭源集成;参见LICENSING.md。由Ashforde® OÜ 专业开发和维护。