### 0.0.1 수신기 전환(Switching) 시 오프셋 차이로 발생하는 위치 튐(Position Jump) 현상을 보상하는 상태 변수(State Variable) 리셋 동기화 로직
단일 GPS 시스템에서는 절대 경험할 수 없는, 다중 GPS 고유의 가장 까다로운 비행 역학적 난제는 바로 ’좌표계의 불일치’다.
아무리 뛰어난 초정밀 RTK GPS 두 대를 장착했다 하더라도, 기체 노즈(Nose) 쪽에 장착된 A 수신기와 테일(Tail) 쪽에 장착된 B 수신기는 물리적으로 최소 수십 센티미터 이상의 3차원 공간적 이격(Offset) 거리를 가진다. 또한, 기압고도계나 타원체 고도(Ellipsoid)를 해석하는 각 디바이스 펌웨어의 미세한 차이로 인해 평상시에도 위성과 계산해 낸 위치 값 사이에 약간의 어긋남(Discrepancy)이 존재할 수밖에 없다.
본 절에서는 주(Primary) 수신기에서 예비(Secondary) 수신기로 제어권이 넘어가는 찰나의 순간, 드론이 허공에서 수 미터 순간이동(Jump)한 것처럼 오인하는 것을 방지하기 위해 EKF2가 가동하는 상태 변수 리셋(State Variable Reset) 로직을 분석한다.
0.1 포지션 점프(Position Jump) 현상의 역학적 위험성
드론이 ‘Hold(Loiter)’ 모드로 제자리에 정지 비행 중이라고 가정해 보자.
- 위치 제어기(Position Controller)는 EKF2가 전달해 주는 현재 좌표(P_{EKF})와 조종사가 명령한 목표 좌표(P_{Target}) 사이의 에러(Error) 벡터를 0으로 만들기 위해 쉴 새 없이 PID 제어 루프를 돌고 있다.
- 이때 Primary GPS(지붕 중앙 장착)가 파손되어, 백업용 Secondary GPS(꼬리 날개 끝 장착, 1미터 후방)로 스위칭이 발생했다.
- Secondary GPS는 “현재 드론은 (기존 좌표 대비) 1미터 뒤에 있습니다“라고 EKF2에 보고한다.
- 만약 이 좌표를 그대로 맹신하여 P_{EKF} 를 업데이트해 버리면, 위치 제어기 입장에서는 드론이 갑자기 뒤로 1미터 밀려난 것(
Position Jump)으로 철석같이 믿게 된다. 그 결과, 원래 위치로 복귀하기 위해 앞으로 1미터만큼 피치(Pitch)를 급격히 꺾어 모터를 풀 가속하는 끔찍한 이상 비행(Erratic Movement)이 발생한다.
0.2 이격 벡터(Offset Vector)의 실시간 추적
이러한 재앙을 막기 위해 PX4의 ekf2_gps_blending.cpp 모듈은 비행하는 내내 단순히 두 좌표를 섞기만 하는 것이 아니라, 두 수신기 사이의 3차원 좌표 차이(Delta)를 실시간으로 추적 및 기록(Logging) 하고 있다.
- 매 업데이트 틱(Tick)마다 Primary와 Secondary 위치 사이의 오프셋 벡터 \Delta P = P_{sec} - P_{pri} 를 계산한다.
- 오프셋 벡터는 고정된 상수가 아니다. 기체의 Heading(Yaw)이 바뀔 때마다 지구 좌표계(NED)를 기준으로 안테나 이격 위치가 상대적으로 회전하므로, \Delta P 는 기체 운동학(Kinematics)에 따라 쉴 새 없이 변하는 동적 변수다.
0.3 상태 리셋(State Reset) 연산과 연속성(Continuity) 보장
장애 판단 상태 머신(12.6.3.1절 참조)이 마침내 페일오버(Failover) 트리거를 격발시킨 바로 그 프레임(Frame)에서 마법이 일어난다.
- 순간 포착: 제어권이 Secondary로 넘어가는 순간, EKF2는 메모리 버퍼에서 가장 마지막으로 유효했던 \Delta P (이격 벡터) 값을 동결시킨다.
- State Vector Reset: EKF2 메인 칼만 필터의 위치 상태 변수(Position State Vector, X_p) 전체를 수정한다. 새로운 Secondary 좌표에 이 오프셋(\Delta P) 보상값을 강제로 빼서(Subtract), EKF2가 뱉어내는 최종 추정 좌표계의 원점(Origin)이 기존 Primary가 가리키던 공간적 위치와 완벽히 맞아떨어지도록 수학적 좌표 이동(Translation)을 스매싱(Smashing)해 넣는다.
- 플래그 전파: 동시에 uORB 토픽(
estimator_event_flags)을 통해 윗선의 위치 제어기(Position Controller)에게 “방금 하부 센서 망에서 Position Reset 이벤트가 발생했으니, 적분기(I-term)가 미쳐 날뛰는 것을 막기 위해 제어 루프를 매끄럽게 재설정(Smooth Restart)하라“는 플래그 신호를 쏘아 올린다.
결과적으로 Secondary GPS의 데이터는 철저하게 Primary GPS가 만들어두었던 좌표계의 상대적 그림자(Shadow) 로서 기능하게 된다. 조종사의 눈에는 GPS가 사망하고 교체되는 일련의 참사에도 불구하고, 드론은 허공의 정지된 1밀리미터도 뺏기지 않은 채 미동 없이 제자리를 지키는(Hovers perfectly) 경이로운 무중단 관제(Seamless Actuation) 시퀀스가 완성된다.