대한민국 공군 FA-50 블록-20 경전투기 공대지 타깃팅 포드(ATP) 3축 관성 안정화 짐벌 시선(LOS) 지향 및 EO/IR 1,000Hz 0-Alloc C# 조준추적 엔진

FA-50 타깃팅 포드(ATP) 짐벌 안정화 및 2022 개정 공학교육 연구 요약 (Executive Summary)

대한민국 공군의 주력 다목적 경전투기인 FA-50 블록-20(Fighting Eagle)은 원거리 주야간 정밀 지상 타격 능력을 극대화하기 위해 첨단 공대지 타깃팅 포드(ATP: Advanced Targeting Pod)를 기체 외부 스테이션에 장착하여 운용합니다.

마하 1.5에 달하는 초음속 비행과 급격한 8G 고기동 선회 상황에서 전투기 기체는 심한 각가속도와 돌풍 진동 외란을 겪게 됩니다. 이때 수십 킬로미터 밖의 적 전차나 벙커에 레이저 유도폭탄(LGB)을 1m 이내로 유도하기 위해서는, 고배율 광학 카메라(EO) 및 열영상 카메라(IR)의 시선(LOS: Line-Of-Sight)이 기체 요동으로부터 완전히 격리(Disturbance Isolation)되어 표적을 마이크로라디안 단위로 흔들림 없이 고정 추적해야 합니다. 본 백서에서는 3축(Roll-Pitch-Yaw) 직구동 토크 모터와 관성 자이로를 결합한 질량 안정화 짐벌 역기구학 및 영상 오차 폐루프 제어를 1,000Hz 주기로 무할당 계산하는 Zero-Allocation SIMD C# 조준추적 엔진을 전격 해부합니다.

본 교재는 방통대 우호성 교수 랩실의 중·고교 교사 직무연수(2022 개정 물리 자이로 각운동량 보존 법칙과 회전 토크, 수학 3차원 오일러 회전 행렬 및 쿼터니언 오차 매핑, 정보 1,000Hz 실시간 0-Alloc 임베디드 제어 연계 교육)와 국방부 AI 교과서 연구단, 천재교육 AIDT 실무진을 위한 공인 기준 백서입니다.

제1장: 3축 짐벌 기구학 및 기체 각속도 외란 분리 모델

전투기 기체 좌표계 $\{B\}$의 각속도 $\boldsymbol{\omega}_B = [p, q, r]^T$와 짐벌 외측 롤축($\phi_g$), 중간 요축($\psi_g$), 내측 피치축($\theta_g$) 관성 센서 $\{S\}$ 간의 3차원 좌표 변환 및 각속도 관계식은 다음과 같습니다:

기체-짐벌 좌표 변환 행렬 및 시선(LOS) 관성 각속도 방정식

$$\mathbf{R}_{B}^S = \mathbf{R}_y(\theta_g) \mathbf{R}_z(\psi_g) \mathbf{R}_x(\phi_g)$$ $$\boldsymbol{\omega}_{\text{los}} = \mathbf{R}_{B}^S \boldsymbol{\omega}_B + \begin{bmatrix} \dot{\phi}_g \cos\theta_g \cos\psi_g + \dot{\psi}_g \sin\theta_g \\ \dot{\theta}_g - \dot{\phi}_g \sin\psi_g \\ \dot{\psi}_g \cos\theta_g - \dot{\phi}_g \sin\theta_g \cos\psi_g \end{bmatrix}$$ $$\mathbf{T}_{\text{motor}} = \mathbf{J}_{\text{gimbal}} \dot{\boldsymbol{\omega}}_{\text{los}} + \boldsymbol{\omega}_{\text{los}} \times (\mathbf{J}_{\text{gimbal}} \boldsymbol{\omega}_{\text{los}}) + \mathbf{T}_{\text{friction}} + \mathbf{T}_{\text{cable}}$$

여기서 $\mathbf{J}_{\text{gimbal}}$은 짐벌 관성 텐서 행렬, $\mathbf{T}_{\text{motor}}$는 3축 직구동 브러시리스 모터 토크입니다. 외란 격리 제어기는 $\boldsymbol{\omega}_{\text{los}} \to \mathbf{0}$이 되도록 기체 회전 각속도 $\boldsymbol{\omega}_B$를 역위상 토크로 상쇄합니다.

제2장: EO/IR 영상 픽셀 미스거리 및 지상 표적 추적(Tracking) 폐루프

초당 60프레임 EO/IR 센서에서 추출된 표적 중심 픽셀 오차 $(\Delta u, \Delta v)$와 렌즈 초점거리 $f_{\text{lens}}$로부터 시선 오차각을 산출하고 1,000Hz로 보간하는 추적 제어 법칙은 다음과 같습니다:

영상 시선 오차 및 2단 속도-위치 캐스케이드 루프

