프로젝트 개요
DM100은 총질량 100톤 로켓의 발사, 약 37 km 고도에서의 단 분리, 1단의 발사장 귀환과 착륙을 계산하는 2차원 개념 시뮬레이터입니다. 단 분리는 로켓의 아래쪽 추진부인 1단과 위쪽 2단이 떨어지는 과정이며, 이 프로젝트에서는 분리된 1단이 발사장으로 돌아오는 비행을 계산합니다. 날씨와 기체 조건을 입력하면 비행 궤적, 추진제 소모량과 착륙 판정을 확인할 수 있습니다.
직접 구현한 물리 모델로 귀환 경로를 정하고, 목표 자세와 관측 자세의 차이를 줄이는 PID 계열 제어기로 기체 방향을 조절합니다. 센서값에 포함된 오차를 고려해 실제 자세를 추정하는 과정도 연결해, 첫 지면 접촉 순간까지 임무와 안전 기준을 평가합니다. 아래 결과의 RCS는 작은 보조 추력기로 기체의 방향을 바꾸는 자세 제어 장치이며, RCS 소모량은 이 장치가 사용한 추진제의 양입니다.
핵심 문제는 회수 궤적을 계산하는 것과 함께 어떤 조건에서 결과를 신뢰할 수 있는지 확인하는 것이었습니다. 이미 확인한 조건을 다시 실행하는 회귀 검증과, 구현을 고정한 뒤 별도 조건으로 수행하는 평가를 구분했습니다. 같은 입력에서 센서 처리 방식과 개별 기능을 비교할 수 있도록 난수 시드도 고정했습니다. 시드는 바람이나 센서 잡음처럼 무작위로 만드는 값의 생성 순서를 정하는 시작값입니다. 입력과 시드, 파일 내용의 변경 여부를 확인하는 소스 해시 및 비행별 기록을 함께 공개했습니다.
Python과 NumPy/SciPy로 물리 계산을 수행하고, FastAPI 기반 로컬 화면과 Matplotlib/FFmpeg 시각화를 연결했습니다. 명시적인 모델로 유도와 상태 추정을 수행하는 프로젝트이며 머신러닝 정책을 학습하지는 않습니다.
핵심 결과
복합 외란은 바람과 기체 편차, 명령 지연처럼 비행을 방해하는 여러 조건이 함께 작용하는 상황입니다. 통과 수는 정해 둔 임무와 안전, 착륙 및 추진제 기준을 모두 충족한 비행 수를 뜻합니다. 센서 평가는 같은 조건을 두 처리 방식으로 각각 실행해 성공 여부와 추진제 소모량을 비교했습니다.
- 복합 외란 조건
- 96/96
- 소스 동결 후 바람, 기체 편차와 지연 조건 평가
- 확장 센서 조건
- 48/48
- 자세 잡음, 편향과 패킷 누락을 추가한 평가
- RCS 소모량 감소
- 18.07%
- 같은 센서 조건 48쌍의 소모량 중앙값 비교
- 수치 허용오차 충족
- 4/4
- 적분 간격 세 종류를 비교한 네 조건
같은 조건에서 비교 기준 처리 대신 자세 추정기를 사용했을 때 RCS 소모량이 감소한 조건은 47개, 증가한 조건은 1개였습니다. 소모량 중앙값은 측정값을 작은 순서로 나열했을 때 가운데에 해당하는 값입니다. 위치 오차의 95백분위는 비교 기준 처리 0.1287 m와 추정기 적용 0.1569 m였습니다. 95백분위는 관측 오차의 약 95%가 그 이하에 놓이는 값으로, 오차가 큰 쪽의 경향을 보여 줍니다. 모든 착륙 지표가 개선된 것은 아니며, 성공 기준을 유지하면서 얻은 RCS 효율 개선으로 해석합니다.
복합 외란 96개 조건의 착륙과 안전 지표
| 평가 항목 | 관측된 최대값 | 판정 기준 |
|---|---|---|
| 접지 위치 오차 | 0.2604 m | 2 m 이하 |
| 다리 끝점 수직 속도 | 1.3047 m/s | 1.5 m/s 이하 |
| 다리 끝점 수평 속도 | 0.1900 m/s | 0.5 m/s 이하 |
| 접지 자세 오차 | 0.0108도 | 3도 이하 |
| 비행 중 동압 | 26.7874 kPa | 30 kPa 이하 |
접지는 착륙 다리가 지면에 처음 닿는 순간이며, 동압은 비행 속도와 대기 밀도에 따라 기체에 가해지는 공기역학적 하중을 나타내는 지표입니다. 항목별 최대값은 서로 다른 비행에서 기록됐을 수 있습니다. 실패 비행도 측정값이 있으면 집계에 포함합니다. 조건이 다른 집단의 최대 오차 차이를 개선율로 계산하지 않습니다. 임무와 비행 안전, 최초 접지 및 추진제 보존 검사를 모두 충족해야 성공으로 판정합니다.
문제와 접근 방법
로켓 회수는 착륙 위치뿐 아니라 비행 중 변하는 질량과 관성, 분리 시점의 운동 상태, 공력과 추진제 공급, 제동에 필요한 잔량을 함께 고려해야 합니다. 지연되거나 잡음이 있는 관측값은 불필요한 자세 제어와 추진제 소모를 일으킬 수도 있습니다.
수평과 수직 이동, 평면 내 회전에 추진제와 구동 장치, 공급 계통 및 액체 추진제 흔들림을 더한 19개 물리 상태 변수를 적분했습니다. 여기서 적분은 짧은 시간 동안의 변화를 누적해 다음 시점의 위치와 속도 등을 계산하는 수치 계산입니다. 기본 적분 간격은 0.010초, 제어 주기는 0.020초이며, 최초 접지 순간을 검출해 회전하는 기체의 다리 끝점 속도를 평가합니다.
제어기는 지연된 관측값과 과거 명령, 표준 기체 제원과 예보를 사용합니다. 실제 외란이나 센서 편향을 정답으로 전달하지 않습니다. 센서 편향은 측정값이 한쪽으로 치우치는 오차이며, 자이로는 기체의 회전 속도를 측정하는 센서입니다. 물리 모델의 예측과 센서 관측을 결합하는 칼만 필터로 각도와 각속도, 자이로 편향을 추정했습니다. 센서 데이터 묶음인 패킷이 누락되더라도 관측의 원래 시각을 유지해 같은 값을 중복 반영하지 않도록 했습니다.
단 분리 전후의 선형 및 각운동량을 연결하고, 실제 공급 유량으로 추력과 추진제 소비를 함께 계산합니다. 공급 버퍼와 주 추진제의 질량을 중복 계산하지 않도록 구성했습니다. 입력 오류와 실행 오류, 정상적으로 계산된 실패 비행도 구분해 기록합니다.
시스템 구조
- 조건 준비
입력 범위와 조합 검사, 난수 시드와 실행 조건 고정
- 비행 계산
19개 상태의 물리 모델과 센서 관측을 시간에 따라 계산
- 유도와 제어
관측 기반 상태 추정, 귀환 경로와 자세 제어를 반복
- 판정과 기록
임무, 안전, 접지와 추진제 기준 평가 및 원본 기록 저장
- 검토와 시각화
결과 검증, 수치 보고서와 저장된 궤적의 영상 생성
물리 모델은 시뮬레이션의 실제 상태를 적분하고, 제어기는 제한된 관측으로 명령을 만듭니다. 평가기는 물리 상태를 기준으로 요구사항을 검사합니다. 이 역할을 나눠 제어기에 정답 상태를 제공하지 않으면서도 결과를 확인할 수 있게 했습니다.
로컬 화면에서는 조건 입력, 실행 진행 상태와 그래프, 실패 항목을 확인합니다. 영상은 저장된 궤적을 재생해 생성하며 비행을 다시 계산하거나 이미 계산한 결과를 변경하지 않습니다.
실험과 검증
최종 평가 전에 소스와 입력, 환경 및 개발 기록의 해시를 저장했습니다. 평가 결과를 본 뒤 해당 버전이나 판정 기준을 조정하지 않았습니다. 소스 동결 후의 평가와 회귀 검증, 개발 조건의 기능 제거 실험은 표본의 역할과 목적에 따라 각각 구분했습니다.
| 평가 집단 | 통과 / 실행 | 확인한 범위 |
|---|---|---|
| 회귀 검증 조건 | 286/286 | 이미 관측한 조건의 동작 유지 |
| 복합 외란 조건 | 96/96 | 바람, 기체 편차와 관측 및 명령 지연 |
| 확장 센서와 자세 추정기 | 48/48 | 각도 잡음, 일정 편향과 패킷 누락 |
| 동일 센서와 비교 기준 계측 처리 | 48/48 | 입력과 시드가 같은 조건의 처리 방식 비교 |
회귀 검증에 사용한 286개 조건은 개발 205개, 기록된 평가 72개와 보조 9개입니다. 복합 외란과 센서 평가, 개발과 기능 제거, 수렴 및 민감도 실험은 305회이며, 회귀 검증까지 합하면 목적이 다른 591회 실행입니다. 독립적인 최종 평가 조건이 591개라는 의미는 아닙니다.
합성 조건의 범위와 통계적 해석
복합 외란 조건은 다섯 고도의 바람과 예보 오차, 돌풍, 대기 편차, 기체 편차와 지연을 조합합니다. 확장 센서에는 각도 잡음 반경 0.01–0.05도, 자이로 잡음 반경 0.005–0.03도/초, 일정한 자세 및 자이로 편향과 한 번에 1–2개 패킷 누락을 적용했습니다. 이 범위는 실측 부품 사양이 아닌 모델 가정입니다.
복합 외란 조건의 성공률에 대한 Wilson 95% 구간은 96.15%–100.00%, 센서 확장 조건은 92.59%–100.00%입니다. Wilson 구간은 유한한 횟수의 성공과 실패로 성공률을 추정할 때의 불확실성을 나타냅니다. 모든 관측 조건에서 성공했더라도 표본 수가 적으면 하한이 낮아집니다. 선언한 합성 표본 분포에 한정한 구간이며 실제 로켓의 신뢰도 구간과 구분합니다.
계측 처리 비교는 비교 기준 처리 방식에 확장 센서 오차를 적용한 결과입니다. 회귀 검증의 286개 조건에도 해당 각도 오차가 있었다는 뜻은 아닙니다. 성공 여부는 전체 48쌍에서, 추진제 효율은 두 방식 모두 성공한 쌍에서 비교합니다.
개별 기능 제거와 수치 계산 검증
| 기능 설정 | 통과 / 개발 조건 12개 |
|---|---|
| 전체 기능 사용 | 12/12 |
| 자세 필터 제거 | 12/12 |
| 항법 가속도 편향 보정 제거 | 11/12 |
| 외란 토크 편향 보정 제거 | 11/12 |
| 귀환 경로 재계산 제거 | 10/12 |
기능 제거 실험은 나머지 조건을 유지한 채 기능 하나를 꺼서 결과가 어떻게 달라지는지 확인하는 비교입니다. 물리 모델과 입력, 난수 생성 순서 및 판정 기준을 유지해 각 기능의 기여를 확인했습니다. 개발 표본의 진단이며 독립적인 최종 평가 성공률과 구분합니다.
적분 간격 0.010초, 0.005초와 0.0025초로 네 조건을 비교했습니다. 계산 간격을 더 잘게 나눠도 결과가 허용 범위 안에서 유지되는지 확인하는 검사입니다. 제어 주기는 0.020초로 유지했고, 성공 판정이 일치한 조건과 사전 수치 허용오차를 모두 충족한 조건은 각각 4/4였습니다. 가장 작은 간격의 계산 결과도 수학적으로 정확한 정답은 아닙니다.
서로 다른 수치 계산 방식인 RK4와 SciPy DOP853을 매끄러운 1초 구간 세 종류에서 비교해 3/3을 통과했습니다. 민감도 비교는 입력한 기체 특성이 달라질 때 결과가 얼마나 변하는지 살펴보는 검사입니다. 추력과 공력, 관성 및 초기 질량을 각각 바꾼 비교는 기준 조건을 포함해 9/9가 통과했습니다. 적분기의 일치는 수치 구현의 일관성 검사이며 실물 물리 모델의 정확도를 입증하지 않습니다.
실행 환경 검증에서는 같은 컴퓨터에 구성한 Windows와 Linux의 관리형 Python 3.12.15에서 각각 소프트웨어 검사 790개와 하위 검사 11개를 통과했습니다. 자동 설치와 의존성 복구, 실제 로컬 화면, 한글 H.264 영상 생성과 오프라인 재사용을 확인했습니다. 보존된 비공개 기록이 필요한 선택적 검사 1개는 건너뛰었으며 독립적인 제삼자 심사는 아닙니다.
한계와 해석
관측한 조건의 통과가 허용된 모든 연속 입력 조합의 성공을 보장하지는 않습니다. 자세 추정기는 RCS 효율을 개선했지만 모든 접지 및 추진제 지표를 개선하지 않았습니다. 센서 오차의 범위도 작은 합성 가정이며 절대 자세 편향의 실물 교정을 수행한 것은 아닙니다.
기체의 수평과 수직 이동, 평면 내 회전을 다루며 3차원 6자유도 운동은 포함하지 않습니다. 2단이 500 kg 탑재체를 700 km 원궤도에 올리는 것은 가정입니다. 실측 보정과 상세 유체, 열 및 구조 모델, 접지 강도와 착륙 후 안정성 및 실제 비행 인증은 범위 밖입니다. 영상의 2단 이동과 접지 후 고정 자세는 시각적 연출입니다.
이 프로젝트는 상태 추정과 모델 기반 제어를 구현하고, 모델의 가정과 평가 범위를 명시하며 비교 실험과 수치 검증으로 결과를 설명하는 역량을 보여줍니다.
실행 방법

