28.5.1.3 `flag_control_altitude_enabled`: Z축 독립 제어 및 기압계/레이저 고도계 융합 제어 플래그

28.5.1.3 flag_control_altitude_enabled: Z축 독립 제어 및 기압계/레이저 고도계 융합 제어 플래그

비행 로봇의 제어에 있어서 3차원 공간 중 중력 방향인 Z축(고도)의 제어는 수평 수직(XY) 이동과는 물리적으로 완전히 다른 양상을 띤다. 기체는 중력을 이겨내기 위해 항상 기저 추력(Hover Thrust)을 소모해야 하며, 센서 역시 수평적인 위치 추정(GPS, Vision)과는 분리된 수직 도메인 센서(기압계, 거리 측정기)에 의존한다.

PX4-Autopilot 아키텍처는 이러한 수학적/물리적 독립성을 반영하여 고도 제어를 수평 위치 제어와 분리하였으며, 그 제어 여부를 결정하는 스위치가 바로 vehicle_control_mode.msg 토픽 내의 flag_control_altitude_enabled 플래그이다.


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

고도 제어 플래그는 시스템 구성 상 매우 잦은 빈도로 true 상태를 유지한다. 조종사가 추락의 공포 없이 비행하기 위한 최소한의 보조 장치가 바로 고도 유지이기 때문이다.

  1. 독립 활성화 (Altitude Mode): 조종사가 스로틀 스틱을 놓았을 때(중립), 기체가 현재 고도를 스스로 유지하는 모드이다. XY 수평 방향으로는 조종사의 스틱 입력이 그대로 자세 제어 루프에 직결(flag_control_manual_enabled = true)되지만, Z축에 대해서만큼은 자동 제어가 개입하므로 이 플래그가 단독으로 켜진다. Position 플래그는 false이다.
  2. 종속 활성화 (Position / Mission 모드): 기체가 지정된 3D 좌표에 도달하기 위해서는 필연적으로 Z축 고도 역시 제어되어야 하므로, 상위 플래그인 위치 제어(Position)가 켜질 때 고도 제어(Altitude) 플래그 역기 논리적으로 동반 활성화(Cascade)된다.

2. Z축 센서 데이터 융합과 EKF2 의존성

고도 제어 루프가 켜졌다는 것은, 제어기가 지속해서 “현재 기체의 고도”, 즉 vehicle_local_position.z 토픽 데이터를 피드백으로 받아와야 함을 뜻한다. 커맨더(Commander) 모듈은 이 플래그를 허락하기 전에 EKF2의 altitude_valid 플래그가 참인지 검사한다.

2.1 다중 센서 융합 메커니즘

현재 고도(Z)를 추정하기 위해 EKF2 내부에서는 다음과 같은 센서들이 융합(Sensor Fusion)된다.

  • 기압계 (Barometer): 측정 주파수가 빠르고 절대적인 고도 변화를 잡아내는 1차 센서. 하지만 온도 변화와 기상 현상에 의해 드리프트(Drift)가 발생한다.
  • 거리 측정기 (Rangefinder / LiDAR / Radar): 지면과 기체 사이의 정확한 이격 거리를 측정한다(distance_sensor 토픽). EKF2는 파라미터(EKF2_HGT_REF)에 따라 기압계의 드리프트를 범위 센서로 보정하는 터레인 팔로잉(Terrain Following)을 수행하거나, 지표면 고도(AGL; Above Ground Level) 추정에 활용한다.
  • GPS (GNSS 고도): 수평 위치뿐 아니라 고도도 제공하지만 수직 오차(VDOP)가 수평보다 크기 때문에 기압계 정보의 장기적인 보정용으로 주로 쓰인다.

3. Z축 제어 파이프라인과 Hover 추력(Hover Thrust) 보상

플래그가 true가 되면 멀티로터의 mc_pos_control 내부에서는 수평 루프와 분리된 Z축 전담 P-Controller가 가동된다.

  1. 상승률 지령(Climb Rate Setpoint) 생성: 조종기 스로틀 스틱의 위치가 고도 에러(\mathbf{e}_z)로 변환되고, 비례 제어기(MPC_Z_P)를 통과하여 “몇 m/s로 상승/하강할 것인가“를 지시하는 목표 수직 속도(v_{z, sp})를 도출한다.

  2. 가속도 및 목표 추력 산출: 목표 수직 속도와 현재 수직 속도의 차이를 다시 PID 연산하여 목표 수직 가속도를 생성한다.

  3. Hover Thrust 합산 (중요): 기체가 고도를 ’유지’하려면 가속도가 0이어야 하지만 제어기가 산출하는 추력 한계는 0이어서는 안 된다. 위치를 유지하기 위한 베이스라인 추력을 Hover Thrust라고 부른다.
    제어기는 최종 목표 추력 토픽(vehicle_thrust_setpoint)의 Z축 방향 값에 이 기저 추력을 더한다.

    Thrust_Z = PID(v_{z, sp} - v_z) + Thrust_{hover}

    최근의 PX4는 이 Hover Thrust 값을 고정 파라미터(MPC_THR_HOVER)에만 의존하지 않고, EKF2를 통해 비행 중 실시간으로 기반 무게 변화(예: 페이로드 낙하)를 추정하는 동적 튜닝(Hover Thrust Estimator) 알고리즘을 사용한다.


4. ArduPilot (AltHold 모드)과의 구조체계 비교

  • PX4-Autopilot (Altitude 플래그 맵핑): XY 제어 로직과 Z 제어 로직이 소스 코드 수준에서 매트릭스 형태로 분리되어 연산된다. mc_pos_controlflag_control_altitude_enabled 값에 따라 Z축 추력 할당 코드를 분기 처리한다. 이는 개발자가 수평축은 외부 비전(ROS2)으로, 수직축은 내부 기압계로 제어하는 등의 복합적인 믹싱을 매우 직관적으로 구현할 수 있게 해준다.
  • ArduPilot (AltHold 모드): mode_althold.cpp 클래스에서 조종사의 스로틀 입력을 상승률(Climb Rate)로 맵핑한 뒤 C++ 컨트롤러 계층인 pos_control->set_desired_velocity_z()를 호출하여 위임한다. PX4의 플래그 맵핑 방식만큼 비동기적인 토픽 바이패스를 네이티브하게 지원하기보다는 객체 지향적인 강제 호출 트리를 따르는 편이다.