28.5.1.1 `flag_control_position_enabled`: 3D 공간 위치 제어기(Position Controller) 활성화 트리거

28.5.1.1 flag_control_position_enabled: 3D 공간 위치 제어기(Position Controller) 활성화 트리거

PX4-Autopilot의 다단(Cascade) 제어 아키텍처에서 무인항공기가 지구상의 특정 3차원 절대 좌표(또는 로컬 좌표계)에 머무르거나 목표 지점으로 이동하도록 지시하는 최상위 공간 제어 스위치가 바로 flag_control_position_enabled 플래그이다. 이 플래그는 vehicle_control_mode.msg 메시지 내에 존재하며, 기체가 ’단지 공중에 떠 있는 것(Altitude)’을 넘어 ’어느 위치에 있어야 하는가(Where to be)’를 결정하는 모든 자율/반자율 비행의 근간이 된다.

본 절에서는 해당 플래그가 어떻게 활성화되며, 하위 위치 제어 모듈(mc_pos_control 등)을 어떻게 구동하는지 내부 메커니즘을 상세히 해부한다.


1. 개요 및 발동 조건(Activation Conditions)

flag_control_position_enabled 플래그는 비행 모드 관리자(Flight Mode Manager)에 의해 다음과 같은 비행 모드(Nav State)에서 true로 세팅된다.

  • 포지션 모드 (Position Mode): 조종사가 롤(Roll) / 피치(Pitch) 스틱을 중앙에 놓았을 때, 바람 등 외란에 밀리지 않고 현재의 3D 공간 좌표에 정지(Hold)하도록 위치 제어기가 개입한다.
  • 미션 모드 (Mission / Auto) 및 리턴 모드(RTL): 자율 항법 모듈(Navigator)이 생성한 웨이포인트(Waypoint) 궤적을 따라가기 위해 절대적인 위치 추종이 필수 불가결하다.
  • 오프보드 모드 (Offboard): 외부 컴패니언 컴퓨터(예: ROS2 노드)에서 위치 셋포인트(trajectory_setpoint)를 퍼블리싱할 때, 이를 수용하기 위해 활성화된다.

역으로, 수동 자세 제어(Stabilize)나 고도 유지(Altitude), 직접 각속도 제어(Acro) 모드에서는 수평 위치(XY) 유지가 목적이 아니므로 이 플래그는 false로 비활성화된다.


2. 센서 전제 조건: EKF2의 유효성 검증

위치 제어 루프가 안전하게 가동되기 위해서는 반드시 현재 기체의 위치를 알 수 있는 신뢰할 만한 데이터가 뒷받침되어야 한다.

  • 커맨더(Commander) 모듈은 flag_control_position_enabled 플래그를 true로 허가하기 전에, 확장 칼만 필터(EKF2)로부터 발행되는 estimator_statuslocal_position_validglobal_position_valid 플래그를 엄격하게 검증한다.
  • GPS 수신 불량, 비전 타겟팅 상실 등으로 추정 오차(Innovation) 임계치를 초과하여 저 플래그들이 false로 떨어지면, 커맨더는 즉시 flag_control_position_enabled를 끄고 하위 모드(Altitude 등)로 강제 강하(Mode Fallback)시킨다.

3. 포지션 컨트롤러(mc_pos_control) 트리거 및 동작 원리

당 플래그가 true로 수신되면 멀티로터의 위치 제어 전담 모듈인 mc_pos_control (Multicopter Position Control) 내부의 P-Controller(비례 제어기) 루프가 본격적으로 가동된다.

3.1 3D 위치 오차(Position Error) 산출

  1. 목표 위치 수신: 시스템은 조종기 스틱 입력(매뉴얼 모드 시 가상 셋포인트 생성) 또는 Navigator 모듈로부터 목표 물리량인 위치 셋포인트(Position Setpoint, \mathbf{p}_{sp}) 를 수신한다.
  2. 현재 위치 보간: EKF2가 추정하는 현재 로컬 프레임(NED 좌표계) 상의 위치(\mathbf{p})를 읽어 들인다.
  3. 오차 연산: 오차 벡터를 구한다. \mathbf{e}_{pos} = \mathbf{p}_{sp} - \mathbf{p}

3.2 위치 제어에서 속도 지령으로의 맵핑 (Position to Velocity)

위치 오차(\mathbf{e}_{pos}) 자체는 모터에 직접인가할 수 있는 물리량이 아니다. 위치 제어기(P-Controller)는 이 공간상 떨어진 거리를 “얼마나 빨리 이동해서 좁힐 것인가“라는 속도 지령(Velocity Setpoint, \mathbf{v}_{sp}) 으로 변환한다.

\mathbf{v}_{sp} = K_{p, pos} \cdot \mathbf{e}_{pos}

여기서 K_{p, pos}는 파라미터 MPC_XY_PMPC_Z_P로 정의되는 위치 비례 게인 상수이다. 오차가 클수록 더 빠른 속도를 지시하지만, 시스템 한계치(MPC_XY_VEL_MAX 등)에 의해 임계 속도 이상으로 산출되지 않도록 상하한 제약(Saturation) 루틴을 거치게 된다.


4. 하위 속도 제어 루프와의 연쇄(Cascade) 인터페이스

위 3.2절에서 산출된 속도 지령(\mathbf{v}_{sp}) 이 실제로 물리적인 움직임이 되기 위해서는 하위 계층인 속도 제어기(Velocity Controller) 가 움직여 주어야 한다.

때문에 flag_control_position_enabled 플래그가 true가 되는 비행 모드 구조 상, 필연적으로 그 하위 단계인 flag_control_velocity_enabledflag_control_attitude_enabled 플래그들 역시 시스템 매니저에 의해 모두 동반 true 상태로 멀티플렉싱된다. (Cascade 구조)

  • P 로직 (Position): 위치 차이를 속도 목표로 바꾼다.
  • PID 로직 (Velocity): 전달받은 속도 목표와 현재 속도(EKF2 추정치)의 차이를 PID 연산하여 목표 가속도(가상 힘 벡터)를 계산하고, 이를 구현하기 위해 기체를 얼마의 각도로 기울여야 하는지(목표 자세 각도, Attitude Setpoint)를 뽑아낸다.

5. ArduPilot과의 아키텍처 비교 (Loiter / Auto 모드)

  • PX4 (제어 권한 플래그 분리): PX4는 “지금 Position Control 모듈이 개입해도 좋다“는 승인 스위치로서 이 플래그 구조체를 활용한다. 모듈 자체는 항상 백그라운드에 떠서 uORB 메시지를 구독 대기하며, 플래그가 참일 때만 연산을 수행한다.
  • ArduPilot: 전통적으로 Copter의 mode_loiter.cpp 또는 mode_auto.cpp 안에서 조종사 입력 또는 미션 데이터를 가공한 후, pos_control->update_xy_controller() 메서드(함수)를 직접 동기식으로 호출하는 객체 지향 상속 및 멤버 함수 호출 패턴에 기반한다.

PX4의 플래그 기반 비동기화 통제 기법은 자율 비행 알고리즘 개발자가 ROS2를 통해 외부에서 특정 차원의 제어만 부분적으로 절제/삽입(Override)하기 용이한 환경을 제공하는 결정적인 아키텍처 우위를 지닌다.