29.6.1.1. 조종기 스위치 할당 파라미터에 따른 물리적 채널 값의 상태 임계치(Threshold) 판별 로직

29.6.1.1. 조종기 스위치 할당 파라미터에 따른 물리적 채널 값의 상태 임계치(Threshold) 판별 로직

1. 개요 및 파라미터 매핑(Parameter Mapping)의 목적

드론의 조종기(Remote Controller, RC)는 전통적으로 1000µs에서 2000µs 사이의 연속적인 펄스폭 변조(PWM) 신호를 전송한다. 조이스틱과 같이 아날로그 형태로 움직이는 스틱 채널(Roll, Pitch, Yaw, Throttle)과 달리, 비행 모드 전환을 담당하는 토글(Toggle) 스위치 채널 역시 내부적으로는 이 1000~2000 구간의 아날로그 값으로 송신된다.

비행 제어기가 이러한 연속적인 수치 범위 내에서 “조종자가 현재 어떤 스위치 포지션을 선택했는가“를 정확히 판별하기 위해서는, 입력된 채널의 값을 특정 임계치(Threshold)로 나누어 이산적인(Discrete) 상태로 스냅(Snap)시키는 과정이 필수적이다. PX4-Autopilot은 이 과정에서 RC_MAP_FLTMODE 파라미터로 할당된 물리 채널을 6개의 독립된 영역으로 분할하고, 각각의 영역에 COM_FLTMODE_1부터 COM_FLTMODE_6까지의 파라미터를 대응시켜 물리적 스위치 동작을 논리적 비행 모드 명령으로 치환한다.

2. 상태 임계치(Threshold) 판별 아키텍처

PX4의 모드 스위치 처리 파이프라인은 입력의 획득, 디지털화(Thresholding), 그리고 논리 매핑이라는 3단계 구조를 따른다.

  1. 채널 매핑(Channel Mapping): 조종기의 수신기로부터 들어오는 다수의 채널(SBUS, CRSF 등) 중 어떤 채널이 비행 모드를 관장할지 RC_MAP_FLTMODE 로 지정한다. (예: Channel 5)
  2. 구간 스플리팅(Interval Splitting): 매핑된 채널에서 들어오는 정규화된(Normalized) 값(-1.0 ~ 1.0) 또는 원본 PWM 값(1000 ~ 2000)을 6개의 균등한(혹은 사전 정의된) 임계치 블록으로 매핑하여 1에서 6 사이의 인덱스(Index) 정수로 산출한다.
  3. 모드 프로젝션(Mode Projection): 획득된 슬롯 번호(1~6)에 해당하는 파라미터(COM_FLTMODE_n)를 읽어와, 해당 슬롯에 미리 설정해둔 구체적인 수동/자동 비행 모드(Stabilized, Acro, Mission 등)로 Commander 모듈에 전환 요청을 전송한다.

3. 임계치 판별 시스템 흐름도 (Mermaid 설계도)

물리 채널의 값이 어떻게 논리적 상태로 변환되어 비행 모드를 켜게 되는지를 나타낸 데이터 파이프라인 다이어그램이다.

graph TD
    A[조종기 하드웨어 스위치<br>예: 3단/6단 토글] --> B(수신기 PWM / SBUS 출력)
    B --> C[RC Input Module]
    
    C --> D{RC_MAP_FLTMODE 파라미터 검사}
    D --> E[할당된 채널의 정규화 값 획득<br>-1.0 ~ 1.0]
    
    E --> F[Threshold 판별 로직]
    F -- Slot 1 < -0.7 --> G1(Index = 1)
    F -- Slot 2 < -0.3 --> G2(Index = 2)
    F -- Slot 3 < 0.1 --> G3(Index = 3)
    F -- Slot 4 < 0.4 --> G4(Index = 4)
    F -- Slot 5 < 0.8 --> G5(Index = 5)
    F -- Slot 6 > 0.8 --> G6(Index = 6)
    
    G1 & G2 & G3 & G4 & G5 & G6 --> H[COM_FLTMODE_n 파라미터 참조]
    
    H --> I[논리적 main_state 매핑<br>예: MAIN_STATE_STAB]
    I --> J[Commander 전환 요청]

4. 소스 코드 깊은 분석 (src/modules/manual_control)

조종기 스위치 값을 판별하여 인덱스를 부여하는 핵심 로직은 RC 전처리 모듈이나 ManualControl 관련 클래스 내의 스위치 평가 함수에서 찾아볼 수 있다. (버전에 따라 로직의 위치가 rc_update 또는 별도의 헬퍼 함수로 나뉠 수 있다.)

