# 1. 커맨더(Commander) 모듈과의 비동기 상태 동기화 및 제어권(Control Authority) 전환 핸드셰이킹 로직

# 1. 커맨더(Commander) 모듈과의 비동기 상태 동기화 및 제어권(Control Authority) 전환 핸드셰이킹 로직

PX4-Autopilot의 운영체제 및 전반적 아키텍처 철학은 ’책임의 분리(Separation of Concerns)’를 극도로 강조한다. 이를 가장 명확하게 보여주는 사례가 바로 기체의 전역적 상태(State)와 안정성을 통제하는 commander 모듈과, 공간의 경로(Path) 연산 및 유도 제어를 담당하는 navigator 모듈 간의 분리 독립이다.

자동 비행 모드(Mission, RTL, Hold 등)가 정상적으로 이륙하고 목적지로 항행하기 위해서는 이 두 거대 싱글톤(Singleton) 모듈 간에 오차 없는 제어권(Control Authority) 위임과 논리적 상태 동기화가 필요하다. 본 절에서는 GCS명령이나 Failsafe(안전 장치) 발동 등 외부 인터럽트가 발생했을 때 이 두 모듈이 어떤 핸드셰이킹(Handshaking) 과정을 거쳐 비동기적으로 스위칭 로직을 완수하는지 소스 코드 수준에서 살펴본다.

1.1 commander 모듈의 상태 머신 권위(Authority)

PX4의 다중 모듈 토폴로지 생태계 내에서, 유일하게 기체의 심장 박동(시동 상태)과 체성 감각(센서 무결성)을 최종 통과(Pass)시키고 비행 모드의 진입을 합법화하는 관문은 오직 commander 모듈뿐이다.

조종사가 조종기 스위치를 토글하여 “RTL 모드“를 요구하거나, GCS가 MAVLink MAV_CMD_DO_SET_MODE 커맨드를 날릴 경우, 이 인터럽트성 요구는 절대 navigator 모듈로 직행하지 않는다. 명령어는 전부 commander 애플리케이션의 C++ 메인 루프 인스턴스(Commander::run()) 내부로 라우팅된다.

여기서 commander는 진입 가능 여부를 판단하기 위한 혹독한 **비행 전 점검(Pre-flight Check)**과 동적 상태 조건(Dynamic Pre-condition) 평가를 시행한다.

  • EKF2 위치 혁신율(Position Innovation)이 안정화되었는가? (GPS 고착 및 분산 지표 확인)
  • 비행경로점(Waypoint) 데이터가 유의미하게 램에 로드되었는가? (navigator 측의 진입 동의 플래그 검증)
  • 배터리 잔량이 임계 볼트(Critical Voltage)를 상회하여 추진을 담보할 수 있는가?

이러한 사전 검열이 무사히 통과(true) 되면, commander는 비로소 글로벌 uORB 토픽인 vehicle_status_s 구조체의 nav_state 열거형(Enum) 필드를 해당 자동 모드(예: NAVIGATION_STATE_AUTO_MISSION)로 오버라이드(Override)하여 시스템 버스에 방출(Publish)한다.

1.2 비동기 핸드셰이킹 로직(Asynchronous Handshaking Logic)

vehicle_status 토픽이 새롭게 갱신된 사실은 navigator 모듈의 폴링(Polling) 루프를 깨우는 데 일조한다. navigator는 스스로가 원수(Head)가 되어 자율 비행의 타이밍을 결정하는 주체적 객체가 아니다. 대신, 철저히 commander 마스터가 발행한 이 상태 명령서(Status Bulletin)를 하달받아 종속적으로 반응하는 노드(Node)에 가깝다.

이 두 모듈 간에 실타래처럼 묶여 작동하는 제어권 인가 핸드셰이킹 시퀀스는 아래 다이어그램과 같은 비동기 트랜잭션 수순을 거친다.

