13.3.3.2. GCS를 경유하는 이동형 베이스라인: 로버(Rover) 측의 MAVLink GPS_INJECT_DATA 타임아웃 처리 및 상대 좌표(Relative Positioning) 기반 제어기 보상 C++ 로직
드론 생태계에서 이동형 베이스(Moving Base)를 조향하기 위해 하드웨어를 직결(UART2 Cross-talk)하는 방식이 물리적으로 불가능한 거대 플랫폼들이 있다. 가령 길이가 수십 미터에 달하는 화물선 지붕 위에서, 베이스 스테이션(QGC가 설치된 중앙 통제실)과 이착륙 지점의 드론(Rover)이 물리적인 전선으로 이뤄질 수 없는 경우다.
이러한 경우 엔지니어는 이동하는 선박(Base)의 GPS 데이터를 QGC가 수집한 뒤, 이를 MAVLink 프로토콜을 태워 텔레메트리 무선망을 통해 드론(Rover)에게 쏘아주는 GCS 경유형 이동 베이스라인 아키텍처를 구축해야 한다. 본 절에서는 QGC 백엔드와 PX4 펌웨어 간에 이루어지는 GPS_INJECT_DATA 메시지의 전송 스펙, 그리고 드론 측 EKF2 제어기가 통신 지연(Timeout)과 요동치는 상대 좌표를 어떻게 C++ 로직으로 보상(Compensation)하는지 심층적으로 다룬다.
1. GCS 기반 Moving Base 데이터 인젝션 파이프라인
이동형 베이스 스테이션(지상 컨트롤러에 부착된 GPS)이 생산하는 RTCM 보정 데이터는, 앞서 다룬 고정형 기반 NTRIP 캐스터와는 전혀 다른 성질을 지닌다. 좌표가 고정된 것이 아니라, 초당 수 미터씩 변위(Displacement)가 발생하기 때문이다.
1.1 MAVLink GPS_INJECT_DATA (ID: 123) 래핑
QGC에 USB로 직결된 로컬 GPS 수신기가 Moving Base 모드로 세팅되어 있다면, QGC의 GPSManager C++ 스레드는 쏟아져 들어오는 무거운 반송파 위상(Carrier-phase) 관측 데이터를 MAVLink 메시지로 변환한다.
이때 사용되는 것이 바로 MAVLINK_MSG_ID_GPS_RTCM_DATA (단순 고정형 보정 데이터 전용)에서 한 단계 더 나아간, 타게팅된 모듈(Component) 식별이 가능한 GPS_INJECT_DATA (다중 노드 환경 유연성 허용) 페이로드 구조이다.
mavlink_gps_inject_data_t inject_msg;
inject_msg.target_system = 1; // 드론의 System ID
inject_msg.target_component = 0; // 드론 내의 모든 GPS 컴포넌트에 뿌림
inject_msg.len = chunk_size; // 최대 110 바이트
memcpy(inject_msg.data, rtcm_buffer, chunk_size);
- QGC는 이 청크들을 초당 1\text{Hz} 수준으로 지속적으로 무선 텔레메트리로 밀어낸다.
2. 드론(Rover) 측 EKF2의 통신 지연(Timeout) 및 보상 C++ 로직
드론에 내장된 F9P 로버(Rover) 모듈은 들어온 데이터를 받아 위성 신호와 버무려 베이스라인 벡터(Baseline Vector)를 생산한다. 그러나 GCS를 거치며 무선 텔레메트리를 통과한 이 데이터는 치명적인 약점을 갖는다. 바로 전송 지연(Latency)과 패킷 유실률(Drop rate) 이다.
2.1 타임아웃 감지 (Timeout Detection) 매커니즘
PX4의 심장인 EKF2 (Extended Kalman Filter)는 들어오는 모든 센서 데이터의 ’신선도(Timestamp)’를 가혹하게 감시한다. src/modules/ekf2/ 디렉토리 하위의 GPS 퓨전 로직은 GPS_INJECT_DATA 가 마지막으로 주입된 시간(_last_gps_inject_us)을 틱(Tick)마다 검사한다.
// EKF2 GPS 데이터 유효성 검사 슈도코드
uint64_t now = hrt_absolute_time();
if (now - _last_gps_inject_us > GPS_INJECT_TIMEOUT_US) {
// 텔레메트리 지연 또는 단절 발생!
_moving_base_valid = false;
_gps_yaw_valid = false;
// 3D RTK 모드를 Float 혹은 단독 측위(3D Fix) 모드로 강등(Fallback)
}
- 만약 선박이 파도에 롤링(Rolling)하여 텔레메트리 안테나의 지향성이 잠시 틀어지고 데이터가 2 \sim 3\text{초} 이상 비면, EKF2는 즉각적으로 해당 상대 좌표 벡터의 신뢰도를 0으로 쳐박고, 내장 기압계와 IMU만으로 버티는 관성 항법 모드로 트랜지션한다.
2.2 상대 좌표 (Relative NED) 속도-가속도 보상(Compensation)
베이스 스테이션(선박) 자체가 움직이므로, 드론이 받은 GPS_INJECT_DATA 속의 Base 좌표는 ’과거의 위치(\approx 0.2\text{초} 전)’이다. 드론이 그 과거의 좌표 위로 착륙하려 하면 필연적으로 선박 덱(Deck)의 가장자리에 추락하게 된다.
이를 막기 위해 PX4의 ‘Target Follow’ 또는 ‘Land target’ C++ 제어기는 단순한 상대 거리뿐만 아니라, 베이스의 속도(Velocity)와 가속도(Acceleration) 파생 성분을 궤적 생성기(Trajectory Generator)에 전방 먹임(Feed-forward) 변수로 투입한다.
- 위치 외삽(Extrapolation): 수신된 Base 좌표 타임스탬프와 드론의 현재 타임스탬프 차이(\Delta t)를 구한다.
- 보상 식 적용: \text{Target}_{xyz\_current} = \text{Base}_{xyz\_received} + (\text{Base}_{Vel\_ned} \times \Delta t)
- 제어기 입력: 드론의 PID 제어기는 위에서 보상(Compensated)된 ’현재 순간의 수학적 예상 지점’을 향해 기판의 롤(Roll)과 피치(Pitch)를 기울여 돌진한다.
결론적으로 GCS를 경유하는 이동형 베이스라인 설계는 물리적 케이블의 제약을 풀어주지만, 무선 통신이라는 불확실성의 바다(Jitter, Latency)를 수학적 필터링(Timeout 컷오프, 1/2차 미분항 기반 Extrapolation)으로 극복해 내야만 하는 고난이도의 비동기 제어 시스템(Asynchronous Control System)이라 할 수 있다.