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)를 통해 이를 모듈화되고 지연 없는 최적의 형태로 관제소에 전달토록 설계되어 있다.