AIDT 온디바이스 국방 MUM-T 무인기뢰처리기(MDV) 측면주사소나(SSS) 저고도 해저면 추종(Altitude-Hold) 심도 제어 서보 엔진

험준한 해저 지형(해산·암초) 초근접(3~5m) 기뢰 탐색 시 음향 고도계 기반 복합 슬라이딩 모드 심도·피치 제어, 10,000Hz C# 엔진

1. 개요

주요 항만 및 전략 해역에 부설된 적의 해저 침저기뢰(Bottom Mine)와 계류기뢰를 신속히 탐색하여 제거하는 기뢰대항작전(Mine Countermeasures, MCM)에서 핵심적인 임무를 수행하는 자산은 무인수상정(USV)에서 진수되는 자율 무인기뢰처리기(Mine Disposal Vehicle, MDV / MCM AUV)입니다. MDV 동체 양측에 장착된 초고주파 측면주사소나(Side-Scan Sonar, SSS) 또는 합성개구소나(SAS)가 5cm 이하의 해저 물체 음향 그림자(Acoustic Shadow)를 왜곡 없이 판별하기 위해서는, 복잡하고 불규칙한 험준한 해저 지형(암초, 침몰선, 해저 협곡) 위 3~5m의 초저고도를 일정하게 유지하며 항주해야 합니다. 그러나 조류의 수직 와류 난류와 급경사 암초 돌출로 인해 기체가 순간적으로 해저면에 격돌하거나 고도가 높아져 소나 음영 사각지대가 발생할 위험이 상존합니다. 본 고에서는 정하방 음향 고도계(Acoustic Altimeter)와 전방 장애물 회피 소나(FLS) 신호를 융합하여 10,000Hz 주기로 수직 트러스터 및 잠타(Elevator)를 슬라이딩 모드 제어(SMC)하는 0-Alloc C# 엔진을 구현합니다.

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

해저면 고도 \(h(t)\) 동역학 및 전방 해저 지형 경사각 \(\gamma_{bottom} = \arctan\left(\frac{\partial z_b}{\partial x}\right)\)과의 기하학적 관계식은 다음과 같습니다:

\[ \dot{h}(t) = -w(t)\cos\theta + u(t)\sin\theta - u(t)\cos\theta \tan\gamma_{bottom} \]

여기서 \(u, w\)는 기체 전진 및 수직 속도이며, \(\theta\)는 피치각입니다.

비선형 유체 저항 및 부력 불균형에 강인한 슬라이딩 모드 제어(Sliding Mode Control, SMC) 표면 \(S_{alt}(t)\)는 다음과 같이 정의됩니다:

\[ S_{alt}(t) = \left( h_{alt}(t) - h_{target} \right) + c_1 \dot{h}_{alt}(t) + c_2 \int_0^t (h_{alt} - h_{target}) d\tau \]

수직 제어 추력 \(T_z\) 및 채터링 완화를 위한 포화 경계층 함수 기반 제어 법칙은 다음과 같습니다:

\[ T_z[k] = (W - B)\cos\theta - \hat{Z}_w w|w| - K_{smc} \cdot \mathrm{sat}\left( \frac{S_{alt}[k]}{\Phi_{boundary}} \right) \]

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

10,000Hz 주기로 고도계 및 전방 소나 신호를 피드백받아 수직 트러스터와 잠타 각도를 구동하는 0-Alloc C# 엔진입니다.

using System;
using System.Runtime.CompilerServices;

namespace ZeliDesk.Defense.MumT.MdvNavigation
{
    /// <summary>
    /// MDV 음향 고도계 및 항행 동역학 계측 상태
    /// </summary>
    public readonly ref struct MdvAltitudeTelemetryState
    {
        public readonly double AltitudeMeters;        // 해저면 정하방 고도 [m]
        public readonly double ForwardSpeedMps;       // 전진 속도 u [m/s]
        public readonly double VerticalSpeedMps;      // 수직 속도 w [m/s]
        public readonly double PitchAngleRad;         // 피치각 theta [rad]
        public readonly double ForwardObstacleDistM;  // 전방 장애물 탐지 거리 [m]

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public MdvAltitudeTelemetryState(double alt, double u, double w, double pitch, double obsDist)
        {
            AltitudeMeters = alt;
            ForwardSpeedMps = u;
            VerticalSpeedMps = w;
            PitchAngleRad = pitch;
            ForwardObstacleDistM = obsDist;
        }
    }

