18.2 메시지 생태계: `.msg` 정의부터 C/C++ 소스 코드 생성까지의 파이프라인

18.2 메시지 생태계: .msg 정의부터 C/C++ 소스 코드 생성까지의 파이프라인

uORB(Micro Object Request Broker) 아키텍처가 제로 카피(Zero-copy) 기반의 초고속 성능을 발휘하려면, 통신에 참여하는 발행자(Publisher)와 구독자(Subscriber)가 메모리에 적재될 “데이터 구조체의 정확한 형태(Memory Layout)“를 사전에 완벽하게 합의하고 있어야 한다. PX4는 이 합의를 런타임이 아닌 컴파일 타임(Compile-time) 에 강제함으로써 최고의 성능을 끌어낸다.

본 절에서는 개발자가 단순한 텍스트 파일(.msg)을 작성하는 것만으로, 어떻게 복잡한 C/C++ 헤더 파일과 발행/구독 인터페이스 코드가 자동으로 생성(Generation)되어 펌웨어에 이식되는지 그 전체 파이프라인 생태계를 조망한다.

1. .msg 파일: 데이터 구조의 단일 진실 공급원(SSOT)

PX4-Autopilot 소스 코드 트리의 최상위에는 msg/ 라는 디렉토리가 존재한다. 이 디렉토리는 기체의 핵심 상태를 나타내는 수십~수백 개의 텍스트 파일들로 채워져 있으며, 이 파일들의 확장자가 바로 .msg 이다.

방향타 페달, 센서 퓨전 결과, 혹은 모터 PWM 출력값 등 PX4 내에서 굴러다니는 모든 유의미한 데이터는 반드시 이 msg/ 디렉토리 내에 .msg 파일 형태로 정의되어야 한다. 즉, .msg 파일은 PX4 시스템 전체를 관통하는 데이터 스키마의 단일 진실 공급원(Single Source of Truth) 역할을 수행한다.

2. ROS 메시지 문법(Syntax)의 차용

흥미롭게도 PX4의 .msg 규칙은 ROS(Robot Operating System)의 메시지 정의 문법과 거의 동일한 형태를 띠고 있다.

  • 기본 구조: [타입] [변수명] 의 형태를 따른다. (예: uint64 timestamp, float32[3] xyz)
  • 타입의 엄격성: int, long과 같은 모호한 C 표준 타입 대신, 플랫폼 독립적으로 크기가 고정된 uint8, int32, float64 등의 명시적 타입만을 허용하여 마이크로컨트롤러 간의 크기 호환성 문제를 미연에 방지한다.
  • 상수 선언: uint8 MODE_MANUAL = 1 과 같은 형태로 열거형(Enum) 상수를 정의할 수 있으며, 주석(#)을 통해 각 필드의 물리적 단위(Unit)를 문서화하는 것을 강력히 권장한다.

3. 코드 생성(Code Generation) 파이프라인 개요

개발자가 새로운 센서를 추가하기 위해 msg/my_custom_sensor.msg 파일을 작성했다고 가정하자. 개발자가 펌웨어 빌드 명령(make px4_fmu-v6c_default 등)을 내리는 순간, 시스템 내부에서는 어떠한 마법이 일어날까?

C/C++ 언어 자체는 .msg라는 텍스트 파일을 곧바로 컴파일할 능력이 없기 때문에, PX4 빌드 시스템은 중개자 역할을 하는 자동 코드 생성 파이프라인을 가동한다.

  1. 변환 스크립트 트리거: CMake 빌드 시스템이 msg/ 디렉토리의 변경 사항을 감지하여 Python 기반의 파서(Parser) 툴체인을 깨운다.
  2. 의존성 분석 및 템플릿 매칭: 툴체인은 .msg 파일을 읽고, 필드 타입과 정렬(Alignment) 규칙, 의존하는 다른 .msg 파일들의 트리를 렉시컬(Lexical)하게 분석한다. 그 후 Jinja2 템플릿 엔진을 사용하여 C/C++ 소스 코드를 찍어낸다.
  3. 헤더(*.h) 및 소스(*.cpp) 파일 생성: 이렇게 생성된 산출물은 빌드 파일이 모이는 임시 디렉토리(보통 build/.../uORB/topics/)에 my_custom_sensor.h 등의 형태로 저장된다.

최종적으로 비행 제어기 코드를 작성하는 모듈 개발자는, 단지 이 자동 생성된 헤더 파일(#include <uORB/topics/my_custom_sensor.h>)을 인클루드하기만 하면 발행자나 구독자를 10줄 이내의 API 호출만으로 쉽게 구현할 수 있게 된다.

이어지는 절에서는 이 웅장한 코드 자동 생성 파이프라인을 지휘하는 CMake 빌드 시스템의 스크립트 구동 원리부터 Python 파서의 내부 분석 알고리즘까지 한 단계씩 심층적으로 해부해 볼 것이다.