衛星衝突回避の理論 — 接近解析と衝突確率の計算

2009年2月10日、シベリア上空780 kmで運用中の通信衛星イリジウム33と、使用済みのロシアの軍事衛星コスモス2251が秒速約11.7 kmで衝突しました。この事故は、それまで理論的な懸念にとどまっていた宇宙のデブリ問題を現実の脅威として世界に知らしめました。衝突によって約2,000個以上の追跡可能な破片が生じ、数万個の微小破片が低軌道に散らばりました。

現在、地球軌道には約36,000個の追跡可能な(10 cm以上の)物体と、推定1億個以上の1 mm以上の破片が存在します。そしてStarlinkやOneWebなどのメガコンステレーション計画により、軌道上の衛星数は今後さらに急増します。宇宙空間の「交通量」が増えるにつれ、衝突回避(collision avoidance)は衛星運用の日常的な業務となっています。

衝突回避の理論を理解すると、以下の応用が可能になります。

  • 運用衛星の安全管理: 接近警報を受けた際に、回避マヌーバの要否を定量的に判断する
  • コンステレーション設計: 数千機の衛星を安全に運用するための軌道配置の計画
  • 宇宙交通管理: 将来の宇宙空間における交通規則やルール策定の基礎

本記事の内容

  • スペースデブリ問題の現状
  • 接近イベント(conjunction)の定義と検出
  • 最接近距離(TCA)の計算
  • 共分散行列と誤差楕円体
  • 衝突確率の計算(Alfriend法)
  • 回避マヌーバの計画
  • Pythonで2衛星の接近解析と衝突確率計算
  • ケスラーシンドローム

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

スペースデブリ問題の深刻化

デブリの現状

地球軌道環境は、1957年のスプートニク打ち上げ以来、人類が残してきた人工物で溢れています。デブリの発生源は主に以下の通りです。

  1. 使用済みロケット上段: 打ち上げ後に軌道上に残留した大型物体
  2. 運用終了衛星: ミッション後にデオービットされなかった衛星
  3. 破砕事象: 爆発(残留推進剤の暴発)や衝突による破片
  4. ミッション関連デブリ: レンズキャップ、カバー、打ち上げ時に分離した部品

2007年の中国の衛星破壊実験(ASAT試験)は単一の事象として約3,500個以上の追跡可能デブリを生成し、現在も低軌道環境を汚染し続けています。

衝突速度

低軌道(LEO)での典型的な衝突速度は10〜14 km/sです。これは銃弾の速度(約1 km/s)の10倍以上であり、1 cmの破片でも衛星を完全に破壊する破壊力を持ちます。

衝突のエネルギーは $E = \frac{1}{2}mv^2$ で決まるので、1 cm・1 gのデブリの衝突エネルギーは

$$ E = \frac{1}{2} \times 10^{-3} \times (10^4)^2 = 50{,}000 \, \text{J} = 50 \, \text{kJ} $$

これは手榴弾のエネルギーに匹敵します。宇宙空間での衝突は超高速衝撃(hypervelocity impact)であり、地上での衝突とは全く異なる破壊メカニズムが働きます。

デブリ問題がなぜこれほど深刻なのかがわかったところで、次に衝突リスクを定量的に評価するための「接近解析」の方法を見ていきましょう。

接近イベント(Conjunction)の定義と検出

接近イベントとは

接近イベント(conjunction)とは、2つの宇宙物体が互いに所定の距離以内に近づくイベントです。米国宇宙コマンド(USSPACECOM)の第18宇宙防衛隊(18 SDS)は、カタログ上の全物体の軌道を伝播し、所定のスクリーニング距離(通常5〜10 km)以内に接近する組み合わせを検出して、関係する衛星運用者に接近情報メッセージ(CDM: Conjunction Data Message)を送信します。

ISSは週に数回の接近警報を受け、そのうち年に数回は回避マヌーバを実施しています。Starlink衛星群では1日あたり数千件の接近イベントが検出されると報告されています。

スクリーニングの手順

全軌道物体の全組み合わせをチェックするのは計算量が膨大です($N$ 個の物体なら $N(N-1)/2$ 組)。実際には以下のようなフィルタリングで計算量を削減します。

