人工衛星の軌道について想像したことがある人は極めて少ないと思います。
実は人工衛星の軌道は、綺麗な円軌道を描いているわけではなく、実際には楕円軌道を描いています。この楕円軌道は数学的に正確に表現することができ、ケプラー要素(Keplerian Elements)と呼ばれる6つまたは7つのパラメータで定義されます。
本記事の内容
- 人工衛星の軌道の7要素
- 各軌道要素の物理的意味と幾何学的解釈
- ケプラーの法則との関係
- Pythonでの軌道計算と可視化
前提: ケプラーの法則
人工衛星の軌道はケプラーの3法則に従います。
第1法則(楕円軌道の法則): 惑星(衛星)の軌道は、中心天体(地球)を1つの焦点とする楕円である。
第2法則(面積速度一定の法則): 衛星と地球中心を結ぶ線分が単位時間に掃く面積は一定である。
$$ \frac{dA}{dt} = \frac{h}{2} = \text{const.} $$
ここで $h$ は軌道角運動量の大きさです。
第3法則(調和の法則): 軌道周期の2乗は軌道長半径の3乗に比例する。
$$ T^2 = \frac{4\pi^2}{\mu} a^3 $$
ここで $\mu = GM_E = 3.986 \times 10^{14} \, \text{m}^3/\text{s}^2$ です。
人工衛星の軌道の7要素
人工衛星の軌道を完全に記述する7つのパラメータは以下の通りです。
- 元期 (Epoch)
- 軌道長半径 (Semimajor axis, $a$)
- 離心率 (Eccentricity, $e$)
- 軌道傾斜角 (Inclination, $i$)
- 昇交点赤経 (RAAN, $\Omega$)
- 近地点引数 (Argument of Perigee, $\omega$)
- 平均近点角 (Mean Anomaly, $M$)
最初の2つ($a$, $e$)が楕円の形状を決め、次の2つ($i$, $\Omega$)が軌道面の向きを決め、$\omega$ が軌道面内での楕円の向きを決め、$M$ が衛星の位置を決めます。
元期(Epoch)
元期は、指定した軌道パラメータが有効な基準時刻のことです。軌道要素は摂動の影響で時間とともに変化するため、「いつの時点の軌道か」を明示する必要があります。
軌道長半径(Semimajor Axis, $a$)
楕円軌道の長軸方向の半径です。軌道のエネルギーと直結しています。
$$ E = -\frac{\mu}{2a} $$
軌道長半径が大きいほど軌道エネルギーが高く、軌道周期も長くなります。
円軌道の場合、$a$ は軌道半径そのものです。地球の半径 $R_E = 6378$ km とすると、軌道高度 $h$ との関係は、
$$ a = R_E + h $$
離心率(Eccentricity, $e$)
楕円の扁平さを表すパラメータです。
$$ e = \frac{r_a – r_p}{r_a + r_p} $$
ここで $r_a$ は遠地点距離、$r_p$ は近地点距離です。
| $e$ の値 | 軌道の形状 |
|---|---|
| $e = 0$ | 円軌道 |
| $0 < e < 1$ | 楕円軌道 |
| $e = 1$ | 放物線軌道 |
| $e > 1$ | 双曲線軌道 |
近地点距離と遠地点距離は以下で計算できます。
$$ r_p = a(1 – e), \quad r_a = a(1 + e) $$
軌道傾斜角(Inclination, $i$)
軌道面と赤道面のなす角度です。$0° \leq i \leq 180°$ の範囲を取ります。
| $i$ の値 | 軌道のタイプ |
|---|---|
| $i = 0°$ | 赤道軌道 |
| $i = 90°$ | 極軌道 |
| $i < 90°$ | 順行軌道(prograde) |
| $i > 90°$ | 逆行軌道(retrograde) |
| $i \approx 98°$ | 太陽同期軌道 |
昇交点赤経(RAAN, $\Omega$)
軌道面と赤道面の交線のうち、衛星が南から北へ通過する点(昇交点)の方向を、春分点からの角度で表します。$\Omega$ が定まることで、地球に対する軌道面の向きが一意に決まります。
近地点引数(Argument of Perigee, $\omega$)
昇交点から近地点方向までの角度です。軌道面内での楕円の向きを規定します。
平均近点角(Mean Anomaly, $M$)
近地点を基準とした衛星の位置を表す角度です。実際の角度(真近点角 $\nu$)とは異なり、等速円運動を仮定した仮想的な角度です。
$$ M = M_0 + n(t – t_0) $$
ここで $n = \sqrt{\mu/a^3}$ は平均運動、$M_0$ は元期における平均近点角です。
ケプラー方程式
平均近点角 $M$ から衛星の実際の位置を求めるには、離心近点角 $E$ を介します。
$$ M = E – e \sin E $$
これがケプラー方程式です。$M$ が与えられたとき $E$ を求めるのは超越方程式の求解問題であり、ニュートン法などの数値解法が必要です。
真近点角 $\nu$ は離心近点角 $E$ から次の式で求められます。
$$ \tan\frac{\nu}{2} = \sqrt{\frac{1+e}{1-e}} \tan\frac{E}{2} $$
Pythonでの軌道計算と可視化
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def solve_kepler(M, e, tol=1e-10):
"""ケプラー方程式をニュートン法で解く"""
E = M # 初期値
for _ in range(100):
dE = (E - e * np.sin(E) - M) / (1 - e * np.cos(E))
E -= dE
if np.all(np.abs(dE) < tol):
break
return E
def orbital_elements_to_position(a, e, i, omega_big, omega_small, M, mu=3.986e14):
"""軌道要素からECI座標系での位置を計算"""
# ケプラー方程式を解く
E = solve_kepler(M, e)
# 真近点角
nu = 2 * np.arctan2(np.sqrt(1+e) * np.sin(E/2),
np.sqrt(1-e) * np.cos(E/2))
# 軌道面内の距離
r = a * (1 - e * np.cos(E))
# 軌道面内の座標
x_orb = r * np.cos(nu)
y_orb = r * np.sin(nu)
# ECI座標系への変換(回転行列)
cos_O = np.cos(omega_big)
sin_O = np.sin(omega_big)
cos_w = np.cos(omega_small)
sin_w = np.sin(omega_small)
cos_i = np.cos(i)
sin_i = np.sin(i)
x = (cos_O*cos_w - sin_O*sin_w*cos_i)*x_orb + \
(-cos_O*sin_w - sin_O*cos_w*cos_i)*y_orb
y = (sin_O*cos_w + cos_O*sin_w*cos_i)*x_orb + \
(-sin_O*sin_w + cos_O*cos_w*cos_i)*y_orb
z = (sin_w*sin_i)*x_orb + (cos_w*sin_i)*y_orb
return x, y, z
# 軌道パラメータの例(ISSに近い軌道)
Re = 6378.137e3 # 地球半径 [m]
a = Re + 408e3 # 軌道長半径(高度408km)
e = 0.0007 # 離心率(ほぼ円軌道)
i = np.radians(51.6) # 軌道傾斜角
omega_big = np.radians(30) # 昇交点赤経
omega_small = np.radians(60) # 近地点引数
# 1周回分の軌道を計算
M_array = np.linspace(0, 2*np.pi, 1000)
x_orb, y_orb, z_orb = orbital_elements_to_position(
a, e, i, omega_big, omega_small, M_array)
# 可視化
fig = plt.figure(figsize=(14, 6))
# 3D軌道
ax1 = fig.add_subplot(121, projection='3d')
# 地球(球)
u = np.linspace(0, 2 * np.pi, 50)
v = np.linspace(0, np.pi, 50)
x_earth = Re * np.outer(np.cos(u), np.sin(v))
y_earth = Re * np.outer(np.sin(u), np.sin(v))
z_earth = Re * np.outer(np.ones_like(u), np.cos(v))
ax1.plot_surface(x_earth, y_earth, z_earth, alpha=0.3, color='blue')
# 軌道
ax1.plot(x_orb, y_orb, z_orb, 'r-', linewidth=2, label='Orbit')
ax1.scatter(x_orb[0], y_orb[0], z_orb[0], c='green', s=100, label='Start')
ax1.set_xlabel('X [m]')
ax1.set_ylabel('Y [m]')
ax1.set_zlabel('Z [m]')
ax1.set_title('Satellite Orbit in ECI Frame')
ax1.legend()
# 離心率と軌道形状の関係
ax2 = fig.add_subplot(122)
nu = np.linspace(0, 2*np.pi, 500)
for e_val in [0.0, 0.2, 0.5, 0.7, 0.9]:
r = a * (1 - e_val**2) / (1 + e_val * np.cos(nu))
x_plot = r * np.cos(nu) / Re
y_plot = r * np.sin(nu) / Re
ax2.plot(x_plot, y_plot, label=f'e = {e_val}')
ax2.scatter(0, 0, c='blue', s=100, zorder=5, label='Earth')
ax2.set_xlabel('x [Earth Radii]')
ax2.set_ylabel('y [Earth Radii]')
ax2.set_title('Orbit Shape vs Eccentricity')
ax2.legend()
ax2.set_aspect('equal')
ax2.grid(True)
plt.tight_layout()
plt.show()
# 軌道パラメータの表示
mu = 3.986e14
T = 2 * np.pi * np.sqrt(a**3 / mu)
print(f"=== 軌道パラメータ ===")
print(f"軌道長半径 a = {a/1e3:.1f} km")
print(f"離心率 e = {e}")
print(f"軌道傾斜角 i = {np.degrees(i):.1f} deg")
print(f"軌道周期 T = {T/60:.1f} min")
print(f"近地点高度 = {a*(1-e)/1e3 - Re/1e3:.1f} km")
print(f"遠地点高度 = {a*(1+e)/1e3 - Re/1e3:.1f} km")
まとめ
本記事では、人工衛星の軌道要素について解説しました。
- 軌道要素は7つのパラメータ($a, e, i, \Omega, \omega, M$, 元期)で軌道を完全に記述する
- $a$ と $e$ が楕円の形状、$i$ と $\Omega$ が軌道面の向き、$\omega$ が面内の楕円の向き、$M$ が衛星の位置を決める
- ケプラー方程式 $M = E – e\sin E$ により、平均近点角から衛星の実際の位置が求まる
- 回転行列を用いて軌道面内座標からECI座標系へ変換できる
次のステップとして、以下の記事も参考にしてください。