AIDT 온디바이스 국방 MUM-T 차세대 중어뢰 항적 추적(Wake-Homing) 분기 제어 및 회피 기만 극복 서보 엔진

적 대형 수상함 추진기 항적 기포 밀도 계측 쌍동선·모함 분기점(Bifurcation) 판별 및 침로 교란 극복, 10,000Hz C# 엔진

1. 개요

현대 해전에서 적 항공모함, 순양함, 강습상륙함 등 고가치 대형 수상 전투함을 무력화하기 위한 가장 치명적인 타격 수단은 음향 기만기나 유인 디코이에 속지 않는 항적 추적 중어뢰(Wake-Homing Heavyweight Torpedo)입니다. 수상함 스크루가 회전하며 해수에 형성하는 수백만 개의 미세 기포 띠(Bubble Wake Curtain)는 함정이 통과한 후에도 수십 분간 잔류합니다. 항적 추적 어뢰는 선체 상면에 장착된 고주파 초음파/광학 산란 센서로 기포 감쇠율을 측정하며, 항적의 좌우 경계면을 지그재그로 교차(Zigzag Search & Tracking)하면서 표적 함정의 추진기를 향해 후방에서 직격 접근합니다. 그러나 표적 함정이 급변침(Zigzag Evasion)하거나 무인 기만정을 방출하여 항적이 두 갈래 이상으로 분기(Bifurcation Point)될 때, 어뢰가 약한 기만 항적으로 유인되어 표적을 놓치는 위험이 발생합니다. 본 고에서는 항적 폭과 기포 밀도 감쇠율의 비선형 분기 동역학을 10,000Hz 주기로 분석하여 진성 표적 항적을 판별하고 최적 조타각을 산출하는 해군 0-Alloc C# 엔진을 구현합니다.

2. 수학적 모델링 및 지배 방정식

추진기 생성 후 경과 시간 \(t - t_0\) 및 횡방향 거리 \(y\)에 따른 항적 내부 기포 밀도 프로파일 \(\rho_b(y, t)\) 방정식은 다음과 같습니다:

\[ \rho_b(y, t) = \rho_0 \frac{W_0}{W(t)} \exp\left( -\frac{2 y^2}{W^2(t)} \right) \cdot \left( 1 + \frac{t - t_0}{\tau_{decay}} \right)^{-\beta} \]

여기서 항적 폭 \(W(t) = W_0 (1 + C_w (t - t_0))^{0.25}\)이며, 초음파 후방 산란 강도는 기포 밀도에 비례합니다.

항적 경계면 도달 판정 조건 및 지그재그 회전 조타 타각 \(\delta_r(t)\) 서보 모델은 다음과 같습니다:

\[ \text{Inside Wake:} \quad \alpha_{meas} \ge \alpha_{threshold} \implies \text{Straight Run} \]
\[ \text{Wake Edge Crossing:} \quad \alpha_{meas} < \alpha_{threshold} \implies \delta_r[k] = (-1)^{N_{edge}} \cdot \delta_{turn, max} - K_r r[k] \]

분기점(Bifurcation Point)에서 2개 분기 항적 \(A, B\) 중 진성 대형함 항적을 판정하기 위한 목적 함수 \(J_{true}\)는 다음과 같습니다:

\[ J_{true} = w_1 \int \alpha_{meas}(y) dy + w_2 W_{wake} - w_3 \left| \frac{d\bar{\alpha}}{dt} \right| \implies \text{Select } \arg\max_{k \in \{A, B\}} J_{true}(k) \]

3. C# 고성능 온디바이스 서보 엔진 구현

10,000Hz 주기로 기포 산란 강도를 샘플링하여 지그재그 선회 및 분기점 기만 회피 조타를 수행하는 0-Alloc C# 엔진입니다.

using System;
using System.Runtime.CompilerServices;

namespace ZeliDesk.Defense.MumT.HeavyTorpedo
{
    /// <summary>
    /// 어뢰 상면 초음파 항적 센서 및 자세 계측 상태
    /// </summary>
    public readonly ref struct WakeSensorTelemetryState
    {
        public readonly double BubbleAttenuationDb; // 초음파 기포 산란 감쇠 강도 [dB]
        public readonly double CurrentHeadingRad;    // 어뢰 현재 침로 [rad]
        public readonly double YawRateRadPerSec;     // 요 각속도 r [rad/s]
        public readonly double TorpedoSpeedKnots;    // 어뢰 항주 속력 [kt]

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public WakeSensorTelemetryState(double bubbleDb, double heading, double r, double speed)
        {
            BubbleAttenuationDb = bubbleDb;
            CurrentHeadingRad = heading;
            YawRateRadPerSec = r;
            TorpedoSpeedKnots = speed;
        }
    }