第1段階: 軌道要素フィルタ — 半長軸や傾斜角が大きく異なる組み合わせは幾何学的に接近し得ないため除外します。近地点高度と遠地点高度が重ならない組み合わせも除外できます。

第2段階: 時間フィルタ — 残った組み合わせについて、軌道を粗い時間刻みで伝播し、距離が閾値以内になる可能性がある組み合わせを抽出します。

第3段階: 精密計算 — 最終的に残った組み合わせについて、精密な軌道伝播と補間により最接近時刻(TCA: Time of Closest Approach)と最接近距離を計算します。

接近イベントが検出された後は、衝突の危険性を定量的に評価する必要があります。そのための最も重要な量が「最接近距離」です。

最接近距離(TCA)の計算

相対運動の記述

2つの物体の位置ベクトルをそれぞれ $\bm{r}_1(t)$、$\bm{r}_2(t)$ とすると、相対位置ベクトルは

$$ \bm{\rho}(t) = \bm{r}_2(t) – \bm{r}_1(t) $$

最接近距離(miss distance)は $|\bm{\rho}(t)|$ の最小値です。

$$ d_{\min} = \min_t |\bm{\rho}(t)| $$

この最小値が達成される時刻が最接近時刻(TCA: Time of Closest Approach)です。

TCAの数値的な求め方

TCAを求めるには、$|\bm{\rho}(t)|^2$ を最小化する $t$ を見つけます。$|\bm{\rho}|^2$ の時間微分をゼロとおくと

$$ \frac{d}{dt}|\bm{\rho}|^2 = 2\bm{\rho} \cdot \dot{\bm{\rho}} = 0 $$

つまり、TCAでは相対位置ベクトルと相対速度ベクトルが直交します。幾何学的には、2物体がすれ違う瞬間を意味しています。

数値的には、両物体の軌道を細かい時間刻みで伝播し、$\bm{\rho} \cdot \dot{\bm{\rho}} = 0$ の条件をブラケット法やニュートン法で求めます。

接近座標系

TCA付近での2物体の相対的な幾何学を記述するために、接近座標系(encounter frame)が定義されます。最もよく使われるのは以下の座標系です。

  • 接線方向(along-track): 物体1の速度ベクトル方向
  • 法線方向(cross-track): 物体1の軌道面に垂直
  • 動径方向(radial): 上の2つに直交する方向

この座標系では、短期的な軌道不確実性の構造が直感的に理解しやすくなります。接線方向の不確実性は通常最も大きく(タイミングの不確定さに対応)、それに対して交差方向や動径方向の不確実性は比較的小さいです。

最接近距離がわかっても、それだけでは衝突リスクを評価できません。なぜなら、軌道の予測には必ず不確実性が伴うからです。次に、この不確実性を定量化する共分散行列の概念を見ていきましょう。

共分散行列と誤差楕円体

軌道決定の不確実性

衛星の軌道はレーダー追跡やGPS観測から決定されますが、観測には必ず誤差があります。この誤差は軌道予測に伝播し、衛星の「予測位置」は点ではなく確率分布(通常はガウス分布と仮定)として表されます。

衛星の状態ベクトル $\bm{x} = (x, y, z, \dot{x}, \dot{y}, \dot{z})^T$ の不確実性は、$6 \times 6$ の共分散行列 $\bm{P}$ で表されます。

$$ \bm{P} = E[(\bm{x} – \bar{\bm{x}})(\bm{x} – \bar{\bm{x}})^T] $$

ここで $\bar{\bm{x}}$ は期待値(最確推定値)です。位置の不確実性は $\bm{P}$ の左上 $3 \times 3$ ブロックで表されます。

誤差楕円体

位置の共分散行列 $\bm{P}_r$($3 \times 3$)の固有値 $\lambda_1, \lambda_2, \lambda_3$ と固有ベクトルが、誤差楕円体の形状と向きを定めます。楕円体の半軸の長さは $\sqrt{\lambda_i}$(1σ)です。

衛星の位置が3σ(99.7%信頼区間)以内にある確率楕円体の体積は

