우주공학/Python

[Python 심] 셔터를 누르면 일어나는 일: 위성 데이터 생성 및 다운링크 시뮬레이터

univ 2026. 2. 6. 12:00
반응형

1. 실습 목표

이론에서 배운 공식을 코드로 구현하여, 고해상도 위성이 겪는 데이터 폭주를 시뮬레이션합니다.

  1. 데이터 생성량 계산: GSD와 관측 폭을 입력하면 초당 몇 Gbps가 생성되는지 계산합니다.
  2. 다운링크 병목 분석: 하루에 찍은 양을 지상국 접촉 시간(10분 x 4회) 안에 다 내릴 수 있는지 판별하고, 필요한 압축률이나 통신 속도를 역산합니다.

2. 파이썬 코드 구현

Python
 
import numpy as np
import matplotlib.pyplot as plt

def calculate_data_budget(gsd_m, swath_km, duration_sec_per_day, downlink_speed_mbps):
    """
    위성 데이터 버짓 시뮬레이션
    
    :param gsd_m: 해상도 (m)
    :param swath_km: 관측 폭 (km)
    :param duration_sec_per_day: 하루 총 촬영 시간 (초)
    :param downlink_speed_mbps: 지상 전송 속도 (Mbps)
    """
    # 1. 물리 상수 및 파라미터
    velocity_ground = 7000.0 # m/s (약 7km/s)
    bit_depth = 12 # bits per pixel (일반적인 위성 카메라)
    
    # 2. 데이터 생성 속도 (Raw Data Rate)
    # Rate = (Swath / GSD) * (Velocity / GSD) * Bits
    swath_m = swath_km * 1000
    pixels_per_line = swath_m / gsd_m
    lines_per_sec = velocity_ground / gsd_m
    
    raw_rate_bps = pixels_per_line * lines_per_sec * bit_depth
    raw_rate_gbps = raw_rate_bps / 1e9 # Gbps 변환
    
    # 3. 하루 총 데이터 생성량 (Daily Volume)
    total_volume_bits = raw_rate_bps * duration_sec_per_day
    total_volume_gbytes = total_volume_bits / 8 / 1e9 # GB 단위
    
    # 4. 다운링크 능력 (Downlink Capability)
    # 가정: 하루에 지상국과 4번 접속, 매회 10분(600초) 통신
    contact_time_sec = 4 * 600 
    downloadable_bits = downlink_speed_mbps * 1e6 * contact_time_sec
    downloadable_gbytes = downloadable_bits / 8 / 1e9
    
    # 5. 결과 분석 (병목 확인)
    is_possible = downloadable_gbytes >= total_volume_gbytes
    required_compression = total_volume_gbytes / downloadable_gbytes if not is_possible else 1.0
    
    return raw_rate_gbps, total_volume_gbytes, downloadable_gbytes, required_compression

# --- 시뮬레이션: GSD에 따른 데이터 폭증 확인 ---
gsd_list = np.linspace(0.3, 1.0, 50) # 30cm ~ 1m
generated_volumes = []
limit_volume = 0

# 고정 파라미터: 폭 12km, 하루 2분(120초) 촬영, 통신속도 500Mbps
SWATH = 12.0
DURATION = 120.0 
SPEED = 500.0

for g in gsd_list:
    _, vol, limit, _ = calculate_data_budget(g, SWATH, DURATION, SPEED)
    generated_volumes.append(vol)
    limit_volume = limit # 통신 한계는 GSD와 무관하게 일정

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

# 데이터 생성량 (파란 실선)
ax.plot(gsd_list * 100, generated_volumes, linewidth=3, label='Daily Data Generated (GB)')
ax.fill_between(gsd_list * 100, generated_volumes, alpha=0.1)

# 다운링크 한계선 (빨간 점선)
ax.axhline(limit_volume, color='red', linestyle='--', linewidth=2, label=f'Downlink Limit ({limit_volume:.1f} GB)')

# 교차점 텍스트
ax.text(80, limit_volume + 10, "Safe Zone (Low Res)", color='green', fontsize=12)
ax.text(40, limit_volume + 50, "Bottleneck Zone (High Res)", color='red', fontsize=12)

ax.set_title(f"The Data Bottleneck: Generation vs Downlink\n(Swath={SWATH}km, Shoot={DURATION}s/day, Down={SPEED}Mbps)")
ax.set_xlabel("GSD (cm)")
ax.set_ylabel("Data Volume (GB/day)")
ax.invert_xaxis() # X축 반전 (왼쪽이 고해상도/낮은GSD)
ax.grid(True)
ax.legend()
plt.show()

# --- 30cm 해상도 케이스 상세 리포트 ---
rate_gbps, gen_vol, down_vol, comp_ratio = calculate_data_budget(0.3, SWATH, DURATION, SPEED)

print(f"=== [Data Budget Report for GSD 30cm] ===")
print(f"1. Raw Data Rate    : {rate_gbps:.2f} Gbps")
print(f"2. Daily Generated  : {gen_vol:.2f} GB (in {DURATION} sec shooting)")
print(f"3. Daily Downlink   : {down_vol:.2f} GB (Max capacity)")
print(f"-----------------------------------------")
if gen_vol > down_vol:
    print(f"Result: FAIL (Overflow)")
    print(f"Solution: Need Compression Ratio of 1:{comp_ratio:.2f}")
else:
    print(f"Result: SUCCESS (Margin: {down_vol - gen_vol:.2f} GB)")

3. 결과 분석: 30cm의 대가

코드를 실행하면 X축의 왼쪽(30cm 고해상도)으로 갈수록 데이터 생성량이 지수함수적으로 치솟는 그래프를 볼 수 있습니다.

[시뮬레이션 결과 예시]

  • 데이터 생성 속도: 11.2 Gbps
    • 카메라 셔터를 여는 순간 초당 11.2GB 분량의 데이터가 쏟아집니다.

  • 하루 촬영량: 168.0 GB (고작 2분 찍었는데!)
  • 다운링크 한계: 150.0 GB (500Mbps 속도로 하루 4번 통신 시)
  • 결론: FAIL. * 찍은 건 168GB인데 보낼 수 있는 건 150GB뿐입니다.
    • 해결책: 1:1.12 이상의 압축(Compression)을 적용하거나, 통신 속도를 더 빠르도록 바꿔야 합니다.

[심화 해석] 이것이 바로 시스템 엔지니어링입니다. 해상도(GSD)를 30cm로 결정하는 순간, 단순히 카메라만 바꾸는 게 아니라 통신 장비(Antenna/RF)데이터 처리 장치(Memory/Compression)까지 모두 업그레이드해야 하는 '나비 효과'가 발생합니다.

4. 마무리

이번 실습을 통해 "고화질 위성을 만드는 것이 왜 돈이 많이 드는지"를 데이터 관점에서 증명했습니다.

  • 좋은 카메라는 엄청난 데이터를 뱉어냅니다.
  • 그것을 저장할 큰 메모리가 필요합니다.
  • 그것을 빨리 보낼 고성능 안테나가 필요합니다.
  • 이 모든 균형을 맞추는 것이 데이터 버짓(Data Budget)입니다.

이로써 위성 시스템의 물리적 설계(궤도, 구조)뿐만 아니라 정보적 설계(데이터)까지 마스터하셨습니다. 다음 시간에는 또 다른 심화 주제로 여러분의 엔지니어링 근육을 키워드리겠습니다.

반응형