19.6.3.3. 센서 투표(Voting) 및 장애 조치(Failover) 알고리즘 기초 연동

19.6.3.3. 센서 투표(Voting) 및 장애 조치(Failover) 알고리즘 기초 연동

19.6.3.2 단원의 피땀 어린 결실로, 우리의 무결성 구독자 데몬은 이제 VFS에 존재하는 0번, 1번, 2번 가속도계 방의 최신 데이터를 모두 긁어모아 _sensor_data_buffer 배열에 한 줄로 나란히 세워놓는 기적을 이루었다.
하지만 데이터가 3개라고 해서 이 세 개의 가속도축 X, Y, Z 데이터를 산술적으로 다 더해서 3으로 남루하게 평균((A+B+C)/3) 내어버리는 멍청한 짓을 저지르면 어떻게 될까? 만약 2번 보조 센서가 충격으로 박살 나서 Y축으로 쓰레기 노이즈(+999.0)를 내뿜고 있다면, 멀쩡했던 0번과 1번의 데이터 오차까지 모조리 파괴해 버려 결국 메인 드론을 추락시키고 말 것이다.

PX4 코어 아키텍트는 이런 초보적인 단순 평균(Averaging)을 경멸한다. 이 다중 데이터 더미 속에서, **“대체 누가 불량품이고 누가 가장 최고 권위의 1등 칩셋인가?”**를 찾아내는 피 튀기는 재판 과정, 즉 ‘다중 센서 투표(Sensor Voting) 및 장애 조치(Failover)’ 알고리즘이 EKF 렌더링 직전에 반드시 최상위 관문으로 꽂혀야만 한다.

1. 센서 보팅(Sensor Voting): 잔혹한 품질 평가의 십자가

우리가 모아놓은 N개의 인스턴스 배열 데이터를 평가할 때, 가장 중요한 채점 매트릭스는 다음과 같다. 이 채점을 통해 각 인스턴스에 가중치(Weight)나 절대 우선순위를 매긴다.

  1. 타임스탬프 생존 검증 (Timeout Check): 센서가 박살 나 통신이 끊겼는지(Dead) 확인하는 가장 원초적 테스트. 아무리 0번 방이 SPI 메인 센서라도, 최신 갱신 타임스탬프(timestamp)가 시스템 현재 시간보다 500ms 이상 뒤처져 있다면 가차 없이 0번 센서를 ‘사망(Timeout)’ 판정하고 후보군에서 영구 삭제(Disable)한다.
  2. 데이터 일관성 및 에러 카운트 (Consistency & Error Count): 구조체 내부에는 센서 드라이버가 측정 시 토해낸 error_count나 노이즈 분산(Variance) 메타데이터가 붙어 있다. 0번 방의 에러 카운트가 갑자기 비행 중 급등한다면 이 센서는 심하게 떨리고 있거나 하드웨어 접불 상태다. 점수를 깎아내야 한다.
  3. 다수결의 원칙 (Majority Rule 보팅): 센서가 3개일 때, 0번과 1번은 가속도 Z축이 -9.8m/s^2를 가리키는데, 박살 난 2번 혼자 +5.0m/s^2를 가리키면, 2번을 물리적 이단(Outlier)으로 규정하고 합산 풀에서 격리해 버린다.

2. 에지 케이스 컷오프(Cut-off) 및 핫스왑(Hot-swap) Failover 아키텍처

위의 평가 알고리즘 점수판에 따라 드론 시스템은 다음과 같은 핫스왑 절차를 맹렬하게 밟아 나간다.

// [단순화된 Failover 분기 로직의 예시]

int best_sensor_index = 0; // 초기 디폴트: 무조건 0번 메인 방을 믿는다
float highest_score = -999.0f;

// 1. 점수 매기기 로직
for (int i = 0; i < active_instances; i++) {
    // 이미 이단(Timeout) 판정 난 쓰레기 방은 스킵
    if (is_sensor_timed_out(i)) continue; 

    // 평가 함수를 거친 품질 다항식 렌더링
    float current_score = calculate_sensor_health_score(_sensor_data_buffer[i]);

    // 2. [가장 강력한 이관 (Failover 타겟 찾기)]
    // 루프를 순회하며 가장 점수가 높은 무결점 방 번호를 찾아낸다.
    if (current_score > highest_score) {
        highest_score = current_score;
        best_sensor_index = i;
    }
}

// 3. [메인 블렌더 스위칭 확정 (Hot-swapping)]
// 만약 원래 메인이었던 0번 방이 죽어서 1번 방이 best_sensor_index로 등극했다면?
if (_current_active_main_sensor != best_sensor_index) {
    PX4_WARN("CRITICAL FAILOVER TRIGGERED! Sensor [%d] is DEAD/NOISY. Switching main navigation feed to Backup Sensor [%d]", 
                _current_active_main_sensor, best_sensor_index);
    _current_active_main_sensor = best_sensor_index; // 메인 의존 파이프라인 영구 교체!
}

// 4. 추출된 단 1개의 무결점 최고급 데이터만을 항법(EKF) 매트릭스에 최종 주입
Inject_Data_To_EKF(_sensor_data_buffer[_current_active_main_sensor]);

이 경이로운 **‘능동적 센서 보팅(Voting)’**과 ‘장애 조치(Failover)’ 아키텍처가 VFS 다중 인스턴스의 하부에서 받쳐주기 때문에, PX4 기체는 공중에서 누군가 샷건(Shotgun)을 쏴서 메인 GPS와 가속도계 보드를 통째로 날려버려도, 백그라운드의 이 블렌더 데몬이 즉각 인터럽트를 잡아내고 죽어버린 0번 방에서 1번 보조 방으로 **수 밀리초(ms) 만에 메인 데이터 파이프 혈관을 스위칭(Hot-swap)**해 버림으로써, 시스템의 추락을 끝까지 완벽하게 막아내는 극강의 무결성 다이하드(Die Hard) 생태계를 구축할 수 있게 된 것이다.