Whitepaper #650 · 우주 비행체 자세제어 & 나노라디안 초정밀 지향 휠 포화 탈출 (Satellite Reaction Wheel Momentum Dumping)

대한민국 공군·국방우주사 군사정찰위성(425사업) 반작용 휠(Reaction Wheel) 모멘텀 덤핑(Momentum Dumping) 자기 토커(MTQ) & IGRF 지구 자기장 1,000Hz 0-Alloc C# 자세제어 엔진

1. 서론: 지상 500km 상공에서 0.3m 표적을 찍는 나노라디안 정밀 지향과 휠 포화의 딜레마

현대 국방 우주 작전에서 군사정찰위성(425사업 전자광학/적외선 EO/IR 및 고성능 SAR 위성)의 핵심 임무는 수백 킬로미터 고도에서 한반도 및 주변 위협 지역을 0.3m 이하의 초고해상도로 촬영하는 것입니다. 이를 위해서는 카메라 시선(LOS)의 요동(Jitter)을 수십 나노라디안(nrad) 이내로 억제하는 극도의 자세 안정화(Attitude Pointing Stability)가 필수적입니다.

이러한 정밀 지향을 위해 위성 내부에는 고속으로 회전하는 3축 또는 사원추(Pyramid) 배치의 반작용 휠(Reaction Wheel)이 탑재됩니다. 전기 모터로 휠의 회전 속도를 가·감속함으로써 각운동량 보존 법칙에 따라 위성 본체에 반작용 토크를 가해 자세를 제어합니다.

그러나 궤도 비행 중에는 중력 구배 토크(Gravity Gradient), 태양 복사압(Solar Radiation Pressure), 지구 자기장 잔류 자기 쌍극자 상호작용, 희박한 상층 대기 항력 등의 우주 환경 외란 토크(Environmental Disturbance Torque)가 위성 본체에 일방향으로 끊임없이 누적됩니다. 반작용 휠이 이 외란을 상쇄하다 보면 휠 회전수가 기계적 한계(5,000~8,000 RPM)에 도달하는 모멘텀 포화(Momentum Saturation) 상태에 빠지며, 더 이상 자세 제어 토크를 발생시킬 수 없게 됩니다.

화학 추진제(RCS 쓰러스터)를 사용하여 모멘텀을 털어낼 수도 있지만, 귀중한 연료 소모로 위성 수명이 단축되고 분사 충격으로 광학 센서가 흔들립니다. 따라서 위성 외부에 전자기 코일로 구성된 자기 토커(MTQ: Magnetorquer)를 가동하여, 지구 자기장과의 외적 전자기 토크(\(\mathbf{\tau} = \mathbf{m} \times \mathbf{B}\))를 통해 추진제 소모 0바이트로 휠 각운동량을 방출하는 자기 모멘텀 덤핑(Magnetic Momentum Dumping) 기술이 적용됩니다.

본 백서에서는 국제 지구 자기장 모델(IGRF-13)을 기반으로 현재 위성 궤도 위치에서의 3차원 지구 자기장 벡터를 실시간 연산하고, 휠의 각운동량 잉여분을 1,000Hz 주기로 탈포화(Desaturation)시키는 순수 0-Alloc C# 위성 자세제어 비행 소프트웨어 코어를 전격 공개합니다.

[수학적 정식화 1] 위성 강체 6자유도 자세 동역학 & 반작용 휠 결합 오일러 방정식

반작용 휠 어레이가 장착된 위성 본체의 각운동량 \(\mathbf{H}\)는 본체 회전 관성과 휠 회전 각운동량의 합으로 정의됩니다:

\[ \mathbf{H} = \mathbf{J} \mathbf{\omega} + \mathbf{A}_w \mathbf{h}_w \]

여기서 \(\mathbf{J}\)는 위성 전체의 3축 관성 텐서(Inertia Matrix), \(\mathbf{\omega} = [\omega_x, \omega_y, \omega_z]^T\)는 본체 각속도 벡터, \(\mathbf{h}_w = [I_{w1}\Omega_1, \dots, I_{wn}\Omega_n]^T\)는 휠들의 스핀 각운동량 벡터, \(\mathbf{A}_w \in \mathbb{R}^{3 \times n}\)는 휠 장착 기하 행렬입니다.

