화학 로켓의 수천 배에 달하는 비추력($I_{sp} > 3,000\,\text{s}$)을 자랑하는 전기추진 이온/홀 추력기는 크세논(Xe) 중성 가스를 전자 충돌로 이온화시킨 후, 수백 볼트의 정전기장으로 가속 분사하여 밀리뉴턴(mN) 단위의 미세 추력을 수개월간 연속 생성합니다. 본 백서에서는 2022 개정 물리·화학·지구과학·수학·정보를 융합하여, 홀 추력기 방전 챔버의 $\mathbf{E} \times \mathbf{B}$ 전자 드리프트 현상과 4차 룬게-쿠타(RK4) 수치적분을 통해 행성 간 저추력 연속 나선형 궤도 전이 궤적을 1,000Hz 주기로 연산하는 0-Alloc C# 온디바이스 시뮬레이터를 공개합니다.

1. 2022 개정 교육과정 교과 연계 분석

  • 물리학 (로렌츠 힘과 하전입자 정전가속, 치올콥스키 로켓 방정식): 방전 챔버 내 전기장 $\mathbf{E}$와 자기장 $\mathbf{B}$에 의한 로렌츠 힘 $\mathbf{F} = q(\mathbf{E} + \mathbf{v} \times \mathbf{B})$ 및 이온 방출 속도 $v_e = \sqrt{2 q V / m_{ion}}$, 유효 배기속도와 비추력 $c = I_{sp} g_0$.
  • 화학 (크세논 1차 이온화 에너지 및 플라즈마 상태): 비활성 기체 크세논($\text{Xe}$)의 1차 이온화 반응 $\text{Xe} + e^- \to \text{Xe}^+ + 2e^-$ 및 플라즈마 중성화를 위한 중화기(Neutralizer) 음극 전자 방출.
  • 지구과학/우주과학 (케플러 궤도 섭동 및 저추력 나선형 탈출 궤적): 순간적인 임펄스 추진(호만 전이)과 달리, 수개월에 걸쳐 고도를 서서히 높여 지구 중력장을 탈출하는 저추력 나선형(Low-thrust Spiral) 궤도 천체역학.
  • 수학 (4차 룬게-쿠타(RK4) 연립 상미분방정식 수치해석): 위성 위치 $\mathbf{r}(t)$와 속도 $\mathbf{v}(t)$, 질량 감소 $\dot{m}(t) = -T / (I_{sp} g_0)$를 4단계 오차 보정으로 적분하는 6자유도 천체역학 수치 적분.
  • 정보 (무할당 실시간 1,000Hz 궤도 전파기): 1ms 실시간 루프 내에서 가비지 컬렉터 부담 없이 스택 메모리와 SIMD 벡터 가속을 통해 행성 간 항법 궤적을 0-Alloc으로 시뮬레이션하는 C# 코어.

2. 홀 추력기 정전가속 및 저추력 궤도 미분방정식

홀 추력기에서 전압 강하 $V_{acc}$를 통과한 크세논 이온($q = 1.602 \times 10^{-19}\,\text{C}$, $m_{ion} = 2.18 \times 10^{-25}\,\text{kg}$)의 분사 속도 $v_e$와 발생 추력 $T$, 비추력 $I_{sp}$는 다음과 같습니다.

$$v_e = \sqrt{\frac{2 q V_{acc}}{m_{ion}}}, \quad T = \dot{m}_{xe} v_e \eta_{div}, \quad I_{sp} = \frac{v_e}{g_0}$$

중심 천체(지구/태양)의 중력상수 $\mu = G M$와 추력 벡터 $\mathbf{T}(t)$를 받는 위성의 6차원 상태 공간 운동방정식은 다음과 같습니다.

$$\frac{d\mathbf{r}}{dt} = \mathbf{v}, \quad \frac{d\mathbf{v}}{dt} = -\frac{\mu}{\|\mathbf{r}\|^3}\mathbf{r} + \frac{\mathbf{T}(t)}{m(t)}, \quad \frac{dm}{dt} = -\frac{\|\mathbf{T}(t)\|}{I_{sp} g_0}$$

이 비선형 연립방정식을 4차 룬게-쿠타(RK4) 방식으로 수치 적분하여, 탐사선의 매 초 궤도 위치와 잔여 연료량을 오차 $O(\Delta t^4)$ 이내로 정밀 추적합니다.

3. 1,000Hz 0-Alloc C# 저추력 궤도 적분 코어

using System;
using System.Numerics;
using System.Runtime.CompilerServices;

