# 1. MAVLink 직렬화(Serialization) 데이터의 내부 mission_item_s 메모리 레이아웃 역직렬화(Deserialization) 매핑
GCS(지상 관제 시스템)에서 디자인된 가상의 비행점(Waypoint)이 PX4-Autopilot 비행 제어기의 뇌수에 안착하기 위해서는 전혀 다른 두 가지 데이터 패러다임 간의 번역 과정을 거쳐야 한다. 하나는 네트워크를 비행하는 **MAVLink 직렬화 프로토콜(Serialization Protocol)**이고, 다른 하나는 기체 내부 RAM에서 C++ 객체들이 직접 연산에 사용하는 uORB 구조체(mission_item_s) 메모리 레이아웃이다.
본 절에서는 dataman과 Navigator 모듈이 이 두 영역 간의 브릿지 역할을 수행하며, 어떻게 효율적이고 무결하게 역직렬화(Deserialization) 및 구조체 매핑(Mapping)을 완수해 내는지 소스 코드 아키텍처 관점에서 해부한다.
1.1 MAVLink MISSION_ITEM_INT 통신 패킷 구조의 생체
텔레메트리(Telemetry) 무선 링크는 대역폭(Bandwidth)이 매우 한정적이고, 노이즈와 패킷 손실 확률이 높은 극한의 통신 물리 계층이다. MAVLink 프로토콜은 이 척박한 링크를 효율적으로 횡단하기 위해 MISSION_ITEM (혹은 보다 고정밀 기하학을 제공하는 MISSION_ITEM_INT)이라는 극도로 압축되고 직렬화된(Serialized) 바이트 스트림(Byte Stream) 패킷을 사용한다.
// MAVLink MISSION_ITEM_INT Payload Structure (직렬화된 C-Struct)
typedef struct __mavlink_mission_item_int_t {
float param1; // (예: Hold Time, 반경 등 가변 파라미터)
float param2; // (예: Acceptance Radius 등 가변 파라미터)
float param3; // (예: Pass Radius / 궤적 회전 각도)
float param4; // (예: Yaw 앵글)
int32_t x; // 위도 (Latitude) * 1e7 (정수형 압축)
int32_t y; // 경도 (Longitude) * 1e7 (정수형 압축)
float z; // 고도 (Altitude)
uint16_t seq; // 임무 아이템 시퀀스 인덱스 (0, 1, 2...)
uint16_t command; // MAV_CMD_NAV_WAYPOINT 등의 명령어 Enum
uint8_t target_system;
uint8_t target_component;
uint8_t frame; // 좌표계 기준 (MAV_FRAME_GLOBAL_INT 등)
uint8_t current;
uint8_t autocontinue;
} mavlink_mission_item_int_t;
이 패킷은 ’데이터의 수송’에만 철저히 초점이 맞춰져 있다. 따라서 통신 인터페이스 모듈(mavlink_receiver)이 이를 인터셉트(Intercept)하게 되면, 곧바로 하위 제어기가 소화할 수 있는 영양분인 내부 메모리 포맷으로 해체(Deserialization)하여 uORB 구조체 공간에 가지런히 적재해야 한다.
1.2 PX4 내부 mission_item_s 메모리 레이아웃 구조체
위의 MAVLink 패킷이 역직렬화 메커니즘을 거쳐 도달하는 최종 정착지는 PX4의 고유 uORB C++ 레이아웃인 msg/mission_item.msg (mission_item_s) 이다.
// msg/mission_item.msg (PX4 내부 uORB 통신 매핑 구조체)
uint64 timestamp # 마이크로초 단위의 RTOS 동기화 스탬프
float64 lat # 역산출된 부동소수점 위도
float64 lon # 역산출된 부동소수점 경도
float32 altitude # 고도 보정이 적용된 실수형 고도 추정치
float32[7] nav_cmd_param # MAVLink의 Param1~7을 포괄하는 배열
uint16 nav_cmd # 치환된 내부 네비게이션 커맨드
int8 frame # LLA, NED 등의 매핑 식별자
bool autocontinue
bool is_current
...
두 구조체를 병위 대조해 보면, MAVLink 통신 페이로드는 바이트 얼라인먼트(Byte Alignment)를 극한으로 조이기 위해 int32_t로 위경도를 압축(10^7을 곱한 스케일링)한 반면, 내부 mission_item_s는 하위 로직(mc_pos_control)이 스케일링 연산의 부하 없이 곧바로 하버사인 공식(Haversine)과 투영 방정식에 삽입할 수 있도록 64비트 배정밀도 부동소수점(float64, double) 포맷으로 이를 해체하여 매핑한 사실을 관찰할 수 있다.
1.3 역직렬화(Deserialization) 및 데이터 파싱 매핑 알고리즘
mavlink_receiver.cpp 파일 내부의 파싱 팩토리 커널에서는 GCS 프레임워크가 뱉어낸 MAVLink 바이너리 조각들을 재조립하여 mission_item_s uORB 토픽으로 매핑하는 동적 번역 작업이 전면적으로 수행된다.
- 지오메트리 패킹 해제 (Geometry Unpacking):
- MAVLink가 보낸
mission_item_int_t.x와y필드(int32_t)는 10^{-7}의 승수를 곱산(Multiply) 받아 다시 순수한 라디안/디그리 기준의float64위경도 속성으로 캐스팅(Casting) 된다. 만일 부동소수점 정밀도가 유실되는MISSION_ITEM레거시 패킷이 날아올 경우, 파서는 경고 플래그를 로그에 남기고 차선책으로 32비트 포맷을 파싱한다.
- MAV_CMD 다형성 변환 매핑 (Polymorphic Enum Mapping):
- MAVLink 명령어인
MAV_CMD_NAV_WAYPOINT(16),MAV_CMD_NAV_LOITER_TIME(19)등은 PX4 내부 상태 머신이 신속 판별할 수 있는 열거형 값인nav_cmd속성으로 정직하게 대입된다.
- 가변 파라미터 배열(nav_cmd_param) 평탄화 (Flattening):
- MAVLink 구조체에서 독립된 변수로 나뒹구는
param1,param2… 필드들은 uORBmission_item_s안에서는 하나의 연속된 메모리 배열(nav_cmd_param[7]) 스페이스로 평탄화(Flattened) 매핑된다. 이는 나중에MissionBlock계층이param값에 접근할 때 루프를 순회하거나 스위치 분기 없이 포인터 오프셋(Offset)만으로 고속 메모리 엑세스를 달성하기 위한 구조적 배려이다.
1.4 Dataman 페이징으로의 데이터 플러시(Flush)
역직렬화가 끝난 mission_item_s 구조체의 인스턴스는 곧바로 navigator로 직행하지 않는다. 통신의 패킷 뭉치는 수십 건이 1초 안에 쏟아질 수 있으므로, 앞선 30.2.2절에서 다룬 dataman 데몬의 쓰기 버퍼(Write Buffer)를 향해 배열의 인덱스(seq) 순서대로 줄지어 적재된다.
sequenceDiagram
participant MAVLink as 통신 모뎀
participant Receiver as mavlink_receiver
participant Struct as mission_item_s (RAM)
participant Dataman as Dataman (SD/RAM 캐시)
MAVLink->>Receiver: 직렬화된 Byte Stream 수신
activate Receiver
Receiver->>Receiver: 패킷 Unpacking 및 CRC 유효성 검증
Receiver->>Struct: 위도/경도 Float64 컨버팅 및 매핑
Receiver->>Struct: Param 배열화 및 enum 치환
Receiver->>Dataman: dm_write(item_index, Struct)
deactivate Receiver
Dataman->>Dataman: LRU 캐시에 임시 저장 (Dirty 락킹)
이 매핑과 저장의 수순이 미션 개수(Mission Count)만큼 모두 완벽하게 종결되고 GCS가 종결 신호(MISSION_ACK)를 방출하면, 비로소 commander는 미션이 적격하게 무결성 메모리에 탑재되었음을 승인하고 자동 비행의 스타트 권한을 오픈한다.
결과적으로, 이 직렬화 프로토콜과 내부 구상화 메모리 사이의 역직렬화 매핑 계층 파이프라인 덕분에 PX4-Autopilot은 이기종(Heterogeneous) 통신망의 거친 노이즈 환경과 바이트 제한을 이겨내고, 고정밀 연산(Float64)이 필구되는 내부 제어기의 퍼포먼스 갈증을 동시에 충족시키는 쌍방향의 혜택을 온전히 거머쥐게 된다.