AIDT 온디바이스 국방 MUM-T 무인수상정(USV) 초공동(Supercavitating) 수중 로켓 어뢰 사출 캐비테이터 자세안정화 서보 엔진

200노트 초고속 수중 돌파 노즈 캐비테이터(Cavitator) 양각·받음각 제어 및 후방 환형 가스 인젝션 서보, 10,000Hz C# 엔진

1. 개요

연안 작전 및 대잠초계 임무를 수행하는 자율 무인수상정(USV)의 핵심 타격 무기체계는 시속 200노트(약 370km/h) 이상으로 수중을 질주하여 적 잠수함과 수상 전투함을 무력화하는 초공동(Supercavitating) 수중 로켓 어뢰입니다. 어뢰 선두에 장착된 디스크형 캐비테이터(Cavitator)에서 물을 급격히 밀어내어 증기압 이하로 압력을 낮춤으로써 어뢰 선체 전체를 거대한 기포(Supercavity)로 감싸 점성 마찰 저항을 90% 이상 절감합니다. 그러나 수중 사출 초기 급가속 단계에서는 유체 동역학적 불안정성으로 인해 캐비티 내부에서 어뢰 후방 동체가 기포 경계면(Cavity Wall)과 충돌하는 미부 타격(Tail-Slap) 현상이 발생합니다. 이 충돌 충격은 어뢰 탄두와 로켓 노즐을 심각하게 손상시키며 궤도를 이탈시킵니다. 본 고에서는 2축 짐벌 노즈 캐비테이터 유체받음각 제어와 미부 환형 압축가스 분사(Ventilated Gas Injection)를 10,000Hz 주기로 통합 지휘하여 테일 슬랩을 원천 방지하는 0-Alloc C# 엔진을 구현합니다.

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

수중 주행 속도 \(v_\infty\) 및 주변 정수압 \(P_\infty\)에 따른 캐비테이션 수 \(\sigma\)와 초공동 기포 최대 직경 \(D_c\), 길이 \(L_c\) 모델은 다음과 같습니다:

\[ \sigma = \frac{P_\infty - P_c}{\frac{1}{2}\rho v_\infty^2}, \quad D_c = d_n \sqrt{\frac{C_{d0}(1+\sigma)}{\sigma}}, \quad L_c = d_n \frac{\sqrt{C_{d0}(1+\sigma)}}{\sigma} \ln\left(\frac{1}{\sigma}\right) \]

여기서 \(d_n\)은 캐비테이터 직경, \(P_c\)는 캐비티 내부 압력, \(C_{d0} \approx 0.82\)는 항력 계수입니다.

노즈 캐비테이터 틸트 각도 \(\delta_c = [\delta_p, \delta_y]^T\)에 의한 유체역학적 양력 및 복원 모멘트 방정식은 다음과 같습니다:

\[ F_{L, cav} = \frac{1}{2} \rho v_\infty^2 \left( \frac{\pi d_n^2}{4} \right) C_{L\alpha} \cdot (\alpha_b + \delta_c), \quad M_{cav} = F_{L, cav} \cdot l_{cavitator} \]

어뢰 미부와 기포벽 간의 여유 간극(Clearance) \(h_{clear}(t)\) 및 테일 슬랩 회피 가스 분사 서보 제어 법칙은 다음과 같습니다:

\[ h_{clear}(t) = R_c(x_{tail}) - \left( R_{body} + \sqrt{y_{tail}^2 + z_{tail}^2} \right) \ge h_{safe} \quad (\approx 15\,\text{mm}) \]
\[ \dot{m}_{gas}[k] = \dot{m}_{base} + K_g \cdot \max\left(0, h_{safe} - h_{clear}[k]\right) + K_d \frac{d(h_{safe} - h_{clear})}{dt} \]

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

10,000Hz 주기로 어뢰 6자유도 IMU 및 기포 압력을 피드백받아 캐비테이터 각도와 환형 가스 인젝터를 구동하는 0-Alloc C# 엔진입니다.

using System;
using System.Runtime.CompilerServices;

namespace ZeliDesk.Defense.MumT.SupercavitatingTorpedo
{
    /// <summary>
    /// 초공동 어뢰 주행 동역학 및 기포 내부 상태
    /// </summary>
    public readonly ref struct SupercavitationKinematicState
    {
        public readonly double SpeedMetersPerSec;    // 수중 속도 [m/s]
        public readonly double DepthMeters;          // 잠항 심도 [m]
        public readonly double PitchAngleRad;        // 피치각 [rad]
        public readonly double PitchRateRadPerSec;   // 피치 각속도 [rad/s]
        public readonly double TailVerticalOffsetM;  // 미부 중심 상하 편위 [m]
        public readonly double CavityInternalPressPa;// 기포 내부 가스압 [Pa]

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public SupercavitationKinematicState(
            double speed,
            double depth,
            double pitch,
            double q,
            double tailOffset,
            double pCavity)
        {
            SpeedMetersPerSec = speed;
            DepthMeters = depth;
            PitchAngleRad = pitch;
            PitchRateRadPerSec = q;
            TailVerticalOffsetM = tailOffset;
            CavityInternalPressPa = pCavity;
        }
    }

