29.5.2. 목표 각속도 변환(Rate Setpoint Generation) 동역학 모델 (src/modules/manual_control/ManualControl.cpp)
조종기의 짐벌 스틱(RC Stick) 물리적 변위는 수동 비행의 가장 원초적인 입력 데이터다. 안정화(Stabilized) 모드에서는 이 스틱 입력이 ’목표 각도(Angle Setpoint)’로 해석되지만, 아크로(Acro) 모드에서는 기체의 ’목표 각속도(Rate Setpoint)’로 변환되어야 한다. 본 절에서는 src/modules/manual_control/ManualControl.cpp 내부에서 수행되는, 물리적 조작량을 3차원 회전 운동학의 목표값인 각속도(deg/s 또는 rad/s)로 사상(Mapping)하는 동역학적 변환 모델을 심층 분석한다.
1. ManualControl 모듈의 역할과 uORB 인터페이스
ManualControl 모듈은 인간 파일럿의 조종 의도를 기체의 동역학적 요구 파라미터로 번역하는 전각 커널(Translator Kernel) 역할을 수행한다. 이 모듈은 하드웨어 드라이버로부터 manual_control_setpoint 토픽(정규화된 -1.0 ~ 1.0 범위의 스틱 입력)을 구독하고, 내부의 커브 변환 함수들을 거쳐 최종적으로 vehicle_rates_setpoint 토픽을 발행한다.
1.1 데이터 파이프라인 개요
sequenceDiagram
participant RC as RC Input (RC_CHANNELS)
participant MC as ManualControl Module
participant RATE as Rate Controller (mc_rate_control)
RC->>MC: manual_control_setpoint (Roll, Pitch, Yaw: -1.0 ~ 1.0)
Note over MC: 1. Deadband 처리
Note over MC: 2. Expo 곡선 (비선형 스케일링) 적용
Note over MC: 3. 최대 각속도(Max Rate) 곱셈 연산
MC->>RATE: vehicle_rates_setpoint (목표 각속도 rad/s)
RATE->>RATE: 실제 각속도와 오차 연산 및 PID 제어
2. 동역학 기반 제어량 변환 로직 (Rate Setpoint Generation)
단순히 스틱 입력을 선형적으로 각속도에 비례시키는 방법(직선 보간)은 초보자나 일반적인 촬영용 드론에서는 무리가 없지만, FPV 레이싱이나 고기동 곡예 비행(Acrobatic Flight)을 수행하는 아크로 모드 환경 조종사에게는 치명적인 약점을 안겨준다. 즉, 중앙 부근의 미세한 스틱 변위에 기체가 너무 민감하게 반응하여 정밀 제어가 불가능해진다.
따라서 PX4 설계자들은 항공 동역학적 관점에서 조종성을 확보하기 위해 다음과 같은 비선형 변환 수학 모델을 도입하였다.
2.1 각속도 연산 커널 분석 (ManualControl::apply_acro_expo)
다음 소스 코드는 아크로 모드 진입 시 스틱 입력값을 각속도로 변환하는 핵심 C++ 로직이다.
// src/modules/manual_control/ManualControl.cpp 의 각속도 변환 함수
float ManualControl::apply_acro_expo(float stick_in, float expo, float super_expo, float max_rate)
{
// 스틱 입력값(stick_in)은 -1.0 ~ 1.0 범위로 정규화되어 들어온다.
float stick_in_abs = fabsf(stick_in);
float sign = matrix::sign(stick_in);
// 1단계: 기본 Expo 적용 구간
// expo(파라미터: MC_ACRO_EXPO) 값에 따라 선형 곡선과 3차 곡선을 보간한다.
float expo_applied = stick_in_abs * (1.0f - expo) + powf(stick_in_abs, 3.0f) * expo;
// 2단계: Super Expo 스케일 분모 연산
// super_expo(파라미터: MC_ACRO_SUPEXPO)는 스틱 끝(Edge)에서의 각속도를 증폭시킨다.
float denominator = 1.0f - stick_in_abs * super_expo;
// 분모가 0 이하로 떨어져 무한대 발산(Division by Zero)하는 예외 방지 가드
if (denominator < 0.0001f) {
denominator = 0.0001f;
}
// 3단계: 최종 목표 각속도 산출
// 부호 복원 * (1, 2단계 결과 합성) * (파라미터: 최대 각속도 MC_ACRO_R_MAX 등)
float rate_setpoint = sign * (expo_applied / denominator) * max_rate;
return rate_setpoint;
}
2.2 수학적 변환 아키텍처 해석
-
Expo(지수) 함수 블록:
expo_applied변수에 사용된 다항식은 스틱이 중앙(0.0) 부근에 있을 때 출력 증가폭을 납작하게(둔감하게) 만들어 미세 조정을 가능하게 한다. Ardupilot의AC_AttitudeControl커브와 비교했을 때 PX4는 수학적으로 완전한 부동소수점 3차 곡선(Cubic Curve) 보간법을 채택하여 수학적 연속성(C1 Continuity)을 보장한다. -
Super Expo 증폭 블록:
분모denominator에 할당된 선형 감소식은 스틱이 최대치(1.0)에 가까워질수록 전체 결과값을 폭발적으로 증가시키는 역할을 한다. 이는 일반적인 다항식 곡선의 한계를 넘어, 조종사가 한정된 스틱 가동 범위 내에서 극한의 롤(Roll Rate)과 피치 회전율을 달성할 수 있도록 해주는 FPV 전용 기동성 증폭 팩터이다. -
Max Rate (최대 각속도 제약):
물리적 동기화의 최종 단계로, 무차원수(Dimensionless Number)로 산출된 커브 결과값에 시스템 개발자가 파라미터로 지정한 최대 각속도(MC_ACRO_R_MAX, 단위: rad/s)를 곱하여 물리적 단위를 부여한다.
3. Ardupilot과 비교를 통한 아키텍처적 우위
Ardupilot은 전통적으로 회전익(Copter) 계열에서 RC 인풋 데드밴드와 엑스포를 조종기 교정(Radio Calibration) 단계의 파라미터(RCx_EXPO)로 처리해왔다. 즉, 하드웨어 입력 레벨에서 변형된 채널 신호가 제어기로 인입된다.
반면 PX4-Autopilot의 아키텍처는 RC 입력은 완전히 선형적인 Raw 형태로 보존하고, 비행 모드의 맥락을 이해하고 있는 ManualControl 모듈 내부에서 역동학적 제어 목적에 맞게 독립적인 변환 커널(apply_acro_expo)을 통과시킨다. 이는 센서/입력 데이터의 원본을 오염시키지 않는(Pure Data Pipeline) 최신 소프트웨어 공학 설계 철학의 결정체이다.