27.5.1.2. 혁신 검사(Innovation Test): 이상치(Outlier) 거부를 위한 통계적 비율 계산 함수 구조
PX4-Autopilot의 EKF2(Extended Kalman Filter)가 보여주는 탁월한 신뢰성은 단지 수학적 최적화에서만 나오는 것이 아니다. 실제 비행 환경에서 필연적으로 발생하는 센서의 고장, 자기장 교란, GPS 다중 경로(Multipath) 신호 반사 등의 극한 상황에서도 기체가 추락하지 않도록 버텨내는 핵심 방어기제는 바로 혁신 검사(Innovation Test 또는 Innovation Gating) 에 있다. 본 절에서는 ecl/EKF/ 라이브러리 내부에서 관측 데이터를 기각(Reject)하거나 수용(Accept)하는 수학적 기준과 이를 구현한 C++ 함수의 내부 구조를 분석한다.
1. 혁신(Innovation)과 검사 비율(Test Ratio)의 통계적 정의
센서 퓨전 파이프라인에서 ’혁신(Innovation, \mathbf{y})’이란, EKF가 내부적으로 상상한 ’예상 관측치(Predicted Measurement)’와 실제 센서에서 들어온 ‘물리적 관측치(Actual Measurement)’ 간의 순수한 차이를 의미한다.
혁신 검사는 이 잔차가 과연 “정상적인 노이즈 범주 안에 있는가, 아니면 외부 교란에 의한 이상치(Outlier)인가?” 를 판단하는 과정이다. 이를 위해 PX4는 단순히 잔차의 절대적인 크기를 비교하는 것이 아니라, 필터의 불확실성을 나타내는 잔차 공분산(Innovation Covariance, \mathbf{S})을 활용하여 통계적 거리(Mahalanobis Distance와 유사한 개념)를 계산한다.
코드 내에서 이 통계적 거리는 Test Ratio(검사 비율) 로 정의되며 다음과 같이 스칼라 비(Ratio)로 산출된다.
\text{Test Ratio} = \frac{\mathbf{y}^2}{ \text{Gate\_Size}^2 \times \mathbf{S} }
어떤 센서의 Test Ratio 값이 1.0을 초과한다면, 이는 해당 센서의 데이터가 시스템이 통계적으로 허용할 수 있는 신뢰 구간(Gate)을 벗어났음을 의미한다.
2. 혁신 검사를 수행하는 C++ 내부 로직
자율 비행 중 이 연산은 수천 번 반복되므로, C++ 코드 상에서는 행렬 곱을 생략하여 컴퓨팅 리소스를 극도로 통제하는 형태로 작성된다. 다음은 EKF 내부에서 혁신 검사 비율을 계산하는 대표적인 로직 흐름이다.
2.1 Gate Size 파라미터 룩업
센서 종류별로 허용할 수 있는 오차 범위가 다르다. QGroundControl(QGC)을 통해 튜닝 가능한 EKF2_GPS_V_GATE, EKF2_BARO_GATE, EKF2_MAG_GATE 등의 파라미터는 1\sigma(표준편차) 대비 몇 배수까지를 허용할 것인지를 의미하는 Gate_Size 상수를 결정한다. 통상적으로 위치 데이터는 5 마진(5 Sigma), 기압계는 5 마진, 지자기 센서는 3 마진 수준으로 튜닝된다.
// src/lib/ecl/EKF/common.h & sensor_fusion.cpp 의 개념적 루틴
// 1. 공분산 S와 편차 계산
float innovation_variance = P_H_T * H + R_noise; // 잔차 공분산 S
float innovation_sq = innovation * innovation; // 잔차의 제곱 y^2
// 2. QGC 파라미터 기반 게이트 크기 도출 (예: gps_v_gate = 5.0f)
float gate_size_sq = gate_size * gate_size;
// 3. Test Ratio 연산 (코드상 _gps_pos_test_ratio 등으로 저장됨)
float test_ratio = innovation_sq / (gate_size_sq * innovation_variance);
// 4. 통계적 기각 판단
if (test_ratio > 1.0f) {
// 혁신 검사 실패 (Outlier 감지)
_gps_pos_innov_rejected = true;
} else {
// 융합 허용 (Update 수행)
_gps_pos_innov_rejected = false;
}
3. 이상치 처리와 복원(Recovery) 메커니즘
만약 Test Ratio가 1.0을 초과하여 이상치로 판단되었다면(_innov_rejected == true), PX4-Autopilot은 즉시 해당 관측 데이터를 융합에서 제외하고 24차원의 상태 벡터와 공분산 행렬 업데이트를 우회(Bypass)한다.
3.1 지속적인 기각 상황 (Persistent Gating)
단발적인 기각은 스파이크성 노이즈를 성공적으로 방어한 훌륭한 사례다. 그러나 센서 자체가 하드웨어적으로 고장 났거나, GPS Spoofing(기만)을 당하여 잔차가 영구히 게이트 밖에 머무르는 상황이 발생할 수 있다.
PX4 ECL은 각 센서별로 잔차 기각 지속 시간(Time out) 타이머를 구동한다.
- 예를 들어 GPS 속도 혁신이 5초 이상 연속으로 거부되면, 필터는 내부 상태가 이미 파탄 났거나 센서가 돌이킬 수 없이 고장 났다고 판단한다.
- 이때 필터는 “센서 타임아웃(Sensor Timeout)” 이벤트를 발생시키고, 해당 센서를 시스템 의존성 트릭에서 완전히 강등(Demote)시키거나, 최악의 경우 관측 행렬을 초기화(Reset) 시켜버리는 대규모 보정 절차를 대기시킨다.
stateDiagram-v2
[*] --> Healthy_Fusion
Healthy_Fusion --> Gated_Waiting : Test Ratio > 1.0
Gated_Waiting --> Healthy_Fusion : Test Ratio <= 1.0 (일시적 노이즈 회복)
Gated_Waiting --> Timeout_Reset : 연속 기각 시간 > 임계치 (예: 5초)
Timeout_Reset --> Sensor_Demoted : 다중 필터 페일오버 또는 VIO로 전환
Sensor_Demoted --> [*]
4. 텔레메트리를 통한 모니터링 (MAVLink ESTIMATOR_STATUS)
이 Test Ratio의 수치들은 비행 중 QGC를 켜놓았을 때 모니터 화면 구석에서 진동하는 백분율 게이지 바나, 로그 파일의 estimator_status ULog 토픽을 통해 실시간으로 관제 시스템에 퍼블리싱(Publishing)된다.
현장의 엔지니어들이 트러블슈팅을 수행할 때, “왜 비행 중 기체가 흔들렸는가?“를 분석하기 위해 가장 먼저 살펴보는 그래프가 바로 자기장, GPS, 기압계의 Test Ratio 곡선이다. 이 값이 평시에는 0.1 ~ 0.3 미만에서 놀아야 하지만, 비행 중 특정 시점에 1.0을 타격(Clipping)하며 평평한 윗선을 그렸다면, 이는 센서 신뢰성이 무너져 EKF가 데이터 수용을 온몸으로 거부하고 있었다는 명백한 통계적 증거가 된다.