### 0.0.1 대역폭 절약을 위한 MAVLink 메시지 스트리밍 레이트(Streaming Rate) 동적 조절 로직

### 0.0.1 대역폭 절약을 위한 MAVLink 메시지 스트리밍 레이트(Streaming Rate) 동적 조절 로직

sensor_gps 데이터를 비롯하여 기체에서 생산되는 수많은 uORB 토픽들을 무작정 100%의 비율로 MAVLink로 변환해 지상으로 쏘아 보낸다면, 텔레메트리 모뎀(900MHz / 433MHz SiK Radio 등)의 협소한 대역폭(Bandwidth)은 수초 내에 포화 상태(Congestion)에 빠지고 말 것이다. 패킷 드롭(Drop)이 발생하고, 조종사의 GCS 화면은 뚝뚝 끊기며, 최악의 경우 통신 모듈 자체가 다운될 수 있다.

이 대재앙을 막기 위해 PX4의 MAVLink 모듈은 무선 링크의 물리적 대역폭을 낭비하지 않도록, 각 메시지의 송출 헤르츠(Hz)를 조타실(Config)에서부터 동적으로 제어하는 스트리밍 레이트(Streaming Rate) 제어 알고리즘을 심장부에 품고 있다.

0.1 전송 주기의 결정권자: configure_stream()

특정 MAVLink 메시지(예: GPS_RAW_INT)가 1초에 몇 번 GCS로 송출될지는 하드코딩된 값이 아니다. 시스템 부팅 시, 혹은 사용자가 QGroundControl을 통해 파라미터를 변경할 때마다 mavlink_main.cpp 내부의 configure_stream() 함수가 호출되어 송출 레이트(Rate)를 결정한다.

  • PX4는 텔레메트리 포트의 목적(Telemtry 1, Telemetry 2, Onboard Companion Computer 등)에 따라 기본 스트리밍 프로필(Profile)을 가지고 있다.
  • 예를 들어 일반적인 SiK 텔레메트리 라디오 프로필의 경우, GPS_RAW_INT 메시지는 초당 5회(5Hz) 수준으로 interval 값이 할당된다. 반면 USB나 와이파이(UDP)처럼 대역폭이 광활한 매체에는 10Hz 또는 그 이상의 빠른 주기가 할당되기도 한다.

0.2 토큰 버킷(Token Bucket) 유사 알고리즘을 통한 스로틀링(Throttling)

configure_stream()에서 5Hz(\approx 200\text{ms} 주기) 배정을 받았다고 해서 무조건 200ms마다 메시지가 나가는 것은 아니다. MAVLink 스트림 구동 스레드는 현재 텔레메트리 하드웨어의 Tx 버퍼(전송 대기열) 상태를 실시간으로 감시하며 유동적으로 스로틀링(Throttling)을 건다.

  1. Interval 검사: 각 MavlinkStream 자식 클래스는 이전에 자기가 GCS로 메시지를 날렸던 마지막 타임스탬프(_last_sent)를 기억하고 있다. 메인 루프가 돌 때마다 현재 시각과 비교하여, 배정받은 주기(예: 200ms)가 경과했는지 일차적으로 검사한다.
  2. 가용 대역폭(Available Bandwidth) 평가: 주기가 지났다고 바로 send()를 때리지 않는다. 그 이전에 현재 직렬 포트(Serial Port)의 링 버퍼에 이 패킷을 밀어 넣을 충분한 빈 공간(Free Space)이 있는지, 그리고 자신이 설정한 전체 대역폭 할당량(Total Bandwidth Allocation)을 초과하지 않았는지 계산한다.
  3. 동적 강등(Dynamic Degradation): 만약 무선 환경이 악화되어 텔레메트리 송신 버퍼가 꽉 찼다면 어떻게 될까? PX4는 이 패킷 전송을 강제로 건너뛴다(Skip). 이 과정이 반복되면 5Hz로 설정된 GPS 패킷이 실제로는 2Hz나 1Hz로 뚝뚝 끊겨서 나가게 되는데, 이는 PX4가 통신 마비(Blackout)를 막기 위해 스스로 스트리밍 레이트를 강등(Degradation)시킨 결과다.

0.3 변화 감지 기반(Delta-based) 송신 최적화

주기를 단순히 시간 기반으로만 자르는 것에 만족하지 않고, 최신 PX4 아키텍처는 토픽의 실질적인 ‘내용물 변화’ 여부를 전송 조건으로 삼는다.

  • EKF2나 센서 드라이버가 고장 등의 이유로 똑같은 구형 좌표만 uORB에 계속 밀어 넣고 있다면, MAVLink 모듈은 구독한 sensor_gps 구조체를 이전 데이터와 비교(memcmp)하여 값의 변화(Delta)가 없으면 전송 주기가 도달했더라도 송출을 과감히 생략(Mute)한다.
  • 이는 의미 없는 중복 데이터를 필터링함으로써 금쪽같은 텔레메트리 대역폭을 절약하고, 배터리 상태(SYS_STATUS)나 긴급 자세(ATTITUDE) 같은 더 치명적인 패킷에 버스 통행권을 우선 양보하는 탁월한 네트워크 트래픽 셰이핑(Traffic Shaping) 기법이다.

이처럼 MAVLink 모듈의 동적 스트리밍 조절 로직은, 하늘에 떠 있는 드론과 지상의 조종사 사이를 잇는 보이지 않는 무선 탯줄(Tether)이 끊어지지 않도록 보호하는 최고 수준의 소프트웨어 안전장치라 할 수 있다.