13.4.1. 단일 RTK 시스템의 PX4 파라미터(Parameter) 최적화 및 비트마스크(Bitmask) 파싱
무인 항공기(UAS)에 고정밀 측위 시스템을 도입할 때, 가장 기본적이면서도 치명적인 실수들이 빈발하는 지점이 바로 ’단일(Single) RTK 시스템’의 파라미터 설정 과정이다. 값비싼 u-blox F9P 칩셋 기반의 GPS 모듈을 Pixhawk(FC)에 연결하고 전원만 인가한다고 해서, 기체가 마법처럼 밀리미터 단위의 포지셔닝을 수행하는 것은 결코 아니다.
PX4-Autopilot의 펌웨어는 광범위한 하드웨어 호환성을 담보하기 위해 고도로 추상화된 드라이버(Driver) 및 파라미터(Parameter) 아키텍처를 지니고 있다. 본 절에서는 기체에 장착된 1개의 RTK 수신기를 EKF2(Estimator)의 핵심 센서로 끌어올리기 위한 필수 파라미터들(GPS_1_CONFIG, EKF2_GPS_CTRL 등)의 역할과, 이들이 C++ 내부 로직에서 어떻게 비트마스크(Bitmask)로 파싱되어 필터링 융합(Fusion)으로 직결되는지 상세히 분석한다.
1. 하드웨어 포트 활성화: GPS_X_CONFIG 파라미터
비행 제어기(FC)에는 여러 개의 직렬(UART/Serial) 포트가 존재하며(예: GPS 1, GPS 2, TELEM 1 등), 펌웨어는 어떤 포트에서 무슨 프로토콜의 데이터가 들어올지 사전에 알 길이 없다. 이 혼돈을 통제하는 문지기 역할을 하는 파라미터가 바로 GPS_1_CONFIG 와 GPS_2_CONFIG 이다.
사용자가 QGroundControl(QGC)을 통해 GPS_1_CONFIG 를 특정 하드웨어 포트 번호(예: 101 번, 통상적으로 GPS 1 포트 지정)로 세팅하면, 펌웨어 부팅 시(NuttX OS Init 스크립트 실행 시) gps 드라이버 데몬이 다음과 같이 구동된다.
# PX4 부팅 쉘(NuttX) 내부 로직의 슈도코드
if [ ${GPS_1_CONFIG} != 0 ]; then
gps start -d /dev/ttyS0 -b 115200
endif
- 드라이버 모듈 기동: 이 설정이 “0 (Disabled)“으로 되어 থাকলে, 아무리 물리적으로 선을 올바르게 꽂아도 펌웨어는 해당 시리얼 포트를 열지 않으므로 데이터 수신 자체가 원천 차단된다.
- 프로토콜 자동 감지(Auto-Baud/Protocol Detection):
gps드라이버는 지정된 포트에서 다양한 보드레이트(9600 \sim 460800\text{ bps})와 프로토콜(UBX, NMEA, MTK 등)을 순차적으로 스캐닝하며 연결을 시도한다.
2. uORB 메시지 발행과 sensor_gps 구조체
하드웨어와 드라이버 간의 성공적인 통신이 시작되면, 드라이버는 들어오는 바이트 스트림을 파싱하여 PX4 내부의 전역 메시지 버스인 uORB 로 sensor_gps 데이터를 뿌린다(Publish). RTK 시스템 관점에서 이 구조체 내부의 가장 중요한 필드는 fix_type 과 정도(Accuracy) 관련 파라미터이다.
fix_type: 0 (No Fix) 부터 6 (RTK Fixed)까지의 상태를 암시한다.eph,epv: 수평(Horizontal), 수직(Vertical) 오차 반경. RTK Fixed 상태가 되면 이 값은 극적으로 낮아진다 (예: 100\text{ m} \rightarrow 0.01\text{ m}).s_variance_m_s: 속도 측정치의 공분산(Variance). RTK의 반송파 위상(Carrier-phase) 연산이 활성화되면 단순 위치뿐 아니라 속도 정보도 밀리미터 단위로 엄청난 신뢰도를 갖게 된다.
3. 핵심 융합 로직: EKF2_GPS_CTRL 비트마스크 필터링
가장 고차원적이고 핵심적인 튜닝 파라미터는 EKF2_GPS_CTRL 이다. EKF2 모듈은 sensor_gps 토픽을 들여다보고 곧장 상태 벡터를 업데이트하지 않으며, 이 32비트 마스크(Bitmask) 파라미터를 통해 “어떤 정보를 어느 수준까지 수용할 것인가“를 엄격히 결정한다.
QGC 상에서 사용자는 체크박스 형태로 이 값을 설정하지만, 내부적으로 이는 2진수의 합산 코드로 번역되어 파싱된다.
| 비트 위치 | 10진수 값 | C++ 펌웨어 매크로 (ekf2_params.c) | 기능 설명 |
|---|---|---|---|
| 0 | 1 | MASK_USE_GPS_POS | 3D 위치 융합. 위/경도 및 고도 데이터를 EKF2 상태 트래킹 변수로 채택. (기본적으로 반드시 켜야 함) |
| 1 | 2 | MASK_USE_GPS_VEL | 3D 속도 융합. RTK 모듈이 반송파 도플러(Doppler) 편이로 도출한 고정밀 이동 속도 벡터를 EKF2 필터에 투입. (풍향/풍속 추정 및 드리프트 감소에 핵심) |
| 2 | 4 | MASK_USE_GPS_HDG | 단일 안테나 기반의 전진 방향(Heading) 융합. (듀얼 RTK가 아닌 싱글 모드에서는 고속 전진 시에만 유용) |
| 3 | 8 | MASK_USE_GPS_YAW | 듀얼 안테나 요(Yaw) 융합. Moving Base 설정 시 지자기 센서를 대체하는 핵심 비트. 단일 RTK에서는 반드시 꺼두어야 한다. |
3.1 단일 RTK 최적화 세팅 (Value:7)
싱글(Single) 베이스/로버 체계를 갖춘 드론의 경우, 위치와 속도, 그리고 관성 항법 시의 전진 방향(Course Over Ground) 정보를 적극 활용하기 위해 비트 0 + 비트 1 + 비트 2 = 7 의 값이 가장 권장되는 최적 세팅이다.
동일 비행경로를 수십 번 순회하는 매핑(Mapping) 드론이나 정밀 방제 기체에서 EKF2_GPS_CTRL 의 ‘속도 융합(Velocity)’ 비트가 누락될 경우(1 로만 세팅될 경우), 위치 궤적은 깔끔해 보일 수 있으나 바람이 불 때마다 기체가 미끄러지며(Slip) 경로를 벗어났다가 복귀하는 불규칙한 요동 현상(Oscillation)을 겪게 된다. 이는 IMU의 속도 적분 오차를 RTK의 정밀 속도 데이터가 제때 컷오프(Cut-off)해주지 못하기 때문이다.
결론적으로, 로컬(Base) 인프라에 천만 원짜리 장비를 쏟아붓고 캐스터에 접속했다 한들, PX4 기체 내부의 GPS_1_CONFIG 포트 오픈부터, 정밀하게 제련된 sensor_gps 메시지가 EKF2_GPS_CTRL 의 비트 연산 필터망을 어떻게 통과하여(Parsing) 메인 상태 추정 코어로 떨어지는지 이해하지 못한다면 자율 비행의 오차는 결코 \text{cm} 단위로 수렴하지 않을 것이다.