// 수동 조종기 입력에서 스위치 슬롯(1~6)을 판별하는 임계치 로직 
// (정규화된 rc_val은 보통 -1.0에서 1.0 구간을 지님)

uint8_t evaluate_flight_mode_switch(float rc_val) {
    // 1. 할당되지 않은 채널이거나 끊어진 경우 (보조 안전 장치)
    if (!PX4_ISFINITE(rc_val)) {
        return 0; // Invalid slot
    }

    // 2. 6단계 임계치(Threshold) 비교 알고리즘
    // 일반적으로 구간을 6등분하여 중간 마진을 둠으로써 노이즈로 인한 플리터링(Flittering) 방지
    
    if (rc_val < -0.6666f) {
        return 1; // 슬롯 1 (예: 1000 ~ 1160 PWM 대응)
    } else if (rc_val < -0.3333f) {
        return 2; // 슬롯 2
    } else if (rc_val < 0.0f) {
        return 3; // 슬롯 3
    } else if (rc_val < 0.3333f) {
        return 4; // 슬롯 4
    } else if (rc_val < 0.6666f) {
        return 5; // 슬롯 5
    } else {
        return 6; // 슬롯 6 (예: 1840 ~ 2000 PWM 대응)
    }
}

위의 로직에 의해 획득된 1~6 사이의 슬롯 인덱스는 즉각적으로 시스템 파라미터 버스로 쿼리된다.

// 슬롯 인덱스에 매칭되는 실제 비행 모드를 결정하는 로직
int32_t flight_mode_param_val = 0;
switch (slot_index) {
    case 1: param_get(_param_com_fltmode_1, &flight_mode_param_val); break;
    case 2: param_get(_param_com_fltmode_2, &flight_mode_param_val); break;
    // ... 6까지 반복
}

// 추출된 파라미터 값(예: 0=Manual, 1=Altitude, 2=Position 등 Enum 값)을 바탕으로
// Commander 모듈에 uORB `vehicle_command`를 통해 변경 명령 하달
request_mode_change(flight_mode_param_val);

이와 같은 임계치 하드코딩(또는 시스템 파라미터 기반 마진 설정) 메커니즘은, 조종기의 포텐셔미터(Potentiometer) 노후화나 날씨로 인한 저항의 변화로 RC 출력값이 소폭 흔들리더라도 모드가 오작동으로 넘어가 기체가 추락하는 현상을 방지하기 위한 통신 방어책이다.

5. Ardupilot 대비 관제 및 파라미터 매핑 차이

스위치 임계치 매핑 측면에서 Ardupilot과 PX4-Autopilot은 매우 유사한 구조(FLTMODE1 ~ FLTMODE6)를 사용하지만, 철학적인 유연성 면에서 결을 달리한다.

  • P4X-Autopilot:
    파라미터 중심의 높은 유연성을 자랑한다. RC_MAP_FLTMODE 외에도 안전 스위치(RC_MAP_KILL_SW), 무장 스위치(RC_MAP_ARM_SW), 오프보드 전환 스위치(RC_MAP_OFFB_SW) 등을 독립된 임계치 로직으로 철저히 분리하여 개별 할당할 수 있다. QGroundControl(QGC) 내부에서도 “Flight Modes” 탭을 통해 스위치의 현재 임계치 구간(Highlight 영역)을 시각적으로 명확하게 디스플레이하여 사용자 경험(UX)을 극대화했다.
  • Ardupilot:
    Ardupilot 역시 전통적으로 Channel 5번을 베이스로 1230, 1360, 1490, 1620, 1749 µs 라는 5개의 고정된 임계치 컷오프(Cut-off) 지점을 가지고 6개의 모드(FLTMODE1 ~ FLTMODE6)를 나눈다. 다만, 최근에 RCx_OPTION 아키텍처를 전격 도입하면서 메인 모드 스위치 이외의 보조 스위치들을 거대한 단일 드롭다운(Dropdown) 형식의 옵션 인덱스로 통합 관장하는 형태로 발전해 왔다. PX4가 모듈형 컴포넌트 간 독립적 제어권을 가지는 반면, Ardupilot은 RC 채널 프로세싱 전체를 하나의 거대 클래스(RC_Channels) 내 옵션 열거형(Enum)으로 묶는 경향을 보인다.

결립론적으로, 임계치를 활용한 조종기 단의 상태 판별 시스템은 아날로그 신호를 안전하게 퀀타이징(Quantizing)하여 상태 전이 행렬의 초기 입력값으로 치환하는 최전방 방어선 역할을 한다고 볼 수 있다.