29.6.3. 센서 결함 감지 및 자율 폴백(Autonomous Fallback) 시스템
1. 개요 및 자율 폴백(Fallback)의 방어적 철학
무인항공기가 야외 환경에서 비행할 때 센서의 결함은 예고 없이 찾아온다. 강한 전자기장 주변을 비행하다 나침반(Compass)이 교란되거나, 도심 빌딩 숲에서 위성 항법 장치(GPS) 신호가 다중 경로(Multipath) 간섭으로 끊어지는 현상이 대표적이다.
만약 기체가 위치 제어(Position Control) 혹은 자동 임무(Mission) 모드로 비행 중일 때 GPS가 상실된다면, 제어기는 잘못된 위치 오차를 극복하기 위해 기체를 엉뚱한 방향으로 최대 가속시켜 버리는 플라이어웨이(Fly-away) 현상을 유발한다. PX4-Autopilot은 이러한 재난을 방지하기 위해 자율 폴백(Autonomous Fallback, 또는 상태 하향 Downgrade) 알고리즘을 스택 최상단에 구현해 두었다. 이는 현재 비행 모드를 유지하기 위한 센서 조건이 깨졌을 때, 더 적은 센서에 의존하는 안전한 하위 비행 모드(예: 고도 제어 또는 자세 안정화 모드)로 기체의 상태를 시스템이 자동으로 강등시키는 펠세이프(Failsafe) 메커니즘이다.
2. 확장 칼만 필터(EKF)의 혁신(Innovation) 기반 결함 감지
센서가 “고장 났다” 혹은 “믿을 수 없다“는 판단은 단순히 센서의 전원이 끊어졌는지 여부로 결정되지 않는다. PX4의 상태 추정기(EKF2)는 수학적인 결함 진단 체계를 가동한다.
EKF는 이전 상태를 기반으로 기체의 현재 위치를 ’예측(Prediction)’하고, GPS 등 센서에서 들어온 ’측정값(Measurement)’과 비교한다. 이 둘의 차이를 **혁신(Innovation)**이라고 부른다. 만약 GPS 신호가 튀어서 혁신 값이 시스템이 허용한 임계치(Variance Gate)를 지속해서 초과하게 되면, EKF는 해당 센서를 필터 융합에서 배제(Reject)시켜버린다.
융합이 배제되면 EKF는 vehicle_status_flags 토픽의 신뢰성 불리언(Boolean) 값을 False로 변경하여 시스템 전역에 방송한다.
condition_global_position_valid = false(GPS 등 평면 위치 상실 시)condition_local_altitude_valid = false(기압계/거리 센서 등 고도 상실 시)
3. 오토노머스 폴백 계층도 (Mermaid 설계도)
Commander 모듈 내의 상태 감시 트리(State Watchdog)가 센서 유효성 플래그의 하락을 감지했을 때 계층적으로 제어 모드를 강등시키는 작동 흐름도이다.
graph TD
A[현재 모드: Position Control<br>조건: GPS + Baro + IMU] --> B{EKF2 Innovation 검사:<br>GPS 신호 불량 감지}
B -- 위치 플래그 False 하락 --> C[Fallback 1단계 발동:<br>위치 제어 포기]
C --> D[목표 모드: Altitude Control<br>조건: Baro + IMU]
D --> E{EKF2 Innovation 검사:<br>기압계 또는 고도 센서 불량 감지}
E -- 고도 플래그 False 하락 --> F[Fallback 2단계 발동:<br>고도 제어 포기]
F --> G[목표 모드: Stabilized<br>조건: IMU 전용]
G --> H((조종자에게 수동 조종 권한 및<br>즉각 착륙 요구 경고 송출))
이처럼 폴백 시스템은 기체의 제어권을 일거에 박탈하고 추락시키는 것이 아니라, 남아있는 건강한 센서를 기반으로 기체의 자세라도 수평으로 유지하여 조종자가 마지막 개입을 할 수 있는 여지를 벌어주는 생명 연장의 소프트웨어 아키텍처이다.
4. 소스 코드 깊은 분석 (state_machine_helper.cpp 및 Failsafe)
이러한 상태 강등은 Commander 스레드의 비행 루프(메인 루프) 내에서 지속해서 감시되는 failsafe.cpp 혹은 상태 검사 함수 군을 통해 이루어진다.
// src/modules/commander/state_machine_helper.cpp 관련 폴백 검사 의사 코드
void set_main_state_fallback(const status_flags_s &status_flags, uint8_t &main_state)
{
// 1. 현재 모드가 위치 제어를 요구하는 자동/수동 모드인지 확인
if (main_state == commander_state_s::MAIN_STATE_POSCTL ||
main_state == commander_state_s::MAIN_STATE_AUTO_MISSION ||
main_state == commander_state_s::MAIN_STATE_AUTO_RTL)
{
// 2. 위치 산출 플래그가 꺼졌다면 폴백 트리거
if (!status_flags.condition_local_position_valid) {
// 3. 고도 산출은 아직 살아있는지 확인 (고도 제어로 갈 수 있는지)
if (status_flags.condition_local_altitude_valid) {
// 다운그레이드: Altitude Control
main_state = commander_state_s::MAIN_STATE_ALTCTL;
mavlink_log_critical("GPS Lost: Fallback to Altitude Control");
}
else if (status_flags.condition_attitude_valid) {
// 고도마저 죽었다면 최후의 보루인 Stabilized 모드로 강등
main_state = commander_state_s::MAIN_STATE_STAB;
mavlink_log_critical("Altitude Lost: Fallback to Stabilized");
}
else {
// IMU마저 죽으면 비행 불능 상태, 강제 비상 정지(Flight Termination)
}
}
}
}
이 과정에서 폴백이 결정되면 내부 부저(Buzzer)에서 뚜렷한 경고음이 울리며, MAVLink의 STATUSTEXT 메시지를 통해 지상 관제소(GCS) 스크린에 붉은색 글씨로 치명적인 결함 및 상태 강등 안내가 팝업된다.
5. Ardupilot 대비 아키텍처 및 철학 차이
센서 결함에 대처하는 폴백 시스템의 철학은 두 소프트웨어의 궤가 조금 다르다.
- P4X-Autopilot:
PX4는 상태 강등(Mode Downgrade)을 최우선으로 시도한다. 수동 위치 제어 중에 GPS를 잃으면 매끄럽게 고도 제어로 미끄러지며 조종자의 스틱 입력 방식을 유지해 준다. 조종자가 드론을 육안으로 보고 있다면 패닉에 빠지지 않고 그대로 기체를 수동으로 끌고 올 수 있는 자율성을 부여한다. - Ardupilot:
Ardupilot은FS_EKF_ACTION이라는 글로벌 파라미터 기반의 이벤트 트리거 방식을 선호한다. EKF 분산이 심해지면 즉시 ‘EKF Failsafe’ 모드로 돌입하며, 파라미터 설정에 따라 Land(즉각 착륙), AltHold(고도 유지), 또는 SmartRTL(GPS가 없어도 옵티컬 플로우 등을 쥐어짜 복귀를 시도) 등 사전에 셋팅된 단일 방어 기동을 강제 집행한다. 조종자의 개입보다는 시스템이 지정된 위기 탈출 프로시저를 끝까지 밀어붙이는 경향이 강하다.
결론적으로 PX4의 자율 폴백 시스템은 센서 데이터의 신뢰성을 지속해서 검증하고, 유효한 최상층 제어 논리부터 하나씩 계단을 내려오며 조종권의 부드러운 이양을 도모하는 유연한 방어 아키텍처라 평가할 수 있다.