sequenceDiagram
    participant GCS as GCS / 조종기(RC)
    participant Commander as Commander 모듈 <br/> (마스터 상태 머신)
    participant uORB as uORB 버스
    participant Navigator as Navigator 모듈 <br/> (임무 유도계)
    
    GCS->>Commander: 모드 변경 커맨드 전송 (Set Mission)
    activate Commander
    Commander->>Commander: 센서 무결성 및 시동 락(Lock) 검증
    Commander->>uORB: vehicle_status (nav_state = AUTO_MISSION) 발행
    deactivate Commander
    
    uORB-->>Navigator: 비동기 토픽 수신 트리거
    
    activate Navigator
    Navigator->>Navigator: 내부 FSM 스위치 (이전 모드 inactivation_call)
    Navigator->>Navigator: Mission_Mode::on_activation() 초기화 콜
    Navigator->>Navigator: Mission_Mode::on_active() 궤적 생성
    Navigator->>uORB: position_setpoint_triplet_s 설정점 하달
    deactivate Navigator

이 고도의 비동기적(Non-blocking) 핸드셰이킹 통신망 구조는 Ardupilot과 극명한 성능 및 구조적 대비를 이룬다. Ardupilot 모델은 특정 서브루틴 블록이 CPU 레지스터를 통째로 선점한 상태로 모드 스위칭 함수를 직렬 실행하지만, PX4는 commander가 오로지 상태 지시등만 점등해 두고 즉시 본연의 센서 감시 및 페일세이프 판정 타이머 루프로 이탈하는(Fire-and-Forget) 구조를 갖는다. 이에 따라 시스템의 메인 동맥 코어가 일시적 트래픽 병목에 걸려 응답 불능(Deadlock)에 빠질 아키텍처적 가능성을 선제적으로 배제한다.

1.3 하프 듀플렉스(Half-duplex) 상호 검토 구조와 예외 거부(Rejection)

비록 commander가 시스템 상태 전이의 유일한 전제 군주라 할지라도, 특정 상황에서는 역으로 navigator 모듈이 권한 위임을 거부(Reject)하거나 commander로 하여금 모드 변경을 단념하도록 종용하는 하프 듀플렉스(반이중) 검토 구조가 가동된다.

이는 주로 경로 이탈이나 데이터 소실 같은 런타임 예외(Runtime Exveptions)가 발현될 때 돋보인다. 예컨대 Mission 모드로의 진입 지시를 받은 navigator가 내부 SD/Dataman 스토리지를 스캔했으나 유효한 위치 이정표 데이터 묶음이 없다고 판별할 경우, navigator는 해당 진입을 강행하여 null 포인터 예외 등을 발생시키지 않는다.

대신, navigator는 자신이 정상적인 미션을 제공할 수 없음을 내부 mission_result_s 토픽 등의 실패 플래그(valid=false)로 래핑하여 uORB에 응답 퍼블리시한다. commander는 이 피드백을 수신하여 “Mission 진입 불가” 알림음을 스피커 부저로 송출하고 컴패니언 컴퓨터나 GCS에 MAV_RESULT_DENIED NACK 신호를 통지한 뒤, 기체를 기존의 안정된 모드(예: Hold 혹은 매뉴얼 Position)로 소프트 홀딩(Soft-holding)시키는 유연한 예외 처리 복구 체인을 성사시킨다.

1.4 Failsafe 발동 시의 제어권 박탈(Deprivation) 및 오버라이딩(Overriding)

반대로 데이터 링크 유실, 극심한 배터리 팩 전압 강하(Low Battery), 지자기 센서 불일치 등 기체의 기계/전자적 생존이 위협받는 특수 상황(Failsafe Condition)에서는 commander 측의 일방 통행적 ‘제어권 박탈’ 로직이 트리거된다.

이러한 경우 commandernavigator가 현재 어떤 복잡한 임무(Mission) 연산 궤도에 심취해 있건 무관하게, vehicle_status 토픽의 계급 강제 전환(RTL 진입 또는 고도 하강 Land 모드 강제 실행)을 비동기식으로 브로드캐스팅한다. navigator는 다음 폴링 인터벌에서 이 전역 모드 변화를 직면하게 되며, 기존 작업 공간을 on_inactivation() 소멸자(Destructor) 루트 인터페이스로 신속히 반납하고 생존 지향적 RTL 복귀 연산 모드로 스스로를 리셋하는 고품질의 안전 우선 인터럽트 아키텍처(Safety Preemptive Architecture) 편제 체계를 입증해 낸다.