29.5.2.2. 슈퍼 엑스포(Super Expo) 비선형 함수: 극한의 기동성을 위한 지수 함수 기반 제어량 증폭 모델의 C++ 구현 소스
현대의 FPV 레이싱 드론이나 3D 곡예 비행용 멀티로터는 초당 1,000도(deg/s)가 넘는 극한의 롤(Roll)/피치(Pitch) 회전 속도를 요구한다. 일반적인 선형 비례 제어나 단순 다항식 기반의 엑스포(Expo) 곡선만으로는 한계가 명확한 스틱 물리 범위(가령 조종기 짐벌의 최대 각도 ±30도) 내에서 이러한 초고속 각속도를 안정적으로 매핑하기 어렵다.
이를 해결하기 위해 PX4-Autopilot은 분수형 지수 함수를 기반으로 스틱 물리량의 끝부분(Edge) 궤적을 기하급수적(Exponential)으로 증폭시키는 ‘슈퍼 엑스포(Super Expo)’ 동역학 모델을 도입했다. 본 절에서는 이 모델이 C++ 소스 코드 레벨에서 어떻게 구현되어 있는지 깊이 분석한다.
1. 슈퍼 엑스포(Super Expo)의 수학적 원리
슈퍼 엑스포 로직의 핵심은 기존의 스틱 입력 궤적(x)을 선형적으로 증가시키는 것이 아니라, 특정 분모(Denominator) 값으로 나누어 스틱이 최대치(1.0 또는 -1.0)에 접근할수록 전체 결과값이 점근선(Asymptote)을 향해 치솟도록 만드는 데 있다.
PX4에서 적용하고 있는 슈퍼 엑스포 수식은 다음과 같이 정의된다.
y = \frac{f_{\text{expo}}(x)}{1 - |x| \cdot S_{\text{expo}}}
- x: 조종기 스틱 입력값 (정규화된 범위: -1.0 \le x \le 1.0)
- f_{\text{expo}}(x): 일반 Expo 곡선이 적용된 중간 출력값
- S_{\text{expo}}: 슈퍼 엑스포 팩터(PX4 파라미터
MC_ACRO_SUPEXPO, 0.0 \sim 0.99 사이의 값)
위 식에서 조종사가 스틱을 끝까지 쳐서 |x| \to 1.0 이 되고, 파라미터 S_{\text{expo}} \to 1.0 에 가까울수록, 분모는 0 에 수렴하게 되어 결과값 y 가 폭발적으로 발산(결과적으로 설정된 최대 각속도를 훨씬 상회하거나 도달하는 속도를 가속)하는 형태를 띠게 된다.
C++ 소스 코드 분석 (ManualControl::apply_acro_expo)
기체의 수동 제어 입력을 전처리하는 커널 모듈인 src/modules/manual_control/ManualControl.cpp에는 위의 수식이 단 몇 줄의 방어적 프로그래밍 기법과 함께 C++로 결합되어 있다.
// src/modules/manual_control/ManualControl.cpp 핵심 발췌
float ManualControl::apply_acro_expo(float stick_in, float expo, float super_expo, float max_rate)
{
float stick_in_abs = fabsf(stick_in);
float sign = matrix::sign(stick_in);
// 1단계: 3차 다항식을 이용한 중앙 엑스포 연산 결과 도출 (f_expo(x))
float expo_applied = stick_in_abs * (1.0f - expo) + powf(stick_in_abs, 3.0f) * expo;
// 2단계: 슈퍼 엑스포를 위한 분모(Denominator) 연산 로직
// 스틱이 양극단(1.0)으로 갈수록, 그리고 super_expo 파라미터가 클수록 분모가 작아짐
float denominator = 1.0f - stick_in_abs * super_expo;
// [보안 및 예외 처리] 0으로 나누기(DBZ, Division by Zero) 현상 방지를 위한 가드 클로즈
// 만약 파라미터 세팅 오류로 분모가 0.0이 되면 CPU 하드웨어 예외를 발생시키므로 제한(Clamp)
if (denominator < 0.0001f) {
denominator = 0.0001f;
}
// 3단계: 비율 산출 및 최종 목표 각속도 변환
// 분수로 구성된 곡선에 max_rate 팩터를 곱하여 최종 물리적 단위(rad/s) 완성
float rate_setpoint = sign * (expo_applied / denominator) * max_rate;
return rate_setpoint;
}
소스 코드 설계의 주안점
fabsf()와matrix::sign()의 활용:
수식에서 분모 부분의 연속성을 보장하기 위해 스틱의 부호(음/양)를 분리하여 절대값 타겟팅만으로 커브를 디자인했다. 최종 산출 직전에 부호를 복원함으로써 C1(1차 미분 가능) 및 연속적인 로직 처리가 완성되었다.Division by Zero하드웨어 예외 억제:
denominator < 0.0001f조건은 시스템 동작에 매우 치명적인 런타임 오류(소프트웨어 크래시 또는 비행 중 프로세서 재부팅)를 원천 차단하는 핵심 펌웨어 엔지니어링 패턴이다.
Ardupilot의 대응 시스템 스케일 차별성
Ardupilot 환경에서는 곡예 비행의 조종성을 확보하기 위해 ACRO_EXPO 파라미터 단일 값으로 커브 최적화를 도모하거나, 보다 하드웨어 의존적인 조종기 자체의 VTX/RC 엑스포 곡선에 의존하는 경향이 강했다.
반면에 PX4는 Betaflight나 Kiss와 같은 전문 FPV 레이싱 펌웨어에 존재하던 정통 슈퍼 엑스포 모델(분수형 증폭 함수)을 ManualControl 모듈 안에 완벽히 기본 탑재하였다. 이를 통해 PX4는 조종기 하드웨어 스펙에 구애받지 않고, 소프트웨어 파라미터(MC_ACRO_EXPO, MC_ACRO_SUPEXPO)의 조정만으로 상업용 촬영 드론부터 200km/h 이상의 고기동 자작 레이서까지 커버할 수 있는 범용적이고 이식성 높은 제어 파이프라인 우위를 확보했다.