29.6.1.2. 상태 전환 함수 내 모드 전환 사전 조건(Pre-condition) 검증: 센서 건강 상태, 시동 유무, 상태 추정기 유효성 확인 분기문

29.6.1.2. 상태 전환 함수 내 모드 전환 사전 조건(Pre-condition) 검증: 센서 건강 상태, 시동 유무, 상태 추정기 유효성 확인 분기문

1. 개요 및 사전 조건 판별의 중요성

비행 제어 시스템에서 조종자가 목표하는 비행 모드로 전환하기 위해서는 해당 모드가 요구하는 기체의 정보(차원 데이터)가 충분히 신뢰할 수 있는 수준이어야 한다. 예를 들어, 조종자가 위치 제어(Position Control) 모드로 전환을 시도할 때, GPS 신호가 끊겨 기체의 국소 위치(Local Position)를 알 수 없다면 전환은 즉시 거부되어야 한다. 허가되지 않은 상태에서의 강제 전환은 기체 오작동 및 즉각적인 추락(Fly-away)으로 이어진다.

이러한 안전사고를 미연에 방지하기 위하여 PX4-Autopilot의 Commander 모듈은 상태 전환 함수 내부에서 사전 조건(Pre-condition) 검증 로직을 엄격하게 실행한다. 본 절에서는 state_machine_helper.cpp 내부에서 조종기의 전환 요청이 센서 건강 상태(Health), 무장(Arming) 상태, 확장 칼만 필터(EKF)의 추정기 유효성 플래그와 어떻게 논리곱(AND) 연산되어 승인되는지 분석한다.

2. 상태 추정 유효성 플래그(Status Flags) 구조

사전 조건 검증의 바탕이 되는 데이터는 vehicle_status_flags_s 구조체의 불리언(Boolean) 멤버 변수들이다. 센서 모듈과 칼만 필터(EKF2 등)는 현재 자기가 산출하는 추정값들의 분산(Variance)과 혁신(Innovation) 오차를 기반으로 정보의 신뢰성을 판단하여 다음과 같은 플래그들을 실시간으로 업데이트(Publish)한다.

  • condition_attitude_valid: 자이로와 가속도계 융합을 통한 기체의 기울어짐(Roll, Pitch) 및 헤딩(Yaw) 각도가 유효한지 나타낸다. (Stabilized 모드 전환 필수 요건)
  • condition_local_altitude_valid: 기압계, GPS 고도, 또는 거리 측정(Range Finder) 센서를 통해 수직 방향의 변위(Z-axis) 추정이 안전한 단계인지 나타낸다. (Altitude 모드 전환 필수 요건)
  • condition_local_position_valid / condition_global_position_valid: 옵티컬 플로우, VIO 혹은 GPS를 기반으로 XY 평면 좌표와 속도 추정이 신뢰할 수준인지 나타낸다. (Position 및 자동 임무 설정 필수 요건)
  • rc_signal_found_once: 부팅 후 조종기와 수신기 간의 유선/무선 신호가 정상적으로 링크된 적이 있는지 보증한다. (수동 제어 모드의 필수 요건)

3. 조건 검증 분기 로직 (Mermaid 설계도)

조종자가 MAIN_STATE_POSCTL (위치 제어 모드)를 요청했을 때, Commander 모듈 내부의 검증 함수가 플래그들을 순차적으로 어떻게 통과시키는지 보여주는 판단 흐름도이다.

graph TD
    A[조종기 스위치 : 위치 제어 모드 전환 요청] --> B{RC 연결 유효성 검사<br>rc_signal_found}
    B -- 실패 --> Deny[전환 거부 TRANSITION_DENIED]
    
    B -- 통과 --> C{자세 추정 유효성 검사<br>condition_attitude_valid}
    C -- 실패 --> Deny
    
    C -- 통과 --> D{고도 추정 유효성 검사<br>condition_local_altitude_valid}
    D -- 실패 --> Deny
    
    D -- 통과 --> E{평면 위치 추정 유효성 검사<br>condition_local_position_valid}
    E -- 실패 --> Deny
    
    E -- 통과 --> F[전환 승인 TRANSITION_CHANGED<br>위치 제어 태스크 활성화]

