가로·세로·높이 10~30cm에 불과한 초소형 큐브위성(CubeSat)은 발사체에서 사출된 직후 초당 수십 도(°/s)에 달하는 격렬한 회전 텀블링(Tumbling) 상태에 빠집니다. 가스 분사 추력기나 대형 반작용 휠을 탑재하기 어려운 초소형 위성이 3축 코일 전자기석(Magnetorquer)을 통해 지구 자기장($\mathbf{B}$)과 상호작용하여 회전 각운동량을 소멸시키는 B-dot 댐핑 알고리즘과 반작용 휠 각운동량 배출(Desaturation)을 1,000Hz 주기로 제어하는 0-Alloc C# 우주 소프트웨어 백서를 공개합니다.

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

  • 물리학 (자기 쌍극자 모멘트, 로렌츠 힘과 회전력, 각운동량 보존 법칙): 도선 코일에 흐르는 전류 $I$와 권수 $N$, 면적 $A$에 의한 자기 모멘트 $\mathbf{m} = N I A \hat{\mathbf{n}}$와 전자기 회전 토크 $\boldsymbol{\tau} = \mathbf{m} \times \mathbf{B}$.
  • 수학 (B-dot 피드백 제어 법칙 및 벡터 외적 미분): 지자기 센서로 측정한 자속밀도 시간 변화율 $\dot{\mathbf{B}}$에 반비례하는 자기 모멘트 $\mathbf{m} = -k \frac{\dot{\mathbf{B}}}{\|\mathbf{B}\|}$ 수렴성 증명.
  • 지구과학 (지구 자기장의 쌍극자 모델 IGRF 및 남극/북극 복각 편각): 저궤도(500km) 상공에서의 지자기장 세기(약 $30\sim50\,\mu\text{T}$)와 궤도 위치별 지자기 벡터 공간 분포 모델링.
  • 정보 (무할당 실시간 1,000Hz 3축 PWM 코일 전류 듀티 산출 파이프라인): 1ms 실시간 루프 내에서 가비지 컬렉터 없이 3축 자력계 신호를 스택 메모리로 0-Alloc 필터링하는 C# 초소형 온디바이스 위성 탑재 코어.

2. 자기 토커 상호작용 및 B-dot 댐핑 수식 모델

위성 동체 좌표계에서 관성모멘트 텐서 $\mathbf{I}$, 각속도 $\boldsymbol{\omega}$인 큐브위성의 오일러 회전 운동방정식은 다음과 같습니다.

$$\mathbf{I} \dot{\boldsymbol{\omega}} + \boldsymbol{\omega} \times (\mathbf{I} \boldsymbol{\omega}) = \boldsymbol{\tau}_{mag} = \mathbf{m} \times \mathbf{B}$$

동체 고정 자력계로 측정한 자기장 벡터 $\mathbf{B}$의 시간 변화율 $\dot{\mathbf{B}} = \frac{d\mathbf{B}}{dt} + \boldsymbol{\omega} \times \mathbf{B}$에 대해, B-dot 제어 법칙을 적용한 회전 운동 에너지 $E_{rot} = \frac{1}{2}\boldsymbol{\omega}^T \mathbf{I}\boldsymbol{\omega}$의 시간 미분은 다음과 같습니다.

$$\dot{E}_{rot} = \boldsymbol{\omega} \cdot \boldsymbol{\tau}_{mag} = \boldsymbol{\omega} \cdot (\mathbf{m} \times \mathbf{B}) = -\frac{k}{\|\mathbf{B}\|} \|\boldsymbol{\omega} \times \mathbf{B}\|^2 \le 0$$

이로써 외부 연료 소모 없이 지구 자기장만으로 위성의 텀블링을 완전히 멈추고 태양광 패널을 태양 방향으로 지향시킬 수 있습니다.

3. 1,000Hz 0-Alloc C# 큐브위성 B-dot 제어 코어

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