$$ V_{3\sigma} = \frac{4}{3}\pi \cdot 3\sqrt{\lambda_1} \cdot 3\sqrt{\lambda_2} \cdot 3\sqrt{\lambda_3} = 36\pi\sqrt{\lambda_1\lambda_2\lambda_3} $$

結合共分散行列

2つの物体が接近する際、それぞれの位置の不確実性を結合します。物体1の位置の共分散行列を $\bm{P}_1$、物体2の共分散行列を $\bm{P}_2$ とすると、相対位置の共分散行列は(2物体の誤差が独立と仮定して)

$$ \bm{P}_c = \bm{P}_1 + \bm{P}_2 $$

この結合共分散行列 $\bm{P}_c$ が定める誤差楕円体の中に相対位置ベクトル $\bm{\rho}$ がどの程度の確率で入るかが、衝突リスクの尺度となります。

共分散行列の概念が理解できたところで、いよいよ衝突確率の計算方法を見ていきましょう。これがconjunction assessmentの核心部分です。

衝突確率の計算

衝突の定義

衝突は、2物体の中心間距離が両物体の結合ハードボディ半径 $R_{\text{HBR}}$ 以下になったときに発生すると定義します。球体近似を使い、各物体の最大寸法から定めた球の半径の和を $R_{\text{HBR}}$ とします。

$$ R_{\text{HBR}} = R_1 + R_2 $$

典型的なGEO衛星なら $R_1 \approx 5$ m、10 cmのデブリなら $R_2 \approx 0.05$ m 程度です。

問題の2次元への縮約

TCA付近での2物体の相対速度は非常に大きい(数km/s〜十数km/s)ため、接近は事実上「一瞬」で終わります。この「短い遭遇」の仮定のもとでは、相対速度方向の不確実性は衝突確率に影響しません。なぜなら、物体は相対速度方向に沿って一直線に通り過ぎるだけだからです。

この洞察により、3次元の衝突確率問題は2次元の問題に縮約できます。具体的には、相対速度ベクトル $\dot{\bm{\rho}}$ に垂直な平面(接近平面, encounter plane, B-plane)上での問題に帰着します。

接近平面上での結合共分散行列 $\bm{C}_{2D}$($2 \times 2$)と、接近平面上での最接近距離ベクトル $\bm{d}_{2D}$ を用いて、衝突確率は次のように書けます。

$$ P_c = \frac{1}{2\pi\sqrt{\det \bm{C}_{2D}}} \iint_{x^2+y^2 \leq R_{\text{HBR}}^2} \exp\left(-\frac{1}{2}\bm{u}^T\bm{C}_{2D}^{-1}\bm{u}\right) dx\, dy $$

ここで $\bm{u} = (x, y)^T – \bm{d}_{2D}$ は接近平面上の位置ベクトルから最接近点へのオフセットです。

Alfriend/Akella法

上の2次元積分を数値的に効率よく計算する方法として、Alfriend法(Alfriend & Akella, 2000)が広く使われています。

まず、共分散行列の固有値分解で座標を主軸に変換します。

$$ \bm{C}_{2D} = \bm{V}\begin{pmatrix}\sigma_1^2 & 0 \\ 0 & \sigma_2^2\end{pmatrix}\bm{V}^T $$

変換後の座標 $(\xi, \eta)$ での最接近距離を $(\xi_0, \eta_0)$ とすると

$$ P_c = \frac{1}{2\pi\sigma_1\sigma_2}\int_0^{R_{\text{HBR}}} \int_0^{2\pi} \exp\left(-\frac{(\xi_0 + \rho\cos\theta)^2}{2\sigma_1^2} – \frac{(\eta_0 + \rho\sin\theta)^2}{2\sigma_2^2}\right)\rho\, d\theta\, d\rho $$

実装上は、この積分をガウス求積法で数値的に評価するか、Chan(2008)の級数展開で解析的に近似します。

衝突確率の閾値

衝突確率がどの値以上なら回避マヌーバを実施するかは、衛星運用者によって異なります。

組織 回避マヌーバの閾値
NASA(有人ミッション) $P_c > 10^{-5}$(イエローアラート), $P_c > 10^{-4}$(レッドアラート)
ESA $P_c > 10^{-4}$
一般的な商業衛星 $P_c > 10^{-5}$

