AIDT 온디바이스 STEM 초음속 풍동 슐리렌(Schlieren) 충격파 파면 위상 적응광학 서보 엔진

마하 3.5 충격파 밀도 구배 \(\nabla \rho\), 나이프 에지 광도 요동, 음속 통과 10,000Hz C# 엔진

1. 개요

초음속 풍동(Supersonic Wind Tunnel) 시험에서 비행체 주위에 형성되는 충격파(Shock Wave)와 팽창파(Expansion Fan)는 유체 밀도의 극심한 불연속 변화를 유발하며, 이는 글래드스톤-데일(Gladstone-Dale) 관계식에 따라 국소 굴절률 구배를 형성합니다. 나이프 에지(Knife Edge)를 이용한 슐리렌(Schlieren) 광학계는 굴절률 1차 미분값(\(\partial \rho / \partial y\))에 의한 광선 편향 각도를 밝기(조도) 차이로 가시화합니다. 그러나 극초음속 기류에 수반되는 난류 경계층 요동은 광선에 심각한 고주파 위상 왜곡을 초래하여 충격파 위치 정밀 계측을 방해합니다. 본 고에서는 슐리렌 명암 신호를 10,000Hz 0-Alloc C# 엔진으로 고속 해석하여 충격파 각도(\(\beta\))와 마하수를 역추정하고 가변 디퓨저 램프 위치를 제어하는 서보 아키텍처를 구현합니다.

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

기체 밀도 \(\rho\)와 굴절률 \(n\) 사이의 글래드스톤-데일 관계식 및 광선 편향각 \(\epsilon_y\)는 다음과 같습니다:

\[ n - 1 = K_{GD} \rho, \quad \epsilon_y = \frac{1}{n_0} \int_0^L \frac{\partial n}{\partial y} dz = \frac{K_{GD}}{n_0} \int_0^L \frac{\partial \rho}{\partial y} dz \]

나이프 에지에 의한 상대 조도 변화율 \(\frac{\Delta I}{I_0} = \frac{f}{a} \epsilon_y\) (\(f\): 초점거리, \(a\): 차단되지 않은 광원 크기)로부터 충격파 전후의 란킨-위고니오(Rankine-Hugoniot) 경사 충격파 압력비 및 밀도비를 산출합니다:

\[ \frac{\rho_2}{\rho_1} = \frac{(\gamma + 1) M_1^2 \sin^2\beta}{(\gamma - 1) M_1^2 \sin^2\beta + 2}, \quad \tan\theta = 2 \cot\beta \left[ \frac{M_1^2 \sin^2\beta - 1}{M_1^2 (\gamma + \cos 2\beta) + 2} \right] \]

충격파 위치 진동 \(\Delta x_{shock}\)을 나이프 에지 광도 오차로부터 10,000Hz 속도로 추출하여 풍동 흡입구 가변 경사 램프의 유압 서보 밸브를 제어합니다.

3. 실시간 피드백 제어 아키텍처