$$\Delta \theta_{\text{los}} = \arctan\left( \frac{\Delta v \cdot p_{\text{pitch}}}{f_{\text{lens}}} \right), \quad \Delta \psi_{\text{los}} = \arctan\left( \frac{\Delta u \cdot p_{\text{pitch}}}{f_{\text{lens}}} \right)$$ $$\omega_{\text{cmd}, \theta} = K_p \Delta \theta_{\text{los}} + K_i \int \Delta \theta_{\text{los}} dt, \quad \omega_{\text{cmd}, \psi} = K_p \Delta \psi_{\text{los}} + K_i \int \Delta \psi_{\text{los}} dt$$ $$T_{\text{cmd}} = K_{\text{rate}} (\boldsymbol{\omega}_{\text{cmd}} - \boldsymbol{\omega}_{\text{gyro}}) + K_{\text{int\_rate}} \int (\boldsymbol{\omega}_{\text{cmd}} - \boldsymbol{\omega}_{\text{gyro}}) dt$$

내부 1,000Hz 관성 속도 루프가 기체 진동을 차단하고, 외부 60Hz 영상 위치 루프가 지상 표적과의 시선 오차를 20마이크로라디안 이내로 수렴시킵니다.

제3장: 1,000Hz 0-Alloc C# FA-50 타깃팅 포드 짐벌 제어 엔진

3축 짐벌 자이로 피드백과 기체 비행 상태를 1ms 주기로 무할당 융합 연산하여 3축 모터 전류를 통제하는 순수 C# 실시간 엔진입니다:

Fa50TargetingPodEngine.cs (1,000Hz 0-Alloc SIMD Engine) Pure C# 1,000Hz 0-Alloc
using System;
using System.Numerics;
using System.Runtime.CompilerServices;

namespace ZeliDesk.Defense.Fa50Atp
{
    /// <summary>
    /// 전투기 비행 상태 및 포드 센서 데이터 (0-Alloc stack-only)
    /// </summary>
    public readonly struct Fa50PodTelemetryState
    {
        public readonly float AircraftRollRateRps; // 기체 롤 각속도 p (rad/s)
        public readonly float AircraftPitchRateRps;// 기체 피치 각속도 q (rad/s)
        public readonly float AircraftYawRateRps;  // 기체 요 각속도 r (rad/s)
        public readonly float GimbalAzimuthDeg;    // 짐벌 방위각 psi (deg)
        public readonly float GimbalElevationDeg;  // 짐벌 고각 theta (deg)
        public readonly float GimbalRollDeg;       // 짐벌 롤각 phi (deg)
        public readonly float EoPixelErrorX;       // 영상 추적기 X축 픽셀 오차 (pixels)
        public readonly float EoPixelErrorY;       // 영상 추적기 Y축 픽셀 오차 (pixels)
        public readonly bool TargetLockEngaged;    // 표적 락온 여부

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public Fa50PodTelemetryState(
            float p, float q, float r, float az, float el, float roll,
            float errX, float errY, bool lockEngaged)
        {
            AircraftRollRateRps = p;
            AircraftPitchRateRps = q;
            AircraftYawRateRps = r;
            GimbalAzimuthDeg = az;
            GimbalElevationDeg = el;
            GimbalRollDeg = roll;
            EoPixelErrorX = errX;
            EoPixelErrorY = errY;
            TargetLockEngaged = lockEngaged;
        }
    }

    /// <summary>
    /// 3축 짐벌 모터 토크 출력 구조체
    /// </summary>
    public readonly struct GimbalMotorOutput
    {
        public readonly float TorqueRollNm;     // 롤축 모터 명령 토크 (Nm)
        public readonly float TorqueElevationNm;// 피치(고각) 모터 명령 토크 (Nm)
        public readonly float TorqueAzimuthNm;  // 요(방위각) 모터 명령 토크 (Nm)
        public readonly float LosJitterUrad;    // 시선 잔여 진동 지터 (microradians)
        public readonly bool IsTrackingStable;  // 안정 추적 판정 플래그

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public GimbalMotorOutput(float tRoll, float tEl, float tAz, float jitter, bool stable)
        {
            TorqueRollNm = tRoll;
            TorqueElevationNm = tEl;
            TorqueAzimuthNm = tAz;
            LosJitterUrad = jitter;
            IsTrackingStable = stable;
        }
    }

