29.6.3.1. 위성 항법 장치 수신 오차 임계치 초과 또는 EKF 위치 추정 실패 시, 위치 제어 모드에서 자세 안정화 모드로 강제 상태 하향(Downgrade)을 트리거하는 인터럽트 소스

29.6.3.1. 위성 항법 장치 수신 오차 임계치 초과 또는 EKF 위치 추정 실패 시, 위치 제어 모드에서 자세 안정화 모드로 강제 상태 하향(Downgrade)을 트리거하는 인터럽트 소스

1. 개요 및 EKF 혁신(Innovation) 임계치의 개념

야외 비행 중인 무인항공기가 겪는 가장 흔하고도 치명적인 결함은 구름, 고층 건물, 전파 재밍(Jamming) 등으로 인한 위성 항법 장치(GPS)의 수신 불량이다. 조종자가 드론을 특정 위치에 고정(Hovering)시키기 위해 위치 제어(Position Control) 모드로 비행하고 있을 때, GPS 신호가 교란되면 기체는 자신이 어디에 있는지 착각하게 되어 제멋대로 가속하는 플라이어웨이(Fly-away) 현상을 일으킨다.

PX4-Autopilot은 단순한 위성 수(Number of Satellites) 위주의 원시적인 결함 판별을 넘어서, 확장 칼만 필터(EKF2)의 혁신(Innovation) 오차 임계치를 기반으로 스마트한 결함 감지를 수행한다. EKF는 관성 센서(IMU)로 예측한 위치와 GPS에서 수신된 실제 위치의 차이(Innovation)를 계산한다. 이 값이 사전에 정의된 임계치(Gate Parameter, 예: EKF2_GPS_P_GATE)를 특정 시간 이상 지속해서 초과하면, 시스템은 GPS 센서 자체를 맹목적으로 믿지 않고 철회(Reject)해 버리며 상태 강등(Downgrade)의 트리거(Trigger)를 당기게 된다.

2. 상태 강등(Downgrade) 인터럽트 소스 아키텍처

GPS 위치 추정 실패 시 트리거되는 폴백 인터럽트 소스는 세 가지 주요 계층을 거친다.

  1. Estimator 계층 (EKF2): 혁신 오차가 임계치를 초과하면 카운터가 동작하고, 타임아웃 발생 시 내부 상태 변수인 local_position_validglobal_position_valid 불리언(Boolean) 값을 false로 갱신하여 uORB vehicle_status_flags 토픽을 발행(Publish)한다.
  2. 안전 로직 계층 (Commander Failsafe): 비행 메인 루프에서 백그라운드로 도는 failsafe.cpp 로직이 상기 플래그 토픽을 실시간으로 구독(Subscribe)한다. 현재 시스템의 상태가 MAIN_STATE_POSCTL(위치 제어)인데 위치 유효성 플래그가 꺼진 상태(Conflict)를 감지한다.
  3. 상태 전이 계층 (State Machine Helper): Failsafe 모듈이 상황의 심각성을 Commander 메인 스레드로 인터럽트(소프트웨어적 이벤트) 형태로 전달하면, state_machine_helper.cpp가 즉시 안전한 하위 모드로 기체의 main_state를 강제 덮어씌운다.

3. 강제 하향 트리거 시퀀스 (Mermaid 설계도)

EKF2 모듈에서 위치 오차를 감지하여 최종적으로 기체가 자세 안정화 모드로 굴러떨어지는 폴백 처리 시퀀스 다이어그램이다.

sequenceDiagram
    participant EKF2 as Estimator (EKF2)
    participant uORB as uORB Network
    participant FS as Failsafe Logic
    participant SM as State Machine
    participant FMM as Flight Mode Manager

    Note over EKF2: 비행 중 GPS 다중 경로 간섭 발생
    EKF2->>EKF2: 혁신 오차(Innovation) > EKF2_GPS_P_GATE 확인
    EKF2->>EKF2: 지속 타임아웃 만료
    EKF2->>uORB: vehicle_status_flags<br>(condition_local_position_valid = false) 발행
    
    uORB->>FS: 플래그 갱신 수신
    FS->>FS: 현재 모드 MAIN_STATE_POSCTL 와<br>플래그 충돌(Conflict) 감지
    FS->>SM: Downgrade Interrupt 발생
    
    Note over SM: 폴백 계층 검사
    SM->>SM: 고도(Baro) 정상인가? -> YES (ALTCTL) / NO (STAB)
    SM->>uORB: vehicle_status (main_state = MAIN_STATE_STAB) 갱신
    
    uORB->>FMM: 신규 main_state 수신
    FMM->>FMM: Position 제어 루프 강제 종료
    FMM->>FMM: Stabilized(수평 유지) 제어 루프 즉시 기동

