29.6.3.2. 폴백 발생 시 관제 시스템으로 전송되는 청각적 경고(Buzzer) 및 비주얼 텍스트 경고 메시지 생성 파이프라인

29.6.3.2. 폴백 발생 시 관제 시스템으로 전송되는 청각적 경고(Buzzer) 및 비주얼 텍스트 경고 메시지 생성 파이프라인

1. 개요 및 상황 인지(Situational Awareness)의 치명성

자율 폴백(Autonomous Fallback) 시스템의 완벽한 작동 이면에는 한 가지 거대한 인적 요인(Human Factor)의 함정이 도사리고 있다. 만약 드론이 GPS 결함을 감지하고 위치 제어에서 고도 제어로 스스로 상태를 무사히 강등시켰다 하더라도, 조종자가 이 사실을 인지하지 못한다면 또 다른 참사가 일어난다. 조종자는 기체가 여전히 제자리에 머물 것(Hovering)이라 착각하여 조종기 스틱에서 손을 뗄 것이고, 하향된 고도 제어 모드 특성상 기체는 바람에 밀려 장애물과 충돌하게 될 것이다.

따라서 상태 강등이 발생하는 즉시, 시스템은 기체 주변의 사람들에게 위험을 알리는 **현장 청각 경고(On-board Buzzer)**와 지상 관제소(GCS) 모니터 앞에 앉은 운영자에게 알리는 비주얼 텍스트 메시지 및 음성 합성(TTS) 경고를 동시다발적으로 생성해야 한다. 본 절에서는 PX4-Autopilot의 분산형 경고 전송 파이프라인 아키텍처를 분석한다.

2. 청각적 경고: 온보드 부저(Buzzer) 제어 로직

PX4-Autopilot은 각 모듈이 직접 핀(Pin) 제어로 하드웨어 부저를 울리게 하는 하드코딩 방식을 배제한다. 대신 tune_control 이라는 전용 uORB 토픽을 통해 멜로디 제어 시스템으로 발음 요청을 보낸다.

폴백을 수행하는 Failsafe 로직은 치명적인 결함이 감지된 시점에 다음과 같이 MAVLink 매크로와 튠(Tune) 매크로를 함께 호출한다.

  • tune_control_s 구조체의 tune_id 피처에 TUNE_ERROR_TUNE 또는 TUNE_HOME_SET(경우에 따라) 상수 값을 실어 퍼블리시한다.
  • 톤 발생기 데몬(tone_alarm 모듈)이 이를 수신하여 특유의 높고 빠른 분노조(Angry) 피치 멜로디를 생성해 PWM 포트로 송출한다. 이는 현장에 있는 조종자에게 드론의 통제 방식이 변했음을 직관적으로 알리는 사이렌 역할을 한다.

3. 텍스트 경고 메시지: uORB에서 MAVLink STATUSTEXT로의 변환

PX4의 로그 시스템은 메인 스레드를 블로킹(Blocking)하지 않기 위해 비동기 퍼블리시/서브스크라이브 패턴을 사용한다. 상태 머신 내에서 이벤트가 발생하면 다음과 같은 C++ 매크로가 실행된다.

// 경고 메시지를 uORB 토픽으로 뿌리는 매크로 호출 (failsafe.cpp 내)
mavlink_log_critical(&mavlink_log_pub, "Failsafe: Position estimate lost, fallback to Altitude Control");

mavlink_log_critical 매크로는 직접 시리얼 버퍼로 글자를 전송하지 않는다. 대신 내부적으로 문자열 형식을 포맷팅한 후, mavlink_log 이라는 uORB 토픽으로 기체 내부 망에 퍼블리시한다.

