28.5.1.4 `flag_control_attitude_enabled` 및 `flag_control_rates_enabled`: 하위 자세/각속도 루프 바이패스(Bypass) 제어

28.5.1.4 flag_control_attitude_enabledflag_control_rates_enabled: 하위 자세/각속도 루프 바이패스(Bypass) 제어

PX4의 모듈식 제어 아키텍처에서 최하단(Inner-most Loops)에 위치하여 기체의 실제 동역학적 움직임을 만들어내는 루프가 자세 제어(Attitude Control)와 각속도 제어(Rates Control)이다. 이들은 상위 계층(위치, 속도)의 요구사항을 받아 기체를 기울이거나 회전시키는 물리적 구동을 전담한다.

vehicle_control_mode.msg 토픽 안에 정의된 flag_control_attitude_enabled 플래그와 flag_control_rates_enabled 플래그는 이 두 계층을 각각 켜고 끄는 역할을 한다. 특히 개발자가 특정 제어 단계를 의도적으로 건너뛰는(Bypass) 극단적인 조작을 가능하게 한다는 점에서 기술적 중요성을 지닌다.


1. 개요 및 루프 분리 구조

전통적으로 “주먹구구식 쿼드콥터 안정화“를 말하면 두 루프가 단단하게 한 묶음으로 취급되곤 했으나, PX4는 이 둘을 명확한 수학적/소프트웨어적 계층으로 분리시켰다.

  1. 자세 제어 플래그 (flag_control_attitude_enabled)
  • 입력: 목표 자세각 (Roll, Pitch, Yaw 쿼터니언 또는 오일러 각)
  • 기능: 목표 각도와 현재 EKF 자세 추정치의 차이(각도 오차)를 구하는 P-Controller.
  • 출력: 목표 각속도(Target Angular Rates) \rightarrow \omega_{sp} = (\dot{\phi}_{sp}, \dot{\theta}_{sp}, \dot{\psi}_{sp})
  1. 각속도 제어 플래그 (flag_control_rates_enabled)
  • 입력: 목표 각속도 (위 계층에서 넘어오거나, 스틱에서 직접 전달)
  • 기능: 목표 회전 속도와 자이로스코프(Gyroscope) 원시 센서 데이터 간의 오차를 보정하는 고속 PID Controller.
  • 출력: 3축 모멘트 토크(Torque / Actuator Controls)

2. 모드에 따른 플래그의 활성/비활성 (Bypass 메커니즘)

비행 모드의 종류에 따라 이 두 스위프트 플래그가 조립되는 방식이 달라진다. 이것이 PX4가 유연한 멀티 제어 시스템을 구현하는 묘미이다.

2.1 상위 종속을 통한 연쇄적 활성화 (Stabilize / Position 등)

가장 보편적인 비행 환경이다. 위치(Position)나 고도(Altitude)를 잡으려면 기체의 기울기 각도를 제어해야 하고, 기울기 각도를 제어하려면 각속도 제어가 동반되어야 한다.
따라서 이 경우에는 시스템이 두 플래그를 모두 true 처리한다.

  • flag_control_attitude_enabled = true
  • flag_control_rates_enabled = true

2.2 하위 루프의 단독 실행 기능 (Acro 모드 바이패스)

곡예 비행(Acrobatic)에 사용되는 순수 Acro(매뉴얼) 모드에서는 조종사가 조종기 스틱을 움직일 때, “기체 각도를 45도로 고정하라“고 명령하는 것이 기체를 일정 속도로 돌리기 위한 “초당 몇 도 단위로 뱅글뱅글 회전해라(Roll Rate)” 라는 지령으로 해석된다.

  • 이러한 모드에서는 각도(Angle) 자체를 바로잡기 위한 P-Controller(mc_att_control의 앞부분)는 완전히 우회(Bypass/Skip)되어야 한다.
  • 이를 위해 커맨더는 flag_control_attitude_enabled 플래그를 명시적으로 false로 끄고, flag_control_rates_enabled 만을 단독으로 true로 설정한다.
  • 자세 제어 코드는 실행되지 않으며, 조종기 입력(manual_control_setpoint)이 즉시 내부 각속도 제어기 루프(mc_rate_control)의 목표 지령값으로 꽂힌다.

3. 오프보드 제어(ROS2 연동) 시의 활용 가치

이러한 바이패스 지향적 플래그 분할 로직은 외부 컴퓨터를 통해 딥러닝 인공지능이나 강화 학습(RL) 기반의 에이전트를 연동할 때 혁명적인 유연성을 제공한다.

전통적인 ROS 개발에서는 픽스호크에 “앞으로 고도 5m를 유지하라” 같은 상위 미션만 줄 수 있었지만, PX4의 플래그 체계를 활용하면 다음과 같은 다양한 깊이(Depth)의 개입이 허용된다.

  1. Direct Attitude 제어: attitude_enabled=true, rates_enabled=true
    ROS 노드가 /fmu/in/vehicle_attitude_setpoint 토픽으로 직접 쿼터니언 목표각을 퍼블리싱한다. EKF2와 비전 센서를 융합하여 호버링(Hovering)의 자세 안정성은 픽스호크에 맡기고, 조향 방향만 외부에서 결정하고 싶을 때 유용하다.
  2. Direct Rates 제어 (강화학습 응용): attitude_enabled=false, rates_enabled=true
    강화학습(RL)로 학습된 신경망 제어기가 직접 3축 회전 속도(vehicle_rates_setpoint)를 뿜어낸다. 픽스호크 내부의 P-Controller가 개입하여 신경망의 의도를 방해하는 것을 막기 위해 Attitude 제어를 완전히 끄는 것이다.
  3. Direct Actuator 제어 (극단적 우회):
    만약 비행 동역학 모델 펌웨어 전체를 뉴럴 네트워크 제어기로 대체하고자 한다면 두 플래그 모두 false로 꺼버리고, Allocation 제어 단락으로 직접 PWM 할당 신호(actuator_motors)를 밀어 넣는 연구도 가능하다.

4. ArduPilot (Acro/Stabilize) 아키텍처와의 비교

  • ArduPilot: mode_acro.cpp 등 개별 모드 클래스에서 조종사 입력을 파싱한 뒤, C++ 라이브러리인 최하위 AP_Motors나 AC_AttitudeControl의 각속도 타겟 함수(input_rate_bf_roll_pitch_yaw())를 콜백 호출한다. 객체 간의 바인딩을 통해 흐름을 이어간다.
  • PX4-Autopilot: 모든 제어 모듈이 평행하게(Parallel) 각자의 쓰레드/태스크로 무한 루프를 돌며 대기하다가, uORB 안락 메시지에 실린 해당 플래그 비트스위치에 불이 켜지는 순간 연산을 트리거하고 퍼블리싱한다. 이는 “제어기 클래스를 어떻게 호출할 것인가“의 문제를 “어느 기능 비트를 마스킹(Masking)할 것인가“의 관점으로 전환한 매우 세련된 분산(Decoupled) 메시징 패턴이다.