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

场景在GitHub上编辑来源:docs/REAL_TLE_GUIDE.md

使用真实星座TLE

内置的scenarios/orbit-sgp4-gps.toml已带有真实TLE(两行根数):即2021-07-28编目的在役GPS(全球定位系统)星座的Celestrak gps-ops快照,共30颗卫星,并设有strict_checksum = true。每颗卫星用SGP4/SDP4(简化通用摄动4/简化深空摄动4)外推,该方法已对照官方AIAA(美国航空航天学会)2006-6753向量验证。同一份快照作为tests/fixtures/celestrak/gps-ops_2021-07-28.txt内置收录,scripts/fetch_tles.sh则获取最新快照。引用其中的几何数值之前请先阅读第3节:该场景从每颗卫星各自的历元开始外推。

若需要一个自包含的合成示例,scenarios/orbit-real-tle.toml给出六颗类GPS卫星,以单独的第2行记录表示,按解析开普勒根数外推;每个不含tle块的orbit场景都会构建一个Walker星座。

若要研究当前的GPS星座(或任何其他星座),请放入一份最新快照。

1. 下载当前快照#

Celestrak转发NORAD(北美防空航天司令部)编目的根数集,至少每日更新。GPS的获取方式:

curl -o gps-ops.txt "https://celestrak.org/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=tle"

其他有用的分组:galileo、glo-ops(GLONASS,俄罗斯全球导航卫星系统)、beidou、stations(国际空间站ISS及其他载人空间站)。

该文件是一系列三行记录(名称、第1行、第2行)。Kshana的解析器会忽略名称行,因此可以原样粘贴该文件。

2. 放入场景#

在任何轨道场景中,将星座的tle块设为该快照的内容:

[constellation]
# Paste the Celestrak gps-ops block here (name/line1/line2 triples). Two real records
# from tests/fixtures/celestrak/gps-ops_2026-06-07.txt are shown; a real block has ~30.
strict_checksum = true   # real Celestrak TLEs carry valid checksums; enforce them
tle = """
GPS BIIR-5  (PRN 22)
1 26407U 00040A   26158.26673196  .00000043  00000+0  00000+0 0  9990
2 26407  54.8526 215.5566 0121168 302.4173  18.5084  2.00557626189748
GPS BIIR-8  (PRN 16)
1 27663U 03005A   26157.61055816  .00000039  00000+0  00000+0 0  9995
2 27663  54.8837 215.3893 0147927  53.0597 289.9583  2.00561160171094
"""

(PRN是GPS卫星所播发的伪随机噪声码编号。)

第1行+第2行的一对记录用SGP4/SDP4(含阻力和深空项)外推;单独的第2行按解析开普勒平均根数处理。两者可以混用。

strict_checksum = true会拒绝任何第69列模10校验和有误的行——这是对新下载文件的一项很好的完好性检查。它默认为false,因为合成的教学场景使用占位校验和。

3. 关于历元的说明——引用几何数值之前请先阅读#

SGP4从每颗卫星各自的TLE历元开始外推,而parse_propagators(位于src/tle.rs)只返回传播器,因此场景时间t会作为tsince = t分别应用于每颗卫星。只有当文件中所有根数集共享同一历元时,这才是正确的约定。

Celestrak分组文件并不满足这一点。文件是在某一时刻下载的,但每颗卫星的根数集按各自的节奏更新,因此其中的历元分散在数天之内。对本仓库内置收录的根数集的实测(第1行,第19–32列):

测试数据 根数集 历元跨度
tests/fixtures/celestrak/gps-ops_2026-06-07.txt 32 70.6 h
tests/fixtures/celestrak/gps-ops_2021-07-28.txt 30 76.4 h
tests/fixtures/celestrak/galileo_2026-06-07.txt 33 335.7 h

70.6 h相当于5.9个GPS轨道周期。若原样外推,轨道面内的相位分布会被打乱:卫星处于正确的高度和倾角,却不在任何一天的实际位置上,因此可见卫星集、DOP(精度因子)以及据此算出的任何可用性,描述的都是一个从未存在过的星座。解析器不会为你测量这一跨度,而orbit和integrity类别也不会对齐历元:场景中的TLE块总是按各卫星自身的历元外推。

请改为这样做。将历元与传播器一并保存,选定一个参考时刻,并把每颗卫星的tsince偏移到该时刻。Tle::epoch_days_1950是公开的,因此解析循环很短;tests/igs_real_data.rs(real_gps_tle_snapshot)是本代码树中的实际示例:

use kshana::orbit::Propagator;
use kshana::sgp4::wgs72;
use kshana::tle::parse_tle;

/// TEME position (m) of one satellite at `t` seconds after the common reference
/// instant `t_ref_jd` (a Julian date), not after its own TLE epoch.
fn aligned_teme_m(line1: &str, line2: &str, t_ref_jd: f64, t: f64) -> Result<[f64; 3], String> {
    let tle = parse_tle(line1, line2)?;
    let jd_epoch = 2_433_281.5 + tle.epoch_days_1950;
    let prop = Propagator::Sgp4(Box::new(tle.to_sgp4(wgs72(), false)));
    let tsince_s = (t_ref_jd - jd_epoch) * 86_400.0 + t;
    Ok(prop.position_eci(tsince_s))
}

TEME是SGP4所用的真赤道平春分点坐标系;tests/igs_real_data.rs用teme_to_ecef将其旋转到地固坐标。

若不做对齐,请在报告该数值时予以说明:它描述的是轨道壳层,而不是真实的天空。

其影响有多大,已在tests/araim_dual_real_data.rs中测得,该测试施加同样的偏移(参考时刻:GPS+Galileo联合测试数据中最晚的历元,2026-06-07T07:21:04 UTC(协调世界时)),运行24 h的双星座ARAIM(先进接收机自主完好性监测)可用性计算。在12 m的VAL(垂直告警限值)下,对齐后的天空给出:仅GPS 0.993、GPS+Galileo联合1.000、对星座故障稳健的双星座0.990;采用未对齐的各卫星自身历元约定,同样的输入给出0.208、0.671和0.031——这是结论上的差别,而不是小误差。

另请参阅#

  • README.md——轨道场景。
  • SCENARIOS.md——orbit类别的字段;integrity、gnss-sim、jamming和constellation-design类别采用同样的constellation表,而ephemeris采用单个tle。
  • INTEGRITY.md——真实天空测试所驱动的ARAIM引擎。
  • src/tle.rs——解析器(parse_propagators、ParseOpts { strict_checksum })。