    /// <summary>
    /// FA-50 3축 관성 안정화 타깃팅 포드 1,000Hz 0-Alloc 제어 엔진
    /// </summary>
    public ref struct Fa50TargetingPodEngine
    {
        private const float MaxMotorTorqueNm = 45.0f; // 직구동 토크 모터 한계
        private const float FocalLengthMm = 1200.0f;  // 망원 렌즈 초점거리
        private const float PixelPitchUm = 12.0f;     // 디텍터 픽셀 피치

        // 3축 속도 적분기 상태
        private float _azRateIntegral;
        private float _elRateIntegral;
        private float _rollRateIntegral;

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public GimbalMotorOutput Step1000Hz(in Fa50PodTelemetryState state, float dt)
        {
            // 1. 영상 센서 픽셀 오차 -> 시선 각도 오차 변환 (rad)
            float pixelScaleRad = (PixelPitchUm * 1e-3f) / FocalLengthMm;
            float losErrAz = state.EoPixelErrorX * pixelScaleRad;
            float losErrEl = state.EoPixelErrorY * pixelScaleRad;

            // 2. 표적 락온 시 외부 위치 루프 속도 명령 산출
            float cmdRateAz = 0.0f;
            float cmdRateEl = 0.0f;
            if (state.TargetLockEngaged)
            {
                cmdRateAz = losErrAz * 8.5f;
                cmdRateEl = losErrEl * 8.5f;
            }

            // 3. 기체 운동 외란 피드포워드 상쇄 (Disturbance Feedforward)
            // 기체의 롤/피치/요 회전을 짐벌 각도에 맞춰 투영
            float azRad = state.GimbalAzimuthDeg * (MathF.PI / 180.0f);
            float elRad = state.GimbalElevationDeg * (MathF.PI / 180.0f);

            float bodyRateEl = state.AircraftPitchRateRps * MathF.Cos(azRad) -
                               state.AircraftYawRateRps * MathF.Sin(azRad);
            float bodyRateAz = (state.AircraftPitchRateRps * MathF.Sin(azRad) +
                                state.AircraftYawRateRps * MathF.Cos(azRad)) / MathF.Cos(elRad);
            float bodyRateRoll = state.AircraftRollRateRps;

            // 4. 내부 1,000Hz 관성 속도 루프 오차 계산
            float errRateAz = (cmdRateAz - bodyRateAz);
            float errRateEl = (cmdRateEl - bodyRateEl);
            float errRateRoll = (0.0f - bodyRateRoll); // 수평선 롤 수평 유지

            _azRateIntegral = Math.Clamp(_azRateIntegral + errRateAz * dt, -5.0f, 5.0f);
            _elRateIntegral = Math.Clamp(_elRateIntegral + errRateEl * dt, -5.0f, 5.0f);
            _rollRateIntegral = Math.Clamp(_rollRateIntegral + errRateRoll * dt, -5.0f, 5.0f);

            // 5. 토크 모터 제어 명령 계산 (PID)
            float torqueAz = (errRateAz * 65.0f) + (_azRateIntegral * 18.0f);
            float torqueEl = (errRateEl * 75.0f) + (_elRateIntegral * 22.0f);
            float torqueRoll = (errRateRoll * 50.0f) + (_rollRateIntegral * 15.0f);

            // 6. 시선 지터(Jitter) 산출 (마이크로라디안 단위)
            float totalErrRad = MathF.Sqrt(losErrAz * losErrAz + losErrEl * losErrEl);
            float jitterUrad = totalErrRad * 1e6f;
            bool isStable = jitterUrad < 35.0f; // 35 urad 이내면 정밀 레이저 조사 안정 판정

            return new GimbalMotorOutput(
                Math.Clamp(torqueRoll, -MaxMotorTorqueNm, MaxMotorTorqueNm),
                Math.Clamp(torqueEl, -MaxMotorTorqueNm, MaxMotorTorqueNm),
                Math.Clamp(torqueAz, -MaxMotorTorqueNm, MaxMotorTorqueNm),
                jitterUrad,
                isStable
            );
        }
    }
}

제4장: 2022 개정 교육과정 연계 교과 융합 지도안 (교사용 가이드)

교과목별 성취기준 및 공학 연계 탐구 가이드

교과목 2022 개정 성취기준 코드 핵심 탐구 주제 및 시뮬레이션 실습
물리 [12물리Ⅰ02-02]
[12물리Ⅱ01-01]
자이로스코프의 각운동량 보존 법칙과 회전 관성 모멘트 역학. 기체 외란 토크에 대항하여 시선을 우주 관성 공간에 정지시키는 피드백 제어 원리 분석.
수학 [12기하02-03]
[12미적02-03]
3차원 직교좌표계 회전 변환 행렬과 삼각함수 복합각 미적분을 활용한 짐벌 시선 역기구학 모델링.
정보 [12정보03-02]
[12인공지능02-03]
카메라 영상 프레임 지연(16.6ms)과 짐벌 서보(1ms) 주기 불일치를 보상하는 0-Alloc C# ref struct 멀티레이트 파이프라인 구현.
기술·가정 [12공학03-03]
[12기술04-02]
전투기 전자광학 정밀 유도 무기 체계와 인공지능 기반 자율 표적 인식(ATR)의 현대 항공 군사 기술 진화 탐구.