ISS(有人宇宙船)は最も保守的な閾値を使用しており、$P_c > 10^{-5}$ でイエローアラート、$P_c > 10^{-4}$ で回避マヌーバが実施されます。

衝突確率を計算して閾値を超えた場合、回避マヌーバを計画する必要があります。次に、回避マヌーバの基本的な考え方を見ていきましょう。

回避マヌーバの計画

マヌーバのタイミングと方向

回避マヌーバは通常、TCAの数時間〜数日前に実施されます。マヌーバの方向は、接近平面上での最接近距離を効率的に増大させる方向が選ばれます。

最も一般的なアプローチは接線方向(along-track)マヌーバです。衛星の進行方向に沿って微小な $\Delta V$ を加えることで、衛星のタイミング(位相)をずらし、TCAでの接近距離を増大させます。

接線方向に $\Delta V$ を加えた場合、TCAまでの時間を $\Delta t$ とすると、接近平面上での位置のずれは概算で

$$ \delta r_{\text{along}} \approx \frac{3}{2}\frac{\Delta V}{v_c}\cdot v_c \cdot \Delta t = \frac{3}{2}\Delta V \cdot \Delta t $$

ここで因子 $3/2$ は、$\Delta V$ による半長軸の変化が平均運動(周期)の変化を引き起こし、時間とともに位相差が蓄積する効果を表しています。

マヌーバのΔV

典型的な回避マヌーバの $\Delta V$ は非常に小さく、数mm/s〜数cm/sのオーダーです。TCAの24時間前に実施する場合

$$ \Delta V \approx \frac{2}{3}\frac{\delta r}{\Delta t} $$

たとえば、最接近距離を1 km増やしたい場合、TCAの24時間前なら

$$ \Delta V \approx \frac{2}{3}\frac{1000}{86400} \approx 0.008 \, \text{m/s} = 8 \, \text{mm/s} $$

この小ささは、早期に対応すれば低コストで衝突を回避できることを示しています。逆に、TCA直前のマヌーバは大きな $\Delta V$ を必要とし、衛星の推進剤バジェットを圧迫します。

マヌーバの判断基準

回避マヌーバの実施判断は単純ではありません。以下の要因を総合的に考慮する必要があります。

  1. 衝突確率の信頼性: 共分散行列の信頼性が低い場合、計算された衝突確率自体が不確実
  2. マヌーバのコスト: 推進剤の消費はミッション寿命に直結
  3. 副次的リスク: マヌーバによって他の物体との新たな接近が生じる可能性
  4. 運用上の制約: マヌーバ実施可能な時間帯やアンテナの可視性

理論的な背景が整ったところで、Pythonでconjunction assessmentの一連の計算を実装してみましょう。

Pythonで接近解析と衝突確率計算

2衛星の接近シナリオの設定

ここでは、2つの衛星が近い軌道を周回し、接近するシナリオをシミュレーションします。

import numpy as np
from scipy.integrate import solve_ivp
from scipy.optimize import minimize_scalar
import matplotlib.pyplot as plt

# --- 定数 ---
mu = 3.986004418e14     # 地球の重力パラメータ [m^3/s^2]
R_E = 6378.137e3         # 地球半径 [m]


def kep_to_cart(a, e, i, RAAN, omega, nu):
    """ケプラー要素 → 位置・速度"""
    p = a * (1 - e**2)
    r_mag = p / (1 + e * np.cos(nu))

    r_pqw = r_mag * np.array([np.cos(nu), np.sin(nu), 0.0])
    v_pqw = np.sqrt(mu / p) * np.array([-np.sin(nu), e + np.cos(nu), 0.0])

    cO, sO = np.cos(RAAN), np.sin(RAAN)
    ci, si = np.cos(i), np.sin(i)
    cw, sw = np.cos(omega), np.sin(omega)

    R_mat = np.array([
        [cO*cw - sO*sw*ci, -cO*sw - sO*cw*ci, sO*si],
        [sO*cw + cO*sw*ci, -sO*sw + cO*cw*ci, -cO*si],
        [sw*si, cw*si, ci]
    ])

    return R_mat @ r_pqw, R_mat @ v_pqw


