우주공학/Python

[뉴스페이스 Python] 파이썬으로 증명하는 공포: 궤도 충돌 확률 시뮬레이션

univ 2026. 2. 8. 07:00
반응형

1. 실습 목표

케슬러 신드롬이 말하는 "밀도가 높아지면 충돌 확률이 폭증한다"는 원리를 파이썬 코드로 구현합니다.

특정 고도(Shell)에 위성이 1,000개일 때와 10,000개일 때, 위성이 1년 동안 생존할 확률이 어떻게 변하는지 계산하고 그래프로 시각화합니다.

(참고: 실제 충돌 확률 계산은 매우 복잡하지만, 여기서는 기체 분자 운동론을 응용한 간소화된 통계 모델을 사용합니다.)

2. 파이썬 코드 구현

Python
 
import numpy as np
import matplotlib.pyplot as plt

def calculate_collision_probability(num_objects, altitude_km, object_radius_m, years=1):
    """
    궤도 내 충돌 확률 계산 (간소화된 기체 분자 모델)
    :param num_objects: 궤도 내 물체 개수 (N)
    :param altitude_km: 궤도 고도 (h)
    :param object_radius_m: 물체 평균 반지름 (r)
    """
    # 1. 궤도 공간의 부피 (Volume of the Shell)
    # 고도 ±10km 범위의 껍질(Shell)을 가정
    R_earth = 6371.0 * 1000 # m
    h = altitude_km * 1000  # m
    shell_thickness = 20.0 * 1000 # 20km 두께
    
    # 구의 겉넓이 * 두께 = 부피
    orbit_radius = R_earth + h
    shell_volume = 4 * np.pi * (orbit_radius**2) * shell_thickness # m^3
    
    # 2. 물체의 밀도 (Density)
    density = num_objects / shell_volume # 개수 / m^3
    
    # 3. 충돌 단면적 (Cross-sectional Area)
    # 두 물체가 충돌하려면 중심 거리가 2r 이내여야 함 -> 면적은 pi * (2r)^2
    collision_area = np.pi * (2 * object_radius_m)**2
    
    # 4. 상대 속도 (Relative Velocity)
    # 궤도 속도는 약 7.5km/s. 정면충돌/측면충돌 평균 상대속도는 약 10km/s 가정
    relative_velocity = 10000.0 # m/s
    
    # 5. 시간당 충돌 횟수 (Collision Rate per Object)
    # Rate = Density * Area * Velocity
    collision_rate = density * collision_area * relative_velocity
    
    # 6. 전체 시스템의 연간 충돌 횟수 (Total Collisions per Year)
    # N개의 물체가 있으므로 N/2 (중복 제외) 곱하기
    # 초 단위 -> 년 단위 변환
    seconds_per_year = 365 * 24 * 3600
    total_collisions = (num_objects * collision_rate / 2) * seconds_per_year
    
    return total_collisions

# --- 시뮬레이션: 위성 개수에 따른 충돌 위험도 ---
# 위성 개수를 1,000개부터 20,000개까지 늘려가며 테스트
sat_counts = np.linspace(1000, 20000, 50)
risks = []

# 가정: 고도 550km, 위성 크기 2m (태양전지판 포함)
for n in sat_counts:
    risk = calculate_collision_probability(n, 550, 2.0)
    risks.append(risk)

# --- 결과 시각화 ---
fig, ax = plt.subplots(figsize=(10, 6))

# 충돌 횟수 그래프 (빨간 실선)
ax.plot(sat_counts, risks, color='crimson', linewidth=3, label='Expected Collisions / Year')
ax.fill_between(sat_counts, risks, color='crimson', alpha=0.1)

# 위험 구간 표시
ax.axhline(1.0, color='black', linestyle='--', label='Critical Threshold (1 Collision/Year)')

# 텍스트 주석
ax.text(15000, risks[-1], f"{risks[-1]:.2f} Collisions/Year", fontsize=12, fontweight='bold', color='crimson')
ax.text(2000, 0.1, "Safe Zone", color='green', fontsize=12)

ax.set_title("Kessler Syndrome Simulation: Risk vs Number of Satellites\n(Altitude=550km, Size=2m)")
ax.set_xlabel("Number of Satellites in Shell")
ax.set_ylabel("Expected Collisions per Year")
ax.grid(True, alpha=0.5)
ax.legend()

plt.show()

3. 결과 분석: 위험한 지수함수

그래프를 보면 아주 무서운 경향이 나타납니다.

[분석 결과]

  • 선형이 아님: 위성 개수가 2배 늘어나면 충돌 위험은 2배가 아니라 4배(제곱)로 늘어납니다. ($N$개의 위성이 서로 부딪힐 경우의 수는 $N^2$에 비례하기 때문입니다.)
  • 임계점: 위성이 약 10,000개를 넘어가면, 연간 충돌 횟수가 1.0회를 돌파합니다.
    • 의미: "매년 최소 1번은 대형 충돌 사고가 터진다."
    • 한 번 충돌하면 수천 개의 파편이 생기고, 이 파편들이 다시 '개수(N)'를 늘려서 그래프를 수직 상승시킵니다. 이것이 바로 케슬러 신드롬의 시작입니다.

4. 마무리: 지속 가능한 우주를 위하여

이 그래프는 왜 전 세계가 우주 교통 관제(STM)와 우주 쓰레기 제거(ADR)에 열을 올리는지 명확하게 보여줍니다. 10,000개는 먼 미래가 아닙니다. 스타링크 하나만 해도 계획된 위성이 42,000개니까요.

여러분의 코드는 경고하고 있습니다. "치우지 않으면, 갇힌다."

다음 시간에는 뉴스페이스의 또 다른 혁명, 한 번 쏘고 버리는 게 아니라 다시 돌아와 착륙하는 [재사용 로켓(Reusable Rocket)]의 경제학과 착륙 알고리즘에 대해 알아보겠습니다.

반응형