28.3.1 이벤트 주도형 아키텍처 기반 콜백 함수 등록 및 미들웨어 트리거 메커니즘

28.3.1 이벤트 주도형 아키텍처 기반 콜백 함수 등록 및 미들웨어 트리거 메커니즘

로봇 응용 소프트웨어에서 서브스크립션(Subscription) 과정은 단순히 네트워크 포트를 열고 데이터를 대기하는 일차원적 행위가 아니다. ROS2의 이벤트 주도형 아키텍처(Event-Driven Architecture)에서 서브스크립션 구현은, 데이터가 도착했을 때 수행할 구체적인 연산(Callback Function)을 미들웨어 논리에 선언적으로 사전 등록(Pre-registration)하고, 해당 이벤트가 발생할 때만 CPU 자원을 할당받는 고도화된 스케줄링 패러다임을 의미한다.

1. 팩토리 메서드를 활용한 콜백 바인딩 구조

rclcpprclpy 계층에서 서브스크라이버 인스턴스를 생성할 때, 개발자는 반드시 create_subscription 내지는 이와 동등한 팩토리 메서드를 호출해야 한다. 이 메서드는 본질적으로 네 가지 독립적인 차원의 정보를 단일 컴포넌트로 결합(Binding)하는 역할을 수행한다. 이 정보에는 통신 채널을 정의하는 ‘토픽 명칭(Topic Name)’, 강타입 검증을 위한 ‘메시지 데이터 구조(IDL Type)’, 트래픽 정책을 관장하는 ‘서비스 품질(QoS, Quality of Service) 프로파일’, 그리고 데이터 수신 시 발동될 ’콜백 함수 포인터(또는 함수 객체)’가 포함된다.

등록된 콜백 함수는 즉시 실행되지 않으며, 노드 객체의 내부 메모리 주소 공간 내에 안전하게 보관된다. 서브스크립션 인스턴스가 소멸하지 않고 스코프(Scope)를 유지하는 한, 이 콜백은 해당 토픽 버스(Topic Bus)에 논리적으로 종속된 상태로 유효성을 지닌다. 이는 응용 계층의 로직을 통신 계층으로부터 물리적으로 철저하게 분리(Decoupling)하면서도, 이벤트 발생 시 즉각적으로 논리적 흐름을 연결하는 객체 지향적 브릿지 역할을 수행한다.

2. RMW(ROS Middleware) 계층의 하향식 이벤트 트리거 메커니즘

서브스크립션과 콜백의 바인딩이 완료되면, 그 정보는 ROS 클라이언트 라이브러리(RCL)를 거쳐 하부의 ROS 미들웨어(RMW) 레이어로 하달(Push down)된다. RMW 레이어는 기저의 DDS(Data Distribution Service) 구현체와 직접 통신하며 물리적인 네트워크 엔드포인트를 개방한다.

퍼블리셔측에서 발송한 네트워크 페이로드가 수신 측 커널(Kernel)의 네트워크 인터페이스 카드(NIC)를 거쳐 운영체제의 소켓 버퍼(Socket Buffer)에 적재되면, 기저 DDS 모듈은 이를 감지하여 바이트 뭉치를 완전한 형태의 상위 메시지 객체로 조립한다. 조립이 끝난 직후, DDS 계층은 RMW를 통하여 일종의 소프트웨어 인터럽트(Software Interrupt) 형태인 ’데이터 수신 이벤트’를 발생시킨다.

3. 대기셋(WaitSet)과 콜백 큐(Callback Queue)의 상호작용

수신된 이벤트는 즉각적으로 콜백 함수를 실행시키는 것이 아니라, RCL 레이어에서 관리하는 특수한 상태 감지 인프라인 멘타(Ament) 계층의 수신 버퍼 또는 WaitSet 계층으로 진입한다. 애플리케이션의 실행자(Executor) 모듈은 지속적으로 이 WaitSet을 감시(Polling 또는 Condition Variable 기반 Block)하고 있으며, 새로운 메시지가 도달하여 서브스크립션 엔터티의 상태가 활성화(Ready) 단계로 전환됨을 확인한다.

이후 준비된 콜백 함수와 수신된 실제 메시지 객체의 참조(Reference)가 한 쌍으로 결합되어 노드에 할당된 ’콜백 큐(Callback Queue)’로 전송된다. 이 정교한 트리거 메커니즘은 초고빈도의 센서 데이터가 폭주하는 상황에서도, 단일 콜백 함수의 처리가 끝날 때까지 새로운 이벤트를 안전하게 큐잉(Queueing)함으로써, 이벤트 유실을 방지하고 메모리 세그멘테이션 오류(Segmentation Fault) 없이 스레드 안전성(Thread Safety)을 보장하는 구조적 근간이 된다.