def two_body_eom(t, state):
    """二体問題の運動方程式"""
    r_vec = state[0:3]
    v_vec = state[3:6]
    r = np.linalg.norm(r_vec)
    a = -mu / r**3 * r_vec
    return np.concatenate([v_vec, a])

2つの衛星の初期軌道を設定します。わずかに異なる軌道要素を持たせて接近を発生させます。

# --- 衛星1: ISS風の軌道 ---
a1 = R_E + 420e3
e1 = 0.0005
i1 = np.radians(51.6)
RAAN1 = np.radians(10.0)
omega1 = np.radians(0.0)
nu1 = np.radians(0.0)

# --- 衛星2(デブリ): わずかに異なる軌道 ---
a2 = R_E + 418e3
e2 = 0.001
i2 = np.radians(97.0)      # 太陽同期軌道に近い傾斜角(交差角が大きい)
RAAN2 = np.radians(12.0)
omega2 = np.radians(5.0)
nu2 = np.radians(180.0)

# 初期状態
r1_0, v1_0 = kep_to_cart(a1, e1, i1, RAAN1, omega1, nu1)
r2_0, v2_0 = kep_to_cart(a2, e2, i2, RAAN2, omega2, nu2)

state1_0 = np.concatenate([r1_0, v1_0])
state2_0 = np.concatenate([r2_0, v2_0])

接近の検出とTCAの計算

# --- 軌道を伝播して接近を検出 ---
T_sim = 2 * 86400   # 2日間
t_eval_coarse = np.linspace(0, T_sim, 20000)

sol1 = solve_ivp(two_body_eom, (0, T_sim), state1_0,
                 method='DOP853', t_eval=t_eval_coarse,
                 rtol=1e-12, atol=1e-14)
sol2 = solve_ivp(two_body_eom, (0, T_sim), state2_0,
                 method='DOP853', t_eval=t_eval_coarse,
                 rtol=1e-12, atol=1e-14)

# 各時刻での距離を計算
distances = np.zeros(len(t_eval_coarse))
for k in range(len(t_eval_coarse)):
    dr = sol2.y[0:3, k] - sol1.y[0:3, k]
    distances[k] = np.linalg.norm(dr)

# 接近イベントの検出(距離が100 km以内)
threshold = 100e3  # 100 km
close_mask = distances < threshold
close_indices = np.where(close_mask)[0]

if len(close_indices) > 0:
    # 最も近い接近を探す
    min_idx = np.argmin(distances)
    print(f"最接近距離(粗い探索): {distances[min_idx]/1e3:.2f} km")
    print(f"最接近時刻(粗い探索): {t_eval_coarse[min_idx]/3600:.2f} hours")
else:
    print("接近イベントなし(閾値内に入りませんでした)")
    # 全体の最小距離を表示
    min_idx = np.argmin(distances)
    print(f"全体の最小距離: {distances[min_idx]/1e3:.2f} km")

TCA付近の精密計算を行います。

# --- TCA付近の精密計算 ---
def distance_at_time(t_sec):
    """時刻tでの2物体間の距離"""
    sol1_t = solve_ivp(two_body_eom, (0, t_sec), state1_0,
                       method='DOP853', t_eval=[t_sec],
                       rtol=1e-13, atol=1e-15)
    sol2_t = solve_ivp(two_body_eom, (0, t_sec), state2_0,
                       method='DOP853', t_eval=[t_sec],
                       rtol=1e-13, atol=1e-15)
    dr = sol2_t.y[0:3, 0] - sol1_t.y[0:3, 0]
    return np.linalg.norm(dr)

# 粗い探索で見つかった最接近時刻付近で精密探索
t_rough = t_eval_coarse[min_idx]
t_search_min = max(0, t_rough - 300)
t_search_max = min(T_sim, t_rough + 300)

result = minimize_scalar(distance_at_time,
                         bounds=(t_search_min, t_search_max),
                         method='bounded',
                         options={'xatol': 0.001})

t_tca = result.x
d_min = result.fun

print(f"\n=== TCA精密計算結果 ===")
print(f"TCA時刻: {t_tca:.3f} s ({t_tca/3600:.4f} hours)")
print(f"最接近距離: {d_min:.2f} m ({d_min/1e3:.4f} km)")
# --- TCAでの状態ベクトルを取得 ---
sol1_tca = solve_ivp(two_body_eom, (0, t_tca), state1_0,
                     method='DOP853', t_eval=[t_tca],
                     rtol=1e-13, atol=1e-15)