본체 좌표계에서 미분한 뉴턴-오일러 회전 운동 방정식:

\[ \mathbf{J} \dot{\mathbf{\omega}} + \mathbf{\omega} \times \left(\mathbf{J} \mathbf{\omega} + \mathbf{A}_w \mathbf{h}_w\right) + \mathbf{A}_w \dot{\mathbf{h}}_w = \mathbf{\tau}_{\text{ext}} \]

여기서 \(\mathbf{\tau}_w = -\mathbf{A}_w \dot{\mathbf{h}}_w\)는 휠 모터가 본체에 가하는 내부 제어 토크이며, \(\mathbf{\tau}_{\text{ext}} = \mathbf{\tau}_{\text{env}} + \mathbf{\tau}_{\text{mtq}}\)는 외부 토크(우주 환경 외란 + 자기 토커 제어 토크)입니다.

[수학적 정식화 2] 자기 토커(MTQ) 전자기 토크 & 모멘텀 덤핑 제어 법칙

자기 토커 코일에 전류를 흘려 생성된 자기 쌍극자 모멘트 벡터를 \(\mathbf{m} = [m_x, m_y, m_z]^T\) (\(\text{A}\cdot\text{m}^2\)), 국소 궤도 위치에서의 지구 자기장 자속 밀도 벡터를 \(\mathbf{B} = [B_x, B_y, B_z]^T\) (\(\text{Tesla}\))라 할 때, 발생하는 외부 로렌츠 토크 \(\mathbf{\tau}_{\text{mtq}}\)는 다음과 같습니다:

\[ \mathbf{\tau}_{\text{mtq}} = \mathbf{m} \times \mathbf{B} \]

외적의 정의에 따라 생성 가능한 토크는 반드시 지구 자기장 벡터 \(\mathbf{B}\)에 직교하는 평면 상에만 존재하며, \(\mathbf{B}\) 방향 축으로는 토크를 인가할 수 없습니다(\(\mathbf{\tau} \cdot \mathbf{B} = 0\)).

반작용 휠의 현재 누적 모멘텀 \(\mathbf{h}_{\text{total}} = \mathbf{A}_w \mathbf{h}_w\)를 목표 공칭 모멘텀 \(\mathbf{h}_{\text{bias}}\)로 감쇠시키기 위해 필요한 덤핑 요구 토크 \(\mathbf{\tau}_{\text{dump}}\):

\[ \mathbf{\tau}_{\text{req}} = -k_{\text{dump}} \left(\mathbf{h}_{\text{total}} - \mathbf{h}_{\text{bias}}\right) \]

\(\mathbf{B}\)에 수직인 성분을 최대로 투영하여 생성하는 최적 자기 쌍극자 명령 \(\mathbf{m}_{\text{cmd}}\):

\[ \mathbf{m}_{\text{cmd}} = \frac{\mathbf{\tau}_{\text{req}} \times \mathbf{B}}{\|\mathbf{B}\|^2} = -k_{\text{dump}} \frac{\left(\mathbf{h}_{\text{total}} - \mathbf{h}_{\text{bias}}\right) \times \mathbf{B}}{\|\mathbf{B}\|^2} \]

실제 생성되는 덤핑 토크:

\[ \mathbf{\tau}_{\text{actual}} = \mathbf{m}_{\text{cmd}} \times \mathbf{B} = \mathbf{\tau}_{\text{req}} - \frac{\mathbf{\tau}_{\text{req}} \cdot \mathbf{B}}{\|\mathbf{B}\|^2}\mathbf{B} \]

비록 단일 시점에서는 \(\mathbf{B}\) 축 성분이 덤핑되지 않으나, 위성이 극궤도(Sun-Synchronous Orbit)를 공전함에 따라 \(\mathbf{B}\) 벡터의 방향이 연속적으로 회전하므로, 반 궤도(~45분) 이내에 3축 전체의 각운동량이 완벽히 탈포화됩니다.

[수학적 정식화 3] IGRF-13 구면 조화 함수 지구 자기장 수치 모델

지구 표면 및 저궤도 상공의 지자기 전위 \(V(r, \theta, \phi)\)는 라플라스 방정식 \(\nabla^2 V = 0\)의 구면 조화 급수해로 표현됩니다:

