実際のコンステレーション TLE の使用
同梱の scenarios/orbit-sgp4-gps.toml には、すでに実際の TLE(two-line element sets、二行軌道要素)が含まれています。これは、2021-07-28 に登録された運用中の GPS(Global Positioning System)コンステレーションの Celestrak gps-ops スナップショットで、30 機の衛星を含み、strict_checksum = true が設定されています。各衛星は SGP4/SDP4(Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4)で伝搬され、これは AIAA(American Institute of Aeronautics and Astronautics)2006-6753 の公式ベクトルに対して検証済みです。同じスナップショットは tests/fixtures/celestrak/gps-ops_2021-07-28.txt として同梱されており、scripts/fetch_tles.sh で新しいものを取得できます。ここから得た幾何の数値を引用する前に、3 節をお読みください。このシナリオは各衛星をそれぞれの元期から伝搬します。
自己完結した合成データの例としては、scenarios/orbit-real-tle.toml が、GPS に似た六機の衛星を line-2 のみのレコードで与え、解析的なケプラー要素として伝搬します。また、tle ブロックを持たない orbit シナリオはすべて、ウォーカー型コンステレーションを構築します。
現在の GPS コンステレーション(または他のコンステレーション)を調べるには、新しいスナップショットを取り込みます。
1. 最新のスナップショットをダウンロードする#
Celestrak は、NORAD(North American Aerospace Defense Command)のカタログ要素セットを、少なくとも毎日更新して再配布しています。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、国際宇宙ステーション、およびその他の有人ステーション)。
このファイルは 三行ずつのレコード(名前、line 1、line 2)が続く形式です。Kshana のパーサーは名前の行を無視するため、ファイルをそのまま貼り付けられます。
2. シナリオに取り込む#
任意の orbit シナリオで、コンステレーションの 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 衛星が送信する擬似ランダム雑音コードの番号です。)
line 1 と line 2 の組は SGP4/SDP4(抗力項と深宇宙項を含む)で伝搬され、line 2 のみの場合は解析的なケプラー平均要素として扱われます。両者を混在させることもできます。
strict_checksum = true を指定すると、69 桁目の mod 10 チェックサムが誤っている行をすべて拒否します。これは新しくダウンロードしたファイルのインテグリティ(完全性)チェックとして有効です。既定値は false です。合成の教材用シナリオにはプレースホルダーのチェックサムが使われているためです。
3. 元期に関する注意:幾何の数値を引用する前にお読みください#
SGP4 は各衛星をそれぞれの TLE 元期から伝搬し、parse_propagators(src/tle.rs 内)は伝搬器のみを返すため、シナリオ時刻 t は tsince = t としてすべての衛星に個別に適用されます。これが正しい規約になるのは、ファイル内のすべての要素セットが同じ元期を共有している場合に限られます。
Celestrak のグループファイルでは、そうはなりません。ファイルは 一つの時点でダウンロードされますが、各衛星の要素セットはそれぞれの周期で更新されるため、ファイル内の元期は数日にわたって分散しています。このリポジトリに同梱されているセットでの実測値(line 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 は GPS の 5.9 周回に相当します。そのまま伝搬すると、軌道面内の位相配置が乱れます。衛星は正しい高度と傾斜角にありますが、どの一日においてもその位置にはいなかったため、そこから得られる可視衛星集合、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(advanced receiver autonomous integrity monitoring、高度な受信機自律インテグリティ監視)可用性の実行を行います。VAL(垂直アラートリミット)12 m の下では、揃えた空では GPS のみで 0.993、GPS+Galileo のプール運用で 1.000、コンステレーション故障に頑健な二重運用で 0.990 となります。一方、衛星ごとの元期という揃えない規約では、同じ入力に対して 0.208、0.671、0.031 となり、小さな誤差ではなく、異なる結論になります。
関連項目#
README.md— orbit シナリオ。SCENARIOS.md—orbit種別のフィールド。integrity、gnss-sim、jamming、constellation-designの各種別は同じconstellationテーブルを取り、ephemerisは単一のtleを取ります。INTEGRITY.md— 実際の空のテストが駆動する ARAIM エンジン。src/tle.rs— パーサー(parse_propagators、ParseOpts { strict_checksum })。