28.4.1.2. Commander 내 State Machine의 모드 변경 요청 평가 및 수락/거부(Accept/Reject) 판별
앞 절에서 다중화기(MUX)를 거쳐 하나로 규합된 모드 변경 요청(vehicle_command 메시지)은 최종적으로 커맨더(Commander) 데몬 심장부에 위치한 **상태 머신(State Machine)**의 심판대에 오른다.
커맨더의 상태 머신은 외부의 요청을 맹목적으로 신뢰하지 않는다. 아무리 조종사(RC)나 지상 관제소(GCS)가 “자율 비행(Auto) 모드로 전환하라“라고 소리쳐도, 기체의 현재 센서나 물리적 조건이 허락하지 않으면 즉각적으로 거부(Reject)를 때려버리는 냉혹한 판사 역할을 수행한다.
1. 사전 조건 평가 매트릭스 (Pre-condition Assessment)
상태 머신은 새로운 모드로의 진입 요청을 수신하면, 기체의 센서 및 시스템 상태를 대변하는 수십 개의 bool 플래그들을 검사한다.
- 위치 추정(Position Estimate) 유효성: 자율 비행(Mission, Hold, RTL)이나 위치 유지(Position) 수동 모드로 진입하기 위해서는 EKF2 에스티메이터가 위성과 융합하여 계산해 낸
local_position_valid및global_position_valid플래그가 반드시true여야 한다. (GPS가 수신되지 않는 실내에서 Position 모드 스위치를 켜면 즉각 거부되는 이유다). - RC 신호 유효성: 조종기 신호가 끊어진(RC Lost) 상태에서는 수동(Manual) 계열 모드로의 진입을 거부한다.
- 배터리 상태: 배터리가 치명적 임계치(Critical)에 도달한 상태에서는, 조종사가 일반 비행 모드로 복귀하려 해도 상태 머신이 이를 묵살하고 안전 장치(Failsafe) 체제인 강제 착륙(Land)을 유지한다.
- 무장(Arming) 여부: 프로펠러가 돌지 않는 Disarm 상태에서는 다이내믹한 공중 기동 모드로의 상태 전환을 사전 차단하여 로직의 꼬임을 막는다.
2. 수락 (Accept) 처리 파이프라인
모든 조건이 충족되어 상태 머신이 전환을 승인(ACK)하면 다음과 같은 이벤트가 연쇄적으로 발생한다.
- 내부 상태 업데이트: 커맨더의 내부 State 열거형(Enum) 변수를 새 모드로 변경한다.
- uORB 발행 (
vehicle_control_mode): 가장 중요한 단계다. 커맨더는[수동제어 허용: False, 고도제어 허용: True, 위치제어 허용: True...]형식으로 제어 권한 비트마스크가 담긴vehicle_control_mode토픽을 발행한다. 바로 이 토픽이 하단의 FMM(Flight Mode Manager)을 깨워 실질적인FlightTask스왑(Swap)을 지시하는 트리거가 된다. - GCS 피드백: MAVLink를 통해 GCS에게
COMMAND_ACK (RESULT_ACCEPTED)패킷을 쏘아보내어 QGroundControl 화면 최상단에 “Flight Mode: Hold“라는 녹색 텍스트가 뜨게 만든다.
3. 거부 (Reject) 처리 파이프라인
반대로 조건이 하나라도 미달되어 거부(NACK) 판정이 내려지면 다음의 방어 로직이 가동된다.
- 전환 폐기: 커맨더의 내부 상태는 기존 모드를 그대로 유지하며, FMM에게 어떠한 새로운 uORB 지시도 내리지 않는다. 드론은 현재 날고 있던 안전한 모드로 계속해서 비행을 이어간다.
- 경고 메시지 발행 (
statustext): 상태 머신은 왜 전환을 거부했는지 그 사유를 텍스트로 렌더링하여statustextuORB 토픽으로 뿌린다. (예: “REJECT AUTO: No global position”). 이 텍스트는 MAVLink를 타고 내려가 QGroundControl 화면 센터에 노란색 또는 빨간색 팝업 경고창으로 출력되어 조종사에게 상황을 인지시킨다. - 오디오 피드백: 동시에 부저(Buzzer) 토픽을 건드려 픽스호크 보드에서 “삐빅!” 하는 불쾌한 톤의 거절음(Denial Tone)을 울려 파일럿에게 물리적 경고를 보낸다.
이처럼 커맨더의 깐깐한 수락/거부 상태 머신 아키텍처는, 사용자의 멍청한 조작 실수나 센서 장애 상황에서도 기체가 추락으로 향하는 자살 명령(Suicide Command)을 절대 수행하지 않도록 막아주는 최후의 논리적 방어벽이다.