전체 비행 영상 보기에서 발사와 단 분리부터 1단 귀환과 착륙까지 확인할 수 있습니다.
Windows x86-64에서는 소스 ZIP의 launch-dm100.bat를 더블클릭합니다. glibc 2.28 이상인 Linux x86-64에서는 다음 명령을 실행합니다.
sh launch-dm100.sh
사용 가능한 Python 3.12가 없으면 프로젝트 폴더에 자동으로 준비하며 최초 설치에는 인터넷 연결이 필요합니다. 의존성과 폰트, 영상 인코더를 점검하고 사용할 수 없는 환경은 보관한 뒤 현재 경로에 재구성합니다. GPU와 시스템 FFmpeg, 별도의 한글 폰트 설치는 필요하지 않습니다.
실험 화면은 정상 운용 범위의 날씨와 기체 편차를 제공합니다. 확장 센서와 기능 제거는 실험 명세 또는 Python API에서 지정합니다. 전체 MP4 생성은 비행 계산보다 오래 걸릴 수 있습니다. 상세 실행 환경 안내에 지원 조건을 정리했습니다.
코드와 자료
ZIP에는 영어와 한국어 문서, 고정 입력과 검증기를 포함했습니다. Python 표준 라이브러리만으로 공개 기록의 요약 수치와 일관성을 확인할 수 있습니다. 다음 명령은 비행을 재실행하지 않습니다.
python scripts/validate_evidence.py docs/results/validation-study-v1
python -m scripts.validate_regression_evidence docs/results/regression-v1.1
실제 비행과 전체 실험을 재현하는 명령은 한국어 검증 설계에 있습니다. 저장된 기록의 일관성 검사와 비행 계산의 재실행은 각각 다른 범위의 검증입니다.
소스와 검증 자료 ZIP 다운로드GitHub에서 소스 코드 보기