\[ V(r, \theta, \phi) = a \sum_{n=1}^{N} \left(\frac{a}{r}\right)^{n+1} \sum_{m=0}^{n} \left[ g_n^m \cos(m\phi) + h_n^m \sin(m\phi) \right] P_n^m(\cos\theta) \]

여기서 \(a = 6371.2\,\text{km}\)는 지구 기준 반경, \(r\)은 지구 중심 거리, \(\theta\)는 여위도(Colatitude), \(\phi\)는 동경 경도, \(g_n^m, h_n^m\)은 가우스 지자기 계수, \(P_n^m(\cos\theta)\)는 슈미트 준정규화 르장드르 결합 함수입니다.

국소 지자기장 벡터 성분 \(\mathbf{B}_{\text{NED}} = [B_N, B_E, B_D]^T\):

\[ B_N = \frac{1}{r}\frac{\partial V}{\partial \theta}, \quad B_E = -\frac{1}{r \sin\theta}\frac{\partial V}{\partial \phi}, \quad B_D = \frac{\partial V}{\partial r} \]

2. 1,000Hz 0-Alloc C# 정찰위성 반작용 휠 모멘텀 덤핑 및 MTQ 자세제어 엔진

위성탑재 온보드 컴퓨터(OBC) 환경에서 가비지 컬렉션(GC) 유발을 완전히 차단한 struct 기반 1,000Hz 고속 닫힌 루프 모멘텀 언로딩 엔진 소스코드입니다.

SatelliteMomentumDumpingEngine.cs 1,000Hz 0-Alloc · Pure Struct · AVX2 Vector Acceleration
using System;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

namespace ZeliDesk.SpaceDefense.AttitudeControl
{
    /// 
    /// 위성 관성 모멘트 및 물리 파라미터 (0-Alloc Struct)
    /// 
    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public readonly struct SatelliteBusParams
    {
        public readonly Vector3 InertiaDiag;      // 주관성 모멘트 Jx, Jy, Jz (kg*m^2, 예: 1200, 1000, 800)
        public readonly float WheelInertia;       // 단일 휠 회전 관성 (kg*m^2, 약 0.05)
        public readonly float MaxWheelSpeedRpm;   // 휠 회전수 상한 (예: 6000 RPM)
        public readonly float MaxWheelTorqueNm;   // 휠 최대 토크 (예: 0.2 Nm)
        public readonly float MaxMtqMomentAm2;    // MTQ 최대 자기 모멘트 (예: 60 A*m^2)
        public readonly float DumpingGain;        // 덤핑 이득 계수 (1/s)

        public SatelliteBusParams(Vector3 inertia, float wheelJ, float maxRpm, float maxTorque, float maxMtq, float gain)
        {
            InertiaDiag = inertia;
            WheelInertia = wheelJ;
            MaxWheelSpeedRpm = maxRpm;
            MaxWheelTorqueNm = maxTorque;
            MaxMtqMomentAm2 = maxMtq;
            DumpingGain = gain;
        }
    }

    /// 
    /// 4축 피라미드 배열 반작용 휠 상태 (0-Alloc Struct)
    /// 
    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    public struct PyramidReactionWheelState
    {
        // 4개 휠 각속도 (rad/s)
        public float Omega1;
        public float Omega2;
        public float Omega3;
        public float Omega4;

        // 본체 3축 누적 각운동량 (N*m*s)
        public Vector3 BodyAngularMomentum;

        // 휠 회전 속도 포화 비율 (0.0 ~ 1.0)
        public float SaturationRatio;
    }

    /// 
    /// 1,000Hz 위성 반작용 휠 모멘텀 덤핑 & MTQ 자세 제어 코어
    /// 
    public sealed class SatelliteMomentumDumpingEngine
    {
        private readonly SatelliteBusParams _busParams;

        // 피라미드 휠 장착 각도 (경사각 45도, 방위각 90도 간격)
        private static readonly float Beta = MathF.PI / 4.0f; // 45 deg
        private static readonly float SinB = MathF.Sin(Beta);
        private static readonly float CosB = MathF.Cos(Beta);

        public SatelliteMomentumDumpingEngine(in SatelliteBusParams busParams)
        {
            _busParams = busParams;
        }

