29.4.1.1. 조종 입력값을 목표 오일러 각(Euler Angle)으로 변환: 최대 기울기 파라미터 연동 비례 연산 및 한계 구속 함수(math::constrain) 적용
1. 조종 스틱 물리량의 정규화 및 비례 연산
매뉴얼 비행 모드(Stabilized, Acro 등)에서 조종자가 송신기(Transmitter)나 QGroundControl(이하 QGC)을 통해 인가하는 스틱의 움직임은 통상적으로 [-1.0, 1.0] 범위의 무차원(Dimensionless) 정규화 데이터로 시스템에 전달된다. PX4-Autopilot v1.14 펌웨어에서는 이 스틱 물리량을 기체가 실제 추종해야 할 3차원 공간상의 목표 자세각(Attitude Setpoint)으로 변환하는 과정을 거친다.
가장 직관적인 롤(Roll)과 피치(Pitch) 제어축의 경우, 정규화된 스틱 입력값은 시스템 파라미터로 지정된 ‘최대 허용 기울기(Maximum Tilt Angle)’ 수치와 비례 연산(Proportional Scaling)된다. 이를 통해 조종자는 스틱을 완전히 밀었을 때 기체가 얼마나 기울어질지를 지상 관제 시스템(GGC)에서 커스터마이징할 수 있다.
1.1 최대 기울기 파라미터 연동 모델
멀티로터의 롤과 피치 축 자세 목표(\theta_{target}, \phi_{target})를 산출하는 기본 수학 모델은 다음과 같다:
\theta_{target} = Input_{pitch} \cdot \theta_{max}
\phi_{target} = Input_{roll} \cdot \phi_{max}
여기서 \theta_{max}와 \phi_{max}는 각각 QGC의 파라미터 설정 창에서 MPC_MAN_TILT_MAX와 같은 변수에 라디안(Radian) 단위로 매핑된 값이다. QGC v4.3 기준으로 해당 파라미터는 기본적으로 35도(약 0.61 라디안) 전후로 세팅되어 있으며, 영상 촬영(Cinematography) 목적일 경우 이 한계치를 낮추어 더 부드럽고 제한된 거동을 유도한다.
2. 한계 구속 함수(math::constrain)의 역할 및 구현 메커니즘
비례 연산만을 거친 결과값은 이론적으로는 완벽하지만, 외부 노이즈, 통신 페이로드의 이상치(Outlier), 혹은 커스텀 소프트웨어 모듈의 논리적 오류로 인해 잘못된 입력값이 인가될 위험이 항상 존재한다. 만약 기체의 공기역학적 한계를 초과하는 90도 이상의 타겟 수치가 전달된다면, 기체는 즉각적인 실속(Stall) 및 양력 상실을 겪게 될 것이다.
이를 원천적으로 방지하기 위해 PX4의 코어 클래스(예: FlightTaskManualPosition) 내부에서는 산출된 목표 각도에 대해 엄격한 하드 클램핑(Hard Clamping) 기법을 강제한다. 이때 핵심적으로 사용되는 C++ 수학 유틸리티가 바로 math::constrain 함수이다.
#include <mathlib/mathlib.h>
// 스틱 입력에 비례한 원시(Raw) 목표 피치 각도 계산
float raw_pitch_sp = _manual_control_setpoint.pitch * math::radians(_param_mpc_man_tilt_max.get());
// 공기역학적 안정성 및 파라미터 한계를 보장하기 위한 Constrain 연산 적용
float constrained_pitch_sp = math::constrain(raw_pitch_sp,
-math::radians(_param_mpc_man_tilt_max.get()),
math::radians(_param_mpc_man_tilt_max.get()));
위 코드에서 math::constrain 인터페이스는 math::constrain(value, min, max) 형태로 정의되며, 전달된 value가 min과 max 범위를 이탈할 경우 해당 경계값으로 강제 포화(Saturation) 시킨다. 이 때, 상하한선 수치 내부 로직 등에서 절대값은 \vert x \vert 기호로 평가되어 양의 대칭성을 보장하기도 한다.
2.1 데이터 파이프라인 아키텍처 다이어그램
입력된 조종 스틱의 신호가 오일러 각(Euler Angle) 데이터 구조로 안전하게 변환되기까지의 전체 흐름은 다음 다이어그램(Data Pipeline)으로 설계되어 있다.
graph LR
A[RC Stick Input <br> Range: -1.0 to 1.0] --> B{Scaling Multiplier}
B -->|Multiply by <br> MPC_MAN_TILT_MAX| C[Raw Euler Angle <br> Radian]
C --> D{"math::constrain()"}
D -->|Saturation Check| E[Constrained Euler Angle <br> Roll / Pitch]
P[(PX4 Parameter Server)] -.->|Provide Limits| B
P -.->|Provide Limits| D
style D fill:#f9f,stroke:#333,stroke-width:2px
이와 같은 이중화된 제한 검증(비례 계수 매핑 + 하단 및 상단 구속) 체계는 ArduPilot 라이브러리의 Math.constrain과 유사하게 소프트웨어의 예외 저항성(Robustness)을 극대화하는 표준 항공 제어 공학의 모범 사례(Best Practice)이다. 이를 통해 ROS2 기반의 오프보드(Offboard) 노드나 MAVSDK를 통해 비정상적인 타겟치가 스트리밍되더라도 하위 로우레벨 제어 단에서 물리적 기체 안전성을 완벽히 담보할 수 있게 된다.