sol2_tca = solve_ivp(two_body_eom, (0, t_tca), state2_0,
                     method='DOP853', t_eval=[t_tca],
                     rtol=1e-13, atol=1e-15)

r1_tca = sol1_tca.y[0:3, 0]
v1_tca = sol1_tca.y[3:6, 0]
r2_tca = sol2_tca.y[0:3, 0]
v2_tca = sol2_tca.y[3:6, 0]

# 相対ベクトル
rho_tca = r2_tca - r1_tca
rho_dot = v2_tca - v1_tca

print(f"\n相対位置ベクトル: {rho_tca} m")
print(f"相対速度: {np.linalg.norm(rho_dot)/1e3:.2f} km/s")
print(f"最接近距離: {np.linalg.norm(rho_tca):.2f} m")

衝突確率の計算

ここでは、仮想的な共分散行列を設定して衝突確率を計算します。

def compute_collision_probability(rho_tca, rho_dot, P1_pos, P2_pos, R_HBR):
    """
    2次元Alfriend法による衝突確率の計算

    Parameters:
        rho_tca: 最接近時の相対位置ベクトル [m] (3,)
        rho_dot: 最接近時の相対速度ベクトル [m/s] (3,)
        P1_pos: 物体1の位置共分散行列 [m^2] (3,3)
        P2_pos: 物体2の位置共分散行列 [m^2] (3,3)
        R_HBR: 結合ハードボディ半径 [m]

    Returns:
        P_c: 衝突確率
    """
    # 結合共分散行列
    P_c_3d = P1_pos + P2_pos

    # 接近平面の基底ベクトル(相対速度に垂直な面)
    v_hat = rho_dot / np.linalg.norm(rho_dot)

    # 接近平面の基底を構築
    # v_hat に垂直な2つのベクトルを見つける
    if abs(v_hat[0]) < 0.9:
        e1 = np.cross(v_hat, [1, 0, 0])
    else:
        e1 = np.cross(v_hat, [0, 1, 0])
    e1 = e1 / np.linalg.norm(e1)
    e2 = np.cross(v_hat, e1)
    e2 = e2 / np.linalg.norm(e2)

    # 投影行列
    T = np.array([e1, e2])  # (2, 3)

    # 2次元に投影
    P_2d = T @ P_c_3d @ T.T  # (2, 2)
    miss_2d = T @ rho_tca     # (2,)

    # 数値積分で衝突確率を計算
    # ガウス分布の2次元積分(円形ハードボディ領域)
    P_2d_inv = np.linalg.inv(P_2d)
    det_P = np.linalg.det(P_2d)

    # 極座標積分
    n_r = 200
    n_theta = 200
    r_vals = np.linspace(0, R_HBR, n_r)
    theta_vals = np.linspace(0, 2 * np.pi, n_theta)

    P_collision = 0.0
    dr = r_vals[1] - r_vals[0]
    dtheta = theta_vals[1] - theta_vals[0]

    for r in r_vals:
        for theta in theta_vals:
            u = np.array([r * np.cos(theta), r * np.sin(theta)]) - miss_2d
            exponent = -0.5 * u @ P_2d_inv @ u
            P_collision += r * np.exp(exponent) * dr * dtheta

    P_collision /= (2 * np.pi * np.sqrt(det_P))

    return P_collision, miss_2d, P_2d


# --- 共分散行列の設定 ---
# 衛星1の位置共分散(追跡精度が良い)
sigma1_along = 200.0    # 接線方向 [m]
sigma1_cross = 30.0     # 交差方向 [m]
sigma1_radial = 10.0    # 動径方向 [m]
P1_pos = np.diag([sigma1_along**2, sigma1_cross**2, sigma1_radial**2])

# 衛星2(デブリ)の位置共分散(追跡精度が悪い)
sigma2_along = 1000.0
sigma2_cross = 100.0
sigma2_radial = 50.0
P2_pos = np.diag([sigma2_along**2, sigma2_cross**2, sigma2_radial**2])

