使用真实星座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 })。