우주공학/Python

[Python] "30cm급 위성을 만들려면?" 광학 탑재체 설계 계산기

univ 2026. 2. 5. 21:17
반응형

1. 실습 목표

이론에서 배운 내용을 바탕으로, 원하는 해상도(GSD)를 입력하면 필요한 망원경의 크기(지름)와 초점 거리를 역산해 주는 파이썬 시뮬레이터를 만듭니다.

단순히 $h \times p / f$ 공식만 쓰는 것이 아니라, 회절 한계(Diffraction Limit)를 고려하여 물리적으로 실현 가능한 최소한의 망원경 사이즈를 계산합니다.

2. 파이썬 코드 구현

Python
 
import numpy as np
import matplotlib.pyplot as plt

def design_optical_payload(target_gsd_m, altitude_km, wavelength_m=0.5e-6, pixel_pitch_um=10.0):
    """
    목표 GSD를 달성하기 위한 탑재체 파라미터 역산 (Reverse Engineering)
    
    :param target_gsd_m: 목표 해상도 (m)
    :param altitude_km: 위성 고도 (km)
    :param wavelength_m: 중심 파장 (기본값: 가시광선 녹색 0.5um)
    :param pixel_pitch_um: 센서 픽셀 크기 (기본값: 10um)
    """
    h_m = altitude_km * 1000
    p_m = pixel_pitch_um * 1e-6
    
    # 1. 기하학적 요구조건 (Geometric Constraint)
    # GSD = (h * p) / f  =>  f = (h * p) / GSD
    required_focal_length = (h_m * p_m) / target_gsd_m
    
    # 2. 물리적 요구조건 (Diffraction Constraint) - 핵심 심화 내용!
    # GSD_diff = 2.44 * (lambda * h) / D  =>  D = 2.44 * (lambda * h) / GSD
    # (여기서 GSD_diff가 목표 GSD와 같아야 물리적으로 구별 가능)
    required_aperture_diameter = 2.44 * (wavelength_m * h_m) / target_gsd_m
    
    # 3. F-Number (밝기) 계산
    f_number = required_focal_length / required_aperture_diameter
    
    return required_focal_length, required_aperture_diameter, f_number

# --- 시뮬레이션: 고도별 필요 망원경 크기 분석 ---
target_gsd = 0.3 # 30cm급 (세계 최고 수준 상용 위성)
altitudes = np.linspace(300, 1000, 100) # 300km ~ 1000km

diameters = []
focal_lengths = []

for alt in altitudes:
    f, d, _ = design_optical_payload(target_gsd, alt)
    diameters.append(d * 100) # cm로 변환
    focal_lengths.append(f)

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

# 망원경 지름 그래프 (빨간색)
color = 'tab:red'
ax1.set_xlabel('Satellite Altitude (km)')
ax1.set_ylabel('Required Aperture Diameter (cm)', color=color, fontsize=12, fontweight='bold')
ax1.plot(altitudes, diameters, color=color, linewidth=3, label='Aperture Size (D)')
ax1.tick_params(axis='y', labelcolor=color)
ax1.grid(True, alpha=0.3)

# 초점 거리 그래프 (파란색)
ax2 = ax1.twinx()
color = 'tab:blue'
ax2.set_ylabel('Required Focal Length (m)', color=color, fontsize=12, fontweight='bold')
ax2.plot(altitudes, focal_lengths, color=color, linewidth=2, linestyle='--', label='Focal Length (f)')
ax2.tick_params(axis='y', labelcolor=color)

# 텍스트 주석
plt.title(f"Optical Payload Design Requirements for GSD {target_gsd*100}cm", fontsize=14)
plt.show()

# --- 특정 케이스 출력 (500km 고도) ---
alt_case = 500
f_req, d_req, f_num = design_optical_payload(target_gsd, alt_case)

print(f"=== [Design Report for {target_gsd*100}cm GSD @ {alt_case}km] ===")
print(f"1. Focal Length (f) : {f_req:.2f} m (Geometry)")
print(f"2. Aperture Dia (D) : {d_req*100:.2f} cm (Diffraction Limit)")
print(f"3. F-Number (f/D)   : f/{f_num:.1f}")
print("---------------------------------------------------------")
print(f"Tip: 만약 50cm급 망원경({d_req*100:.2f}cm)을 싣지 못하면,")
print(f"     아무리 좋은 센서를 써도 {target_gsd*100}cm 해상도는 물리적으로 불가능합니다.")

3. 결과 분석: 500km에서 30cm를 보려면?

코드를 실행하면 고도가 높아질수록 필요한 망원경 크기가 선형적으로 커지는 그래프를 볼 수 있습니다.

  • 고도: 500km
  • 목표 해상도: 30cm
  • 필요한 망원경 지름($D$): 약 203.33cm

[심화 해석]

이 결과가 주는 교훈은 명확합니다.

여러분이 500km 상공에서 30cm 해상도를 구현하고 싶다면, 최소한 지름 204cm짜리 거울을 우주로 쏘아 올려야 합니다.

기하학 공식($h \times p / f$)만 보고 "초점거리만 늘리면 되지 않나?"라고 생각했다면, 지름 10cm짜리 렌즈로 30cm 해상도를 보려고 시도했을 것이고, 결과는 회절 때문에 뿌옇게 뭉개진 사진뿐이었을 겁니다.

이것이 바로 물리학을 고려한 엔지니어링입니다.

4. 마무리

이번 실습을 통해 "원하는 해상도(GSD)를 얻기 위한 물리적 대가(망원경 크기)"를 계산해 보았습니다.

우주 공학은 마법이 아닙니다.

더 잘 보고 싶으면(GSD $\downarrow$), 더 무거운 망원경($D \uparrow$)을 싣거나, 더 낮게 날아야($h \downarrow$) 합니다. 이 트레이드오프(Trade-off) 관계를 이해하는 것이 탑재체 설계의 핵심입니다.

다음 시간에는 이 위성들이 모여서 만드는 거대한 네트워크, [뉴스페이스 트렌드] 시리즈로 이어가거나, 혹은 또 다른 심화 주제로 찾아뵙겠습니다.

반응형