19.1.3. 커스텀 모듈(Custom Module) 워크스페이스 구축

19.1.3. 커스텀 모듈(Custom Module) 워크스페이스 구축

개발용 우분투(Ubuntu) OS 하드웨어 환경과 VSCode 툴체인의 딥 인텔리센스 지망 매핑이 완벽하게 마무리되었다면, 드디어 가혹한 비행 제어기 보드 위에서 독자적으로 살아 숨 쉴 나만의 독립적인 소프트웨어 생명체(Daemon)를 잉태할 물리적인 공간을 마련할 차례이다. PX4-Autopilot의 소스 트리는 수십만 줄의 코드가 거미줄처럼 뒤엉켜 있는 거대한 시스템 생태계의 바다와 같아서, 아무 디렉토리 바닥에나 C++ 파일을 툭 던져 놓고 빌드가 성공하길 기도하는 것은 완벽한 어불성설이다.
본 단원에서는 PX4 시스템의 매우 엄격한 펌웨어 아키텍처 규칙과 코딩 컨벤션(Coding Convention)을 100% 준수하면서도, 기존 코어 시스템과 완벽히 격리(Isolation)되어 타 컴파일러의 간섭 없이 독립적으로 생동할 수 있는 나만의 커스텀 모듈 워크스페이스(Workspace)를 가장 정석적으로 뚫어내는 토목 공사 과정을 해부한다.

1. 시스템과의 우아하고도 완벽한 격리: src/examples 디렉토리의 진정한 의미

Pixhawk 시스템의 방대한 펌웨어 트리를 열어보면 가장 거시적이고 핵심적인 비행 제어 및 믹서 C++ 소스 코드들은 구조적으로 src/modules (비행 모드, 자세 제어기, 네비게이터 등 시스템 메인 코어)나 src/drivers (하드웨어 센서 프로토콜 파서 등)라는 신성한 디렉토리 바운더리에 깊숙이 똬리를 틀고 존재한다.
물론 개발자가 완전히 새로운 상용 제품급 코어 EKF 필터 추정기를 밑바닥부터 짠다면 이곳에 입주하여 코어 시스템의 특권을 부여받는 것이 문맥상 알맞겠지만, 우리가 시스템 내부로 이식하려는 uORB 메시지 발행/구독 수준의 “독립적이고 실험적인(Experimental/Custom)” 애플리케이션의 경우 시스템 코어 핏줄망에 함부로 C++ 파이프를 꽂을 경우 전역 메모리의 치명적인 브랜치 오염과 파일 링킹(Linking)의 처참한 꼬임을 야기할 끔찍한 파괴 위험성이 상존한다.

이러한 리스크를 미연에 방지하기 위해 PX4 코어 아키텍트 그룹은 전 세계의 서드파티 모듈 개발자, 선행 R&D 연구원, 연습용 데몬 생성자들을 위해 기존 생태계로부터 구조적으로 물리 격리된 모래놀이터(Sandbox) 같은 완전한 독립된 성역을 하나 배려하여 지정해 두었는데, 그곳이 바로 소스 트리 깊숙한 곳의 src/examples 최하위 로컬 디렉토리이다.

실습의 주도권을 쥔 우리는 바로 시스템의 이 합법적이고 안전한 빈틈을 차갑게 파고들어 다음과 같은 세 가지 물리적 객체 뼈대(Skeleton) 형상화 작업을 순차적으로 전개해 나갈 것이다.

  • 독립적 폴더 트리의 생성: 거대한 src/examples 하위에 나만의 이름표를 단 완전히 독립된 패키지 폴더(px4_uorb_example)를 신설하여, 타 모듈들과의 어설픈 텍스트 포인터 섞임이나 의존성 오염을 물리적으로 철저하게 원천 차단한다.
  • 스레드 메인 진입점(Main Function) 앵커 타설: 단 한 번 불리고 사라지는 단순 1회성 절차적 코드 조각 나부랭이가 아니라, 하드 리얼타임 OS인 NuttX 커널 셸(NSH)의 백그라운드 스케줄러 위에서 합법적인 백그라운드 데몬(Daemon) 통행증을 받고 영원히 살아남아 무한 루프를 도는 완전한 C++ 표준 아키텍처 진입점 파일(.cpp)의 닻을 내린다.
  • CMake 기반 자체 빌드망 고속도로 개통: 이 외딴섬 같은 독립된 폴더를 PX4 펌웨어 메인 빌드 시스템의 심장부로 합류시켜 주는 진입 고속도로 교차로 스크립트(CMakeLists.txt)를 정식으로 체결함으로써, 우리가 타이핑한 텍스트 조각들이 최종 .px4 바이너리 펌웨어 덩어리 안에 합목적성을 가진 기계어로 컴파일되어 아름답게 융합되도록 만든다.

이 기초적인 워크스페이스 컨테이너 타설 작업이 한 치의 오류 없이 깔끔하게 완료되고 나서야, 비로소 새하얀 빈 캔버스 위에 새로운 정보의 혈액인 커스텀 데이터(uORB .msg)와 이를 뿜어내고 수혈받는 핏줄(Publisher/Subscriber)을 거침없이 그려 넣는, 마법과도 같은 하드코어 C++ 설계 드로잉이 시작될 수 있는 것이다.