    /// <summary>
    /// 수직 트러스터 및 잠타 제어 출력
    /// </summary>
    public readonly ref struct MdvAltitudeControlOutput
    {
        public readonly double VerticalThrusterNewtons; // 수직 트러스터 추력 [N]
        public readonly double SternElevatorCommandRad; // 잠타 타각 [rad]
        public readonly double AltitudeErrorMeters;     // 고도 유지 오차 [m]
        public readonly bool IsGroundProximityAlarm;    // 해저 충돌 위험(<1.5m) 경보

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public MdvAltitudeControlOutput(double thrust, double elevator, double err, bool alarm)
        {
            VerticalThrusterNewtons = thrust;
            SternElevatorCommandRad = elevator;
            AltitudeErrorMeters = err;
            IsGroundProximityAlarm = alarm;
        }
    }

    /// <summary>
    /// 10,000Hz 무인기뢰처리기 슬라이딩 모드 해저면 추종 서보 엔진
    /// </summary>
    public ref struct MdvAltitudeHoldServoEngine
    {
        private readonly double _netBuoyancyNewtons; // 순 잔여 부력 (W - B)
        private readonly double _c1Slope;
        private readonly double _c2Integral;
        private readonly double _ksmcGain;
        private readonly double _boundaryLayer;
        private readonly double _maxThrustN;

        private double _altIntegral;

        public MdvAltitudeHoldServoEngine(
            double netBuoyancyNewtons,
            double c1Slope,
            double c2Integral,
            double ksmcGain,
            double boundaryLayer,
            double maxThrustN)
        {
            _netBuoyancyNewtons = netBuoyancyNewtons;
            _c1Slope = c1Slope;
            _c2Integral = c2Integral;
            _ksmcGain = ksmcGain;
            _boundaryLayer = boundaryLayer;
            _maxThrustN = maxThrustN;
            _altIntegral = 0.0;
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public MdvAltitudeControlOutput ProcessCycle(
            in MdvAltitudeTelemetryState state,
            double targetAltitudeM,
            double dtSeconds)
        {
            // 1. 고도 오차 및 적분
            double altErr = state.AltitudeMeters - targetAltitudeM;
            _altIntegral += altErr * dtSeconds;

            // 2. 수직 고도 변화율
            double hDot = state.ForwardSpeedMps * Math.Sin(state.PitchAngleRad) - state.VerticalSpeedMps * Math.Cos(state.PitchAngleRad);

            // 전방 급경사 장애물 회피 바이어스 (10m 이내 장애물 감지 시 상승 바이어스)
            if (state.ForwardObstacleDistM < 10.0)
            {
                altErr -= (10.0 - state.ForwardObstacleDistM) * 0.4;
            }

            // 3. 슬라이딩 표면 S 계산
            double sAlt = altErr + _c1Slope * hDot + _c2Integral * _altIntegral;

            // 4. 경계층 포화 함수 sat(S / Phi)
            double satVal = Math.Clamp(sAlt / _boundaryLayer, -1.0, 1.0);

            // 5. 제어 추력 연산 (부력 보상 + SMC)
            double thrustCmd = _netBuoyancyNewtons - (_ksmcGain * satVal);
            thrustCmd = Math.Clamp(thrustCmd, -_maxThrustN, _maxThrustN);

            // 6. 잠타 타각 지령 (피치 자세 안정화 결합)
            double elevatorCmd = Math.Clamp(-0.2 * satVal - 0.5 * state.PitchAngleRad, -0.35, 0.35);

            // 충돌 경보 플래그 (1.5m 미만 근접 시)
            bool isAlarm = state.AltitudeMeters < 1.5;

            return new MdvAltitudeControlOutput(
                thrustCmd,
                elevatorCmd,
                altErr,
                isAlarm);
        }
    }
}

4. 국방 및 교육 적용 방안

  • 국방부 AI 교과서 & 해군작전사령부 기뢰전전대 훈련: 해저면 초근접 항주 동역학, 측면주사소나 왜곡 보정 슬라이딩 모드 제어 교구.
  • 국방과학연구소(ADD) 해양기술연구원 / 한화오션: 차세대 다목적 자율 무인잠수정(AUV) 해저 지형 추종 비행제어컴퓨터(FCC) 실장.