13.3.1. 로컬 베이스(Local Base) 스테이션 운용 C++ 알고리즘 및 QGC 백엔드 분석
드론(Rover)이 하늘에서 획득하는 수백 개의 GPS 패킷은 오직 지상에 굳건히 자리 잡은 삼각대 위 베이스 스테이션(Base Station)이 제공하는 보정 데이터를 통해서만 밀리미터 단위의 진실성(Truth)을 획득한다. 현장에서 독립적인 로컬 베이스 시스템을 운용할 때, QGroundControl(QGC) 내부의 C++ 백엔드 아키텍처는 이 베이스 단말기와 통신하며 우주로부터 떨어지는 무수한 불확실성을 수학적으로 다듬어 낸다.
본 절에서는 로컬 베이스 스테이션이 자신의 기하학적 원점을 확립해 나가는 메커니즘을 분석하고, QGroundControl 애플리케이션의 핵심 C++ 백엔드 클래스(GPSManager, RTCMMavlink 등)가 백그라운드 스레드에서 어떠한 알고리즘을 통해 RTK 초기화 및 관제를 수행하는지 해부한다.
1. u-blox F9P 기반 로컬 베이스 스테이션 초기화 상태 머신
지상에 설치된 베이스 스테이션용 GNSS 모듈(예: HERE+ Base, Holybro RTK Base 등)에 USB 전원이 인가되면, QGroundControl은 해당 직렬 포트(Serial Port)를 가로채고 일련의 명령 스크립트를 주입하여 수신기를 ’Base Mode’로 강제 전환시킨다.
이 과정은 QGC 내부의 상태 머신(State Machine)에 의해 3단계 로직으로 흘러간다.
- 구성 주입 (Configuration Injection):
QGC의GPSManager클래스는 연결된 장치가 u-blox 프로토콜 모듈임을 인식하자마자, 수신기의 NEMA 출력을 끄고 UBX 바이너리 모드로 통신 채널을 고정시킨다. 그리고 베이스 스테이션에게 RTCM 3.3 보정 메시지(1005, 1077, 1087, 1097, 1127 등)를 1\text{Hz} 주기로 USB 스트림으로 뿜어내도록 레지스터(CFG-MSG)를 하드코딩한다. - 측량-인 (Survey-In) 모드 진입:
현장 삼각대를 아무 데나 세웠기 때문에 베이스 스테이션은 “내 절대 좌표가 현재 지구상 어디인지” 아직 알지 못한다. 따라서 스스로 대략 2~5분간 멈춰서 GPS 관측치 평균을 내며 좌표를 수렴시키는 알고리즘을 시작한다. - 고정 모드 (Fixed Mode) 전환:
위상 좌표가 지정된 임계값(Threshold, 예: 오차 반경 2\text{ m} 이내)에 도달하면TMODE3상태가 Survey-In에서 Fixed로 승격된다. 비로소 이 시점부터 RTCM 보정 데이터 스트림이 유효한(Valid) 것으로 간주되며 드론으로 전송되기 시작한다.
2. QGroundControl 백엔드의 C++ 아키텍처 분석
QGroundControl 프론트엔드(QML UI) 아래에서는 멀티 스레딩 기반의 강력한 C++ 엔진이 텔레메트리 파이프라인을 통제하고 있다. বে이스 스테이션 파트의 핵심 로직은 src/GPS/ 디렉토리 내에 구현되어 있다.
2.1 GPSManager.cc 통신 중재자
GPSManager 액티브 스레드는 데스크톱 USB나 태블릿 시리얼 포트에 새로운 GPS 디바이스가 꽂히는 순간(핫플러그 감지) 즉각적으로 활성화된다.
- 멀티플렉싱: 이 클래스는 플러그된 모듈이 단순 NMEA 송출기인지, 아니면 RTK를 수행할 수 있는 고성능 칩셋(F9P 등)인지
UBX-MON-VER폴링 명령을 때려 파악한다. 판단이 서면GPSProvider객체를 생성하여 USB 소켓의 읽기/쓰기 권한을 위임한다.
2.2 RTCM 데이터 라우팅 및 RTCMMavlink 매핑
베이스 모듈이 Survey-in을 완료하고 드디어 RTCM 바이너리 블록을 USB로 마구 토해내기 시작하면, 이 바이트 배열은 QGC 백엔드 내부의 버퍼로 쏟아져 들어온다.
여기서 시스템 아키텍트는 극도의 효율성을 추구해야 한다. 이 생(Raw) 데이터를 그대로 UDP/TCP 텔레메트리 채널에 처박으면 네트워크 대역폭(Bandwidth)이 순식간에 붕괴된다.
RTCMMavlink.cc의 파싱(Parsing):
이 클래스는 쏟아지는 RTCM 바이트 배열을 180\text{ bytes} 크기의 조각(Chunk)으로 정밀하게 칼질한다.
그리고 이 조각들을MAVLINK_MSG_ID_GPS_RTCM_DATA(233번) 패킷 구조체의 페이로드(Payload) 영역에 차곡차곡 인캡슐레이션(Encapsulation) 시킨다.- 큐 혼잡 제어 (Queue Congestion Control):
QGC는 자체적인 패킷 우선순위 분배 스케줄러를 가지고 있다. 만약 조종사가 경로점(Waypoint)을 업로드 중이거나, 다른 고순위 MAVLink 제어 패킷이 텔레메트리 라디오를 타야 한다면,RTCMMavlink스레드는 영리하게 자신의 송신 주파수를 낮추거나 1\text{Hz} RTCM 일부를 드롭(Drop)시켜 기체 통신 단절을 방어해 낸다.
3. UI 피드백 및 상태 동기화 메커니즘 (QML 연동)
사용자는 QGC 상단 헤더 아이콘의 위성 안테나 애니메이션을 통해 로컬 베이스 스테이션의 실시간 운용 상태를 파악한다. 이 직관적인 UI 피드백 뒤에는 QObject의 Signal/Slot 매커니즘이 존재한다.
- C++ 백엔드(GPSManager)는 1\text{Hz} 마다 USB를 통해 들어오는
UBX-NAV-SVIN패킷(Survey-In 진행 상태)을 디코딩한다. - 현재 계산된
Mean Accuracy(오차 반경) 수치와Duration(계측 지속 시간) 변수를 Qt Property 체계로 바인딩한다. - 만약 도달 목표치(예: 사용자가 UI에 설정한 목표 오차 2.0\text{ m}, 지속 시간 60\text{초})를 돌파하게 되면, C++ 엔진은 내부 Boolean 플래그
_surveyInValid를true로 뒤집고 시그널(Signal)을emit한다. - QML 계층에서는 이 시그널을 즉시 감지하여 UI의 베이스 스테이션 아이콘 색상을 회색(대기)에서 흰색(정상 Fixed)으로 변경하고 다이어로그에 “RTK Survey-in Completed” 메시지를 표출한다.
로컬 베이스 스테이션의 운용 알고리즘은 단지 땅에 삼각대를 세우는 행위로 끝나지 않는다. 시리얼 버스 통제권의 탈취에서부터, RTCM 생성 모드를 강제하는 구성 파일 주입, 끝없는 180\text{ bytes} MAVLink 페이로드 슬라이싱 공정, 그리고 QGC-프론트엔드로 이어지는 상태 보고에 이르기까지 C++ 파이프라인의 숨 막히는 오케스트레이션을 이해해야만 우리는 진정한 PX4 관제 통합 연동의 세계로 진입할 수 있다.