## 0.1 단일 운영체제 프로세스 상 복수 노드 런타임 배치를 위한 rclcpp_components 프레임워크

## 0.1 단일 운영체제 프로세스 상 복수 노드 런타임 배치를 위한 rclcpp_components 프레임워크

대규모 분산 로보틱스 시스템에서 발생하는 물리적 오버헤드를 근본적으로 절감하기 위해, ROS2 C++ 생태계는 rclcpp_components 패키지를 표준 런타임 조합(Composition) 프레임워크로 제공한다. 과거에 개발자가 개별 파일마다 선언해왔던 불필요한 main() 함수 파이프라인(초기화, 노드 할당, 스핀, 셧다운)을 제거하고, 순수한 비즈니스 로직이 담긴 클래스 정의부만을 독립적인 컴파일 단위로 추상화하여, 이들을 단일 운영체제 컨테이너 프로세스 안에 자유자재로 재배치할 수 있도록 돕는 진보된 형태의 로더(Loader) 아키텍처이다.

0.1.1 노드 독립성 추상화와 main 엔트리포인트(Entry-point)의 배제

컴포넌트 모델 세계관에서 개별 드론 서브클래스(예: 옵티컬 플로우 분석기, IMU 드라이버 등)는 rclcpp::Node 또는 그 파생 클래스를 상속받는 순수한 C++ 클래스 생태계로만 존재해야 한다. 개발자는 이 클래스의 인스턴스를 직접 메모리에 올리거나 스핀(Spin) 루프를 돌리는 main() 함수를 작성하지 않는다. 기존의 메인 함수 기반 절차적 코드는 바이너리 실행 파일(Executable)을 생성하여 해당 논리를 단 하나의 독립된 운영체제 프로세스(Process) 공간에 강제로 결박(Bound)시켜 버리기 때문이다. 컴포넌트 철학은 클래스 설계 단위와 프로세스 실행 단위를 완전히 분리(Decoupling)시켜, 노드의 배포 형태를 런타임 시점까지 지연시키는 지연 바인딩(Late Binding) 패턴을 추구한다.

0.1.2 RCLCPP_COMPONENTS_REGISTER_NODE 매크로와 클래스 팩토리(Factory)의 주입

생성된 자율 에이전트 노드 클래스가 컴포넌트로 기능하기 위한 핵심 요건은 해당 클래스의 소스 코드 하단에 선언되는 RCLCPP_COMPONENTS_REGISTER_NODE(클래스명) 매크로이다. 이 C++ 매크로는 컴파일 단계에서 치환되어 프레임워크의 뒷단에 숨겨진 보일러플레이트(Boilerplate) 코드를 자동으로 생성해 낸다.
본질적으로 이 매크로는 플러그인 팩토리(Plugin Factory) 패턴의 등록 인터페이스로서 기능한다. 동적으로 노드 클래스의 인스턴스를 생성하여 포인터를 반환할 수 있는 빌더(Builder) 함수를 C 언어의 심볼(Symbol) 형태로 노출시킴으로써, 향후 ComponentManager 컨테이너가 해당 공유 라이브러리를 열었을 때 어떤 클래스를 어떻게 초기화해야 하는지 알려주는 네비게이션 역할을 담당한다.

0.1.3 컴파일러 빌드 시스템과의 링킹(Linking) 연동

컴포넌트를 단일 프로세스 컨테이너에 배치하기 위해, CMakeLists.txt 내의 워크플로우 또한 기존의 정적 빌드 규칙(add_executable)에서 탈피해야 한다. 개발자는 소스 코드를 동적 공유 라이브러리(add_library(.. SHARED))로 빌드한 뒤, Ament 빌드 시스템이 제공하는 rclcpp_components_register_node CMake 함수를 호출하여 패키지의 메타데이터(Metadata)와 Ament 리소스 인덱스(Resource Index)에 해당 라이브러리를 컴포넌트로서 공식 등재해야 한다.
이러한 등록 절차가 완료되면, 시스템 오케스트레이터(Orchestrator)인 ros2 launch 혹은 ros2 run rclcpp_components component_container 명령을 통해 비어 있는 컨테이너 프로세스를 먼저 띄운 후, 서로 다른 패키지에 분산되어 있던 .so 파일(컴포넌트) 수십 개를 런타임 동안 이 단일 프로세스 내의 이그제큐터(Executor) 풀로 순차적으로 밀어 넣어 동기화시키는 압도적인 메모리 밀집(Memory Density) 형성이 가능해진다.