29.5.1.1. 커맨더 모듈에서 자세 제어 플래그 비활성화 및 각속도 제어 플래그 활성화로 설정되는 논리적 상태 전이 추적
PX4-Autopilot의 아키텍처에서 비행 모드의 결정과 그에 따른 하위 제어 루프들의 점멸(On/Off)을 총괄하는 핵심 두뇌는 커맨더(Commander) 모듈이다. 조종사가 조종기 스위치나 GCS 명령을 통해 아크로(Acro) 모드 전환을 요청하면 시스템 내부에서는 vehicle_status 트랜잭션이 발생하며, 이는 최종적으로 vehicle_control_mode 토픽의 비트 플래그 설정으로 반영된다. 본 절에서는 아크로 모드 진입 시 자세 제어 플래그가 비활성화되고 각속도 제어 플래그만 남게 되는 논리적 상태 전이 과정을 PX4 소스 코드를 통해 체계적으로 추적한다.
1. 커맨더(Commander) 모듈의 상태 머신 개요
PX4의 상태 머신(State Machine)은 이벤트 기반(Event-driven)으로 동작한다. 모드 변경 명령(vehicle_command uORB 토픽)이 수신되면 커맨더 모듈 내부의 Commander::execute_command() 함수가 이를 가로채어 유효성 검사를 수행한다. 기체가 곡예 비행을 수행할 수 있는 상태인지(예: 센서 캘리브레이션 완료, 시동 상태 등)를 확인한 후, 내부 상태 변수인 nav_state를 NAVIGATION_STATE_ACRO로 전환한다.
2. 논리적 상태 전이 추적: update_control_mode() 함수
모드 전환이 승인되어 nav_state가 변경되면, 매 주기마다 호출되는 Commander::update_control_mode() 함수가 현재의 내비게이션 상태에 맞춰 시스템 전체에 전파될 제어 플래그들을 재설정한다.
다음은 src/modules/commander/Commander.cpp 내부에서 아크로 모드와 관련된 플래그 설정 로직을 핵심만 추려낸 것이다.
// src/modules/commander/Commander.cpp 발췌
void Commander::update_control_mode()
{
// 1. 배포할 새로운 control_mode 구조체 초기화 (모든 플래그를 기본 0(false)으로 세팅)
vehicle_control_mode_s control_mode{};
// ... 시동(Armed) 및 기본 상태 체크 생략 ...
// 2. 현재 내비게이션 상태(비행 모드)에 따른 플래그 설정 로직 진입
switch (_internal_flight_mode) {
/* [비교 차원] 안정화(Stabilized) 모드:
* 수동 제어(RC) 활성화 + 자세(Attitude) 제어 활성화 + 각속도(Rate) 제어 활성화
*/
case vehicle_status_s::NAVIGATION_STATE_STAB:
control_mode.flag_control_manual_enabled = true;
control_mode.flag_control_attitude_enabled = true;
control_mode.flag_control_rates_enabled = true;
break;
/* [핵심] 아크로(Acro) 모드:
* 수동 제어(RC) 활성화 + 각속도(Rate) 제어만 활성화
*/
case vehicle_status_s::NAVIGATION_STATE_ACRO:
control_mode.flag_control_manual_enabled = true;
control_mode.flag_control_attitude_enabled = false; // 핵심 상태 전이: 자세 제어 Off
control_mode.flag_control_rates_enabled = true; // 핵심 상태 전이: 각속도 제어 On
break;
// ... 타 비행 모드 생략 ...
}
// 3. 내부 상태 전이가 끝난 구조체를 uORB 토픽으로 퍼블리싱 (시스템 전체 전파)
if (_vehicle_control_mode_pub.publish(control_mode)) {
// 퍼블리싱 성공
}
}
2.1 코드 분석 및 상태 전이의 결론
-
flag_control_attitude_enabled = false의 의미:
이 한 줄의 코드가 PX4 아크로 모드의 본질을 규정한다. 커맨더 모듈이 이 플래그를 비활성화함에 따라,mc_att_control(자세 제어기) 모듈은 현재 기체의 실제 롤, 피치 쿼터니언 각도가 어떻든 간에 자체적인 오차 계산 추적을 중지하고 유휴(Idle) 상태로 진입하게 된다. 이를 통해 조종사가 한 바퀴 완전히 회전(Flip)하는 기동을 수행할 때 기체가 스스로 수평을 맞추려는 반작용(Restoring Force)을 원천적으로 차단한다. -
flag_control_rates_enabled = true의 의미:
반면 각속도 제어 플래그는 여전히 활성화되어 있다. 이는 기체 제어의 최하위 루프인mc_rate_control모듈이 계속해서 살아서 동작함을 의미한다. 결과적으로 조종기의 스틱 입력 값은ManualControl모듈에 의해 목표 각속도(vehicle_rates_setpoint)로 치환된 직후, 중간 단계의 간섭 없이RateControl객체로 직접 인입된다.
3. Ardupilot과의 내부 상태 모델 비교
Ardupilot은 AP_Vehicle::Mode 기반의 C++ 다형성(Polymorphism)과 가상 함수(Virtual Function) 오버라이딩을 통해 모드별 제어 분기를 수행한다. (예: ModeAcro::run())
반면에 PX4는 위 코드처럼 중앙 집중화된 커맨더 모듈에서 비트맵 형태의 불리언(Boolean) 제어 플래그(vehicle_control_mode)를 생성하고, 이를 uORB 메시지로 전체 시스템에 브로드캐스트하는 구조를 띠고 있다.
이러한 PX4의 플래그 기반 아키텍처는 개별 제어기 모듈들이 비행 모드의 구체적인 이름이나 맥락을 알 필요 없이 오직 ‘자신에게 할당된 플래그가 켜졌느냐’ 만을 판단하게 만들어 모듈 간의 결합도를 극적으로 낮추고 소프트웨어 확장성을 제고한다.