대잠 감시 장기 지속 잠항을 위한 수중 글라이더의 부력 및 피치 자세 능동 안정화

유무인복합 대잠수함전(ASW MUM-T)에서 저소음 장기 지속 음향 감시를 수행하는 자율 수중 글라이더는 스크루 프로펠러 없이 내부 유압 오일 블래더를 통한 체적 가변 부력 엔진(VBE)과 내부 이동 배터리 팩(Movable Mass)의 무게중심 이동만으로 톱니형(Sawtooth) 궤적을 활공합니다. 그러나 수온약층(Thermocline) 경계면에서 수십 미터 진폭으로 요동치는 해양 내부파(Internal Waves)를 만날 경우, 국소 해수 밀도 급변과 강한 수직 유속 섭동으로 인해 활공 경로가 이탈되고 실속(Stall)이 발생합니다. 본 논문에서는 국소 밀도 및 압력 구배를 .NET 9 SIMD(`Vector256`)로 실시간 추정하여 유압 오일 펌프와 피치 액추에이터를 정밀 제어하는 무할당 적응 서보 엔진을 구현합니다.

1. 서론: 수중 글라이더 6자유도 활공 동역학 및 내부파 수직 외란

수중 글라이더의 종방향 수직 평면 운동방정식은 중력-부력 불평형력과 양력 $L$, 항력 $D$의 평형으로 모델링됩니다:

$$m \dot{v}_g = (m_0 g - \rho(S, T, p) V g) \sin \theta_p - D + F_{ext}^z \sin \gamma$$ $$J_y \dot{q} = -m_p g (r_p \cos \theta_p + z_p \sin \theta_p) + M_{hydro}$$

여기서 해수 밀도 $\rho(S, T, p)$는 UNESCO 국제 상태방정식에 따르며, 비선형 내부파 통과 시 수직 유속 $w_{wave}(z, t) = W_0 \sin(k_x x - \omega t) \phi(z)$에 의해 유효 영각(Angle of Attack $\alpha$)이 심각하게 교란됩니다:

$$\alpha(t) = \theta_p(t) - \arctan\left( \frac{w_{glider} + w_{wave}}{u_{glider}} \right)$$

2. 비선형 적응 역단계(Backstepping) 부력-피치 제어 수리 모델

영각 오차 $e_\alpha = \alpha - \alpha_{opt}$를 0으로 수렴시키기 위해 오일 블래더 주입량 $\Delta V_{oil}$과 이동 질량 변위 $r_p$를 비선형 슬라이딩 모드 관측기와 연동합니다:

$$\Delta V_{oil}^{cmd} = \frac{m}{\rho_0} - V_0 + K_b \int_0^t (w_{ref} - w_{meas}) dt$$ $$r_p^{cmd} = -\frac{M_{hydro}}{m_p g \cos \theta_p} - K_p \cdot e_\alpha$$

3. .NET 9 SIMD 기반 수중 글라이더 적응 부력 서보 구현

다음 C# 코드는 8단계 수심 센서 어레이의 CTD(전도도-온도-수심) 데이터를 AVX-256 벡터 레지스터로 병렬 변환하여 나노초 단위로 유압 밸브 펄스를 연산합니다.

GliderBuoyancyAdaptiveServo.cs C# (.NET 9 / AVX-256)
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86;