위의 다이어그램에서 볼 수 있듯, 고도 제어나 위치 제어와 같이 상위 수준의 자율성을 요구하는 모드일수록 더 많은 계층의 센서 유효성 플래그가 참(True)이어야만 상태 전이가 허가된다.

4. 소스 코드 깊은 분석 (Commander::main_state_transition())

state_machine_helper.cpp에 구현된 main_state_transition() 함수는 switch (main_state_req) 문을 통하여 각각의 모드가 요구하는 검증 분기문(Branching)을 명시적으로 나열한다. 위치 제어(Position Control) 모드 전환 시점의 핵심 소스 코드는 아래와 같은 철학으로 짜여있다.

// src/modules/commander/state_machine_helper.cpp (의사 코드 단순화)

case commander_state_s::MAIN_STATE_POSCTL:
    // 사전 조건 1: 수동 조종입력 유효성
    if (!status_flags.rc_signal_found_once) {
        // RC 신호가 없으면 위치 제어를 수동으로 조작할 수 없으므로 거부
        break;
    }

    // 사전 조건 2: 3차원 위치(XY 및 고도 Z) 및 자세 유효성 확인
    if (status_flags.condition_local_position_valid &&
        status_flags.condition_local_altitude_valid &&
        status_flags.condition_attitude_valid) 
    {
        // 모든 센서 추정치가 안정적일 때만 모드 변경 승인
        main_state = main_state_req;
        ret = TRANSITION_CHANGED;
        
    } else {
        // 만약 GPS 음영 지역에 진입하여 condition_local_position_valid 플래그가 False로 
        // 떨어진 상태에서 조종자가 스위치를 조작했다면 이 분기를 타지 못하고 
        // switch 문을 빠져나가 ret = TRANSITION_DENIED 가 반환된다.
    }
    break;

또한 시동 전(Pre-arming) 상태에서는 기체의 모터가 돌지 않으므로 위치 제어 모드로 전환해두는 것이 허용되지만, 이미 시동이 걸린(Armed) 활성 비행 중(arming_state == ARMING_STATE_ARMED)에는 위치 오류 혁신(Innovation)이 임계치를 넘는 순간부터 해당 모드로의 스위칭이 철저히 차단된다. 이를 위해 상태 헬퍼 함수들은 arming_state 파라미터를 함수 인자로 넘겨받아 이중 검증을 실행한다.

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

사전 조건 검증 철학에 있어서 두 소프트웨어는 다음과 같은 대비를 이룬다.

  • PX4-Autopilot:
    사전 조건들을 불리언(Boolean) 기반의 거대한 비트맵 구조체(vehicle_status_flags_s)로 추상화하여, 메인 비행 컨트롤러 외부의 Commander 데몬에서 논리 연산을 통해 판단한다. 이로 인해 EKF 센서단이 어떤 이유로 실패했든 간에(예: 카메라 VIO 고장, GPS 안테나 탈거 등), 위치 산출이 불가능하다는 단일 플래그(condition_local_position_valid == false) 하나만 확인하면 되므로 모듈 간 결합도가 대폭 낮고 관리가 용이하다.
  • Ardupilot:
    비행 모드 처리 로직을 위한 Copter::set_mode() 과정에서, 개별 모드 클래스(예: ModePosHold, ModeLoiter) 들이 내장하고 있는 다형성(Polymorphic) 메서드인 requires_GPS()requires_barometer() 등을 직접 쿼리(Query)하여 검증하는 방식이다. 전환 요청자가 해당 모드 클래스의 멤버 함수 기능을 직접 호출하여 가능성을 물어보고 획득하는 객체지향적 폴링(Polling) 구조에 가깝다.

결론적으로 PX4의 사전 조건 검증 분기문은 추정기(Estimator)가 퍼블리시한 상태 플래그를 수동적으로 소비하여 철저한 진실표(Truth Table) 기반의 분기를 타게 함으로써, 제어권 스왑 이전에 완벽한 센서 신뢰성을 프로그래밍 기법으로 담보해낸다.