1261.67 플랫폼 독립적 행동 제어 프레임워크
1. 플랫폼 독립성의 정의와 동기
플랫폼 독립적 행동 제어 프레임워크(Platform-Independent Behavior Control Framework)란, 특정 하드웨어 플랫폼, 운영체제, 또는 미들웨어 구현에 종속되지 않으면서 로봇의 행동을 체계적으로 정의, 실행, 관리할 수 있도록 설계된 소프트웨어 구조를 의미한다. 로봇 공학에서 플랫폼 독립성은 단순한 소프트웨어 이식성(portability)을 넘어, 다양한 로봇 플랫폼 간에 행동 제어 로직을 재사용하고, 이기종(heterogeneous) 시스템 환경에서도 일관된 행동 실행을 보장하는 핵심적 설계 목표이다.
플랫폼 독립성을 추구하는 주된 동기는 다음과 같다. 첫째, 로봇 시스템은 프로세서 아키텍처(x86, ARM, RISC-V 등), 운영체제(Linux, QNX, VxWorks, FreeRTOS 등), 통신 미들웨어(ROS2/DDS, Zenoh, MQTT 등)가 개별 프로젝트마다 상이하며, 행동 제어 로직이 이러한 하위 계층에 밀접하게 결합될 경우 재사용이 극도로 제한된다. 둘째, 시뮬레이션 환경과 실제 하드웨어 사이의 전환(sim-to-real transfer)에서 행동 제어 코드의 수정 없는 이식이 요구된다. 셋째, 다중 로봇 시스템에서 이기종 로봇 간 동일한 행동 정의를 공유하고 상호 운용성(interoperability)을 확보해야 하는 필요성이 증대하고 있다.
2. 설계 원칙
2.1 관심사의 분리
플랫폼 독립적 행동 제어 프레임워크의 근본적 설계 원칙은 관심사의 분리(Separation of Concerns, SoC)이다. 행동 제어 로직을 크게 세 계층으로 분리한다.
첫째, **행동 정의 계층(Behavior Definition Layer)**은 행동의 의미론적 명세를 담당한다. 이 계층은 행동의 전제 조건(precondition), 사후 조건(postcondition), 불변 조건(invariant), 전이 규칙(transition rule)을 플랫폼에 독립적인 형식으로 기술한다.
둘째, **행동 조정 계층(Behavior Coordination Layer)**은 다수의 행동 간 선택, 전환, 병렬 실행, 우선순위 관리 등의 조정 정책을 수행한다. 유한 상태 머신(Finite State Machine, FSM), 행동 트리(Behavior Tree, BT), 또는 계층적 작업 네트워크(Hierarchical Task Network, HTN) 등의 조정 메커니즘이 이 계층에서 운용된다.
셋째, **플랫폼 적응 계층(Platform Adaptation Layer)**은 행동 정의와 조정 계층에서 발생하는 추상적 명령을 특정 플랫폼의 통신 프로토콜, 하드웨어 드라이버, 센서 인터페이스로 변환하는 역할을 수행한다. 이 계층만이 플랫폼에 종속적이며, 나머지 계층은 플랫폼 변경에 영향을 받지 않는다.
2.2 추상 인터페이스 기반 설계
플랫폼 독립성을 달성하기 위해 추상 인터페이스(abstract interface) 기반 설계를 채택한다. 행동 제어 프레임워크는 센서 입력, 액추에이터 출력, 통신 채널에 대해 추상 인터페이스를 정의하며, 각 플랫폼은 이 인터페이스의 구체적 구현(concrete implementation)을 제공한다. 이러한 패턴은 의존성 역전 원칙(Dependency Inversion Principle, DIP)에 해당하며, 고수준의 행동 제어 모듈이 저수준의 플랫폼 세부 사항에 의존하지 않도록 보장한다.
예를 들어, 이동 행동(navigation behavior)의 추상 인터페이스는 move_to(target_pose), get_current_pose(), is_obstacle_detected() 등의 메서드를 정의하되, 이 메서드가 ROS2 액션 통신으로 구현되는지, 독자적 프로토콜로 구현되는지에 대해서는 행동 로직 자체가 알 필요가 없다.
2.3 의존성 주입과 팩토리 패턴
플랫폼 적응 계층의 구체적 구현을 행동 제어 로직에 결합하는 메커니즘으로 의존성 주입(Dependency Injection, DI)과 추상 팩토리 패턴(Abstract Factory Pattern)을 활용한다. 의존성 주입은 행동 제어 객체가 생성될 때 필요한 플랫폼 서비스 객체를 외부에서 주입받는 방식이며, 추상 팩토리 패턴은 플랫폼별 객체 군(family of objects)을 일관된 인터페이스로 생성하는 메커니즘이다.
이 두 패턴을 결합하면, 행동 제어 코드를 컴파일 시점이 아닌 배포 시점(deployment time) 또는 실행 시점(runtime)에 특정 플랫폼에 바인딩할 수 있다.
3. 아키텍처 구성
3.1 행동 프리미티브와 복합 행동
플랫폼 독립적 행동 제어 프레임워크에서 행동의 기본 단위는 **행동 프리미티브(behavior primitive)**이다. 행동 프리미티브는 원자적(atomic) 행동으로서, 더 이상 분해할 수 없는 최소 행동 단위를 의미한다. 이동, 파지(grasp), 회전, 대기 등이 행동 프리미티브의 전형적 사례이다.
**복합 행동(composite behavior)**은 다수의 행동 프리미티브 또는 하위 복합 행동을 조합하여 구성된다. 복합 행동의 조합 방식에는 순차적 실행(sequence), 병렬 실행(parallel), 선택적 실행(selector), 조건부 실행(conditional) 등이 있으며, 이러한 조합 패턴은 행동 트리의 내부 노드 구조와 직접적으로 대응한다.
행동 프리미티브와 복합 행동 모두 동일한 추상 인터페이스(예: initialize(), execute(), terminate(), get_status())를 구현함으로써, 조정 계층에서는 행동의 내부 구현이 프리미티브인지 복합인지를 구분하지 않고 일관된 방식으로 관리할 수 있다. 이는 복합체 패턴(Composite Pattern)의 적용에 해당한다.
3.2 행동 상태 모델
각 행동은 표준화된 상태 모델을 따른다. 일반적으로 채택되는 상태는 다음과 같다.
| 상태 | 설명 |
|---|---|
| IDLE | 행동이 초기화되었으나 아직 실행되지 않은 상태 |
| RUNNING | 행동이 현재 실행 중인 상태 |
| SUCCESS | 행동이 의도한 목표를 달성하고 성공적으로 종료된 상태 |
| FAILURE | 행동이 목표를 달성하지 못하고 실패한 상태 |
| CANCELLED | 외부 요청에 의해 행동이 취소된 상태 |
이 상태 모델은 행동 트리의 노드 상태(SUCCESS, FAILURE, RUNNING)와 의미론적으로 호환되며, ROS2 액션 서버의 목표 상태 머신(goal state machine)과도 매핑이 가능하다. 플랫폼 독립적 프레임워크에서는 이 상태 전이를 플랫폼에 종속적인 통신 메커니즘과 분리하여 관리함으로써, 동일한 상태 전이 로직이 이기종 환경에서도 재사용될 수 있도록 설계한다.
3.3 환경 모델과 세계 모델 추상화
행동 제어 프레임워크가 플랫폼 독립성을 유지하면서 센서 데이터에 기반한 의사결정을 수행하기 위해서는, 환경 정보를 추상화한 세계 모델(world model) 인터페이스를 정의해야 한다. 세계 모델은 로봇의 현재 위치, 주변 장애물 정보, 목표 지점, 다른 로봇의 상태 등을 통합적으로 제공하는 데이터 구조이다.
세계 모델 인터페이스는 다음의 추상화 수준을 유지한다.
- 좌표계 독립적(coordinate-frame-independent) 위치 표현
- 센서 결합(sensor fusion) 결과의 통합적 접근
- 시간 동기화된 데이터 스냅샷(snapshot) 제공
플랫폼 적응 계층에서 구체적인 센서 드라이버, 좌표 변환 라이브러리(예: ROS2 tf2), 지도 서비스 등을 세계 모델 인터페이스의 구현으로 바인딩한다.
4. 주요 구현 전략
4.1 도메인 특화 언어와 선언적 행동 명세
플랫폼 독립성을 강화하기 위한 효과적 전략 중 하나는 도메인 특화 언어(Domain-Specific Language, DSL)를 통한 선언적 행동 명세이다. 행동 제어 로직을 범용 프로그래밍 언어(C++, Python 등)로 직접 작성하는 대신, XML, YAML, JSON 등의 선언적 형식 또는 전용 DSL로 기술하면, 행동 명세와 실행 환경 간의 결합도를 최소화할 수 있다.
BehaviorTree.CPP에서 사용하는 XML 기반 행동 트리 명세가 이 접근법의 대표적 사례이다. 이 방식에서는 행동 트리의 구조, 조건 노드, 행동 노드의 배치를 XML 파일로 정의하고, 런타임에 해당 XML을 파싱하여 행동 트리 인스턴스를 생성한다. 행동 노드의 실행 로직은 C++ 클래스로 구현되되, 트리 구조 자체는 플랫폼에 독립적인 명세 파일로 관리된다.
SMACH(State Machine for Advanced Control in Heuristic)에서는 Python 기반의 선언적 상태 머신 구축 API를 제공하여, 상태 머신의 구조를 플랫폼 세부 사항과 분리한다.
4.2 하드웨어 추상화 계층과의 통합
플랫폼 독립적 행동 제어 프레임워크는 하드웨어 추상화 계층(Hardware Abstraction Layer, HAL)과 긴밀하게 연동된다. HAL은 센서, 액추에이터, 통신 장치 등의 하드웨어 자원을 통일된 소프트웨어 인터페이스로 감싸는 계층이다. 행동 제어 프레임워크가 HAL을 통해서만 하드웨어에 접근함으로써, 하드웨어 교체 시에도 행동 제어 로직의 수정 없이 HAL 구현만 교체하면 된다.
ROS2 환경에서는 ros2_control 패키지가 HAL 기능을 제공하며, hardware_interface 모듈을 통해 다양한 액추에이터와 센서를 추상적 인터페이스로 접근할 수 있다. 플랫폼 독립적 행동 제어 프레임워크는 이와 같은 HAL 위에 설계됨으로써, 동일한 행동 제어 로직이 시뮬레이션 환경(Gazebo, Isaac Sim)과 실제 하드웨어에서 동일하게 동작할 수 있다.
4.3 통신 미들웨어 추상화
행동 제어 프레임워크가 특정 통신 미들웨어에 종속되는 것을 방지하기 위해, 통신 미들웨어 추상화(Communication Middleware Abstraction) 계층을 도입한다. 이 계층은 발행-구독, 요청-응답, 액션 통신 등의 통신 패턴을 추상 인터페이스로 정의하며, ROS2/DDS, Zenoh, MQTT 등의 구체적 미들웨어 구현은 플러그인(plugin) 방식으로 교체 가능하다.
이를 통해, 행동 제어 모듈은 publish(topic, message), subscribe(topic, callback), send_goal(action, goal) 등의 추상적 통신 API만을 사용하고, 실제 통신 프로토콜의 선택은 배포 설정(deployment configuration)에 위임한다.
5. 플랫폼 이식성과 교차 컴파일
5.1 이식성 확보를 위한 코드 구조
플랫폼 독립적 프레임워크의 이식성을 확보하기 위해, 다음의 코드 구조적 원칙이 적용된다.
- 플랫폼 종속적 코드를 명확히 격리된 디렉터리와 모듈에 배치한다.
- 조건부 컴파일(conditional compilation)을 최소화하고, 런타임 다형성(runtime polymorphism) 또는 빌드 시스템 수준의 교체를 선호한다.
- C++ 표준 라이브러리와 POSIX 호환 API만을 핵심 로직에서 사용하며, 플랫폼 고유 API는 적응 계층에 한정한다.
- CMake 또는 Bazel 등의 교차 플랫폼 빌드 시스템을 사용하여, 다양한 타겟 아키텍처에 대한 빌드 구성을 자동화한다.
5.2 교차 컴파일 지원
임베디드 로봇 플랫폼(ARM Cortex-M, ARM Cortex-A 등)에서의 행동 제어 실행을 위해, 교차 컴파일(cross-compilation) 지원은 필수적이다. CMake 툴체인 파일(toolchain file)을 통해 타겟 프로세서, 시스템 루트(sysroot), 컴파일러 경로를 지정하며, 플랫폼 적응 계층의 구현을 타겟 플랫폼에 맞게 선택적으로 빌드한다.
ROS2 생태계에서는 colcon build와 --cmake-args를 결합하여 교차 컴파일 구성을 설정할 수 있으며, micro-ROS 프로젝트는 마이크로컨트롤러 환경에서의 ROS2 행동 제어 프레임워크 실행을 위한 교차 컴파일 인프라를 제공한다.
6. 사례 분석
6.1 BehaviorTree.CPP의 플랫폼 독립적 설계
BehaviorTree.CPP(Faconti, 2019)은 플랫폼 독립적 행동 제어 프레임워크의 대표적 사례이다. 이 프레임워크는 핵심 행동 트리 엔진을 순수 C++ 표준 라이브러리만으로 구현하며, ROS2와의 통합은 별도의 래퍼 패키지(behaviortree_ros2)를 통해 제공된다. 행동 트리 명세는 XML 파일로 정의되어 플랫폼에 독립적이며, 행동 노드의 구현만 타겟 플랫폼에 맞추어 작성하면 된다.
이 설계 덕분에 BehaviorTree.CPP는 ROS2 기반 로봇, 비ROS 시스템, 게임 엔진(Unreal Engine, Unity), 시뮬레이션 환경 등 다양한 플랫폼에서 동일한 행동 트리 엔진을 활용할 수 있다.
6.2 FlexBE의 플랫폼 적응 전략
FlexBE(Flexible Behavior Engine)(Schillinger et al., 2016)은 ROS2 환경에 특화되어 있으나, 행동 상태(behavior state)와 상태 머신 구조를 Python 클래스 계층으로 추상화함으로써, 행동 로직 자체는 특정 통신 메커니즘에 직접 의존하지 않는다. FlexBE의 상태 클래스는 on_enter(), execute(), on_exit() 등의 표준화된 생명주기 메서드를 제공하며, ROS2 통신은 별도의 프록시(proxy) 객체를 통해 간접적으로 접근한다.
7. 플랫폼 독립성의 한계와 절충
플랫폼 독립적 행동 제어 프레임워크의 설계에는 본질적 한계와 절충이 존재한다.
첫째, 추상화 계층의 도입은 간접 호출(indirection)에 의한 성능 오버헤드를 유발한다. 실시간 행동 제어에서 마이크로초 단위의 지연이 중요한 경우, 추상화 계층의 비용이 허용 가능한 수준인지 검증해야 한다.
둘째, 모든 플랫폼의 기능을 단일 추상 인터페이스로 완전히 포괄하는 것은 불가능하다. 일부 플랫폼 고유의 기능(예: FPGA 기반 가속 연산, GPU 병렬 처리)은 추상화 범위를 넘어설 수 있으며, 이 경우 플랫폼 특화 확장 인터페이스(platform-specific extension interface)를 별도로 제공하는 절충이 필요하다.
셋째, 선언적 행동 명세 방식은 복잡한 조건 분기나 동적 행동 생성의 표현력에 한계를 보일 수 있으며, 이 경우 명령적(imperative) 코드와의 혼합 사용이 불가피하다.
이러한 한계에도 불구하고, 플랫폼 독립적 행동 제어 프레임워크는 로봇 소프트웨어의 재사용성, 유지보수성, 이식성을 본질적으로 향상시키며, 현대 로봇 공학에서 행동 제어 시스템 설계의 표준적 지향점으로 확립되어 있다.
참고 문헌
- Faconti, D. (2019). BehaviorTree.CPP: A C++ library to create Behavior Trees. GitHub Repository.
- Schillinger, P., Kohlbrecher, S., & von Stryk, O. (2016). “Human-Robot Collaborative High-Level Control with Application to Rescue Robotics.” Proceedings of the IEEE International Conference on Robotics and Automation (ICRA).
- Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley.
- Quigley, M., Gerkey, B., & Smart, W. D. (2015). Programming Robots with ROS. O’Reilly Media.
- Brooks, R. A. (1986). “A Robust Layered Control System for a Mobile Robot.” IEEE Journal on Robotics and Automation, 2(1), 14–23.
v0.1.0