1. 들어가는 글: 배터리는 언제 죽는가?
지난 [이론 편]에서 우리는 태양전지판의 효율을 떨어뜨리는 코사인 손실과, 위성 생존의 법칙인 에너지 밸런스를 배웠습니다.
[SMAD 심화] 태양을 향해 쏴라 (1): 위성 전력계(EPS)의 핵심, 코사인 손실과 에너지 밸런스
1. 들어가는 글: 멈추지 않는 심장사람의 심장이 멈추면 생명이 끝나듯, 위성의 전력이 끊기면 그 즉시 '우주 쓰레기'가 됩니다.위성 시스템 엔지니어(SE)가 가장 보수적이고 치밀하게 설계해야
univ.tistory.com
오늘은 파이썬 코드로 가상의 위성을 궤도에 띄워보겠습니다.
- 태양전지판은 100W급입니다.
- 위성은 항상 40W를 소비합니다.
- 하지만 위성은 회전하고 있고, 30분 동안 지구 그림자에 들어갑니다.
과연 이 위성의 배터리는 방전되지 않고 살아남을 수 있을까요?
2. 시뮬레이션 시나리오
- 궤도 주기: 90분 (5400초)
- 식(Eclipse) 시간: 30분 (1800초) - 이때는 발전량 0
- 태양전지판: 최대 100W (태양 정면 시)
- 상시 소비 전력: 40W
- 배터리 용량: 100Wh (초기 충전량 80%)
핵심 로직: 낮(Sunlight) 시간 동안 위성의 위치에 따라 태양 입사각이 변한다고 가정하여 코사인 손실을 적용합니다.
3. 파이썬 코드 구현
import numpy as np
import matplotlib.pyplot as plt
# --- 1. 파라미터 설정 ---
Orbit_Period = 90.0 * 60.0 # 90분 (초 단위)
Eclipse_Time = 30.0 * 60.0 # 30분 (초 단위)
Sunlight_Time = Orbit_Period - Eclipse_Time
# 전력 시스템 스펙
Solar_Max_Power = 100.0 # W (최대 발전량)
Power_Consumption = 40.0 # W (상시 소비량)
Battery_Capacity_Wh = 100.0 # Wh (배터리 총 용량)
Initial_SoC = 80.0 # % (초기 배터리 상태)
def eps_simulation(t_array):
generated_powers = []
battery_socs = []
# 현재 배터리 에너지 (Wh)
current_battery_wh = Battery_Capacity_Wh * (Initial_SoC / 100.0)
dt = t_array[1] - t_array[0] # 시간 간격
for t in t_array:
time_in_orbit = t % Orbit_Period
# --- 1. 발전량 계산 (코사인 손실 적용) ---
if time_in_orbit < Eclipse_Time:
# 밤(Eclipse): 발전 없음
p_gen = 0.0
else:
# 낮(Sunlight): 태양각 변화 시뮬레이션
# 낮 시간 동안 태양각이 -90도 -> 0도(정면) -> +90도로 변한다고 가정
sun_phase = (time_in_orbit - Eclipse_Time) / Sunlight_Time
angle_rad = (sun_phase - 0.5) * np.pi
# 코사인 법칙: P = P_max * cos(theta)
efficiency = max(0, np.cos(angle_rad))
p_gen = Solar_Max_Power * efficiency
generated_powers.append(p_gen)
# --- 2. 배터리 입출력 계산 (에너지 밸런스) ---
# 넷 파워 = 발전량 - 소비량
net_power = p_gen - Power_Consumption
# 전력(W)을 에너지(Wh)로 변환하여 배터리에 더함/뺌
energy_delta = net_power * (dt / 3600.0)
current_battery_wh += energy_delta
# 배터리 물리적 한계 (0 ~ 100Wh)
current_battery_wh = max(0, min(current_battery_wh, Battery_Capacity_Wh))
# SoC(%) 기록
soc = (current_battery_wh / Battery_Capacity_Wh) * 100.0
battery_socs.append(soc)
return generated_powers, battery_socs
# --- 4. 실행 및 시각화 ---
time = np.linspace(0, Orbit_Period * 2, 1000) # 2바퀴 궤도 (3시간)
powers, socs = eps_simulation(time)
fig, ax1 = plt.subplots(figsize=(10, 6))
# 발전량 그래프 (주황색)
color = 'tab:orange'
ax1.set_xlabel('Time (min)')
ax1.set_ylabel('Generated Power (W)', color=color, fontsize=12)
ax1.plot(time/60, powers, color=color, linewidth=2, label='Solar Power')
ax1.tick_params(axis='y', labelcolor=color)
ax1.set_ylim(0, 110)
ax1.grid(True, alpha=0.3)
# 식(Eclipse) 구간 표시
for i in range(3):
ax1.axvspan(i*90, i*90 + 30, color='gray', alpha=0.2, label='Eclipse' if i==0 else "")
# 배터리 SoC 그래프 (파란색)
ax2 = ax1.twinx()
color = 'tab:blue'
ax2.set_ylabel('Battery SoC (%)', color=color, fontsize=12)
ax2.plot(time/60, socs, color=color, linewidth=2, linestyle='--', label='Battery SoC')
ax2.tick_params(axis='y', labelcolor=color)
ax2.set_ylim(0, 105)
# 배터리 위험선 (60%)
ax2.axhline(60, color='red', linestyle=':', linewidth=2, label='Safety Limit (60%)')
plt.title("Satellite EPS Simulation: Generation & Battery Cycle")
fig.tight_layout()
plt.show()
4. 결과 분석: 둥근 산과 배터리의 운명
코드를 실행하면 아주 흥미로운 이중 축 그래프가 나타납니다.

