AIDT 온디바이스 STEM 양자/MEMS 관성센서 링 레이저 자이로스코프(RLG) 사냐크(Sagnac) 위상 및 락인(Lock-in) 억제 디더링 서보 제어기

후방산란 결합 광학 락인 현상 기계 디더링(Mechanical Dither) 상쇄, 0.001°/hr 초정밀 항법 등급 10,000Hz C# 엔진

1. 개요

잠수함, 항공기, 유도탄 등의 장거리 자율 항법을 위한 순수 관성항법장치(INS)는 0.001°/hr 이하의 바이어스 안정성을 요구합니다. 링 레이저 자이로스코프(Ring Laser Gyroscope, RLG)는 폐곡선 광학 캐비티 내부에서 시계 방향(CW)과 반시계 방향(CCW)으로 전파하는 레이저 광선 간의 사냐크(Sagnac) 주파수 차이를 측정하여 회전 각속도를 검출합니다. 그러나 회전 각속도가 매우 낮은 영역에서는 고반사율 미러 표면의 미세 결함에 의한 후방산란(Backscattering)으로 인해 두 빔의 위상이 동기화되어 비트 주파수가 영(Zero)이 되는 '광학 락인(Lock-in / Blind Zone)' 현상이 발생합니다. 이를 극복하기 위해 압전 바이모프 스프링으로 RLG 블록에 수백 Hz의 고주파 비틀림 진동(기계적 디더, Mechanical Dither)을 인위적으로 인가하여 락인 영역을 순식간에 통과시켜야 합니다. 본 고에서는 10,000Hz 주기로 디더 각진동 신호를 위상 상쇄하고 잔여 랜덤 워크를 필터링하는 0-Alloc C# 엔진을 구현합니다.

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

사냐크 효과(Sagnac Effect)에 의한 광학 비트 주파수와 회전 각속도 비례식은 다음과 같습니다:

\[ \Delta f_S = f_{CW} - f_{CCW} = \frac{4 A}{\lambda L} \vec{\Omega} \cdot \hat{n} = K_{scale} \cdot \Omega \]

후방산란 결합 계수 \(r_{bs}\)에 의한 비선형 위상차 락인(Lock-in) 아들러(Adler) 미분방정식은 다음과 같습니다:

\[ \frac{d\psi}{dt} = 2\pi \Delta f_S - \Omega_L \sin(\psi), \quad \Omega_L = \frac{2 c r_{bs}}{L} \]

기계적 디더 진동 각도 \(\theta_D(t) = \Theta_0 \sin(\omega_D t)\)가 인가된 합성 각속도 방정식은 다음과 같습니다:

\[ \frac{d\psi}{dt} = 2\pi K_{scale} \left( \Omega_{in} + \Theta_0 \omega_D \cos(\omega_D t) \right) - \Omega_L \sin(\psi) \]

디더 주파수 성분 제거 및 순수 항법 회전각(True Navigation Angle \(\theta_{nav}\)) 실시간 적분식은 다음과 같습니다:

\[ \theta_{nav}(t_k) = \theta_{nav}(t_{k-1}) + \frac{1}{K_{scale}} \int_{t_{k-1}}^{t_k} \left( f_{beat}(t) - K_{scale} \dot{\theta}_{dither}(t) \right) dt \]

3. 실시간 C# 서보 제어기 구현

다음은 광학 비트 펄스 카운터와 피에조 디더 센서 신호를 10,000Hz 주기로 샘플링하여 락인 오차를 제거하고 순항 각도를 적분하는 0-Alloc C# 엔진 구현체입니다:

RingLaserGyroSagnacServoEngine.cs
using System;
using System.Runtime.CompilerServices;

namespace ZeliDesk.Stem.InertialGyro
{
    public readonly ref struct RlgSensorFrame
    {
        public readonly double RawBeatFrequencyHz;
        public readonly double DitherPiezoPickoffVolts;
        public readonly double CavityIntensityMw;
        public readonly double PathLengthControlVoltageVolts;
        public readonly double TemperatureCelsius;

        public RlgSensorFrame(
            double rawBeatFrequencyHz,
            double ditherPiezoPickoffVolts,
            double cavityIntensityMw,
            double pathLengthControlVoltageVolts,
            double temperatureCelsius)
        {
            RawBeatFrequencyHz = rawBeatFrequencyHz;
            DitherPiezoPickoffVolts = ditherPiezoPickoffVolts;
            CavityIntensityMw = cavityIntensityMw;
            PathLengthControlVoltageVolts = pathLengthControlVoltageVolts;
            TemperatureCelsius = temperatureCelsius;
        }
    }

    public ref struct RlgNavigationOutput
    {
        public double CompensatedRateDegSec;
        public double AccumulatedAngleDegrees;
        public double DitherDriveVoltageVolts;
        public bool IsLockInAvoided;
        public bool IsCavityLasingStable;
    }

    public ref struct RingLaserGyroSagnacServoEngine
    {
        private const double ScaleFactorHzPerDegSec = 1580.45; // Approx for typical 30cm perimeter RLG
        private const double DitherFreqHz = 400.0;
        private const double DitherThresholdHz = 50.0;
        private readonly double _dt;
        private double _accumulatedAngleDeg;
        private double _prevDitherVolts;
        private double _ditherPhase;

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public RingLaserGyroSagnacServoEngine(double dt)
        {
            _dt = dt;
            _accumulatedAngleDeg = 0.0;
            _prevDitherVolts = 0.0;
            _ditherPhase = 0.0;
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void ComputeInertialAngle(in RlgSensorFrame frame, out RlgNavigationOutput output)
        {
            output = default;

            // Dither velocity derivative from pickoff voltage (approx 20 deg/s per volt)
            double ditherVelDegSec = (frame.DitherPiezoPickoffVolts - _prevDitherVolts) / _dt * 20.0;
            _prevDitherVolts = frame.DitherPiezoPickoffVolts;

            // Total apparent rate from raw optical beat frequency
            double apparentRateDegSec = frame.RawBeatFrequencyHz / ScaleFactorHzPerDegSec;

            // Strip off mechanical dither rate
            double trueRateDegSec = apparentRateDegSec - ditherVelDegSec;

            // Angle integration
            _accumulatedAngleDeg += trueRateDegSec * _dt;

            // Dither drive generation (closed-loop self-oscillation at 400Hz)
            _ditherPhase += 2.0 * Math.PI * DitherFreqHz * _dt;
            if (_ditherPhase >= 2.0 * Math.PI) _ditherPhase -= 2.0 * Math.PI;

            double ditherDriveV = 15.0 * Math.Sin(_ditherPhase);

            output.CompensatedRateDegSec = trueRateDegSec;
            output.AccumulatedAngleDegrees = _accumulatedAngleDeg;
            output.DitherDriveVoltageVolts = ditherDriveV;
            output.IsLockInAvoided = Math.Abs(frame.RawBeatFrequencyHz) >= DitherThresholdHz;
            output.IsCavityLasingStable = frame.CavityIntensityMw >= 1.0;
        }
    }
}

4. 교육 및 실무 적용 방안

  • 한국방송통신대학교 물리학/정보통신: 특수상대성이론 사냐크 간섭 효과, 비선형 아들러 위상 락인 및 관성 유도항법 실습.
  • 국방과학연구소(ADD) 및 한화에어로스페이스: 차기 잠수함 및 전략 순항미사일용 초고정밀 RLG 항법장치 디더링 제어기 실장.