チュートリアル 1 — はじめての軌道:GPS 衛星はどこにいるか
Kind: orbit · シナリオ:scenarios/orbit-sgp4-gps.toml(教材用のコピー:scenarios/orbit.toml) · 難易度:初級 · 約 15 分
最後まで進めると、実際の運用中の GPS 衛星コンステレーションを伝播させ、その可用性とジオメトリを読み、すべての衛星が実際に宇宙のどこにいるかを示す表をエクスポートできます。そしてその表が、それ自身ではなく外部の参照に対して検証されたものであることも理解できます。
このシナリオについて#
GPS(全地球測位システム)の衛星は、ユーザーに自分がどこにいるかといま何時かを教えます。その前に、衛星がどこにいるかとユーザーがそのうち何機を見られるかを知る必要があります。それがジオメトリであり、ジオメトリは測位がどれだけ正確にできるかの下限を決めます(DOP、すなわち精度低下率)。このチュートリアルでは次のことを行います。
- GPS コンステレーションの本物の Celestrak
gps-opsスナップショット(2021-07-28、30 機の衛星、実際の two-line elements、TLE)を取得し、 - 検証済みの SGP4/SDP4 モデル(Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4)ですべての衛星を伝播させ、
- 各時間ステップで、低軌道のユーザーがどの衛星を見られるかを求め(見通し線、地球による掩蔽、5° の仰角マスク)、
- そのジオメトリを PDOP(位置の精度低下率)と位置精度に変換し、
- 衛星の実際の地球中心・地球固定(ECEF)の位置を SP3 ファイル(Standard Product 3、International GNSS Service、IGS の精密軌道フォーマット。GNSS は全球測位衛星システム)にエクスポートします。
流れは次のとおりです。TLE → SGP4 による伝播 → エポックごとの ECEF → 可視性 → 可視衛星数 → PDOP → 位置シグマ = PDOP · σ_UERE。ここで σ_UERE はユーザー等価距離誤差(衛星ごとの 1-σ の測距誤差)です。
実行する#
cargo run -- scenarios/orbit-sgp4-gps.toml
Python:
import json, kshana
result = json.loads(kshana.run(open("scenarios/orbit-sgp4-gps.toml").read()))
print(result["geometry"]["best_pdop"], result["geometry"]["best_position_sigma_m"])
あるいはブラウザー版 Studio を開いて、軌道シナリオを選んでください。
一行の要約を読む#
決定論的な実行(シード = 17)では次のように出力されます。
scenario 4c51512369a6 | 345/361 samples GNSS-nominal | best PDOP 1.07 pos 1.07m | quantum holdover 0s p95 2.59e-5ns integrity 1.000 security n/a (no attack) | classical holdover 0s p95 6.7ns integrity 1.000 security n/a (no attack)
項目ごとの説明:
scenario 4c51512369a6— 12 文字のシナリオハッシュです。これは、入力(シード、しきい値、モデルパラメーター、TLE ブロック)を正確に特定します。いずれかの入力を変えるとこれも変わり、同じに保てば実行をビット単位で再現できます。同じハッシュが、グラフのフッターと、結果の JSON(JavaScript Object Notation)ファイルにも記録されます。345/361 samples GNSS-nominal— 361 の時間ステップのうち、ユーザーが使える測位解を得ているのは 345 ステップ(95.6 %)です。この実行は 12 時間の通過(43,200 秒)を 120 秒刻みで行ったものです。best PDOP 1.07— 通過中で最良(最小)の位置の精度低下率です。PDOP が 1 に近いほどジオメトリは優れており、小さいほど良好です。pos 1.07m— 最良の位置精度です。位置シグマ = PDOP · σ_UERE。このシナリオではsigma_uere_m = 1.0のため、二つの数値はここでは数値として等しくなりますが、規則は PDOP × UERE であって、「位置 = PDOP」ではありません。UERE が 3 m であれば、位置シグマは約 3.2 m になります。(最後の落とし穴を参照してください。)- クロックの数値(
holdover、p95、integrity、security)が付いてくるのは、軌道パックが通過中のクロックも含んでいるためです。これらはチュートリアル 2 の焦点であり、このチュートリアルのものではありません。(攻撃が設定されていないため、securityはn/a (no attack)と読みます。)
JSON の geometry ブロックには、基になる数値が入っています。
"geometry": {
"samples_total": 361,
"samples_with_fix": 345,
"sigma_uere_m": 1.0,
"best_pdop": 1.0713624151805556,
"median_pdop": 2.318376881311817,
"best_position_sigma_m": 1.0713624151805556,
"median_position_sigma_m": 2.318376881311817
}
衛星はどこにいるのか?(見返り)#
ジオメトリが良好なのは、衛星が実際に GPS の殻にいるからです。それを証明するために、地球固定の位置をエクスポートします。
cargo run -- scenarios/orbit-sgp4-gps.toml --export-sp3 gps.sp3
最初のサンプルステップにおける最初の三機の衛星の位置(ECEF、単位 km)。SP3 ファイルには四番目のクロック列があり、999999.999999 の「値なし」マーカーで書かれています。
PG01 9771.575585 24612.128830 0.003744 999999.999999
PG02 20449.643959 -11875.958365 -12379.457079 999999.999999
PG03 26467.367408 45.510223 4010.411755 999999.999999
PG01 の地心距離を求めます。
|r(PG01)| = sqrt(9771.575585^2 + 24612.128830^2 + 0.003744^2) = 26480.9 km
循環しないオラクル:これは本当に GPS の軌道か#
エンジンを自分自身と照らして確認するだけのチュートリアルでは、何も証明できません。ここに、上記のすべての主張に対する、外部の循環しない拠り所があります。
1. 衛星は、実際の GPS の中軌道(MEO)の殻の上にあります。GPS の公称軌道長半径は a = 26,560 km で、高度は平均地球半径 6,378 km から約 20,180 km 上空です(IS-GPS-200、すなわち GPS のインターフェース仕様。GPS Standard Positioning Service(SPS)Performance Standard、米国国防総省(DoD)。Misra & Enge, Global Positioning System, 2nd ed.)。PG01 の瞬時の距離 26,480.9 km は、a から数百 km 以内にあります。これは、実際の GPS の離心率(約 0.005〜0.02)から生じる値そのものです。試験 tests/tutorials.rs::tutorial1_satellites_are_in_the_gps_meo_shell は、この公表された a に対して 26000 km < |r(PG01)| < 27200 km を検証しており、これは Kshana の外部にあるものです。
2. 通過の長さは GPS の一周です。ケプラーの第三法則から、a = 26,560 km と μ = 398,600.4418 km³/s²(World Geodetic System 1984、WGS-84。National Imagery and Mapping Agency の技術報告 NIMA TR8350.2)を用いて周期 T = 2π√(a³/μ) が得られます。T = 43,078 s = 11.967 h、恒星日の半分です。シナリオの継続時間 43,200 秒(「約 GPS の一周」)はこれと 0.3 % 未満の差で一致し、GPS の地上軌跡は IS-GPS-200 のとおり、恒星日ごと(二周)に繰り返されます。
3. 伝播させた位置は、自己整合的なものではなく、外部の参照と照合して確認済みです。この ECEF の表を作成した SGP4/SDP4 伝播器は、AIAA(American Institute of Aeronautics and Astronautics)2006-6753 の検証ベクトル 666 件すべてに最悪でも 4.12 mm の範囲で一致し(tests/sgp4_verification.rs、docs/SGP4-VALIDATION.md)、独立した sgp4 クレートとはサブミクロンの範囲で一致します。したがって、エクスポートした表は、Kshana 自身の演算ではなく、外部の参照実装に照らして確認されています。
SP3 の日付に関する注記。SP3 のエポックヘッダーには、プレースホルダーの暦日付(2000-01-01)が示されていますが、伝播は実際には各 TLE 自身のエポック(2021 年)から行われます。この表は、「2000 年 1 月初日の」ではなく、「最初のサンプルステップにおける ECEF の位置」として読んでください。
試験が固定するもの#
tests/tutorials.rs は、上記のすべての数値を CI の取り決めにします。
tutorial1_orbit_headline_holds—best_pdop ≈ 1.071、best_position_sigma_m == best_pdop(sigma_uere_m = 1.0のため)、samples_total == 361、そして要約には345/361が含まれます。tutorial1_satellites_are_in_the_gps_meo_shell— PG01 の距離は GPS の殻の帯域内にあり、公表されたa = 26,560 kmに照らして確認されます。
エンジンが本物の GPS の殻を作り出さなくなったら、ビルドは赤になります。
落とし穴と単位#
- 位置シグマは PDOP × UERE であり、PDOP ではありません。両者が等しいのは、ここで
sigma_uere_m = 1.0であるからにすぎません。UERE を変えると、両者は離れます。 - タイミングの数値の単位はナノ秒、位置の数値の単位はメートルです。混同しないでください。
holdover_sは格子に量子化されています(時間格子のステップでの下限)。この通過では、ユーザーはほぼ常に測位解を得ているため、ホールドオーバーは 0 秒(持ちこたえるべき途絶がない)であり、これは良いケースです。
次のステップ#
- 仰角マスク(
mask_deg)を厳しくしたり緩めたりして、可用性の変化を確認してください。これはティア 2 の演習です。 scripts/fetch_tles.shで新しい TLE スナップショットに差し替えます(ティア 2 の「新しいデータを使う」)。- 続いて チュートリアル 2 — クロックのホールドオーバーに進みます。そこでは GNSS 信号が取り去られ、搭載クロックが持ちこたえなければなりません。