# 結合ハードボディ半径
R_HBR = 10.0  # [m](大型衛星 + デブリ)

# 衝突確率の計算
P_c, miss_2d, P_2d = compute_collision_probability(
    rho_tca, rho_dot, P1_pos, P2_pos, R_HBR)

print(f"\n=== 衝突確率計算結果 ===")
print(f"衝突確率: {P_c:.6e}")
print(f"接近平面上のミス距離: ({miss_2d[0]:.1f}, {miss_2d[1]:.1f}) m")
print(f"ミス距離の大きさ: {np.linalg.norm(miss_2d):.1f} m")

# リスク判定
if P_c > 1e-4:
    print("→ レッドアラート: 回避マヌーバを推奨")
elif P_c > 1e-5:
    print("→ イエローアラート: 状況を注視、マヌーバ準備")
else:
    print("→ 許容範囲内: アクション不要")

接近の可視化

# --- 接近平面上の可視化 ---
fig, ax = plt.subplots(figsize=(8, 8))

# 誤差楕円体の可視化
eigenvalues, eigenvectors = np.linalg.eigh(P_2d)
angle = np.degrees(np.arctan2(eigenvectors[1, 0], eigenvectors[0, 0]))

for n_sigma, alpha in [(1, 0.3), (2, 0.2), (3, 0.1)]:
    ellipse = plt.matplotlib.patches.Ellipse(
        (0, 0),
        2 * n_sigma * np.sqrt(eigenvalues[0]),
        2 * n_sigma * np.sqrt(eigenvalues[1]),
        angle=angle,
        fill=True, facecolor='blue', alpha=alpha,
        edgecolor='blue', linewidth=1,
        label=f'{n_sigma}σ' if n_sigma == 1 else None)
    ax.add_patch(ellipse)

# ハードボディ円
circle = plt.Circle(miss_2d, R_HBR, fill=False, color='red',
                     linewidth=2, label=f'Hard-body (R={R_HBR}m)')
ax.add_patch(circle)

# ミス距離ベクトル
ax.plot([0, miss_2d[0]], [0, miss_2d[1]], 'r--', linewidth=1.5)
ax.plot(miss_2d[0], miss_2d[1], 'r*', markersize=15, label='Miss point')
ax.plot(0, 0, 'b+', markersize=15, markeredgewidth=2, label='Origin (predicted)')

# 軸の設定
max_range = max(3 * np.sqrt(eigenvalues.max()),
                np.linalg.norm(miss_2d) + R_HBR) * 1.2
ax.set_xlim(-max_range, max_range)
ax.set_ylim(-max_range, max_range)
ax.set_aspect('equal')
ax.set_xlabel('Encounter plane ξ [m]')
ax.set_ylabel('Encounter plane η [m]')
ax.set_title(f'接近平面上の誤差楕円体と衝突領域\n'
             f'Miss distance = {np.linalg.norm(miss_2d):.1f} m, '
             f'P_c = {P_c:.2e}')
ax.legend(loc='upper right')
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('conjunction_assessment.png', dpi=150, bbox_inches='tight')
plt.show()

この図から、接近解析の幾何学的な構造が直感的に理解できます。

  1. 青い楕円が誤差楕円体(1σ、2σ、3σ) — 2つの衛星の位置不確実性を結合した分布を表しています。楕円が細長いのは、接線方向の不確実性が交差方向よりもはるかに大きいためです。

  2. 赤い円がハードボディ領域 — この円の内部に相対位置が入ると衝突が発生します。誤差楕円体がこの領域をどの程度覆うかが衝突確率を決定します。

  3. ミス距離と衝突確率の関係 — ミス距離が誤差楕円体のサイズに比べて大きければ衝突確率は低く、小さければ高くなります。単純な距離だけでなく、不確実性の方向と大きさの両方が重要です。

衝突確率のパラメトリック解析

最後に、ミス距離を変えた場合の衝突確率の変化を調べます。

# --- ミス距離と衝突確率の関係 ---
miss_distances = np.linspace(10, 5000, 50)
Pc_values = []

