AIDT 온디바이스 STEM 방사광 X선 극저온 나노단층촬영(Cryo-Nano-CT) 시료 회전축 나노 흔들림(Runout) 보정 서보 제어기

100K 액체질소 기화 냉각 환경 시료대 회전 편심(Eccentricity) 및 열수축 드리프트 서브-5nm 간섭계 보정, 10,000Hz C# 엔진

1. 개요

제4세대 방사광 가속기(Synchrotron Radiation) 및 X선 자유전자레이저(XFEL)를 이용한 극저온 생체 거대분자 및 차세대 반도체 나노단층촬영(Cryo-Nano-CT)은 10nm 이하의 3차원 입체 공간 분해능을 목표로 합니다. 생체 시료의 방사선 손상(Radiation Damage)을 억제하기 위해 시료를 100K 이하의 극저온(Cryogenic) 액체질소 기화 기류 내에서 유지한 채 0°부터 180° 또는 360°까지 정밀 회전시키며 수천 장의 2차원 투영(Projection) 영상을 취득합니다. 그러나 극저온 냉각용 극세 기류의 열유동 불안정, 베어링의 미세 기계적 유격, 초정밀 회전축의 편심(Eccentricity) 및 기계적 흔들림(Runout)으로 인해 회전 시료의 중심 위치가 수십~수백 나노미터 규모로 주기적 또는 비주기적으로 요동칩니다. 이 회전축 오차가 보정되지 않으면 역투영(Filtered Backprojection, FBP)이나 반복 재구성(SIRT/ePIE) 알고리즘에서 심각한 아티팩트와 해상도 저하가 발생합니다. 본 고에서는 레이저 헤테로다인 직교 간섭계와 3축 나노 피에조 스테이지를 결합하여 10,000Hz 주기로 회전 런아웃 오차를 5nm 이내로 실시간 능동 억제하는 고성능 0-Alloc C# 엔진을 구현합니다.

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

극저온 시료대 회전각 \(\theta(t)\)에 따른 시료 축 중심의 반경 방향 런아웃(Radial Runout) 오차 모델은 다음과 같이 동기 성분(Synchronous)과 비동기 성분(Asynchronous) 및 열수축 드리프트의 합으로 표현됩니다:

\[ \Delta r(\theta, t) = \sum_{k=1}^M \left[ A_k \cos(k\theta(t) + \phi_k) \right] + \Delta r_{thermal}(t) + \xi_{vib}(t) \]

여기서 \(A_k, \phi_k\)는 고조파 편심 계수, \(\Delta r_{thermal}(t) = \alpha_{th} L_0 (T(t) - T_0)\)는 극저온 열팽창 드리프트, \(\xi_{vib}\)는 냉매 기화 난류에 의한 확률적 고주파 진동입니다.

직교 레이저 헤테로다인 간섭계(Heterodyne Interferometer)를 통해 계측되는 \(X, Y\) 2축 순간 위치 오차 \(\mathbf{e}(t) = [e_x, e_y]^T\)는 다음과 같습니다:

\[ \begin{bmatrix} e_x(t) \\ e_y(t) \end{bmatrix} = \begin{bmatrix} X_{meas}(t) - X_{ref} \\ Y_{meas}(t) - Y_{ref} \end{bmatrix} = \begin{bmatrix} \cos\theta(t) & -\sin\theta(t) \\ \sin\theta(t) & \cos\theta(t) \end{bmatrix} \begin{bmatrix} \delta x_{ecc} \\ \delta y_{ecc} \end{bmatrix} + \begin{bmatrix} d_x(t) \\ d_y(t) \end{bmatrix} \]

3축 나노 피에조 액추에이터(PZT)에 인가되는 피드포워드 반복 제어(Repetitive Control) 결합 PID 서보 법칙은 다음과 같습니다:

\[ \mathbf{u}_{pzt}[k] = \mathbf{u}_{ff}(\theta[k]) + K_p \mathbf{e}[k] + K_i \sum_{j=0}^k \mathbf{e}[j] \Delta t + K_d \frac{\mathbf{e}[k] - \mathbf{e}[k-1]}{\Delta t} \]
\[ \mathbf{u}_{ff}(\theta) = \sum_{k=1}^M \begin{bmatrix} \hat{A}_{x,k} \cos(k\theta) + \hat{B}_{x,k} \sin(k\theta) \\ \hat{A}_{y,k} \cos(k\theta) + \hat{B}_{y,k} \sin(k\theta) \end{bmatrix} \]

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

GC 지연을 배제하고 10,000Hz(100\(\mu\)s) 확정적 루프 타이밍을 보장하기 위해 `ref struct` 기반의 0-메모리 할당 아키텍처로 구현합니다.

using System;
using System.Runtime.CompilerServices;

namespace ZeliDesk.Stem.Synchrotron.CryoTomography
{
    /// <summary>
    /// 100K 극저온 시료 회전축 나노 런아웃 계측 및 피에조 보정 상태
    /// </summary>
    public readonly ref struct CryoRunoutSampleState
    {
        public readonly double RotationAngleRad;   // 시료 회전 각도 theta [rad]
        public readonly double XInterferometerNm;   // X축 레이저 간섭계 계측값 [nm]
        public readonly double YInterferometerNm;   // Y축 레이저 간섭계 계측값 [nm]
        public readonly double CryoTemperatureK;    // 시료 챔버 온도 [K]

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public CryoRunoutSampleState(double angle, double xNm, double yNm, double tempK)
        {
            RotationAngleRad = angle;
            XInterferometerNm = xNm;
            YInterferometerNm = yNm;
            CryoTemperatureK = tempK;
        }
    }

