Component로 정의된 Node를 Composable Node라 하며, Composable Node 들이 하나의 컨테이너(단일 프로세스)에서 실행하는 형태를 Node Composition 이라 한다.
Component
Component는 ROS2 노드의 코드를 특정 방식으로 구조화한 것을 의미한다.
일반적인 독립 실행(Standalone) 노드와 달리, Component는 다른 노드와 같은 프로세스 내에 묶여서 실행될 수 있는 재사용 가능한 구성 요소로 설계된다.
이는 여러 노드가 하나의 프로세스 공간을 공유할 수 있도록 하여 시스템의 모듈성과 효율성을 높인다.
Composable Node
Composable Node는 Component로 정의된 노드를 지칭한다.
Node Composition 아키텍처에서 다른 Component들과 함께 하나의 컨테이너(프로세스) 내에서 실행될 수 있도록 구현된 노드를 말한다.
Node Composition
Node Composition은 여러 Composable Node(Component)들이 하나의 운영체제 프로세스(컨테이너) 내에서 함께 실행되는 ROS2의 아키텍처 패턴이다.
이 방식을 통해 한 컨테이너 안에서 묶여서 돌아가는 Composable Node끼리는 단일 PID(Process ID)를 공유하며, std::shared_ptr 형태로 메모리 주소값만 넘겨주는 Zero-Copy 통신이 이루어진다.
Zero-Copy 통신은 일반적인 노드 간의 데이터 복사(IPC, Inter-Process Communication)에 비해 데이터 전송 지연시간과 CPU 오버헤드를 대폭 줄여주는 핵심적인 장점이다.
예를 들어,ROS2에 기본 설치된 v4l2_camera 패키지는 독립 실행(Standalone Node)과 컴포넌트 실행(Composable Node)을 둘 다 지원하도록 제작되어 있다.
독립 실행 (Standalone): 각 노드가 rclcpp 런타임, 미들웨어(DDS), C++ 표준 라이브러리 등을 중복으로 메모리에 할당함.
컴포넌트 실행 (Container): 단 하나의 PID(프로세스) 안에서 rclcpp 런타임과 스레드 풀을 공유하므로, RAM 사용량이 획기적으로 줄어들고 CPU 컨텍스트 스위칭(Context Switching) 오버헤드 최소화.
컴포넌트에서 Zero-Copy 실행 (Container+Zero-Copy) :use_intra_process_comms 옵션을 통해 Zero-Copy를 활성화 하면 활성화된 노드끼리의 통신은 단일 프로세스의 메모리 주소를 그대로 넘겨주기 때문에 메모리 복사가 이루어 지지 않아 가장 빠르다.
Node Composition 구성 및 설정
Composition에 구성될 노드들을 Component로 정의하고, launch 파일에서 컨테이너로 실행할 노드들과 Standalone으로 실행할 노드들을 구성하여 실행 할 수 있다.
#include <rclcpp_components/register_node_macro.hpp> // 컴포넌트 등록 헤더 추가
클래스 생성자 컴포넌트 명시
class YoloOrtDetectorNode : public rclcpp::Node {public: // Composable Node는 컴포넌트 컨테이너가 생성자 인자(NodeOptions)를 주입하므로 // 생성자 형태가 아래와 같아야 함 (options를 부모 생성자로 전달) explicit YoloOrtDetectorNode(const rclcpp::NodeOptions & options = rclcpp::NodeOptions()) : Node("yolo_ort_detector_node", options) { // ~~~ }
코드 최하단 클래스를 컴포넌트 시스템에 등록하는 매크로 추가
// 컴포넌트 플러그인 등록 매크로를 명시한다.// 이 매크로는 내부적으로 "이 C++ 클래스를 .so 라이브러리 파일 바깥으로 노출(Export)시켜서,// ROS 2 컨테이너가 라이브러리를 열었을 때 클래스를 찾아낼 수 있도록 등록해 주는 함수"를 만들어낸다.RCLCPP_COMPONENTS_REGISTER_NODE(YoloOrtDetectorNode)