ありがたいことに、北米航空宇宙防衛司令部(NORAD)が人工衛星の監視をしていて、そのデータを公開しています。そのデータを使うと、人工衛星がどこにいるかがわかるので、軌道を描くことも可能になります。
データは、TLE(Two-line elements:2行軌道要素形式)で提供されていて、次のようなデータです。
GPS BIIR-2 (PRN 13)
1 24876U 97035A 24208.16661746 .00000010 00000+0 00000+0 0 9993
2 24876 55.6808 125.6087 0081778 52.9015 307.8605 2.00565530198095
Pythonには衛星軌道計算に必要なライブラリも揃っているので、それを使えば簡単に衛星位置がわかります。
ライブラリとしては、PyEphemやSkyfieldなどがあります。Skyfieldの方が使い勝手が良さそうなので、そちらでシミュレーションしてみました。
あらかじめ、NORADのCelesTrakから、データをダウンロードしておくと便利です(データはテキスト形式)。
import skyfield.api
from skyfield.framelib import itrs
sats = skyfield.api.load.tle_file("gnss.txt")
print(len(sats))
print(sats[0])
GNSSのTLEデータを読み込み、衛星の数と最初の衛星のデータを出力してみると、
164
GPS BIIR-2 (PRN 13) catalog #24876 epoch 2024-07-26 03:59:56 UTC
3次元の位置情報を出力してみます。
from skyfield.api import load, Topos
from skyfield.api import EarthSatellite
# 衛星のTLEデータをロード
sats = load.tle_file("gnss.txt")
ts = load.timescale()
# 最初の衛星を取得
sat = sats[0]
# 指定時刻を設定(2024/7/24/0:00:00)
t = ts.utc(2024, 7, 24, 0, 0, 0)
# 指定時刻の衛星の位置を取得(Kmで表示)
position = sat.at(t).position.km
# 座標を表示
print(f"Sat Position(x, y, z): {position}")
Sat Position(x, y, z): [ 18795.29105888 -4841.92871682 -18454.39533754]
上記は、地球に固定されていない座標系から見た位置情報(GCRS:地上から電車に乗っている人を見る感じ。電車とともに人も動いている)になります。これを使えば、衛星軌道のシミュレーションが簡単にできます。以下では、GNSSのうち、日本の準天頂衛星システム「みちびき」のみを取り出してみました。ワイヤーフレームで表示した地球の周りを衛星が回っています。
これに対して、地球に固定されている座標系から見た位置情報(ECEF:外から電車と同じスピードで動いて電車に乗っている人を見る感じ。電車の位置は固定され人だけが動いている)を取得するには、以下のコードになります。
from skyfield.api import load, Topos
from skyfield.api import EarthSatellite
from skyfield.framelib import itrs
# 衛星のTLEデータをロード
sats = load.tle_file("gnss.txt")
ts = load.timescale()
# 最初の衛星を取得
sat = sats[0]
# 指定時刻を設定(2024/7/24/0:00:00)
t = ts.utc(2024, 7, 24, 0, 0, 0)
# 指定時刻の衛星の位置を取得(Kmで表示)
position = sat.at(t).frame_xyz(itrs).km
# 座標を表示
print(f"Sat Position(x, y, z): {position}")
Sat Position(x, y, z): [ 14064.46737018 13436.69522509 -18409.72368022]
8の字の軌跡を描いているのがわかります。