28.2.2. 소스 코드 디렉터리 및 빌드 시스템(`src/modules/flight_mode_manager`)

28.2.2. 소스 코드 디렉터리 및 빌드 시스템(src/modules/flight_mode_manager)

아무리 C++ 문법적으로 추상화된 우아한 소프트웨어 아키텍처 철학과 코딩 패턴이라 한들, 결국 그것들은 실제 소스 코드 파일(Source Files)이 하드디스크 디렉터리 노드상에 물리적으로 어떻게 수직/수평 배치되고 컴파일(Compile) 빌드 시스템에 얽혀 묶여 있는지, 그 노골적인 종속성 트리(Dependency Tree) 구조로 가장 솔직하고 정직하게 밑바닥이 드러나기 마련이다.

PX4의 지연 할당 다이나믹 태스크 스위치 마법이 매초 치열하게 일어나는 핵심 무대인 펌웨어 소스 트리 src/modules/flight_mode_manager 디렉터리의 지형 구조와, 이를 엮어내는 CMake 빌드 타임(Build-time) 시스템의 메타(Meta) 바인딩 원리를 해부해 본다.

1. 물리적 디렉터리 레이아웃(Directory Layout)의 완벽한 모듈화 철학

flight_mode_manager (이하 FMM) 루트 폴더 내부에 진입해 보면, 철저하게 피 튀기는 오케스트라의 ‘지휘자(FMM Manager)’ 공간과 수학 연산을 수행하는 ’연주자(Flight Tasks)’들의 공간으로 거대한 이등분 장벽이 물리적으로 격리 쳐져 있다.

  • 최상위 계층 디렉터리 (오케스트라 지휘자의 공간):
  • FlightModeManager.cpp / .hpp: 워크 큐(Work Queue) 커널 스케줄링 제어, uORB 이벤트 토픽 구독 및 발행, 메모리 팩토리 할당 및 추상 nav_state 전환 트랜잭션을 철권 통치 관장하는 중앙 브로커(Broker) 본체 파일들이다.
  • 명심할 점은, 이 위대한 최상위 루트 공간에는 실제 드론을 움직이는 삼각함수 물리 궤적 PID 수식이나 회피 생성 수학적 알고리즘(Algorithm) 로직이 단 한 줄의 C++ 코드도 존재하지 않는다는 점이다. 오직 행정과 통제 스크립트만이 삭막하게 존재한다.
  • tasks/ 하위 서브 디렉터리 계층 (독립된 연주자들의 샌드박스 공간):
  • tasks/FlightTask/: 이곳에는 모든 파생 비행 모드의 설계도 뼈대가 되는 FlightTask (최상위 순수 가상 부모 클래스 템플릿 인터페이스) 헤더가 정의 파일로 선언되어 있다.
  • tasks/ManualPosition/, tasks/AutoMapper/, tasks/AutoLine/ 등: 실제 사람이 스틱을 쳤을 때 수동 위치 제어 가속도를 스무딩하거나, 자율 비행(Mission) 웨이포인트 이동 매트릭스 계산 로직을 땀 흘리며 담고 있는 C++ 구체적 파생 파편 객체 소스들이, 각각 완벽히 독립된 자신의 이름표가 지어진 서브 폴더 방(Room) 하나씩을 프라이빗하게 꿰차고 샌드박스 캡슐로 고립되어 처박혀 들어앉아 있다.

이러한 숨 막히도록 모듈화되고 파편화 캡슐링된 물리적 폴더 도메인 구조 덕분에, 코어 개발자가 FMM 본체 브로커 엔진 OS 레벨의 버그를 디버깅할 때와, 대학원생이 커스텀 비행 모드의 위치 가속도 수학 수식을 미세 튜닝할 때 열어야 하는 에디터의 작업 컨텍스트(Context Workspace) 창이 완벽하게 둘로 분리되어, 뇌 용량의 인지적 복잡성(Cognitive Overload)을 극한으로 대폭 낮춰주는 쾌적한 개발 경험을 선사한다.