① 발전량 (주황색 실선):
- 낮 구간이라고 해서 100W가 쭉 나오는 게 아닙니다. 태양각이 변하면서 둥근 아치형(Sine Wave)을 그립니다.
- 피크일 때만 100W이고, 평균 발전량은 훨씬 낮습니다. 이것이 현실적인 시뮬레이션입니다.
② 배터리 SoC (파란색 점선):
- Eclipse 구간: 회색 음영 부분에서 SoC가 80% $\rightarrow$ 60%로 뚝 떨어집니다. (발전은 0인데 40W를 쓰니까요.)
- Sunlight 초기: 해가 떴는데도 배터리가 충전되지 않고 더 떨어집니다! 왜냐하면 태양각이 안 좋아서 발전량이 소비량(40W)보다 적기 때문입니다.
- Sunlight 중반: 태양이 머리 위로 오면서 발전량이 40W를 넘기고, 드디어 배터리가 충전됩니다.
[결론]
그래프를 보면 배터리 최저점이 약 60% 선에 걸쳐 있습니다.
이 위성 시스템은 "간신히 합격"입니다. 만약 소비 전력이 45W로 늘어나거나, 패널 효율이 조금만 떨어져도 배터리 수명에 치명적인 손상을 입게 됩니다.
5. 마무리: 심화 과정을 마치며
이로써 위성 전력계의 핵심인 에너지 밸런스까지 직접 파이썬으로 검증해 보았습니다.
지금까지 우리는 궤도(Orbit), 자세(AOCS), 열(Thermal), 통신(Comm), 전력(EPS)이라는 위성의 5대 핵심 시스템을 모두 코드로 구현해 보았습니다. 이제 여러분은 단순한 코딩을 넘어, 실제 위성 엔지니어들이 고민하는 문제들을 다룰 수 있게 되었습니다.
다음 시간에는 이 긴 여정을 정리하는 최종 회고와 함께, 뉴스페이스 시대에 엔지니어로서 나아가야 할 길에 대해 이야기 나누겠습니다.
'우주공학 > Python' 카테고리의 다른 글
| [Python] "30cm급 위성을 만들려면?" 광학 탑재체 설계 계산기 (0) | 2026.02.05 |
|---|---|
| [뉴스페이스 Python] 파이썬으로 띄우는 나만의 스타링크: 워커 델타(Walker Delta) 시각화와 관측 예측 (0) | 2026.01.29 |
| [Python 위성 심화] 화성에서 온 사진: 통신 링크 버짓(Link Budget) 계산기와 안테나 설계 (0) | 2026.01.27 |
| [Python 위성 심화] 내 위성, 안 부서질까? 진동 시험 데이터(PSD) 분석과 Grms 계산 (0) | 2026.01.27 |
| [Python 위성 심화] 내 위성의 연료비 계산: 델타브이($\Delta V$) 계산기와 호만 전이 시각화 (0) | 2026.01.27 |