### 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_gpsuORB 토픽을 카피(Copy)해 온 뒤, MAVLink 프로토콜 명세에 정의된GPS_RAW_INT(메시지 ID #24) 구조체의 각 필드에 값을 일대일로 대입(매핑)하는 작업이 벌어진다.
0.3 직렬화(Serialization)와 캡슐화(Encapsulation)
C++ 변수에서 MAVLink 구조체로 값의 이동이 끝나면, 네트워크 전송을 위한 최종 포장 작업이 진행된다.
- 엔디안(Endian) 변환 및 패킹:
픽스호크의 CPU(ARM)는 리틀 엔디안(Little Endian)을 사용하지만, MAVLink 데이터는 아키텍처 중립적인 바이트 스트림으로 밀집(Packed)되어야 한다. 직렬화 라이브러리는 구조체의 빈 패딩(Padding)을 싹 걷어내고 순수한 데이터 바이트만 일렬로 압축한다. - 헤더(Header) 및 서명 캡슐화:
압축된 페이로드(Payload) 앞뒤로 MAVLink v2.0 규격에 맞는 봉투가 씌워진다. 앞부분에는 Magic 바이트(0xFD), 페이로드 길이, 시퀀스 번호, 송신자 시스템 ID와 컴포넌트 ID, 그리고 메시지 ID가 조립된 헤더(Header)가 붙는다. - 체크섬(Checksum) 무결성 각인:
마지막으로 페이로드 전체를 CRC-16/MCRF4XX 알고리즘으로 스캔하여 생성된 2바이트짜리 체크섬 꼬리표가 맨 뒤에 부착된다. 만약 보안(Signing) 기능이 켜져 있다면 암호학적 서명이 추가로 붙는다.
이 일련의 캡슐화 과정을 거치고 나면, 기체 내부에서 방대한 부피를 차지하던 C++ sensor_gps 토픽은, 노이즈가 들끓는 무선 링크의 거친 파도를 뚫고 지상 관제소까지 무사히 도달할 수 있는 작고 날렵한 잠수정, MAVLink GPS_RAW_INT 패킷으로 완벽하게 탈바꿈하게 된다.