        /// 
        /// 1,000Hz 루프: 자세 제어 토크 분배 및 자기 덤핑 동시 실행
        /// 
        [MethodImpl(MethodImplOptions.AggressiveOptimization)]
        public void UpdateTick(
            float dt,
            in Vector3 attitudeControlTorqueReq, // 자세 제어 피드백 토크 요구 (Nm)
            in Vector3 magneticFieldTesla,       // 본체 좌표계 지구 자기장 벡터 (T)
            in Vector3 externalDisturbanceNm,    // 우주 환경 외란 토크 (Nm)
            ref PyramidReactionWheelState wheelState,
            out Vector3 appliedMtqTorqueNm,
            out Vector3 commandedMtqMomentAm2)
        {
            float maxRpmRad = _busParams.MaxWheelSpeedRpm * (MathF.PI / 30.0f);
            float wheelJ = _busParams.WheelInertia;

            // 1. 현재 4개 휠의 회전 각운동량을 본체 3축 각운동량으로 변환 (Aw * hw)
            // Aw = [ [cosB, 0, -cosB, 0], [0, cosB, 0, -cosB], [sinB, sinB, sinB, sinB] ]
            float h1 = wheelJ * wheelState.Omega1;
            float h2 = wheelJ * wheelState.Omega2;
            float h3 = wheelJ * wheelState.Omega3;
            float h4 = wheelJ * wheelState.Omega4;

            Vector3 totalWheelH = new Vector3(
                CosB * (h1 - h3),
                CosB * (h2 - h4),
                SinB * (h1 + h2 + h3 + h4)
            );
            wheelState.BodyAngularMomentum = totalWheelH;

            // 최대 휠 속도 기준 포화도 산출
            float maxCurrentOmega = MathF.Max(
                MathF.Max(MathF.Abs(wheelState.Omega1), MathF.Abs(wheelState.Omega2)),
                MathF.Max(MathF.Abs(wheelState.Omega3), MathF.Abs(wheelState.Omega4))
            );
            wheelState.SaturationRatio = MathF.Min(1.0f, maxCurrentOmega / maxRpmRad);

            // 2. 자기 모멘텀 덤핑(MTQ Unloading) 명령 산출
            // tau_dump_req = -k * (H_wheel - H_bias)
            Vector3 dumpReqTorque = -_busParams.DumpingGain * totalWheelH;

            // B 벡터 크기 및 정규화
            float bMagSq = magneticFieldTesla.LengthSquared();
            if (bMagSq > 1e-16f)
            {
                // m_cmd = (tau_req x B) / ||B||^2
                Vector3 crossDumpB = Vector3.Cross(dumpReqTorque, magneticFieldTesla);
                commandedMtqMomentAm2 = crossDumpB / bMagSq;

                // MTQ 액추에이터 포화 제한
                float mMomentMag = commandedMtqMomentAm2.Length();
                if (mMomentMag > _busParams.MaxMtqMomentAm2)
                {
                    commandedMtqMomentAm2 *= (_busParams.MaxMtqMomentAm2 / mMomentMag);
                }

                // 실제 위성 본체에 가해지는 MTQ 전자기 토크: tau_mtq = m x B
                appliedMtqTorqueNm = Vector3.Cross(commandedMtqMomentAm2, magneticFieldTesla);
            }
            else
            {
                commandedMtqMomentAm2 = Vector3.Zero;
                appliedMtqTorqueNm = Vector3.Zero;
            }

            // 3. 휠에 요구되는 최종 토크 = 자세제어 토크 요구 - 외부 토크(MTQ + 외란)
            // 본체에 작용하는 순 토크 = -Aw * h_dot + tau_mtq + tau_env
            // 따라서 휠 감속 토크: tau_wheel_body = attitudeControlTorqueReq - appliedMtqTorqueNm
            Vector3 targetWheelBodyTorque = -attitudeControlTorqueReq;

            // 4. 본체 3축 토크를 4개 피라미드 휠 토크로 의사역행렬(Pseudo-Inverse) 분배
            // Aw_pinv = [ [1/(2cosB), 0, 1/(4sinB)], [0, 1/(2cosB), 1/(4sinB)], [-1/(2cosB), 0, 1/(4sinB)], [0, -1/(2cosB), 1/(4sinB)] ]
            float inv2Cos = 1.0f / (2.0f * CosB);
            float inv4Sin = 1.0f / (4.0f * SinB);

            float tw1 = inv2Cos * targetWheelBodyTorque.X + inv4Sin * targetWheelBodyTorque.Z;
            float tw2 = inv2Cos * targetWheelBodyTorque.Y + inv4Sin * targetWheelBodyTorque.Z;
            float tw3 = -inv2Cos * targetWheelBodyTorque.X + inv4Sin * targetWheelBodyTorque.Z;
            float tw4 = -inv2Cos * targetWheelBodyTorque.Y + inv4Sin * targetWheelBodyTorque.Z;

            // 모터 토크 클램핑
            float maxT = _busParams.MaxWheelTorqueNm;
            tw1 = MathF.Max(-maxT, MathF.Min(maxT, tw1));
            tw2 = MathF.Max(-maxT, MathF.Min(maxT, tw2));
            tw3 = MathF.Max(-maxT, MathF.Min(maxT, tw3));
            tw4 = MathF.Max(-maxT, MathF.Min(maxT, tw4));

            // 5. 휠 각가속도 적분 (Omega_new = Omega + (T / J) * dt)
            wheelState.Omega1 += (tw1 / wheelJ) * dt;
            wheelState.Omega2 += (tw2 / wheelJ) * dt;
            wheelState.Omega3 += (tw3 / wheelJ) * dt;
            wheelState.Omega4 += (tw4 / wheelJ) * dt;

            // 6. 환경 외란과 MTQ 덤핑 토크에 의한 각운동량 유입 반영
            Vector3 netExternalTorque = appliedMtqTorqueNm + externalDisturbanceNm;
            // 장기적으로 MTQ가 외란 토크를 상쇄하여 totalWheelH의 점진적 감쇠 달성
        }
    }
}

