29.4.2. 추력(Thrust) 및 고도 보상 매핑 알고리즘
1. 안정화(Stabilized) 모드에서의 추력 제어 아키텍처
PX4-Autopilot의 수동 비행 체계에서, 안정화(Stabilized) 모드는 기체의 자세(Attitude)를 전자적으로 제어하면서도 고도(Altitude) 기동에 대해서는 조종자의 수동 스로틀(Throttle) 입력에 전적으로 의존한다. 따라서 조종기의 스로틀 스틱의 물리적 변위가 기체의 메인 모터 변속기(ESC) 출력(Main Motor Output)으로 직결되는 경로를 구성한다.
그러나 직관적인 1:1 선형 매핑(Linear Mapping) 구조를 단순히 사용할 경우, 멀티로터 기체의 비행 역학적 특성상 심각한 고도 상실 현상이 발생할 수 있다. 기체가 전진 비행을 위해 피치(Pitch) 방향으로 기울어지면(Tilt), 기체의 로터 평면이 눕혀지면서 발생되는 전체 추력 벡터 중 수직(Z축 - 지구 중력 반대 방향)으로 향하는 양력 성분이 \cos(\theta) 배율만큼 급감하기 때문이다.
이러한 물리적 강하 현상을 선제적으로 극복하기 위해 PX4-Autopilot v1.14 펌웨어(src/lib/FlightTasks/tasks/ManualPosition)는 단순한 스로틀 값 전달 로직을 넘어서, 스틱 입력값에 대한 무차원 변환(Non-dimensionalization) 및 뱅크각(Bank Angle) 보상을 포괄하는 추력 및 고도 보상 매핑(Thrust and Altitude Compensation Mapping) 알고리즘을 심층적으로 내장하고 있다.
2. 조종기 스로틀 입력의 튜닝 스케일링(Dimensionless Scaling)
조종기로부터 수신된 manual_control_setpoint uORB 트랜잭션의 z축 데이터(스로틀)는 통상 [-1.0, 1.0] 범위로 철저히 정규화(Normalized)되어 시스템 코어에 전달된다.
PX4의 지상 관제 시스템인 QGroundControl v4.3(이하 QGC)을 통해 설정할 수 있는 주요 튜닝 파라미터 MPC_THR_HOVER는 이 매핑 과정의 절대적인 제어 기준점 역할을 한다. 이 파라미터는 기체가 현재의 이륙 중량(Takeoff Weight)을 극복하고 특정 고도를 안정적으로 유지하기 위해 기계적으로 요구되는 기본 호버링 추력(Hover Thrust) 비율(%)을 명세한다.
만약 무거운 페이로드(Payload)를 장착하여 중량이 증가했다면, 이 파라미터를 높여 튜닝해야만 조종기가 중앙(스프링 복원점)에 위치할 때 기체가 고도를 이탈하지 않고 완벽히 유지할 수 있다.
- 비선형 조각 함수 매핑(Non-linear Piecewise Mapping):
스틱이 중앙부 데드존(Deadzone) 부근에 위치할 때 일관되고 단단한 호버링 추력을 내어주기 위해 조종기 스틱 값은 선형 보간 비례식 대신 조각 함수(Piecewise Function) 기반의 비선형 곡선 스케일링을 거치게 되며, 이를 통해 조종자는 호버링 스위트 스팟(Sweet Spot)을 쉽게 인지하고 기체의 수직 역학을 안정화시킬 수 있다.
3. 뱅크각 고도 보상(Bank Angle Compensation) 알고리즘 내장
기체가 롤(Roll) 방향으로 \phi 만큼, 피치(Pitch) 방향으로 \theta 만큼 기울어졌을 때, 지구 중력과 싸우는 수직 양력이 손실되는 것을 보상하는 시스템은 수동 비행 시 조종자의 인지적 편의성을 극적으로 향상시킨다.
과거 ArduPilot 펌웨어의 Stabilize 모드에서 사용되는 보상기(Compensator) 메커니즘과 유사하게, PX4 역시 공기역학적 입체 추력 손실분을 자동 연산해 채워넣는 공식을 C++ 제어 컨트롤러 루틴에 적용시켜 두었다.
T_{compensated} = \frac{T_{manual}}{\cos(\phi)\cos(\theta)}
이 때 수식 내의 삼각함수 누적 연산 역수 치환 시, 계산 변수의 절댓값 \vert x \vert 평가 등을 통과시켜 과도한 배율(Reciprocal) 확장이 일어나지 않도록 추력 상한선(Maximum Thrust Upper Bound)이 수학적으로 강제 구속(math::constrain)된다.
#include <mathlib/mathlib.h>
// 1. 조종기 스틱 기반의 비선형 곡선 기반 수동 추력 산출
float thrust_z_manual = calculate_manual_thrust(_manual_control_setpoint.z, _param_mpc_thr_hover.get());
// 2. 현재 기체의 기울기를 나타내는 롤과 피치각에 의한 삼각 투영 보상 계수 산출
float tilt_cos = cosf(current_roll) * cosf(current_pitch);
// 3. 뱅크각 보상 연산 수행 및 제로 나누기(Divide-by-zero) 붕괴 오류 방지
if (tilt_cos > 0.01f) {
float thrust_z_compensated = thrust_z_manual / tilt_cos;
// 4. 모터 기계적 한계 상한치(1.0) 포화(Saturation) 방지를 위한 강력한 클램핑
_thrust_setpoint = math::constrain(thrust_z_compensated, 0.0f, 1.0f);
} else {
// 기체가 물리적으로 뒤집히거나 극한 롤링 루프 기동 상황일 경우 보상 제외 (원시 추력 인가)
_thrust_setpoint = thrust_z_manual;
}
이 지능적인 고도 보상 로직은 조종자가 맹렬한 전진 비행을 추동하기 위해 우측 피치 스틱을 급격하게 칠 때, 기체가 밑으로 추락(Altitude Drop)하는 것을 막기 위해 동시간에 좌측 스로틀 스틱을 예민하게 밀어 올려야만 하는 복합 신경 조작의 인지적 부하(Cognitive Load)를 완벽히 소거해 준다.
3. 추력 매핑 시스템 프레임워크 아키텍처 다이어그램
입력된 Z축 조종 스틱 데이터가 호버링 파라미터 매핑과 기울기 보상기를 거쳐 액추에이터 믹서 전달 전 단계인 최종 uORB 제어 버스로 퍼블리싱 되기까지의 전체 아키텍처 도식은 다음 프레임워크와 같다.
graph TD
A[RC Throttle Input <br> Range: -1.0 to +1.0] -->|Lookup Parameter| B[Non-linear Piecewise Mapping]
P1[(QGC Parameter <br> MPC_THR_HOVER)] -.->|Target Hover Reference| B
B --> C[Manual Base Throttle Thrust]
C --> D{Bank Angle Tilt Compensator}
E[Estimator Node <br> EKF2 Current Attitude] -->|Extract Roll & Pitch Variables| D
D -->|Divide Thrust by cos(tilt)| F[Tilt-Compensated Thrust Output]
F --> G["math::constrain(0.0, 1.0) Clamping"]
G --> H[Publish vehicle_local_position_setpoint msg]
style D fill:#e6f3ff,stroke:#0066cc,stroke-width:2px
이와 같은 추력 제어 보완 루틴은 향후 확장 개발 시 MAVSDK 라이브러리를 통한 원격 제어나 ROS2 미들웨어 노드가 Offboard 자율 궤적 제어를 수행할 때에도, 저수준 제어기(Low-level Controller) 단에서 기체의 추락을 물리적으로 방지해주는 중추적인 안전 장벽(Safety Barrier) 역할을 기능적으로 수행한다. 이는 복합 제어 시스템(Complex Control Systems)을 표방하는 무인항공기 아키텍처 설계 내에서 예외가 절대로 허용되지 않는 핵심 안전 컴포넌트 편대 중 하나이다.