28.3.2.1. `FlightTaskManual` 상속 트리의 궤적 생성 알고리즘

28.3.2.1. FlightTaskManual 상속 트리의 궤적 생성 알고리즘

수동 비행 모드는 인간의 손가락 끝에서 시작된다. FlightTask 최상위 클래스가 센서 데이터와 OS 통신이라는 ’기계적 인프라’를 다룬다면, 그 바로 아래 2세대 자식 클래스인 FlightTaskManual은 오롯이 **인간-기계 인터페이스(HMI: Human-Machine Interface)**에 집중하여 설계된 중간 관리자 트리의 뿌리다.

이 클래스와 그 산하 자식 클래스(수동 위치 제어, 수동 고도 제어 등)들은 조종기의 아날로그 스틱 입력을 어떻게 부드럽고 직관적인 3차원 물리적 궤적(Trajectory)으로 다듬어 낼 것인가에 대한 제어공학적 고민이 집약되어 있다.

1. HMI 전처리: 원시(Raw) 스틱 입력의 추상화

드론 조종기의 원시 데이터(Raw Data)는 보통 1000us에서 2000us 사이를 오가는 PWM 신호이거나 MAVLink 조이스틱 패킷이다. 메인 궤적 알고리즘이 이런 하드웨어 종속적인 수치를 직접 다룰 수는 없다.

FlightTaskManualupdateInitialize() 단계에서 uORB의 manual_control_setpoint 토픽을 읽어들여, 모든 스틱 축(Roll, Pitch, Yaw, Throttle)의 값을 -1.0(최소) 에서 +1.0(최대) 사이의 무차원(Dimensionless) 정규화 실수(Normalized Float) 포맷으로 매핑(Mapping)한다.
이렇게 추상화된 변수(_sticks) 덕분에, 하위 수동 모드 클래스들은 조종기가 후타바(Futaba)인지 타라니스(Taranis)인지, 혹은 QGroundControl 화면의 가상 조이스틱인지 전혀 신경 쓰지 않고 오직 수학계산에만 몰두할 수 있다.

2. 인간 공학적 필터링: 데드존(Deadzone)과 엑스포(Expo) 곡선

인간의 엄지손가락은 결코 기계처럼 정밀하지 않다. 스틱을 중앙에 놓았다고 생각해도 미세하게 떨림(Jitter)이 발생하며, 기체는 이를 명령으로 오인해 계속해서 미세하게 흐르는 현상(Drift)이 발생한다.

  • 데드존 (Deadzone) 필터:
    FlightTaskManual 내부에는 파라미터(MPC_HOLD_DZ 등)로 설정된 데드존 영역 내의 미세한 스틱 입력값(예: -0.05 ~ +0.05)을 수학적으로 완벽한 0.0f로 뭉개버리는 논리 블록이 존재한다. 이 필터 덕분에 조종사가 스틱을 놓으면 드론은 바람에 밀리지 않고 그 자리에 얼음처럼 멈춰 설 수 있다(Position Hold).
  • 비선형 엑스포 (Exponential) 변환:
    선형(Linear) 매핑만 사용할 경우, 기체를 아주 천천히 움직이고 싶을 때 스틱을 1mm 단위로 미세하게 조작해야 하는 극도의 스트레스가 발생한다. 이를 위해 스틱의 중앙 부근에서는 출력 변화를 둔감하게 만들고, 스틱을 끝까지 칠 때 기하급수적으로 출력을 솟구치게 만드는 3차 함수(Cubic) 형태의 비선형 곡선 변환 필터가 공통으로 적용된다.

3. 궤적 생성(Trajectory Generation): 무차원 비율에서 물리적 속도로

스틱 입력이 완벽하게 -1.0 ~ +1.0 범위의 부드러운 실수로 정제되었다면, 이제 이를 드론이 이해할 수 있는 **물리적 속도(m/s)**로 뻥튀기(Scaling)할 차례다. 이는 이 상속 트리의 3세대 하위 클래스들(FlightTaskManualPosition 등) 내부의 update() 함수에서 각각의 비행 목적에 맞게 전개된다.

  • 파라미터 기반의 속도 합성(Velocity Synthesis):
    최대 비행 속도를 결정하는 사용자의 튜닝 파라미터(예: MPC_VEL_MAN_MAX)를 곱하여 물리적 목표 궤적(Setpoint)을 산출한다.
    만약 MPC_VEL_MAN_MAX가 10m/s로 설정되어 있고 조종사가 Pitch 스틱을 50% 밀었다면 (_sticks.y = 0.5), 해당 축의 목표 속도(Setpoint Velocity)는 0.5 * 10m/s = 5m/s로 간단히 계산된다.
  • XYZ 독립 제어 (Decoupled Control):
    이 궤적 생성 알고리즘은 철저하게 X, Y, Z 세 개의 직교 프레임으로 분리되어 독립 계산된다. 조종사가 기체를 빙글빙글 돌리며(Yaw) 전진(Pitch)하더라도, 코드는 그저 각각의 스틱 변수에 각각의 비례 상수를 곱해 _trajectory_setpoint 벡터의 x, y, yaw 슬롯에 차례로 밀어 넣을 뿐이다.

이러한 FlightTaskManual 상속 트리의 우아한 전처리 알고리즘 덕분에, 가장 예측 불가능한 잡음 덩어리인 ’인간 조종사’의 손놀림이 매우 통제되고 정밀한 수학적 궤적 수식으로 변주될 수 있는 것이다.