namespace ZeliDesk.Defense.MaritimeRobotics
{
    /// <summary>
    /// 수중 글라이더(Underwater Glider) 내부파 외란 보정 적응 부력 서보
    /// GC 제로 할당 ref struct 및 AVX-256 SIMD 가속화
    /// </summary>
    public ref struct GliderBuoyancyAdaptiveServo
    {
        private readonly ReadOnlySpan<float> _depthPressures;    // 수심 압력 (dbar)
        private readonly ReadOnlySpan<float> _waterDensities;    // 실측 해수 밀도 rho (kg/m^3)
        private readonly ReadOnlySpan<float> _verticalVelocities;// 수직 강하/상승 속도 w (m/s)
        private readonly Span<float> _netBuoyancyForces;         // 연산된 순 부력 F_net (N)
        private readonly Span<float> _oilVolumeCommands;         // 오일 블래더 펌프 체적 명령 (cc)

        private readonly float _gliderMass;     // 글라이더 총 질량 m (kg)
        private readonly float _nominalVolume;  // 기준 외형 체적 V0 (m^3)
        private readonly float _gravity;        // 중력가속도 g (9.80665 m/s^2)
        private readonly float _targetSinkRate; // 목표 수직 속도 w_target (m/s)

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public GliderBuoyancyAdaptiveServo(
            ReadOnlySpan<float> depthPressures,
            ReadOnlySpan<float> waterDensities,
            ReadOnlySpan<float> verticalVelocities,
            Span<float> netBuoyancyForces,
            Span<float> oilVolumeCommands,
            float gliderMass = 58.5f,
            float nominalVolume = 0.057f,
            float targetSinkRate = -0.25f)
        {
            _depthPressures = depthPressures;
            _waterDensities = waterDensities;
            _verticalVelocities = verticalVelocities;
            _netBuoyancyForces = netBuoyancyForces;
            _oilVolumeCommands = oilVolumeCommands;
            _gliderMass = gliderMass;
            _nominalVolume = nominalVolume;
            _gravity = 9.80665f;
            _targetSinkRate = targetSinkRate;
        }

        /// <summary>
        /// 8개 심도 계층의 밀도 및 수직 유속 섭동을 SIMD 병렬 분석하여 부력 펌프 제어
        /// </summary>
        [MethodImpl(MethodImplOptions.AggressiveOptimization)]
        public void ExecuteBuoyancyLoop()
        {
            int length = _waterDensities.Length;
            int simdLength = length - (length % 8);

            Vector256<float> vMass = Vector256.Create(_gliderMass);
            Vector256<float> vVol0 = Vector256.Create(_nominalVolume);
            Vector256<float> vG = Vector256.Create(_gravity);
            Vector256<float> vWtarget = Vector256.Create(_targetSinkRate);
            Vector256<float> vGainW = Vector256.Create(85.0f); // cc/(m/s)

            int i = 0;
            if (Avx2.IsSupported)
            {
                for (; i < simdLength; i += 8)
                {
                    Vector256<float> vRho = Vector256.Create(MemoryMarshal.Cast<float, Vector256<float>>(_waterDensities.Slice(i, 8))[0]);
                    Vector256<float> vW = Vector256.Create(MemoryMarshal.Cast<float, Vector256<float>>(_verticalVelocities.Slice(i, 8))[0]);

                    // 부력 B = rho * V0 * g
                    Vector256<float> vBuoyancy = Avx.Multiply(Avx.Multiply(vRho, vVol0), vG);
                    // 중력 W = m * g
                    Vector256<float> vWeight = Avx.Multiply(vMass, vG);

                    // 순 부력 F_net = B - W
                    Vector256<float> vFnet = Avx.Subtract(vBuoyancy, vWeight);

                    // 수직 유속 오차: ErrorW = w - w_target
                    Vector256<float> vErrW = Avx.Subtract(vW, vWtarget);

                    // 오일 체적 명령 (cc) = -F_net * 0.1 - GainW * ErrorW
                    Vector256<float> vCmd = Avx.Subtract(
                        Avx.Multiply(vFnet, Vector256.Create(-0.1f)),
                        Avx.Multiply(vErrW, vGainW)
                    );

                    vFnet.CopyTo(_netBuoyancyForces.Slice(i, 8));
                    vCmd.CopyTo(_oilVolumeCommands.Slice(i, 8));
                }
            }

            for (; i < length; i++)
            {
                float b = _waterDensities[i] * _nominalVolume * _gravity;
                float w = _gliderMass * _gravity;
                float fnet = b - w;
                float errW = _verticalVelocities[i] - _targetSinkRate;
                _netBuoyancyForces[i] = fnet;
                _oilVolumeCommands[i] = (-fnet * 0.1f) - (errW * 85.0f);
            }
        }
    }
}

4. 교육 및 국방 실무 시사점

  • 해군 무인잠수정 및 대잠작전 실무진: 동해 등 수온약층이 뚜렷한 해역에서 내부파(Internal Wave) 급변에 의한 글라이더 실속을 능동 제어하여 3개월 이상 음향 감시 임무를 지속하는 제어 로직 검증.
  • 방통대 지구과학·물리 융합교육 교구: 아르키메데스의 부력 원리와 해수의 상태방정식(온도, 염분, 압력에 따른 밀도 변화)을 자율 해양 로봇 제어와 접목한 STEM 융합 교육 콘텐츠 제공.