이후 백그라운드에서 동작 중인 mavlink 통신 모듈 데몬이 이 토픽을 구독(Subscribe)하여 잡아챈 뒤, 해당 문자열을 MAVLink 프로토콜의 표준 메시지인 STATUSTEXT (Message ID #253) 구조체 패킷으로 정렬 및 직렬화(Serialization)한다. 이때 중요도(Severity)는 MAV_SEVERITY_CRITICAL (Enum 값 3) 상태로 세팅되어 텔레메트리(Telemetry) 무선 모뎀을 타고 지상으로 전송된다.

4. GCS 파이프라인의 완성 (Mermaid 다이어그램)

초기 결함 감지부터 사용자의 스크린에 경고가 뜨기까지의 End-to-End 데이터 파이프라인이다.

sequenceDiagram
    participant FAIL as Commander Failsafe
    participant ALARM as tone_alarm (Buzzer)
    participant uORB as uORB Network
    participant MAV as MAVLink Module
    participant TX as Telemetry Radio
    participant GCS as QGroundControl (GCS)
    
    Note over FAIL: GPS Loss로 인한 Downgrade 발동
    FAIL->>ALARM: tune_control 토픽 (TUNE_ERROR_TUNE)
    ALARM->>ALARM: 100데시벨 삐-삐-삐! 사운드 발산
    
    FAIL->>uORB: mavlink_log 토픽 퍼블리시<br/>("Position estimate lost")
    uORB->>MAV: 토픽 서브스크라이브
    
    MAV->>MAV: STATUSTEXT 패킷 생성<br>(Severity: CRITICAL)
    MAV->>TX: 시리얼 통신 (UART)
    TX->>GCS: RF 무선 전송
    
    Note over GCS: QGroundControl 패킷 파싱
    GCS->>GCS: severity 레벨 검사 (CRITICAL 감지)
    GCS->>GCS: 빨간색 최상단 팝업 배너 UI 렌더링
    GCS->>GCS: 오디오 TTS 합성<br/>("Critical: Position estimate lost")

QGroundControl(QGC)은 이 STATUSTEXT 패킷의 중요도를 확인하고, CRITICAL이나 EMERGENCY 등급일 경우 알림 영역을 붉은색의 거대한 배너(Banner)로 강조하여 조종자의 주의를 완전히 뺏어버린다. 동시에 탑재된 TTS(Text-to-Speech) 엔진을 돌려 스피커로 해당 메시지를 음성으로 직접 낭독해 준다.

5. Ardupilot 대비 아키텍처 및 철학 차이

경고를 GCS로 전송하는 파이프라인 구성에 있어서 두 소프트웨어는 확연한 철학적 분기를 보여준다.

  • P4X-Autopilot:
    uORB 중개망을 활용하는 완벽한 디커플링(Decoupling) 아키텍처이다. 폴백 로직을 짜는 개발자는 MAVLink 패킷 구조나 시리얼 전송 지연시간을 전혀 고려할 필요 없이 mavlink_log 토픽으로 포스트만 던지면 끝난다. 텍스트 경고마저도 비동기화된 멀티스레드 마이크로커널 패턴의 특성을 고스란히 가지고 있어, 로깅 문자열 처리가 비행 프레임 레이트(Loop rate) 저하를 일으키지 않는다.
  • Ardupilot:
    Ardupilot은 전통적이고 견고한 직렬화 단일 스레드 기법에 의존한다. 폴백이나 EKF Failsafe 모듈 내부에서 gcs().send_text(MAV_SEVERITY_CRITICAL, "...") 형태의 전역 싱글턴(Singleton) 객체 메서드를 직접 호출한다. 이 메서드의 끝단은 곧바로 직렬 포트(Serial Port)의 버퍼 푸시(Push)와 물리적으로 연결되어 있어 직관적이고 빠르지만, 거대한 문자열 처리 작업이 메인 비행 루프 시간을 점유할 소지가 존재하여 코딩 시 각별한 주의가 요구된다.

요약하자면, 폴백 경고 메시지 파이프라인은 기체의 오작동과 조종자의 오판이 만나는 끔찍한 접점을 차단하는 유일한 창구이며, PX4-Autopilot은 uORB와 MAVLink의 비동기화된 다리(Bridge)를 통해 이를 모듈화되고 지연 없는 최적의 형태로 관제소에 전달토록 설계되어 있다.