for d_miss in miss_distances:
    # ミス距離をスケーリング
    rho_scaled = rho_tca * (d_miss / np.linalg.norm(rho_tca))
    Pc_val, _, _ = compute_collision_probability(
        rho_scaled, rho_dot, P1_pos, P2_pos, R_HBR)
    Pc_values.append(Pc_val)

fig, ax = plt.subplots(figsize=(10, 6))
ax.semilogy(miss_distances, Pc_values, 'b-', linewidth=2)
ax.axhline(y=1e-4, color='red', linestyle='--', alpha=0.7, label='Red threshold (1e-4)')
ax.axhline(y=1e-5, color='orange', linestyle='--', alpha=0.7, label='Yellow threshold (1e-5)')
ax.set_xlabel('Miss Distance [m]')
ax.set_ylabel('Collision Probability')
ax.set_title('ミス距離と衝突確率の関係')
ax.legend()
ax.grid(True, alpha=0.3, which='both')
plt.tight_layout()
plt.savefig('pc_vs_miss_distance.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフから重要な知見が得られます。

  1. 衝突確率はミス距離に対して急激に減少する — ミス距離が誤差楕円体の特性的なサイズを超えると、衝突確率は指数関数的に低下します。

  2. 閾値距離が存在する — 赤い線($10^{-4}$)と橙色の線($10^{-5}$)との交点が、回避マヌーバの判断基準となるミス距離の目安です。

  3. 単純な距離だけでは不十分 — 同じミス距離でも、共分散行列(不確実性の方向と大きさ)によって衝突確率は大きく変わります。だからこそ、共分散情報を含む定量的な衝突確率計算が不可欠なのです。

ケスラーシンドローム

連鎖衝突の恐怖

1978年、NASAのドナルド・ケスラーは「宇宙デブリの衝突が新たなデブリを生み、それがさらに衝突を引き起こす連鎖反応」の可能性を指摘しました。これがケスラーシンドロームです。

ある高度帯でデブリ密度が臨界値を超えると、衝突によるデブリ生成速度が自然減衰(大気抵抗による再突入)速度を上回り、デブリが自己増殖的に増加します。最終的にその高度帯は使用不能になり、宇宙開発に壊滅的な影響を与えます。

NASAの軌道デブリプログラムオフィスの長期シミュレーションによると、今後一切の打ち上げを行わなくても、既存のデブリ同士の衝突によって特定の高度帯(750〜1000 km)のデブリ数は増加し続けるとされています。これはケスラーシンドロームがすでに始まっている可能性を示唆しています。

対策

ケスラーシンドロームを防ぐ(または遅らせる)ための対策は以下の通りです。

  1. ミッション後の25年(5年)以内のデオービット: 国際ガイドライン。近年は5年への短縮が議論されている
  2. 衝突回避マヌーバ: 本記事で解説した手法。運用中の衛星同士の衝突を防ぐ
  3. 能動的デブリ除去(ADR): ロボットアームやネットで大型デブリを捕獲し、デオービットさせる技術
  4. パッシブデオービット: ドラッグセイルや電磁テザーで自然減衰を加速する

宇宙の持続可能性は、技術だけでなく国際的な規制・協力の問題でもあります。

まとめ

本記事では、衛星衝突回避のための接近解析と衝突確率計算の理論を解説しました。

  • デブリ問題の深刻化: 36,000個以上の追跡可能物体と推定1億個以上の微小デブリが存在。LEOでの衝突速度は10〜14 km/sに達する
  • 接近イベントの検出: 軌道要素フィルタ→時間フィルタ→精密計算の段階的スクリーニング
  • TCAの計算: 相対位置ベクトルと相対速度ベクトルが直交する時刻を数値的に求める
  • 共分散行列: 軌道決定の不確実性を定量化。2物体の結合共分散 $\bm{P}_c = \bm{P}_1 + \bm{P}_2$ が衝突リスク評価の鍵
  • 衝突確率: 短い遭遇の仮定で3D→2D問題に縮約。接近平面上のガウス分布積分で計算
  • 回避マヌーバ: TCAの数日前に数mm/s〜数cm/sのΔVで実施可能。早期対応が低コスト
  • ケスラーシンドローム: 特定高度帯ではデブリの自己増殖がすでに始まっている可能性がある

次のステップとして、以下の記事も参考にしてください。