# 1. uORB 메시징 체계 및 빌드 자동화: `msg/` 및 `Tools/`

# 1. uORB 메시징 체계 및 빌드 자동화: msg/Tools/

PX4 시스템의 가장 위대한 아키텍처적 결단은, 각각의 모듈(제어기, 센서, 로거)들이 서로의 메모리 주소를 직접 참조(Pointer C/C++)하거나 의존하도록 내버려 두지 않고, 오직 uORB (Micro Object Request Broker) 라는 거대한 익명의 중앙 우체국을 통과하도록 강제한 것이다. 그리고 편지(Message)의 규격을 찍어내는 공구함이 바로 msg/Tools/ 디렉토리다.

데이터 구조체 템플릿: msg/ 디렉토리
msg/ 폴더를 열어보면 sensor_accel.msg, vehicle_local_position.msg 같은 묘한 문법의 텍스트 파일들이 수백 개 쌓여있다.
파일 안의 내용은 매우 단순하다.

uint64 timestamp       # time since system start (microseconds)
float32 x              # X position in meters
float32 y              # Y position in meters
float32 z              # Z position in meters

이것은 C++ 코드가 아닌, 언어에 종속되지 않은 순수한 ‘데이터 정의(Data Definition)’ 파일이다. uORB는 Publisher(발행자) 모듈과 Subscriber(구독자) 모듈 사이를 오가는 택배 상자의 모양을 오직 이 .msg 단위로 규격화한다.

자동생성의 마법 도가니: Tools/의 Jinja2 파이프라인
개발자가 터미널에서 make 빌드를 개시하는 즉시, 컴파일러가 C++ 코드를 물기 전에 가장 먼저 튀어나오는 해머(Hammer)들이 바로 Tools/ 폴더에 묻혀있던 Python 스크립트 군단이다.
특히 이 중 Tools/msg/generate_microRTPS_bridge.py 나 기본 메타 제너레이터 스크립트들은 msg/ 폴더의 위 텍스트 파일들을 거칠게 파싱(Parsing)한다.
Jinja2 와 EmPy 같은 템플릿 렌더링 엔진을 가동하여, 위에서 본 단순한 float32 x 텍스트 구문을 수백 줄의 난해한 C++ struct 코드 파일과 직렬화/역직렬화(Serialization/Deserialization) 코드로 폭발적으로 생성해 낸다 (build/.../uORB/topics/ 경로에 박힘).

이 오토 코드 제너레이션(Auto Code Generation) 아키텍처 덕분에 다음과 같은 두 가지 엄청난 우위를 지위를 선점한다.

  1. 인간 개발자는 멍청하고 지루한 데이터 복사(Memcpy) 로직과 패딩(Padding) 바이트 정렬 문제를 손으로 풀 필요가 없다. 스크립트가 C++ 표준에 맞춰 완벽히 찍어낸다.
  2. 만약 구조체에 float32 temp 라는 변수를 하나 추가하고 싶다면, 방대한 C++ 파일 50군데를 수정할 필요 없이 오직 원래의 .msg 파일 딱 한 줄만 추가하고 빌드를 때리면, 모든 50군데의 C/C++ 소스코드와 MAVLink 브리지까지 스크립트가 알아서 구조체를 관통시켜 동기화시킨다.

이것이 현대 펌웨어가 수십만 줄 규모로 성장하면서도 엔지니어링 파편화를 막을 수 있었던 가장 중요한 미들웨어(Middleware) 지팡이다.