4. 소스 코드 깊은 분석 (failsafe.cppcommander)

인터럽트를 소프트웨어적으로 검출하고 처리하는 PX4의 핵심 구조는 주로 src/modules/commander/failsafe/failsafe.cpp 내에 위치한 폴백 이밸류에이터(Evaluator) 함수들에 집중되어 있다.

// 수동 위치 제어 중 센서 상실로 인한 Downgrade 처리 (의사 로직 압축)

// 폴백 트리거 검사 함수 (비행 루프 내에서 고빈도 호출됨)
void check_fallback_conditions(const status_flags_s &status_flags, uint8_t &main_state)
{
    // 위치 제어 모드 종속성 검사
    if (main_state == commander_state_s::MAIN_STATE_POSCTL) {
        
        // EKF 위치 추정기가 position_valid 플래그를 false로 내린 인터럽트를 감지
        if (!status_flags.condition_local_position_valid) {
            
            // 경고 메시지 로깅
            mavlink_log_critical(&mavlink_log_pub, "Failsafe: Position estimate lost");

            // 고도 센서(기압계 등)가 살아있는지 2차 검사
            if (status_flags.condition_local_altitude_valid) {
                // 다운그레이드 단계 1: 고도 제어 모드로 연착륙
                main_state = commander_state_s::MAIN_STATE_ALTCTL;
            } else {
                // 다운그레이드 단계 2: 극한 상황. 수동 자세 제어 모드로 하드 강등
                main_state = commander_state_s::MAIN_STATE_STAB;
                mavlink_log_emergency(&mavlink_log_pub, "Failsafe: Altitude estimate lost, fallback to STABILIZED");
            }
            
            // 알림: 조종자는 이제 스틱을 중앙에 놓더라도 기체가 바람에 떠밀리게 됨을
            // 인지하고 직접 조종해야 함을 경고음으로 통보 (Buzzer)
        }
    }
}

이 코드는 조건문(if (!status_flags...))이 참이 되는 순간 동기적으로 main_state 변수를 조작해버리기 때문에, 다음 비행 제어기(mc_pos_control) 사이클이 돌기도 전에 모드 전환 통보가 완료되며, 오작동으로 인한 플라이어웨이의 골든 타임을 완벽히 차단한다.

5. Ardupilot 대비 아키텍처 및 철학 차이

EKF 위치 상실이라는 동일한 인터럽트에 대응하는 두 시스템의 펠세이프 철학은 상당히 대조적이다.

  • P4X-Autopilot:
    시스템 상태 깃발(Flags)의 수동적 조합을 통하여 **“우아한 강등(Graceful Degradation)”**을 지향한다. 위치 제어(PosCtl)에서 GPS를 잃으면 바로 추락하는 것이 아니라, 사용자가 명시하지 않았음에도 고도 제어(AltCtl) 모드로, 거기서도 안되면 자세 제어(Stab) 모드로 한 계단씩 모드를 떨어트린다. 이는 조종자가 기체를 최대한 제어할 수 있도록 스택의 유창함(Fluidity)을 제공하기 위한 의도다.
  • Ardupilot:
    비행의 ’의도(Intent)’를 엄격히 고수하는 방식이다. EKF Failsafe 메뉴얼에 따르면, FS_EKF_ACTION 파라미터가 1(Land)인 경우 GPS 분산값을 뜻하는 FS_EKF_THRESH(기본 0.8)를 넘어서는 순간 기체는 즉시 그 자리에 Land(착륙) 모드를 강제 집행한다. 조종자가 수평 유지 모드(RTL/Loiter 중)를 원했으나 센서가 고장났으니, 시스템이 개입하여 가장 안전한 행위(지상 이탈)를 보수적으로 단행하는 하드 코딩 성향이 짙다.

결론적으로 위성 항법 시스템의 오차폭발은 PX4-Autopilot의 Failsafe 모듈에 의해 main_state 변수를 즉각적으로 재설정하는 소프트웨어 인터럽트 소스로 작용하며, 이를 통해 기체는 가장 의존성이 낮은 자세 안정화 제어 메커니즘으로 무사히 대피할 수 있게 된다.