Chapter 20. 분산 비행 제어기 구조에서의 콜백 그룹(Callback Group) 단일화 기법
ROS 2(Robot Operating System 2) 프레임워크 기반의 자율 비행 제어 스택(Flight Control Stack)은 고주파수의 센서 신호 획득, 비행 역학 기반의 기하학적 자세 제어(Attitude Control), 그리고 저주파수의 임무 통제(Mission Control) 모듈이 분산된 노드 토폴로지 위에서 상호작용하는 복합 다중 에이전트 시스템이다. 이러한 이종 주파수의 컴포넌트가 동일한 컴퓨팅 자원 내에 혼재하게 될 경우, 미들웨어 계층에 내장된 기본 이그제큐터(Default Executor)의 라운드 로빈(Round-Robin) 방식 스케줄링 로직은 제약적인 고우선순위 제어 루프의 실행 지연(Latency)을 야기하게 된다. 이를 원천적으로 방지하고 제어 주기의 결정론성(Determinism)을 확보하기 위해, 콜백 그룹(Callback Group)의 전략적 단일화 및 실행 컨텍스트 격리(Isolation) 기법이 필수적으로 구비되어야 한다.
1. ROS 2 콜백 그룹 아키텍처 메커니즘
ROS 2의 rclcpp 클라이언트 라이브러리는 노드(Node) 내부 콜백들의 실행 동시성(Concurrency)을 통제하기 위하여 두 가지 명확한 프로그래밍 모델의 콜백 그룹 형태를 제공한다.
첫째, 상호 배타적 콜백 그룹(Mutually Exclusive Callback Group)이다. 해당 그룹에 편입된 콜백 함수들은 프레임워크 수준에서의 철저한 락(Lock) 메커니즘을 부여받아, 런타임 상에서 어떠한 경우에도 절대 병렬로 실행되지 않음을 보장받는다. 이 방식은 공유 변수에 대한 데이터 레이스(Data Race) 방지에 탁월한 효과를 지니나, 연산량이 많거나 지연 시간이 긴 입출력(I/O) 작업을 수행하는 콜백이 혼합될 경우 그룹 내 다른 단발성 통신 콜백들의 기아(Starvation) 상태를 유발할 아키텍처적 위험성을 내포한다.
둘째, 재진입 가능 콜백 그룹(Reentrant Callback Group)이다. 이 그룹으로 분류된 콜백 구조체들은 이그제큐터에 연동된 스레드 풀(Thread Pool)의 물리적 코어 자원이 허용하는 한도 내에서 병렬적(Parallel) 동시 실행이 허용된다. 연산 처리의 동시성은 향상되나 메모리 자원에 대한 스레드 안전성(Thread Safety)을 설계자가 직접 확보해야 하는 제약이 요구된다.
2. 분산 비행 제어기에서의 우선순위 역전 및 계측
다중 회전익(Multi-Rotor) 플랫폼 등 고도의 동역학적 불안정성을 내재한 드론의 비행 제어기는 각 로터(Rotor)의 인버터 제어 신호를 생성하기 위해 최소 400Hz 이상의 고정된 하드데드라인(Hard Deadline) 주기를 필수적으로 요구한다. 반면 하드웨어 헬스체크 및 원격 지상 통제소(GCS)와의 텔레메트리(Telemetry) 처리, 또는 공간 탐색 모듈은 통상 10Hz에서 50Hz 영역의 상대적 저주파수 주기를 취한다.
이질적인 속성을 지닌 콜백 함수들을 하나의 노드 객체 내부에서 기본 전역 상호 배타적 콜백 그룹으로 묶어 배치할 경우, 저주파수 텔레메트리 콜백이 연산을 점유하는 수 밀리초(ms)의 인터벌 동안 비행 역학 제어 루프의 트리거가 블로킹(Blocking)되는 심각한 수준의 우선순위 역전(Priority Inversion) 현상이 발현된다. 이는 종국적으로 드론 추종 오차(Tracking Error)의 발산과 추력 제어능력의 완전한 상실(Stall)을 초래한다.
3. 콜백 그룹 단일화 기법 및 커스텀 이그제큐터 매핑 논리
실시간 파이프라인의 제어 결정론성을 보장하기 위한 가장 진보적이고 핵심적인 설계 기법은, 컴포넌트의 논리적 기능 단위가 아닌 시스템의 타이밍 위상(Timing Phase)과 데드라인 임계도를 기준으로 콜백 그룹을 세분화하여 단일화(Unification)하는 것이다. 본 최적화 기법의 구현 논리는 다음의 절차로 학술화된다.
- 지터(Jitter) 민감도 기반의 그룹 분리: 시스템 내에서 최고 정밀도의 주파수 사양(예: 상시 오차 100 마이크로초 이내)이 요구되는 핵심 자세 제어(Attitude Control) 타이머 콜백과 외부 관성 측정 장치(IMU) 서브스크립션 콜백만을 선별한다. 그리고 이를 여타의 상태 모니터링 콜백으로부터 완벽히 분리하여, 단일 목적의 전용 상호 배타적 콜백 그룹으로 추출 및 응집시킨다.
- 커스텀 이그제큐터(Custom Executor)의 1:1 독립 매핑: 단일화가 완료된 고주파수 전용 콜백 그룹을 ROS 2 노드의 디폴트 이그제큐터 스핀(Spin) 구문에서 배제힌다. 대신, 프로세스 내 백그라운드 스레드 위에 독자적으로 인스턴스화된 커스텀 싱글스레드 이그제큐터(Single-Threaded Executor)에 해당 콜백 그룹만을 단독으로 매핑(Mapping)한다.
- OS 레벨 컨텍스트 스레드 속성 강제: 인스턴스화된 싱글스레드 이그제큐터를 구동하는 운영체제 계층의 Pthread(POSIX Thread) 핸들에 대하여, RTOS 스케줄링 정책(예: 리눅스 커널의
SCHED_FIFO혹은SCHED_RR)을 주입한다. 더 나아가 운영체제 상의 최상위 실행 우선순위(예: Priority 99) 및 실시간 스레드가 다른 비결정론적 작업과 경합하지 않도록 CPU 선호도 코어 격리(Core Affinity 및isolcpus설정)를 엄격하게 부여한다.
4. 단일화 구조의 컴퓨팅 이론적 타당성
ROS 2 생태계에서 콜백 그룹의 무분별한 혼합적재(Mixed-Criticality)를 지양하고, 시간 제약적 속성(Temporal Constraint)이 완전히 합치되는 콜백들만을 병합하여 독립적인 이그제큐터 스레드로 분할 구동하는 기법은 내부 자원 경합을 근본적으로 제거한다. 미들웨어 계층의 이벤트 대기열 쿼리(Query) 및 콜백 디스패칭 오버헤드는 O(1)의 복잡도에 가깝게 최소화되며, 멀티스레드 이그제큐터를 활용할 때 필연적으로 수반되는 대기열(Wait Set) 이벤트 갱신과 스레드 풀 간 뮤텍스(Mutex) 락 병목 인자를 소프트웨어 스택 전반에서 소거한다.
분산 컴퓨팅 기반의 비행 제어기 환경 모델에서 이러한 콜백 그룹 단일화 및 코어 레벨 격리 설계는 실시간 실행 컨텍스트(Execution Context)를 하드웨어 명령어 파이프라인과 가장 최단 경로로 일치시키는 필수 불가결한 안전 필수(Safety-Critical) 소프트웨어 패턴으로 정립된다. (분석 기준: ROS 2 Humble/Iron 아키텍처)