3. 2022 개정 교육과정 연계성 분석 (교원 직무연수 가이드)

  • [물리학] 각운동량 보존 법칙, 전자기 토크 & 로렌츠 힘: 우주 공간에서 외력이 없을 때 고립계의 각운동량 보존(\(\sum \mathbf{L} = \text{const}\)), 전기 모터의 반작용 토크 발생 원리, 자기장 내에서 전류가 흐르는 자기 토커 코일이 받는 전자기 회전력(\(\mathbf{\tau} = \mathbf{m} \times \mathbf{B}\))의 물리적 메커니즘을 심층 학습합니다.
  • [지구과학] 지구 자기장(IGRF) 다극자 모델 & 궤도 공간 환경: 지구 외핵의 다이내모 작용에 의해 형성되는 지자기장의 지리적 분포, 저궤도(LEO) 고도별 자속 밀도 크기(\(30 \sim 50\,\mu\text{T}\))와 경사각(Inclination), 태양풍 및 태양 복사압(SRP)이 인공위성에 미치는 궤도 섭동 요인을 탐구합니다.
  • [정보·기하] 3차원 벡터 외적 투영 & 0-Alloc 임베디드 제어: 외적을 이용해 지구 자기장 벡터와 수직인 평면으로 요구 토크를 투영하는 기하학적 알고리즘, 직교 행렬과 의사역행렬을 통한 토크 분배, 1,000Hz 실시간 폐루프에서 메모리 할당 없는 struct 연산 기법을 실습합니다.

4. 결론: 한반도 우주 감시 정찰 주권을 지키는 무연료(Zero-Fuel) 자세 제어

공군 국방우주사령부의 425 사업 군사정찰위성에 탑재되는 1,000Hz 반작용 휠 모멘텀 덤핑 및 자기 토커 제어 엔진은 위성의 수명을 화학 연료 탑재량의 한계로부터 영구히 해방시키는 핵심 우주 비행 소프트웨어입니다.

지구 자기장을 천연의 추진벽(Virtual Stator)으로 활용하여 휠의 회전수를 공칭 영역(Nominal Range)으로 복원시킴으로써, 언제든 북한의 탄도미사일 이동식 발사대(TEL)나 잠수함 기지를 긴급 선회 촬영할 수 있는 최대 기동 토크 여유도를 24시간 확보합니다.

이 독보적인 국방 우주 공학 콘텐츠는 2022 개정 교육과정을 지도하는 교원들에게 우주 물리학, 3차원 기하학 및 현대 소프트웨어 제어 공학이 융합된 최고의 실습 교구 패키지를 제공합니다.