13.4.1.1. GPS_1_CONFIG, GPS_1_GNSS (GPS, Galileo, GLONASS, BeiDou) 비트마스크 파싱 및 드라이버 초기화(Init) 시퀀스
PX4-Autopilot에서 가장 방대하고 무거운 센서 드라이버 중 하나인 gps 데몬(Daemon)은, 드론의 전원이 커짐(Boot-up)과 동시에 NuttX(혹은 Linux)의 시작 스크립트(Startup Script)에 의해 호출동된다. 이 드라이버가 깨어나서 가장 먼저 수행하는 작업은 사용자가 세팅한 파라미터 메모리를 뒤져 하드웨어 포트를 열고, 장착된 GPS 칩셋(예: u-blox, Trimble 등)과 통신 협상을 개시하는 일이다.
본 절에서는 GPS 모듈의 하드웨어 활성화를 관장하는 GPS_1_CONFIG 파라미터와, 전 지구적 위성 인프라(Constellation)의 수신 범위를 결정짓는 GPS_1_GNSS 파라미터가 C++ 계층에서 어떻게 비트마스크(Bitmask)로 파싱(Parsing)되어 실질적인 모듈 초기화(Initialization) 시퀀스로 이어지는지 소스 코드 레벨에서 명확히 해부한다.
1. 하드웨어 포트 매핑: GPS_1_CONFIG
PX4 시스템은 기판(Board)마다 시리얼 포트(Serial Port)의 핀 개수와 논리적 이름이 모두 다르다(Pixhawk 4, Durandal, Pixhawk 6C 등). GPS_1_CONFIG 파라미터는 논리적 컴포넌트 넘버를 OS 커널의 물리적 디바이스 노드(예: /dev/ttyS0)로 매핑하는 인터페이스다.
1.1 파라미터 값 메커니즘
QGroundControl(QGC)에서 이 파라미터는 편의상 드롭다운(Drop-down) 메뉴로 제공되지만, 내부적으로는 특정 포트를 지칭하는 정수형 ID(Integer ID)를 갖는다.
- Disabled (0):
gps드라이버 데몬 시작 스크립트에서 스킵을 지시한다. - GPS 1 (101), TELEM 1 (102) 등: 부팅 스크립트인
rc.sensors내에는 이 ID 값을 파싱하여, 베이스 플라이트 보드(Base flight board)에 정의된 장치 트리를 탐색하고 일치하는 UART 경로를 찾아낸다.
1.2 프로토콜/보드레이트 오토바우드(Auto-baud) 탐색 시퀀스
포트가 확인되면 src/drivers/gps/gps.cpp 메인 문에서 GPS_1_PROTOCOL 세팅에 맞춰 장치 초기화가 시작된다.
u-blox 칩셋(PROTOCOL_UBX)으로 설정된 경우, C++ 로직은 낡은 칩셋과 최신 칩셋을 모두 호환하기 위해 배열로 정의된 보드레이트(Baudrate) 스윕(Sweep) 함수를 가동한다.
// 펌웨어 내 Auto-baud 스윕 유사 로직
const int baudrates[] = {115200, 38400, 9600, 460800, 230400};
for (int baud : baudrates) {
set_baudrate(uart_fd, baud);
if (test_ubx_connection()) {
// 성공적으로 연결됨!
break;
}
}
- 만약 u-center 등으로 GPS 칩셋 내부 보드레이트를 460800 으로 억지로 고정해 두었다 하더라도, PX4의 센서 드라이버는 오토바우드 스위핑을 돌며 결국 해당 보드레이트에서 UBX ACK(응답)를 받아내고 초기화 루틴의 1단계를 통과한다.
2. 위성군(Constellation) 선택의 미학: GPS_1_GNSS বি트마스크
오토바우드를 통과한 드라이버는 이제 칩셋에게 “너는 어떤 나라의 위성들을 추적(Tracking)할 것인가?“를 명령해야 한다. 이것이 바로 GPS_1_GNSS 파라미터의 역할이며, 다수 위성군의 중복 조합을 표현하기 위해 전형적인 비트마스크(Bitmask) 산술 기법이 동원된다.
2.1 비트 플래그(Bit Flag) 구성
소스 코드 내에서 GPS_1_GNSS 에 매핑되는 변수는 8비트 정수(Integer) 형태로서, 2의 거듭제곱 값을 자릿수 플래그로 활용한다.
| 비트 인덱스 | 10진수 값 | 위성군 시스템 | 국가/운영 주체 |
|---|---|---|---|
| Bit 0 | 1 | GPS | 미국 (가장 기본적이고 필수적인 시스템) |
| Bit 1 | 2 | SBAS | 지역 기반 위성 보정 시스템 (WAAS, EGNOS 등) |
| Bit 2 | 4 | Galileo | 유럽 연합 (최신, 정밀도 높음) |
| Bit 3 | 8 | Beidou | 중국 (아시아 지역 궤도 시야각 우수) |
| Bit 4 | 16 | GLONASS | 러시아 (고위도 지역에서 성능 우수) |
2.2 최적 조합 도출과 C++ 파싱 연산
전체 활성화에 대한 고찰: 모든 비트를 1로 켠 31 (1+2+4+8+16) 설정이 무조건 좋은 것은 아니다. 구형 u-blox M8N 칩셋의 경우 연산(CPU/채널) 한계로 인해 3개 이상의 시스템을 동시 추적하면 오히려 업데이트 레이트(Update Rate)가 5\text{Hz} 미만으로 떨어지는 참사가 벌어진다. (다만 F9P 같은 고성능 RTK 칩셋은 연산 여력이 충분하여 31 세팅도 너끈히 소화해 낸다.)
펌웨어의 u-blox C++ 드라이버 클래스는 이 파라미터 값을 읽어들인 후, UBX-CFG-GNSS 메시지 패킷을 동적으로 조립하여 칩셋으로 전송한다.
// 비트마스크를 통한 UBX-CFG-GNSS 메시지 조립 유사 로직
int32_t gnss_param = get_param_value("GPS_1_GNSS");
if (gnss_param & 1) { enable_system(UBX_SYS_GPS); }
if (gnss_param & 2) { enable_system(UBX_SYS_SBAS); }
if (gnss_param & 4) { enable_system(UBX_SYS_GALILEO); }
if (gnss_param & 8) { enable_system(UBX_SYS_BEIDOU); }
if (gnss_param & 16) { enable_system(UBX_SYS_GLONASS); }
// 조립된 설정 바이너리를 UART 버스로 전송
send_ubx_message();
- 이 부분에서 비트 논리곱(
&) 연산자가 빛을 발한다. 만약 파라미터 값이 13 (8+4+1) 이라면, 코드 흐름상 비트 0, 비트 2, 비트 3 조건문만True로 평가되어 GPS, Galileo, BeiDou 시스템만 선택적으로 켜지고, რუს시아 GLONASS(16)와 SBAS(2) 수신 채널은 하드웨어 내부적으로 슬립(Sleep) 상태로 진입하여 채널 리소스를 절약하게 된다.
3. 초기화 시퀀스 완료의 의미
위의 두 과정을 무사히 거치고, PX4 펌웨어가 칩셋으로부터 “설정 완료” ACK(Acknowledgement)를 받아내면 어떻게 될까?
칩셋은 이제 PX4가 지시한 위성군만을 쫓아 안테나로 신호를 수집하고, 약속된 5\text{Hz} \sim 10\text{Hz} 주기에 맞추어 UBX-NAV-PVT (위치/속도/시간) 등 필수 데이터들을 시리얼 선으로 쏟아내기 시작한다.
이것이 바로 GPS_1_CONFIG 와 GPS_1_GNSS 라는 단순한 숫자의 조합이 C++ 드라이버 계층의 비트 파싱(Bit Parsing)을 거쳐 차가운 실리콘 칩셋의 라우팅 구조를 통째로 재편성하는 감각적인 임베디드 시퀀싱(Embedded Sequencing)의 정수이다.