1. 개요
잠수함의 은밀성을 유지하면서 원거리 수상/공중 표적을 감시·정찰하기 위해 어뢰발사관 또는 수직발사관(VLS)에서 사출되는 잠수함 발사 무인기(Submarine-Launched UAV, SLUAV)는 부력 캡슐(Canister Capsule)에 수납되어 수면으로 자율 상승합니다. 캡슐이 수면을 돌파(Water-Exit Broaching)하는 수십 밀리초의 순간, 해수 밀도에서 공기 밀도로 급변하며 부가질량(Added Mass)이 소멸하고 파도 슬래밍 충격 모멘트가 작용하여 전복 위험에 노출됩니다. 안정적인 비행 천이를 달성하려면 수면 돌파 직후 반작용 제어 노즐(RCS)로 피치 자세를 80°~90° 수직 상태로 안정화하고, 정점 도달 시 캡슐 덮개 분리, 주익/미익 전개 잠금, 고체 로켓 부스터 점화 시퀀스를 밀리초 단위로 제어해야 합니다. 본 고에서는 10,000Hz 주기로 6자유도 관성 센서를 처리하는 0-Alloc C# 엔진을 구현합니다.
2. 수학적 모델링 및 지배 방정식
수중 부력 상승 및 수면 돌파 천이 영역에서의 캡슐 수직 운동방정식은 다음과 같습니다:
수면 돌파 시 파랑 충격에 의한 슬래밍 각가속도 및 복원 모멘트 방정식은 다음과 같습니다:
돌파 직후 RCS 추력기 펄스 자세 제어 법칙은 다음과 같습니다:
로켓 부스터 점화 및 날개 기구학적 전개 잠금(Mechanical Lock) 조건식은 다음과 같습니다:
3. 실시간 C# 서보 제어기 구현
다음은 고정밀 6축 IMU와 정압 심도계 데이터를 10,000Hz 주기로 분석하여 RCS 밸브 점화 및 날개 전개 서보 핀을 격발하는 0-Alloc C# 엔진 구현체입니다:
using System;
using System.Runtime.CompilerServices;
namespace ZeliDesk.Defense.Sluav
{
public readonly ref struct SluavSensorFrame
{
public readonly double DepthMeters; // Positive below surface, negative above
public readonly double VerticalVelocityMps;
public readonly double PitchAngleDegrees;
public readonly double PitchRateDegSec;
public readonly double CapsuleAccelerationZ;
public SluavSensorFrame(
double depthMeters,
double verticalVelocityMps,
double pitchAngleDegrees,
double pitchRateDegSec,
double capsuleAccelerationZ)
{
DepthMeters = depthMeters;
VerticalVelocityMps = verticalVelocityMps;
PitchAngleDegrees = pitchAngleDegrees;
PitchRateDegSec = pitchRateDegSec;
CapsuleAccelerationZ = capsuleAccelerationZ;
}
}
public ref struct SluavControlCommand
{
public byte RcsPitchThrusterMask; // Bit 0: Pitch Up, Bit 1: Pitch Down
public bool DeployWingsCommand;
public bool JettisonCapsuleCoverCommand;
public bool FireRocketBoosterCommand;
public double PitchErrorDegrees;
public bool IsBroachAttitudeStable;
}
public ref struct SluavCapsuleBroachServoEngine
{
private const double TargetPitchDegrees = 85.0;
private const double AirClearanceMeters = -1.2; // 1.2m above water
private readonly double _kpPitch;
private readonly double _kdPitch;
private readonly double _dt;
private bool _coverJettisoned;
private bool _wingsDeployed;
private double _timeSinceBroachSec;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public SluavCapsuleBroachServoEngine(double kpPitch, double kdPitch, double dt)
{
_kpPitch = kpPitch;
_kdPitch = kdPitch;
_dt = dt;
_coverJettisoned = false;
_wingsDeployed = false;
_timeSinceBroachSec = 0.0;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ComputeBroachSequence(in SluavSensorFrame frame, out SluavControlCommand cmd)
{
cmd = default;
double pitchErr = TargetPitchDegrees - frame.PitchAngleDegrees;
cmd.PitchErrorDegrees = pitchErr;
// Broaching phase detection (z <= 0.0)
bool isBroached = frame.DepthMeters <= 0.0;
if (isBroached)
{
_timeSinceBroachSec += _dt;
}
// RCS attitude control
double rcsControl = (_kpPitch * pitchErr) - (_kdPitch * frame.PitchRateDegSec);
byte rcsMask = 0;
if (isBroached && Math.Abs(pitchErr) > 3.0)
{
if (rcsControl > 10.0) rcsMask |= 0x01; // Pitch Up
else if (rcsControl < -10.0) rcsMask |= 0x02; // Pitch Down
}
cmd.RcsPitchThrusterMask = rcsMask;
bool isAttitudeStable = Math.Abs(pitchErr) <= 5.0 && Math.Abs(frame.PitchRateDegSec) <= 15.0;
cmd.IsBroachAttitudeStable = isAttitudeStable;
// Sequential Staging Logic
if (isBroached && frame.DepthMeters <= AirClearanceMeters)
{
// Step 1: Jettison Cover
if (!_coverJettisoned)
{
cmd.JettisonCapsuleCoverCommand = true;
_coverJettisoned = true;
}
// Step 2: Deploy Wings (50ms after cover jettison)
if (_coverJettisoned && _timeSinceBroachSec >= 0.05 && !_wingsDeployed)
{
cmd.DeployWingsCommand = true;
_wingsDeployed = true;
}
// Step 3: Fire Rocket Booster (120ms after broach with stable attitude)
if (_wingsDeployed && _timeSinceBroachSec >= 0.12 && isAttitudeStable)
{
cmd.FireRocketBoosterCommand = true;
}
}
}
}
}
4. 교육 및 실무 적용 방안
- 해군 잠수함사령부 및 해군사관학교: 잠수함 어뢰관 사출 공중체계, 캡슐 수면 돌파 유체동역학 시뮬레이션 교육.
- 국방과학연구소(ADD) 해양기술원: SLUAV 캐니스터 수면 돌파 RCS 자세안정화 및 날개 전개 시퀀서 알고리즘 탑재.