13.4.2.2. Primary/Secondary 수신기 절체(Fallback) 로직의 지연 시간(Timeout) 계산 및 타임스탬프 동기화(Time Synchronization) 오차 보상

13.4.2.2. Primary/Secondary 수신기 절체(Fallback) 로직의 지연 시간(Timeout) 계산 및 타임스탬프 동기화(Time Synchronization) 오차 보상

다중 GPS 시스템 환경에서 블렌딩(Blending) 모드가 아닌 단순 스위칭(Switching) 또는 절체(Fallback) 로직을 채택했을 때, 메인 수신기(Primary)에서 백업 수신기(Secondary)로 권한이 넘어가는 찰나의 순간은 시스템의 명운을 가르는 가장 아찔한 임계점이다.

물리적으로 떨어져 있는 두 개의 하드웨어 수신기는 각자의 시계(Clock)로 동작하며 서로 다른 처리 지연 시간을 갖는다. 본 절에서는 PX4-Autopilot의 센서 매니저(sensors 모듈)가 절체를 결단하는 타임아웃(Timeout)의 기준점은 무엇이며, 두 수신기 간의 타임스탬프(Timestamp) 불일치로 인해 발생하는 이른바 ’시간축 오차(Temporal Offset)’를 어떻게 소프트웨어적으로 보상(Compensation)하는지 심층 분석한다.

1. 페일세이프 타임아웃(Timeout) 판정 로직

단순히 “GPS 1번에서 데이터가 안 들어오네? 2번으로 바꾼다” 식의 1차원적 로직은 치명적이다. 1번 GPS가 일시적인 CPU 병목으로 단 한두 프레임을 늦게 뱉었을 뿐인데, 성급하게 절체를 수행하면 오히려 스위칭 충격(Jerk)만 발생하기 때문이다.

1.1 지연 시간(Staleness)의 검증

PX4의 vehicle_gps_position.cpp 클래스는 각각의 GPS 인스턴스가 uORB 버스로 데이터를 발행할 때마다 그 순간의 절대 시스템 시간(hrt_absolute_time())을 캐싱해 둔다.

// 페일세이프 타임아웃 검증 유사 로직
uint64_t current_time = hrt_absolute_time();
uint64_t gps1_last_recv = _gps_data[0].timestamp;
uint64_t dt_us = current_time - gps1_last_recv;

// 통상적인 허용 Timeout 한계 (예: 500ms)
if (dt_us > GPS_TIMEOUT_MAX_US) {
    // 1번(Primary) 수신기 사망 판정, Fallback 발동!
    trigger_fallback_to_secondary();
}

1.2 정확도 기반(Accuracy-based) 강제 절체

데이터가 꼬박꼬박 들어오더라도 품질이 바닥이라면 절체해야 한다.
1번 수신기가 도심 협곡에 가려 다중경로(Multipath) 에러가 폭주하여 위치 오차 분산(eph) 수치를 비정상적으로 높게 보고하면, 펌웨어는 고도, 수평 오차율이 2번 백업 수신기보다 일정 비율(통상 1.5 \sim 2 배 이상) 나빠지는 순간 즉시 2번을 Primary로 격상시킨다.

2. 타임스탬프 동기화(Time Synchronization)의 난제

절체(Fallback)가 발생하여 2번 GPS 데이터를 EKF2로 밀어 넣기 시작했다고 가정해 보자. 여기서 거대한 물리학적 함정이 발생한다.

수신기 1번과 2번은 각자 위성으로부터 초당 10번(10\text{Hz}, 100\text{ms} 간격) 위치를 연산하지만, 이 두 하드웨어의 10\text{Hz} 주기가 정확히 동일한 위상(Phase)으로 박자를 맞추어 진동하지 않는다.

  • GPS 1은 1.00\text{s}, 1.10\text{s}, 1.20\text{s}… 에 연산을 마침.
  • GPS 2는 반 박자 엇갈려 1.04\text{s}, 1.14\text{s}, 1.24\text{s}… 에 연산을 마침. (Time Offset 존재)

드론이 시속 50\text{ km/h} (약 14\text{ m/s})로 전진하고 있을 때, 40\text{ ms} 의 시간적 엇갈림은 공중에서 약 56\text{ cm} 의 **공간적 격차(Spatial Gap)**를 의미한다! 이 상황에서 갑자기 2번 데이터를 EKF2에 꽂아 넣으면 EKF2는 “순식간에 기체가 56\text{ cm} 를 등속도 없이 워프(Warp)했다“고 착각해버린다.

3. 오차 보상 및 외삽(Extrapolation) C++ 매커니즘

이 끔찍한 시간축 오차로 인한 공간 점프(Jump) 현상을 막고, 물 흐르듯 매끄러운 절체를 이룩하기 위해 PX4는 동역학적 외삽(Kinematic Extrapolation) 기법을 동원한다.

3.1 절체 직전의 시간 차이(Delta T) 계산

로직은 1번(죽기 직전)과 2번(새로 채택된) 측정치 간의 ’타임스탬프 격차(\Delta t)’를 계산한다.
\Delta t = T_{Secondary} - T_{Primary\_Last}

3.2. 속도 벡터(Velocity Vector)를 이용한 위치 보상

단순히 2번 GPS의 위치를 그대로 쓰지 않고, 2번 GPS가 보고하는 자기 자신의 3D 속도 벡터(V_N, V_E, V_D)를 이용하여 이 \Delta t 시간 동안 기체가 날아갔을 거리를 수학적으로 더하거나 뺀다.

// 타임 차이에 따른 공간 오차 보상 (Extrapolation)
float dt_sec = (time_secondary - time_primary_expected) * 1e-6f;

// Secondary 수신기의 원본 좌표
double lat_raw = _gps_data[1].lat; 
double lon_raw = _gps_data[1].lon;

// 속도를 기반으로 시간축을 일치시킨 '가상의 좌표' 산출
double lat_compensated = lat_raw + (vel_north * dt_sec * METERS_TO_LAT);
double lon_compensated = lon_raw + (vel_east  * dt_sec * METERS_TO_LON);

// 보상된 좌표를 EKF2 버스로 전달
publish_to_ekf2(lat_compensated, lon_compensated);

3.3. EKF2 코어의 스텝(Step) 완충 작용

마지막으로, 보상된 데이터가 EKF 코어에 진입하면, 앞 절에서 언급했던 EKF2_GPS_CHECK 파라미터 기반의 혁신 검정(Innovation Gate Test)이 최후의 완충재 역할을 한다. 절체 충격으로 인한 잔여 오차가 발생하더라도 게이트 내에 존재한다면 상태 벡터 업데이트 비중(Kalman Gain)이 통제되어 부드러운 전이(Soft Transition)가 이루어진다.

결론적으로 PX4의 다중 센서 Fallback 아키텍처는 단순히 ’A선이 끊어지면 B선을 꽂는다’는 원시적 하드웨어 릴레이 수준을 아득히 초월한다. 각 하드웨어 클럭(Clock) 진동자의 불일치를 소프트웨어 속도 벡터 융합 기술로 끌어올려, 시간과 공간을 초월하는 가상의 이어달리기 배턴 파싱(Baton Passing)을 수행해 내는 극한의 동기화 공학이다.