こんかいは人工衛星にまつわる
プログラミングのお話です

解説動画はこちら


 


問題

地球から約20,200 kmの高度の中軌道(MEO: Medium Earth Orbit)を
約3.9 km/秒(時速約14,000 km)で周回するGPS衛星は
1日あたりどれくらいの時間のズレが生じているでしょうか?




解説

GPS衛星では、次の2つの要因によって時間のずれが発生します
1.特殊相対性理論(速さによる時間の遅れ)
2.一般相対性理論(重力による時間の進み方の違い)

この2つのズレを計算する事で
時間のズレを求める事ができます。


相対性理論のざっくりな解説は省きます
(それでも知りたい方は動画の方を見てくださいね)


おおよそ、2つの理論から
導き出される時間のズレを求める計算方法は
以下のようになります。

スクリーンショット 2024-10-26 16.27.14

あとはこれをコードで計算してあげれば良いですね。






時間のズレを計算するコード

うまく2つの数式を定義して
計算してあげると答えが出ます。

重力定数などは
scipyで定数が有るので、それを使うと便利です。

import math
from scipy import constants

# 定数の定義
G = constants.G # 重力定数 6.67430e-11
c = constants.c # 光速 (m/s) 299792458
Earth = 5.9722 * (10**24) # 地球の質量 (kg) 5.9722e24 
R_earth = 6.371e6  # 地球の半径 (m)

# パラメータ
altitude = 20200e3  # GPS衛星の軌道高度 (約20,200 km)
satellite_speed = 3900  # 衛星の速度 (m/s)

# 衛星の軌道半径
r_satellite = R_earth + altitude

# 一般相対性理論による時間の進みの近似計算(重力ポテンシャル差)
gravitational_time_dilation = G * Earth * (1 / R_earth - 1 / r_satellite) / c**2

# 特殊相対性理論による時間の遅れの近似計算(速度)
velocity_time_dilation = satellite_speed ** 2 / (2 * c**2)

# 合計の時間のズレ(地上から見た衛星の時計のズレ、秒単位)
total_time_dilation = gravitational_time_dilation - velocity_time_dilation
total_time_dilation_per_day = total_time_dilation * 86400  # 1日あたりのズレ

print("1日あたりの時間のズレ(秒):", f'{total_time_dilation_per_day:.30f}')
print("1日あたりの時間のズレ(マイクロ秒):", f'{total_time_dilation_per_day*1000000:.30f}')
1日あたりの時間のズレ(秒): 0.000038413514669274767825320194
1日あたりの時間のズレ(マイクロ秒): 38.413514669274768209561443654820




まとめ

GPS衛星の時計は地上の時計に対して
1日あたり約38マイクロ秒進みます。

衛星の時刻が1マイクロ秒(1秒の100万分の1)ずれると
約300mの誤差が発生するらしいです・・・


人工衛星プログラミングでは
この辺りも加味してやらないといけないですね。

将来的に宇宙案件とか出てきた場合に
こういた知識が役に立つかもしれませんね

今回は人工衛星に関わる
プログラミングのお話でした。

それでは。