### 0.0.1 GCS 관제 통신을 위한 MAVLink 캡슐화 로직

### 0.0.1 GCS 관제 통신을 위한 MAVLink 캡슐화 로직

드론의 ’뇌’인 EKF2가 GPS 비퍼(Beeper)를 삼켰다면, 이제 그 정보를 지상에 있는 조종사에게 실시간으로 보고해야 할 차례다. QGroundControl(QGC)과 같은 지상 관제 시스템(GCS)은 PX4 내부에 떠돌아다니는 sensor_gps라는 C++ 구조체를 전혀 이해하지 못한다.
GCS와 드론 사이의 유일한 공용어는 MAVLink(Micro Air Vehicle Link) 프로토콜뿐이며, 따라서 uORB 데이터를 MAVLink 패킷으로 변환(Serialization)하여 무선 텔레메트리 모뎀으로 쏘아 보내는 전용 브리지(Bridge) 계층이 필수적이다.

본 절에서는 uORB 네트워크를 호령하던 GPS 데이터가 어떻게 아주 작은 바이트 배열인 MAVLink 패킷으로 압축(Encapsulation)되어 지상으로 하강하는지 그 송신 파이프라인의 구조를 살펴본다.

0.1 mavlink 모듈: 두 세계를 잇는 번역국

PX4 펌웨어 내의 src/modules/mavlink 디렉토리는 기체 내부의 uORB 생태계와 외부의 MAVLink 통신망(UART 텔레메트리, 와이파이 UDP 등)을 연결하는 거대한 라우팅 허브이자 번역국이다.

  • 이 모듈은 부팅 시 mavlink start 커맨드에 의해 독립적인 스레드로 구동된다.
  • 이 모듈의 가장 중요한 역할 중 하나는 uORB 토픽 구독자(Subscriber) 로 활동하는 것이다. EKF2나 로거(Logger) 모듈이 GPS 토픽을 가져가는 것과 완전히 똑같은 방식으로, mavlink 모듈 역시 sensor_gps 토픽에 빨대를 꽂고 새로운 데이터가 갱신될 때마다(updated == true) 이 값을 낚아챈다.

0.2 스트림(Stream) 클래스와 다형성(Polymorphism)

mavlink 모듈이 다루어야 할 데이터는 GPS뿐만 아니라 배터리, 자세, 고도 등 수백 가지에 달한다. 이를 단일 루프에서 하드코딩으로 처리하면 코드는 금세 스파게티가 된다. PX4는 이를 객체 지향의 다형성(Polymorphism)스트림(Stream) 아키텍처로 우아하게 분리해 냈다.

  • 모듈 내부에는 각 MAVLink 메시지 종류별로 MavlinkStream이라는 부모 클래스를 상속받는 자식 클래스들이 수십 개 정의되어 있다. (예: MavlinkStreamHeartbeat, MavlinkStreamAttitude 등)
  • GPS 데이터 송신을 전담하는 클래스는 MavlinkStreamGPSRawInt 이다.
  • 이 클래스 내부에 정의된 send() 가상 함수(Virtual Function)가 호출되면, 내부적으로 sensor_gps uORB 토픽을 카피(Copy)해 온 뒤, MAVLink 프로토콜 명세에 정의된 GPS_RAW_INT (메시지 ID #24) 구조체의 각 필드에 값을 일대일로 대입(매핑)하는 작업이 벌어진다.

0.3 직렬화(Serialization)와 캡슐화(Encapsulation)

C++ 변수에서 MAVLink 구조체로 값의 이동이 끝나면, 네트워크 전송을 위한 최종 포장 작업이 진행된다.

  1. 엔디안(Endian) 변환 및 패킹:
    픽스호크의 CPU(ARM)는 리틀 엔디안(Little Endian)을 사용하지만, MAVLink 데이터는 아키텍처 중립적인 바이트 스트림으로 밀집(Packed)되어야 한다. 직렬화 라이브러리는 구조체의 빈 패딩(Padding)을 싹 걷어내고 순수한 데이터 바이트만 일렬로 압축한다.
  2. 헤더(Header) 및 서명 캡슐화:
    압축된 페이로드(Payload) 앞뒤로 MAVLink v2.0 규격에 맞는 봉투가 씌워진다. 앞부분에는 Magic 바이트(0xFD), 페이로드 길이, 시퀀스 번호, 송신자 시스템 ID와 컴포넌트 ID, 그리고 메시지 ID가 조립된 헤더(Header)가 붙는다.
  3. 체크섬(Checksum) 무결성 각인:
    마지막으로 페이로드 전체를 CRC-16/MCRF4XX 알고리즘으로 스캔하여 생성된 2바이트짜리 체크섬 꼬리표가 맨 뒤에 부착된다. 만약 보안(Signing) 기능이 켜져 있다면 암호학적 서명이 추가로 붙는다.

이 일련의 캡슐화 과정을 거치고 나면, 기체 내부에서 방대한 부피를 차지하던 C++ sensor_gps 토픽은, 노이즈가 들끓는 무선 링크의 거친 파도를 뚫고 지상 관제소까지 무사히 도달할 수 있는 작고 날렵한 잠수정, MAVLink GPS_RAW_INT 패킷으로 완벽하게 탈바꿈하게 된다.