2. CMakeLists.txt 스크립트 기반의 OCP(Open-Closed Principle) 빌드 결합

FMM 아키텍처가 전 세계의 수많은 로보틱스 연구자들의 무한한 커스텀 자율 비행 모드 확장성(Scalability) 테스트 도화지로 압도적 각광을 받는 진짜 핵심 이유는, 단순한 C++ 객체 클래스 상속 레벨을 넘어서서 ソース 코드(C++) 레벨의 직접적인 타이핑 수정을 거의 0으로 최소화하도록 고도로 설계된 영리하고 변태적인 CMake 빌드 매크로 메타 프로그래밍 시스템 덕분이다.

  • 스태틱 팩토리 레지스트리(Registry)의 완전 자동화 부트스트래핑:
    연구자가 획기적인 동적 회피 알고리즘을 담은 완전히 새로운 커스텀 비행 모드 산출물(예: tasks/MyAwesomeAvoidance/) 폴더를 밑바닥부터 새로 만들었다 하더라도, FMM 루틴 코어 뼈대 메인 소스 파일인 FlightModeManager.cpp 본문을 텍스트 에디터로 덜덜 떨며 열어서 거대한 switch-case 분기문 몸통 어딘가에 내 모드 파생 포인터 이름을 비집고 메스로 수술하여 억지로 꿰매 하드코딩(Hard-coding) 타이핑해 넣을 필요가 단 1%도 존재하지 않는다.
  • 컴파일 타임(Compile-time) 매크로 자동 바인딩 마술:
    개발자는 단지 디렉터리 tasks/ 루트 공간에 얌전히 놓여 있는 CMakeLists.txt 파일 안의 서브모듈 빌드 타겟(Module Targets) 배열 리스트 텍스트 배열에 내 모드 폴더 이름 단 한 줄(MyAwesomeAvoidance)만 타이핑 텍스트로 가볍게 추가 기입해 주면 모든 수술이 허탈하리만치 허무하게 우아하게 끝난다.
    콘솔 터미널에서 make px4_fmu-vX_default 빌드 명령어가 떨어지면, CMake 매크로 메타 스크립트가 C++ 컴파일이 채 시작되기도 전인 빌드 파싱 타임 1단계에 폴더 리스트를 파이썬 스크립트 돌리듯 텍스트로 동적 와일드카드 스캔해버린다. 곧이어 자신이 스캔하여 찾아낸 모든 존재하는 비행 타스크 클래스 폴더들의 헤더 파일명과 팩토리 생성자(Constructor) 포인터 주소를 한데 긁어모아 커대한 연결고리 매핑 C++ 브릿지 헤더 파일 소스 코드 조각을 자기 스스로 **자동 생성(Auto-generation text)**하여 코어 루틴 엔진에 링커 단계로 냅다 주입(Injection) 해 버리기 때문이다.
  • 소프트웨어 공학의 ‘개방-폐쇄 원칙’ 진정한 현실 완성:
    FMM 엔진 본체의 핵심 OS 연동 C++ 소스 코드는 수십 년간 절대 한 줄도 수정할 필요 없이 튼튼하게 잠겨 굳게 닫혀(Modified/Closed) 있으면서도, 외부 모듈의 창의적인 수학적 기능 확장이나 무한한 종류의 이종 회피 수학 로직(Task Extensions) 추가 편입에 대해서는 그냥 새 폴더를 하나 옆에 더 파고 텍스트 스크립트 파일에 이름 한 줄 더 추가하는 행위만으로 포용력 있게 우주 무한히 열려(Extended/Open) 있는, C++ 교과서에나 나올법한 모던 시스템 디자인 패턴의 지극한 정수를 현실 드론 로보틱스 판에 그대로 시연해 보여준다.