namespace ZeliDesk.Education.StemSpace.CubeSatAcs
{
    public readonly record struct MagnetometerTelemetry(
        Vector3 MagneticFieldMicroTesla, // 3축 자력계 측정치
        Vector3 AngularRateRadPerSec,
        float BatteryVoltageVolts
    );

    public ref struct MagnetorquerCommand
    {
        public Vector3 CommandedMagneticMomentAm2; // 3축 자기 모멘트 (A*m^2)
        public Vector3 CoilPwmDutyPercent;
        public bool DetumblingConverged;
    }

    public static class CubeSatBdotControlCore
    {
        private const float MaxDipoleMomentAm2 = 0.25f; // 1U/3U 큐브위성 코일 한계
        private const float BdotGainK = 1.2e5f;

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static void ComputeBdotTorque(
            ref readonly MagnetometerTelemetry tel,
            ref Vector3 previousBField, // 스택 관리 이전 자기장 벡터
            float dtSec,
            ref MagnetorquerCommand cmd)
        {
            // 1. 자기장 시간 변화율 (B-dot) 계산
            Vector3 bDot = (tel.MagneticFieldMicroTesla - previousBField) / Math.Max(dtSec, 0.001f);
            previousBField = tel.MagneticFieldMicroTesla;

            float bNorm = tel.MagneticFieldMicroTesla.Length();
            if (bNorm < 1.0f)
            {
                cmd.CommandedMagneticMomentAm2 = Vector3.Zero;
                cmd.CoilPwmDutyPercent = Vector3.Zero;
                cmd.DetumblingConverged = false;
                return;
            }

            // 2. B-dot 피드백 법칙: m = -k * (B_dot / ||B||)
            Vector3 targetMoment = -BdotGainK * (bDot / bNorm) * 1e-6f;

            // 3. 코일 전자기 모멘트 클램핑
            targetMoment.X = Math.Clamp(targetMoment.X, -MaxDipoleMomentAm2, MaxDipoleMomentAm2);
            targetMoment.Y = Math.Clamp(targetMoment.Y, -MaxDipoleMomentAm2, MaxDipoleMomentAm2);
            targetMoment.Z = Math.Clamp(targetMoment.Z, -MaxDipoleMomentAm2, MaxDipoleMomentAm2);
            cmd.CommandedMagneticMomentAm2 = targetMoment;

            // 4. PWM 듀티비 환산 (-100% ~ +100%)
            cmd.CoilPwmDutyPercent = new Vector3(
                (targetMoment.X / MaxDipoleMomentAm2) * 100.0f,
                (targetMoment.Y / MaxDipoleMomentAm2) * 100.0f,
                (targetMoment.Z / MaxDipoleMomentAm2) * 100.0f
            );

            // 5. 각속도 0.5 deg/s 이하 수렴 확인
            cmd.DetumblingConverged = tel.AngularRateRadPerSec.Length() < 0.0087f;
        }
    }
}

4. 방통대 우호성 교수 랩실 교구 및 국방 AIDT 현장 적용 가이드

초·중·고 과학교육 및 우주 동아리 탐구

본 백서는 중·고등학교 물리학의 "전자기 유도와 전류가 만드는 자기장, 토크와 각운동량, 우주선 자세 제어" 단원에서 학생들이 직접 나침반과 코일로 우주선을 멈추는 원리를 탐구할 수 있는 직관적인 교육 교구입니다. 전기를 흘리면 자석이 되는 전자석의 원리가 실제 우주에 떠 있는 위성의 회전을 멈추는 핵심 브레이크가 된다는 사실을 C# 0-Alloc 알고리즘으로 시각화할 수 있습니다.

5. 결론 및 제383호 예고

자기 토커 기반 B-dot 제어는 저궤도 초소형 위성의 생존과 임무 성공을 가능케 하는 필수 핵심 기술입니다. 이어지는 제383호 백서에서는 한국형 초전도 인공태양 KSTAR 토카막(Tokamak) 초전도 자석 D자형 플라즈마 평형 및 1,000Hz 0-Alloc C# 그라드-샤프라노프(Grad-Shafranov) MHD 평형 제어 엔진을 심층 분석합니다.