namespace ZeliDesk.Education.StemSpace.IonThruster
{
    public readonly record struct SpacecraftState(
        Vector3 PositionMeters,   // 지심/태양 중심 관성좌표계 위치 (m)
        Vector3 VelocityMps,      // 속도 (m/s)
        float MassKg,             // 현재 탐사선 총 질량 (kg)
        float IspSeconds          // 추력기 비추력 (초)
    );

    public ref struct ThrusterOutput
    {
        public Vector3 ThrustNewton;
        public float MassFlowKgPerSec;
        public float AccelerationMps2;
    }

    public static class LowThrustRk4Integrator
    {
        private const float MuEarth = 3.986004418e14f; // 지구 중력상수 (m^3/s^2)
        private const float StandardGravityG0 = 9.80665f;

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static SpacecraftState StepRk4(
            in SpacecraftState state,
            Vector3 thrustUnitVector,
            float thrustMagnitudeN,
            float dtSec)
        {
            // k1 평가
            EvaluateDerivatives(state, thrustUnitVector, thrustMagnitudeN, out Vector3 dr1, out Vector3 dv1, out float dm1);

            // k2 평가
            var s2 = new SpacecraftState(
                state.PositionMeters + dr1 * (0.5f * dtSec),
                state.VelocityMps + dv1 * (0.5f * dtSec),
                state.MassKg + dm1 * (0.5f * dtSec),
                state.IspSeconds
            );
            EvaluateDerivatives(s2, thrustUnitVector, thrustMagnitudeN, out Vector3 dr2, out Vector3 dv2, out float dm2);

            // k3 평가
            var s3 = new SpacecraftState(
                state.PositionMeters + dr2 * (0.5f * dtSec),
                state.VelocityMps + dv2 * (0.5f * dtSec),
                state.MassKg + dm2 * (0.5f * dtSec),
                state.IspSeconds
            );
            EvaluateDerivatives(s3, thrustUnitVector, thrustMagnitudeN, out Vector3 dr3, out Vector3 dv3, out float dm3);

            // k4 평가
            var s4 = new SpacecraftState(
                state.PositionMeters + dr3 * dtSec,
                state.VelocityMps + dv3 * dtSec,
                state.MassKg + dm3 * dtSec,
                state.IspSeconds
            );
            EvaluateDerivatives(s4, thrustUnitVector, thrustMagnitudeN, out Vector3 dr4, out Vector3 dv4, out float dm4);

            // RK4 가중 평균 합성 (0-Alloc 스택 연산)
            Vector3 newPos = state.PositionMeters + (dr1 + 2f * dr2 + 2f * dr3 + dr4) * (dtSec / 6f);
            Vector3 newVel = state.VelocityMps + (dv1 + 2f * dv2 + 2f * dv3 + dv4) * (dtSec / 6f);
            float newMass = state.MassKg + (dm1 + 2f * dm2 + 2f * dm3 + dm4) * (dtSec / 6f);

            return new SpacecraftState(newPos, newVel, Math.Max(newMass, 1.0f), state.IspSeconds);
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        private static void EvaluateDerivatives(
            in SpacecraftState s,
            Vector3 thrustDir,
            float thrustN,
            out Vector3 dr,
            out Vector3 dv,
            out float dm)
        {
            dr = s.VelocityMps;

            float rLength = s.PositionMeters.Length();
            float rCube = rLength * rLength * rLength;
            Vector3 gravityAcc = (rCube > 1e-6f) ? -MuEarth / rCube * s.PositionMeters : Vector3.Zero;

            Vector3 thrustAcc = (s.MassKg > 0.1f) ? (thrustDir * thrustN) / s.MassKg : Vector3.Zero;
            dv = gravityAcc + thrustAcc;

            dm = -(thrustN / (s.IspSeconds * StandardGravityG0));
        }
    }
}

4. 교육적 가치 및 미래 우주탐사 응용

본 시뮬레이터는 한국 최초의 달 궤도선 다누리호의 항법 제어는 물론, 향후 화성 및 소행성 탐사선에 적용될 전기추진 시스템의 핵심 원리를 고스란히 담고 있습니다. 학생들은 본 교구를 통해 단순한 수식 암기가 아니라, 왜 크세논 가스가 이온 엔진의 최적 연료인지(원자 질량이 크고 이온화 에너지가 낮음), 왜 화학 로켓보다 수개월간 연속 가속하는 저추력 엔진이 행성 간 전이에서 탑재 연료 중량을 80% 이상 절감하는지를 3D 실시간 궤적 렌더링과 함께 체득하게 됩니다.