28.5.1 `vehicle_control_mode.msg` 플래그 심층 해부

28.5.1 vehicle_control_mode.msg 플래그 심층 해부

PX4-Autopilot의 아키텍처 내에서 컴포넌트 간의 책임과 구동 권한을 정확히 통제하는 핵심 열쇠는 vehicle_control_mode.msg uORB 메시지이다. 커맨더(Commander) 모듈의 상태 머신 평가 결과에 따라 비행 모드 관리자(Flight Mode Manager)가 이 메시지를 구성하고 발행(Publishing)하면, 각 하위 제어기들은 자신에게 할당된 플래그가 true인지 확인하여 실행 여부를 결정한다.

본 절에서는 vehicle_control_mode.msg에 정의된 개별 불리언(Boolean) 플래그들의 의미와 제어기 간의 계층적 연관성을 소스 코드 수준에서 상세히 해부한다.


1. 개요: 메시지 구조체(Message Structure)

PX4의 소스 트리에서 msg/VehicleControlMode.msg 파일은 제어 플래그들의 청사진을 제공한다. 소프트웨어가 빌드될 때, 이 .msg 파일은 C++ 구조체인 vehicle_control_mode_s (보통 uORB/topics/vehicle_control_mode.h 헤더)로 자동 컴파일 변환된다.

이 메시지 구조체 내의 변수들은 대부분 bool 타입이며 크게 세 가지 범주로 분류할 수 있다.

  1. 제어 주체(Source) 플래그: 누가 기체를 조종하고 있는가? (조종사, 자동 임무, 오프보드)
  2. 공간적/물리적 제어(Spatial Control) 플래그: 어떤 차수학(위치, 고도, 속도)이 통제되고 있는가?
  3. 최하위 동역학(Dynamics) 제어 플래그: 자세, 각속도, 액추에이터 할당 등.

2. 주요 제어 플래그 심층 분석

2.1 제어 주체(Source) 플래그

  • flag_control_manual_enabled: 조종기(Radio Control)의 스틱 입력이 기체 제어기 루프에 반영되어야 함을 의미한다. Manual, Stabilize, Acro, Altitude, Position 모드 등 조종사가 직접 개입하는 모든 모드에서 true가 된다. Mission이나 Hold 모드에서는 false가 된다.
  • flag_control_auto_enabled: 시스템 내부의 자율 비행 로직(Navigator 모듈)이 생성한 경로점(Setpoints)을 추종해야 함을 지시한다. Mission, Return, Takeoff, Land 모드에서 true로 설정된다.
  • flag_control_offboard_enabled: 제어 입력표준이 외부 에이전트(ROS2, MAVSDK 스크립트 등)로부터 오고 있음을 알린다. Offboard 모드에서만 단독으로 켜지며 제어권이 완전히 외부에 위임되었음을 입증하는 플래그이다.

2.2 공간 위치 및 속도(Spatial & Velocity) 플래그

  • flag_control_position_enabled: 수평(XY) 3차원 공간상의 절대 위치 제어 루프를 가동한다. Position 제어기 모듈(mc_pos_control, fw_pos_control_l1 등)이 위치 오차를 속도 지령으로 변환하는 연산을 수행하도록 트리거한다.
  • flag_control_altitude_enabled: 수직(Z) 축 공간상의 고도 제어 루프를 가동한다. (Barometer나 거리 측정기에 의존). XY 제어와 분리되어 있어, 기압계만 유효한 Altitude 모드에서는 position 플래그는 false이더라도 이 플래그는 true가 될 수 있다.
  • flag_control_velocity_enabled: 3D 공간상의 속도 제어 루프 진입 조건이다. 위치 제어 플래그가 참이면 통상적으로 속도 오차를 가속도로 산출하기 위해 이 플래그도 동반 활성화된다.

2.3 최하위 자세 및 동역학(Attitude & Dynamics) 플래그

  • flag_control_attitude_enabled: 기체의 Roll, Pitch, Yaw 3축 자세 각도 궤적을 쫓는 자세 제어 루프를 켠다. mc_att_control (멀티콥터 기준) 모듈이 이 플래그를 검사하여 자세 제어 PID 연산을 거쳐 목표 각속도(Target Rates)를 생성한다.
  • flag_control_rates_enabled: 자세의 각속도(Angular Rates; Roll rate, Pitch rate, Yaw rate)를 제어하는 루프가 가동된다. 대부분의 비행 모드에서 활성화되지만, 조종사가 직접 각속도만 제어하는 Acro 모드에서는 attitude 플래그가 false이고 rates 플래그만 단독으로 true가 되는 현상이 관찰된다.
  • flag_control_allocation_enabled: 최하위 계층으로, 제어기에서 산출된 가상의 힘과 토크(Torque)를 믹서(Mixer) 또는 Control Allocator를 통해 실제 각각의 모터 및 서보 PWM 신호로 분배(Allocation)할 권한을 부여한다.

3. 플래그 간의 캐스케이드(Cascade) 계층 구조

플래그들은 서로 고립되어 존재하지 않고 시스템의 직렬적인(Cascade) 다중 제어 루프 구조를 투영한다. 일반적으로 상위 제어 플래그가 true이면 하위 계층의 제어 플래그들도 강제 혹은 논리적으로 동반 활성화되어야 온전한 물리적 비행이 가능하다.

graph TD
    subgraph "상위 제어 (Outer Loops)"
        P[flag_control_position] --> V[flag_control_velocity]
        A[flag_control_altitude] --> V
    end
    subgraph "중간 제어 (Mid Loops)"
        V -.-> ATT[flag_control_attitude]
    end
    subgraph "하위 제어 (Inner Loops)"
        ATT -.-> RAT[flag_control_rates]
        RAT -.-> ALLOC[flag_control_allocation]
    end
  • 예시 (Position 모드): Position 플래그가 켜지면, 기체가 위치를 유지하기 위해 속도 제어가 필요하고, 속도를 내기 위해 자세를 기울여야 하므로 Attitude 플래그가 필요하며, 자세를 바꾸기 위해 Rates와 Allocation 플래그까지 도미노처럼 모두 true로 연쇄 활성화된다.

4. 비행 모드별 플래그 조합 일람 (멀티로터 기준)

Flight Mode Manager가 상황별로 이 플래그들을 어떻게 멀티플렉싱(조합)하는지 다음 표를 통해 명확히 이해할 수 있다.

비행 모드PositionAltitudeVelocityAttitudeRatesManual
Acrofalsefalsefalsefalsetruetrue
Stabilizefalsefalsefalsetruetruetrue
Altitudefalsetruefalsetruetruetrue
Positiontruetruetruetruetruetrue
Mission (Auto)truetruetruetruetruefalse (Auto 플래그 참)

이 표에서 관찰할 수 있듯, vehicle_control_mode.msg의 본질은 “현재의 비행 모드가 요구하는 센서의 민감도와 제어기의 깊이(Depth)를 가장 원초적인 Boolean 값으로 분해하여 표현함” 에 있다.

이러한 분해 덕분에, PX4 소스 코드를 해킹하여 새로운 실험적 비행 모드를 창조하는 로봇 공학자는 기존 모듈의 복잡한 C++ 함수 호출 구조를 분석할 필요 없이, 오직 이 플래그들의 조합(Bitmap)만을 FMM에 요구하는 것으로 기체의 모든 거동을 손쉽게 통제할 수 있다.