    /// <summary>
    /// 피에조 3축 서보 제어 출력
    /// </summary>
    public readonly ref struct CryoPiezoCorrectionOutput
    {
        public readonly double DeltaXPztVolt;      // X축 피에조 구동 전압 [V]
        public readonly double DeltaYPztVolt;      // Y축 피에조 구동 전압 [V]
        public readonly double ResidualErrorNm;    // 보정 후 잔류 축 편심 오차 [nm]
        public readonly bool IsStableForProjection; // 촬영 허용 잔류 오차(<5nm) 여부

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public CryoPiezoCorrectionOutput(double vx, double vy, double errNm, bool stable)
        {
            DeltaXPztVolt = vx;
            DeltaYPztVolt = vy;
            ResidualErrorNm = errNm;
            IsStableForProjection = stable;
        }
    }

    /// <summary>
    /// 10,000Hz 극저온 시료축 나노 런아웃 능동 보정 서보 엔진
    /// </summary>
    public ref struct SynchrotronCryoRunoutServoEngine
    {
        private readonly double _kp;
        private readonly double _ki;
        private readonly double _kd;
        private readonly double _piezoGainVoltPerNm;
        private readonly double _maxVoltLimit;

        // PID 적분 및 이전 오차 버퍼
        private double _integralX;
        private double _integralY;
        private double _prevErrX;
        private double _prevErrY;

        // 1차~4차 고조파 편심 피드포워드 룩업 계수
        private readonly Span<double> _harmonicsCosX;
        private readonly Span<double> _harmonicsSinX;
        private readonly Span<double> _harmonicsCosY;
        private readonly Span<double> _harmonicsSinY;

        public SynchrotronCryoRunoutServoEngine(
            double kp,
            double ki,
            double kd,
            double piezoGainVoltPerNm,
            double maxVoltLimit,
            Span<double> cosX,
            Span<double> sinX,
            Span<double> cosY,
            Span<double> sinY)
        {
            _kp = kp;
            _ki = ki;
            _kd = kd;
            _piezoGainVoltPerNm = piezoGainVoltPerNm;
            _maxVoltLimit = maxVoltLimit;
            _integralX = 0.0;
            _integralY = 0.0;
            _prevErrX = 0.0;
            _prevErrY = 0.0;
            _harmonicsCosX = cosX;
            _harmonicsSinX = sinX;
            _harmonicsCosY = cosY;
            _harmonicsSinY = sinY;
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public CryoPiezoCorrectionOutput Update(in CryoRunoutSampleState state, double dtSeconds)
        {
            double theta = state.RotationAngleRad;

            // 1. 고조파 편심 피드포워드 기준 모델 계산
            double ffX = 0.0;
            double ffY = 0.0;
            int harmonicsCount = _harmonicsCosX.Length;
            for (int k = 1; k <= harmonicsCount; k++)
            {
                double angleK = k * theta;
                double c = Math.Cos(angleK);
                double s = Math.Sin(angleK);
                ffX += _harmonicsCosX[k - 1] * c + _harmonicsSinX[k - 1] * s;
                ffY += _harmonicsCosY[k - 1] * c + _harmonicsSinY[k - 1] * s;
            }

            // 2. 오차 연산 (이상적 축 중심 0.0nm 기준)
            double errX = -(state.XInterferometerNm);
            double errY = -(state.YInterferometerNm);

            // 3. 적분 및 미분 연산
            _integralX += errX * dtSeconds;
            _integralY += errY * dtSeconds;
            double derivX = (errX - _prevErrX) / dtSeconds;
            double derivY = (errY - _prevErrY) / dtSeconds;
            _prevErrX = errX;
            _prevErrY = errY;

            // 4. 피드백 + 피드포워드 보정 변위 [nm]
            double compNmX = ffX + (_kp * errX + _ki * _integralX + _kd * derivX);
            double compNmY = ffY + (_kp * errY + _ki * _integralY + _kd * derivY);

            // 5. 전압 변환 및 포화 한계
            double voltX = Math.Clamp(compNmX * _piezoGainVoltPerNm, -_maxVoltLimit, _maxVoltLimit);
            double voltY = Math.Clamp(compNmY * _piezoGainVoltPerNm, -_maxVoltLimit, _maxVoltLimit);

            // 6. 보정 후 잔류 반경 오차 추정
            double residualX = state.XInterferometerNm + (voltX / _piezoGainVoltPerNm);
            double residualY = state.YInterferometerNm + (voltY / _piezoGainVoltPerNm);
            double residualDistNm = Math.Sqrt(residualX * residualX + residualY * residualY);

            bool isStable = residualDistNm <= 5.0; // 5nm 이내 단층촬영 투영 허용 조건

            return new CryoPiezoCorrectionOutput(voltX, voltY, residualDistNm, isStable);
        }
    }
}

4. 교육 및 산업 적용 방안

  • 한국방송통신대학교 나노재료·생체물리 원격 실험: 극저온 단층촬영 시료 회전축 편심 모델링, 간섭계 피드포워드 능동 제어 시뮬레이션 교구.
  • 포항가속기연구소(PAL) / 오창 4세대 다목적방사광가속기: Cryo-Nano-CT 빔라인 시료 스테이지 서브-5nm 축 안정화 실시간 서보 실장.