graph TD A[마하 3.5 초음속 풍동 시험부 윈도우 내 모델 비행체] --> B[평행 광원 제1 오목 반사경 조사 및 충격파 통과] B --> C[밀도 급변에 따른 굴절률 경사도 유발 광선 굴절 편향] C --> D[제2 오목 반사경 및 초점 위치 수평/수직 나이프 에지 차단] D --> E[초고속 포토다이오드 어레이로 슐리렌 조도 편차 ΔI 실시간 계측] E --> F[10,000Hz 0-Alloc C# 경사 충격파 각도 β 및 마하수 역해석] F --> G[유압 서보 액추에이터로 흡입구 가변 경사판 램프 각도 즉각 보정] G --> H[충격파 분리 불안정성 Unstart 방지 및 유동 안정화 락] H --> B

4. 고성능 0-Alloc C# 서보 엔진 구현

GC 지연 없이 10,000Hz 주기로 슐리렌 센서 신호를 받아 충격파 위치와 가변 램프를 실시간 제어하는 C# 구조입니다:

using System;
using System.Runtime.CompilerServices;

namespace ZeliDesk.Stem.Schlieren
{
    public readonly record struct SchlierenConfig(
        double GladstoneDaleConstantK, // 공기 글래드스톤-데일 상수 (약 0.000226 m^3/kg)
        double FocalLengthM,           // 슐리렌 거울 초점거리 f (예: 1.5 m)
        double KnifeEdgeCutoffMm,      // 나이프 에지 초기 차단 폭 (예: 2.0 mm)
        double SpecificHeatRatioGamma, // 비열비 γ (공기: 1.4)
        double TargetShockAngleDeg     // 목표 경사 충격파 각도 (예: 32.5도)
    );

    public ref struct SchlierenServoState
    {
        public double EstimatedDensityGradientKgPerM4;
        public double MeasuredShockAngleDeg;
        public double EstimatedMachNumber;
        public double RampActuatorCommandMm;
        public bool IsShockwaveStable;
    }

    public static class SchlierenServoEngine
    {
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static void UpdateSchlierenServo(
            in SchlierenConfig cfg,
            ref SchlierenServoState state,
            double measuredIntensityRatioDeltaI,
            double upstreamStagnationPressureKpa,
            double downstreamStaticPressureKpa)
        {
            // 1. 슐리렌 명암 변화율로부터 광선 편향각 ε 및 밀도 구배 산출
            // ΔI / I0 = (f / a) * ε
            double deflectionAngleRad = (measuredIntensityRatioDeltaI * (cfg.KnifeEdgeCutoffMm * 1e-3)) / cfg.FocalLengthM;
            const double TestSectionWidthM = 0.20; // 20cm 시험부
            state.EstimatedDensityGradientKgPerM4 = deflectionAngleRad / (cfg.GladstoneDaleConstantK * TestSectionWidthM);

            // 2. 압력비 기반 마하수 및 경사 충격파 각도 추정
            double pressureRatio = Math.Max(1.0, downstreamStaticPressureKpa / Math.Max(1.0, upstreamStagnationPressureKpa));
            // 간이 마하수 역산: P2/P1 = 1 + 2γ/(γ+1) * (M^2 sin^2(β) - 1)
            double normalMachSquared = 1.0 + (pressureRatio - 1.0) * (cfg.SpecificHeatRatioGamma + 1.0) / (2.0 * cfg.SpecificHeatRatioGamma);
            double normalMach = Math.Sqrt(Math.Max(1.0, normalMachSquared));

            // 충격파 각도 추정 (밀도 구배 방향각 기반)
            state.MeasuredShockAngleDeg = Math.Clamp(Math.Asin(Math.Min(1.0, normalMach / 3.5)) * (180.0 / Math.PI), 15.0, 85.0);
            state.EstimatedMachNumber = normalMach / Math.Sin(state.MeasuredShockAngleDeg * Math.PI / 180.0);

            // 3. 충격파 각도 편차에 따른 유압 램프 변위 지령 산출
            double angleErrorDeg = state.MeasuredShockAngleDeg - cfg.TargetShockAngleDeg;
            state.RampActuatorCommandMm = Math.Clamp(-0.25 * angleErrorDeg, -5.0, 5.0);

            // 4. 충격파 안정 판정 (|Δβ| < 0.5도)
            state.IsShockwaveStable = Math.Abs(angleErrorDeg) < 0.5;
        }
    }
}

5. 교육 및 산업 응용 가치

본 서보 시스템은 초음속 항공기 엔진 흡입구의 충격파 위치 안정화(Shock Trap Control)와 초고속 공력 탄성학 연구에 직결됩니다. 중·고교 및 대학 물리/지구과학 교육과정에서는 눈에 보이지 않는 공기의 밀도와 충격파를 빛의 굴절을 통해 가시화하는 슐리렌 광학 원리를 체험형 시뮬레이션으로 완벽히 제공합니다.