    /// <summary>
    /// 노즈 캐비테이터 각도 및 가스 분사 서보 지령
    /// </summary>
    public readonly ref struct CavitatorActuatorCommand
    {
        public readonly double CavitatorPitchDeflectionRad; // 캐비테이터 피치 타각 [rad]
        public readonly double VentilatedGasMassFlowKgPerS; // 환형 가스 분사 유량 [kg/s]
        public readonly double EstimatedClearanceMm;        // 미부-기포벽 간극 [mm]
        public readonly bool IsTailSlapWarning;             // 테일 슬랩 충돌 임계 경보

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public CavitatorActuatorCommand(double deltaRad, double gasFlow, double clearanceMm, bool warning)
        {
            CavitatorPitchDeflectionRad = deltaRad;
            VentilatedGasMassFlowKgPerS = gasFlow;
            EstimatedClearanceMm = clearanceMm;
            IsTailSlapWarning = warning;
        }
    }

    /// <summary>
    /// 10,000Hz 초공동 수중 로켓 어뢰 캐비테이터 자세안정화 서보 엔진
    /// </summary>
    public ref struct SupercavitatingTorpedoServoEngine
    {
        private const double WaterDensity = 1025.0; // 해수 밀도 [kg/m^3]
        private const double Gravity = 9.80665;
        private const double AtmosphericPressPa = 101325.0;

        private readonly double _cavitatorDiameterM;
        private readonly double _bodyRadiusM;
        private readonly double _tailDistanceM;
        private readonly double _kpAngle;
        private readonly double _kdRate;
        private readonly double _kgGas;

        private double _prevClearanceM;

        public SupercavitatingTorpedoServoEngine(
            double cavitatorDiameterM,
            double bodyRadiusM,
            double tailDistanceM,
            double kpAngle,
            double kdRate,
            double kgGas)
        {
            _cavitatorDiameterM = cavitatorDiameterM;
            _bodyRadiusM = bodyRadiusM;
            _tailDistanceM = tailDistanceM;
            _kpAngle = kpAngle;
            _kdRate = kdRate;
            _kgGas = kgGas;
            _prevClearanceM = 0.05; // 초기 50mm 간극
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public CavitatorActuatorCommand ProcessControlCycle(
            in SupercavitationKinematicState state,
            double dtSeconds)
        {
            // 1. 심도에 따른 정수압 계산
            double ambientPressPa = AtmosphericPressPa + WaterDensity * Gravity * state.DepthMeters;
            double dynPress = 0.5 * WaterDensity * state.SpeedMetersPerSec * state.SpeedMetersPerSec;

            // 2. 캐비테이션 수 sigma 계산
            double sigma = Math.Max(0.01, (ambientPressPa - state.CavityInternalPressPa) / dynPress);

            // 3. 미부 위치에서의 캐비티 반경 Rc 계산 (로그 근사 모델)
            double cd0 = 0.82;
            double maxCavityRadius = (_cavitatorDiameterM / 2.0) * Math.Sqrt((cd0 * (1.0 + sigma)) / sigma);
            double cavityLength = _cavitatorDiameterM * (Math.Sqrt(cd0 * (1.0 + sigma)) / sigma) * Math.Log(1.0 / sigma);

            double xRatio = Math.Clamp(_tailDistanceM / cavityLength, 0.0, 1.0);
            double tailCavityRadius = maxCavityRadius * Math.Sqrt(Math.Max(0.0, 1.0 - Math.Pow(1.0 - 2.0 * xRatio, 2)));

            // 4. 미부-기포벽 여유 간극 계산
            double currentClearanceM = tailCavityRadius - (_bodyRadiusM + Math.Abs(state.TailVerticalOffsetM));
            double clearanceMm = currentClearanceM * 1000.0;

            // 5. 캐비테이터 피치 타각 계산 (각속도 댐핑 + 오프셋 보정)
            double targetPitchRad = -(_kpAngle * state.TailVerticalOffsetM + _kdRate * state.PitchRateRadPerSec);
            double clampedPitchCmdRad = Math.Clamp(targetPitchRad, -0.26, 0.26); // +-15도 한계

            // 6. 환형 가스 인젝션 유량 계산 (간극 20mm 미만 시 가스 분사 급증)
            const double safeClearanceM = 0.020; // 20mm
            double gasFlow = 0.2; // 기본 유지 유량 [kg/s]
            if (currentClearanceM < safeClearanceM)
            {
                double dClearance = (currentClearanceM - _prevClearanceM) / dtSeconds;
                double deficit = safeClearanceM - currentClearanceM;
                gasFlow += _kgGas * deficit - 0.5 * dClearance;
            }
            gasFlow = Math.Clamp(gasFlow, 0.0, 5.0); // 최대 5kg/s 분사
            _prevClearanceM = currentClearanceM;

            bool isWarning = clearanceMm < 10.0; // 10mm 미만 충돌 임계

            return new CavitatorActuatorCommand(
                clampedPitchCmdRad,
                gasFlow,
                clearanceMm,
                isWarning);
        }
    }
}

4. 국방 및 교육 적용 방안

  • 국방부 AI 교과서 & 해군사관학교 무기체계학: 초공동 유체역학(Supercavitation), 테일 슬랩 방지 캐비테이터 서보 제어 교구.
  • 국방과학연구소(ADD) 해양기술연구원 / LIG넥스원: 무인수상정(USV) 탑재 초고속 대잠/대함 타격체계 자율 유도조종 비행제어컴퓨터(FCC) 실장.