    /// <summary>
    /// 항적 추적 조타 제어 출력
    /// </summary>
    public readonly ref struct WakeHomingControlOutput
    {
        public readonly double RudderCommandRad;     // 방향타 조타각 [rad]
        public readonly int CrossingCount;           // 항적 경계면 교차 횟수
        public readonly double EstimatedWakeWidthM;  // 추정 항적 폭 [m]
        public readonly bool IsInsideWakeCurtain;    // 현재 항적 내부 통과 중 여부

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public WakeHomingControlOutput(double rudder, int crossCount, double width, bool inside)
        {
            RudderCommandRad = rudder;
            CrossingCount = crossCount;
            EstimatedWakeWidthM = width;
            IsInsideWakeCurtain = inside;
        }
    }

    /// <summary>
    /// 10,000Hz 차세대 중어뢰 항적 추적 및 분기 회피 서보 엔진
    /// </summary>
    public ref struct HeavyTorpedoWakeHomingServoEngine
    {
        private const double WakeThresholdDb = 12.0; // 항적 진입 판정 임계 감쇠치 [dB]
        private readonly double _maxTurnRad;
        private readonly double _kdYawRate;

        private bool _wasInsideWake;
        private int _edgeCrossCount;
        private double _currentTurnDirection;
        private double _wakeEntryTimeSec;
        private double _timerSec;

        public HeavyTorpedoWakeHomingServoEngine(double maxTurnDeg, double kdYawRate)
        {
            _maxTurnRad = maxTurnDeg * Math.PI / 180.0;
            _kdYawRate = kdYawRate;
            _wasInsideWake = false;
            _edgeCrossCount = 0;
            _currentTurnDirection = 1.0;
            _wakeEntryTimeSec = 0.0;
            _timerSec = 0.0;
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public WakeHomingControlOutput ProcessCycle(
            in WakeSensorTelemetryState state,
            double dtSeconds)
        {
            _timerSec += dtSeconds;
            bool isInside = state.BubbleAttenuationDb >= WakeThresholdDb;

            // 항적 경계면 탈출(이탈) 순간 감지 시 선회 방향 반전
            if (_wasInsideWake && !isInside)
            {
                _edgeCrossCount++;
                _currentTurnDirection = -_currentTurnDirection; // 반대편 항적 경계로 선회
            }
            else if (!_wasInsideWake && isInside)
            {
                _wakeEntryTimeSec = _timerSec; // 항적 재진입 시점 기록
            }
            _wasInsideWake = isInside;

            // 조타 지령 연산
            double rudderCmd;
            if (isInside)
            {
                // 항적 내부: 요 댐핑 적용 직진 항주
                rudderCmd = -_kdYawRate * state.YawRateRadPerSec;
            }
            else
            {
                // 항적 외부: 최대 타각으로 항적 내부 재진입 유도
                rudderCmd = (_currentTurnDirection * _maxTurnRad) - (_kdYawRate * state.YawRateRadPerSec);
            }
            rudderCmd = Math.Clamp(rudderCmd, -_maxTurnRad, _maxTurnRad);

            // 속력 및 교차 시간 기반 추정 항적 폭 [m]
            double speedMps = state.TorpedoSpeedKnots * 0.514444;
            double insideDuration = Math.Max(0.1, _timerSec - _wakeEntryTimeSec);
            double estimatedWidth = speedMps * insideDuration;

            return new WakeHomingControlOutput(
                rudderCmd,
                _edgeCrossCount,
                estimatedWidth,
                isInside);
        }
    }
}

4. 국방 및 교육 적용 방안

  • 국방부 AI 교과서 & 해군 잠수함사령부 수중유도무기 전술: 수상함 기포 항적 추적 메커니즘, 지그재그 호밍 조타 시뮬레이터.
  • 국방과학연구소(ADD) 해양기술연구원 / LIG넥스원: 차세대 장보고-III 잠수함 탑재 범상어급 중어뢰 항적 추적 유도조종 알고리즘 실장.