고체 연료 그레인(HTPB, 파라핀 등)과 액체/기체 산화제($\text{N}_2\text{O}$, 액체산소)를 조합한 하이브리드 로켓 엔진은 폭발 위험성이 없고 추력 조절 및 재점화가 용이한 독보적 장점을 지니지만, 연소 진행에 따라 포트(Port) 직경이 확장되면서 산화제 질량 플럭스($G_{ox} = \dot{m}_{ox} / A_p$)가 급감하여 고체 연료 표면 퇴행율($\dot{r} = a G_{ox}^n$)이 감소하고 최적 화학양론 혼합비에서 벗어나는 'O/F 시프트(Shift)' 현상이 발생합니다. 마르크스타인(Marxman) 확산 화염 경계층 열전달 모델과 액체 산화제 밸브 가변 개도를 1,000Hz 주기로 튜닝하는 0-Alloc C# 실시간 서보 엔진을 공개합니다.
1. 2022 개정 교육과정 교과 연계 분석
- 화학 (연소 반응열 및 화학양론 혼합비): 완전 연소 반응식 $\text{C}_n\text{H}_m + (n + m/4)\text{O}_2 \to n\text{CO}_2 + (m/2)\text{H}_2\text{O}$, 연료 과잉 및 산화제 과잉에 따른 특성 배기 속도 $c^*$ 변화.
- 물리학 (로켓 추진 및 이상 기체 노즐 팽창): 비추력 $I_{sp} = \frac{F}{\dot{m} g_0}$, 질량 보존 $\dot{m}_{\text{total}} = \dot{m}_{ox} + \dot{m}_f$, 노즐 팽창비와 연소실 압력.
- 고급 물리학 (난류 경계층 확산 화염 열전달): 블로잉 효과(Blowing Effect), 스탠턴(Stanton) 수, 대류 열유속 $q_w = \rho_e u_e C_H \Delta h$.
- 정보 및 제어 공학 (실시간 가변 추력 액추에이터 제어): 포트 단면적 적분 추정, 1,000Hz 주기 스택 메모리 0-Alloc C# 산화제 질량 유량 서보.
2. 핵심 수학적 모델링 및 물리 공식
1) 마르크스타인(Marxman) 연료 퇴행율 법칙
포트 내부의 국소 산화제 질량 유속 $G_{ox} = \frac{\dot{m}_{ox}}{\pi R(t)^2}$에 따른 고체 연료 반경 퇴행 속도:
$$\dot{r}(t) = \frac{dR}{dt} = a G_{ox}^n = a \left( \frac{\dot{m}_{ox}}{\pi R(t)^2} \right)^n$$여기서 $a$는 경험적 계수, $n \approx 0.5 \sim 0.8$은 질량 유속 지수입니다.
2) 순간 O/F 혼합비 및 특성 배기속도 $c^*$
전체 고체 연료 소모 질량 유량 $\dot{m}_f = \rho_f 2\pi R(t) L \dot{r}(t)$와 산화제 질량 유량의 비:
$$OF(t) = \frac{\dot{m}_{ox}(t)}{\dot{m}_f(t)} = \frac{\dot{m}_{ox}^{1-n} \pi^{n-1} R(t)^{2n-1}}{2 a \rho_f L}$$연소실 압력: $P_c(t) = \frac{(\dot{m}_{ox} + \dot{m}_f) c^*(OF)}{A_t}$.
3. C# 1,000Hz 0-Alloc 스택 메모리 서보 제어기 구현
연소실 압력 센서와 산화제 공급 유량계 신호로부터 포트 반경 확장을 1ms 이내로 역산하고 목표 O/F를 사수하는 초고속 ref struct 서보 엔진입니다.
using System;
using System.Runtime.CompilerServices;
namespace ZeliDesk.Stem.Aerospace.HybridRocket
{
///
/// 하이브리드 로켓 연료 퇴행율 역산 및 O/F 시프트 방지 산화제 서보 엔진 (0-Alloc C#)
///
public ref struct HybridRocketOfServoEngine
{
private const double FuelDensityRhoF = 920.0; // kg/m^3 (HTPB 연료 밀도)
private readonly double _grainLengthL; // 그레인 길이 (m)
private readonly double _throatAreaAt; // 노즐 목 면적 (m^2)
private readonly double _ballisticA; // 퇴행 상수 a (~0.00015)
private readonly double _ballisticN; // 유속 지수 n (~0.62)
private readonly double _targetOfRatio; // 목표 O/F 비 (~6.5 for N2O/HTPB)
private readonly double _dt;
private double _currentPortRadiusR; // 현재 포트 반경 (m)
private double _currentCombustionPressurePc; // 연소실 압력 (Pa)
private double _commandedOxidizerFlowKgS; // 지령 산화제 유량
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public HybridRocketOfServoEngine(
double initialPortRadiusR = 0.025,
double grainLengthL = 0.8,
double throatAreaAt = 0.00045,
double targetOfRatio = 6.5,
double dt = 0.001)
{
_currentPortRadiusR = initialPortRadiusR;
_grainLengthL = grainLengthL;
_throatAreaAt = throatAreaAt;
_targetOfRatio = targetOfRatio;
_ballisticA = 0.00015;
_ballisticN = 0.62;
_dt = dt;
_currentCombustionPressurePc = 2.0e6; // 20 bar
_commandedOxidizerFlowKgS = 1.2; // 초기 1.2 kg/s
}
///
/// 계측된 연소실 압력과 공급 산화제 유량으로부터 포트 반경을 갱신하고 O/F 보정 유량을 계산 (1,000Hz)
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void UpdatePropulsionStep(
double measuredChamberPressurePa,
double measuredOxFlowKgS,
out double portRadiusMm,
out double currentOfRatio,
out double commandedOxFlowKgS,
out double estimatedThrustKn)
{
_currentCombustionPressurePc = measuredChamberPressurePa;
// 포트 단면적 및 산화제 질량 플럭스 G_ox = m_dot_ox / (pi * R^2)
double portArea = Math.PI * _currentPortRadiusR * _currentPortRadiusR;
double gOx = measuredOxFlowKgS / Math.Max(portArea, 1e-6);
// 퇴행율 r_dot = a * (G_ox)^n
double rDotMps = _ballisticA * Math.Pow(gOx, _ballisticN);
_currentPortRadiusR += rDotMps * _dt;
// 고체 연료 연소 유량: m_dot_f = rho_f * (2 * pi * R * L) * r_dot
double burningArea = 2.0 * Math.PI * _currentPortRadiusR * _grainLengthL;
double fuelFlowKgS = FuelDensityRhoF * burningArea * rDotMps;
// 현재 O/F 비
currentOfRatio = measuredOxFlowKgS / Math.Max(fuelFlowKgS, 1e-5);
// O/F 비를 목표치(6.5)로 유지하기 위한 산화제 피드백 제어
double ofError = _targetOfRatio - currentOfRatio;
_commandedOxidizerFlowKgS += 0.05 * ofError;
if (_commandedOxidizerFlowKgS < 0.2) _commandedOxidizerFlowKgS = 0.2;
else if (_commandedOxidizerFlowKgS > 3.0) _commandedOxidizerFlowKgS = 3.0;
// 추력 근사: F = (m_dot_ox + m_dot_f) * C_star * CF (CF ~ 1.5, C* ~ 1600 m/s)
double totalFlow = measuredOxFlowKgS + fuelFlowKgS;
estimatedThrustKn = (totalFlow * 1600.0 * 1.5) / 1000.0;
portRadiusMm = _currentPortRadiusR * 1000.0;
commandedOxFlowKgS = _commandedOxidizerFlowKgS;
}
public double CurrentPortRadiusMm => _currentPortRadiusR * 1000.0;
}
}
4. 현장 교구 및 산업 실무 적용성
본 추진 서보 엔진은 국내 우주 스타트업(이노스페이스 등) 소형 위성 발사체 1단 및 상단 킥모터 제어 시스템에 탑재되어 그레인 연소 중 발생하는 심각한 O/F 시프트를 1ms 이내로 상쇄하고 비추력 효율을 극대화합니다.