### 0.0.1 ASCII 파싱의 오버헤드(Overhead) 및 높은 갱신 주기(10Hz 이상)에서의 직렬 포트 대역폭(Bandwidth) 병목 현상
과거의 고정익(Fixed-wing) 무인기 내비게이션은 1Hz(초당 1회 갱신) 통신 속도로도 충분한 제어가 가능했다. 그러나 현대의 쿼드콥터(Quad-copter)나 고성능 자율주행 로버(Rover)에 탑재되는 EKF(Extended Kalman Filter) 추정기는 기체의 극단적인 동역학(Dynamics)을 추종하기 위해 최소 5Hz, 권장 10Hz~20Hz 이상의 빠른 위치 정보 갱신을 게걸스럽게 요구한다.
이러한 고속 갱신 환경(High Update Rate)에서 NMEA 0183 ASCII 프로토콜을 그대로 덮어놓고 사용하는 것은, 좁은 골목길에 초대형 화물차를 구겨 넣는 것과 같은 치명적인 직렬 포트 대역폭(Serial Bandwidth) 병목 현상을 초래하게 된다.
0.1 전송 대역폭(Bandwidth) 관점의 비효율성 계산
NMEA 기반의 1회 GPS 위치 업데이트 사이클(Epoch)을 완성하기 위해서는 보통 $GPGGA, $GPRMC, $GPVTG 세 문장이 한 묶음으로 전송되어야 한다. 위성의 개수와 좌표 자릿수에 따라 다르지만, 이 세 문장 세트는 공백과 제어 문자를 포함하여 통상 250바이트(Bytes) 이상의 ASCII 문자열 덩어리를 이룬다.
- 9600 bps의 악몽: UART 통신 규격에서 1바이트를 전송하려면 시작 비트(Start bit)와 정지 비트(Stop bit)를 포함해 대략 10비트(Bits)가 필요하다. 250바이트를 전송하려면 약 2500비트의 대역폭을 타격하게 된다.
만약 초보 설계자가 NMEA 초기 기본 속도인 9600 bps(bits per second) 보드레이트(Baudrate)를 그대로 방치했다면, 1회 업데이트 전송에만 무려 2500 / 9600 \approx 0.26초(260ms)가 소모된다. 즉, 물리적으로 초당 3.8번(3.8Hz) 이상의 갱신은 불가능하다는 계산이 나온다. - GPS 수신기 내부에서 10Hz 연산을 마쳐 기체로 쏘아주려 해도, 전송 통로(UART Tx/Rx) 자체가 병목이 되어 큐(Queue)가 막히거나 패킷이 지연 전송(Latency)되어 버리는 참사가 발생한다.
0.2 MCU 인터럽트 오버헤드(Interrupt Overhead)와 CPU 스레싱(Thrashing)
문제가 대역폭 하나로 끝나지 않는다. 115200 bps 이상으로 통신 속도를 무리하게 끌어올려 대역폭 문제를 우회하려 시도할지라도, 메인 프로세서(STM32 등)가 받아내야 하는 소프트웨어적 파싱 오버헤드가 발목을 잡는다.
- 문자 단위 인터럽트 부하: 바이너리 패킷은 헤더(Header)의 페이로드 길이(
length) 필드를 먼저 읽은 후, DMA(Direct Memory Access)를 통해 한 번의 청크(Chunk)로 메모리에 블록 전송을 시켜버릴 수 있다. 그러나 길이 가변형의 텍스트 스트림인 NMEA는 CPU가 매 바이트 인터럽트마다 깨어나서 “이 문자가 쉼표인지, 엔터키인지” 확인해야 한다. - 만약 10Hz 속도로 250바이트 NMEA 세트를 쏟아붓는다면, 제어기 프로세서는 오직 GPS 데이터를 쪼개어 읽어 들이는 데에만 초당 2500번의 컨텍스트 스위칭(Context Switching) 및 RX 인터럽트 처리에 내몰리게 된다. 이는 IMU 등 더 화급한 다른 센서의 실시간 샘플링 주기를 위협하는 치명적 설계 결함이다.
0.3 고속 갱신(High-rate)을 위한 타협 및 바이너리로의 전환
PX4의 디폴트 파라미터(Parameter) 환경에서는 이러한 NMEA의 물리적/소프트웨어적 한계를 극복하기 위해 기본적으로 다음과 같은 자동화 방책을 실시한다.
- 동적 보드레이트 상향 조정(Baudrate Escalation):
PX4의gps드라이버는 NMEA 모듈을 9600bps로 최초 감지하자마자, 역방향 직렬 쓰기 제어 명령(Proprietary Set-command)을 쏘아보내 강제로 모듈의 통신 속도를 115200bps 이상으로 끌어올린다. 이를 통해 일단 물리 파이프라인(UART)의 물길을 넓혀 병목을 해소한다. - 쓸모없는 서브 문장 억제(Sentence Muzzling):
GSV, GSA 등 위성 맵 구조나 에페메리스(Ephemeris)를 장황하게 열거하는 불필요한 장문 텍스트가 10Hz 속도로 함께 쏟아지지 않도록, PX4는 해당 서브 메시지들의 출력 빈도를 1초 단위(1Hz)로 낮추거나 아예Mute시켜 오더 단위(Order-level)의 텍스트 부하를 걷어낸다. - 바이너리 패러다임으로의 강제 전환:
궁극적으로, 만약 연결된 모듈이 단순 NMEA 전용 칩이 아닌 u-blox 호환 칩셋(PX4 표준)이라면, 위와 같은 텍스트 파싱을 조기에 단념시킨다. 초기 NMEA 텍스트 포맷으로 모듈이 감지되더라도 PX4는 즉시UBX-CFG-PRT설정 바이너리 코드를 주입하여 NMEA 출력을 강제로 꺼버리고, 압축률이 극대화된 고밀도 바이너리 프로토콜(UBX) 스트림을 토출하도록 하드웨어 자체 설정을 런타임에 재프로그래밍(Reprogramming)해버린다. 변환된 바이너리 프로토콜 구조에 대해서는 이어지는 절에서 구체적으로 다룬다.