Part 134. 유연한 의사 결정: 행동 트리 (Flexible Decision-Making: Behavior Trees)
1. 개요
로봇 시스템의 자율적 의사 결정 구조에서 행동 트리(Behavior Tree, BT)는 유한 상태 머신(Finite State Machine, FSM)의 구조적 한계를 극복하기 위하여 등장한 계층적 제어 아키텍처이다. 행동 트리는 원래 컴퓨터 게임 분야에서 비플레이어 캐릭터(NPC)의 인공지능 행동 모델링을 위하여 개발되었으나, 그 모듈성(modularity), 재사용성(reusability), 반응성(reactivity) 등의 구조적 장점이 인정되어 로봇공학, 자율 주행, 자율 비행 등 다양한 자율 시스템 분야로 확산되었다 (Colledanchise & Ögren, 2018).
유한 상태 머신은 상태(state)와 전이(transition)의 쌍으로 행동을 정의하며, 소수의 상태를 가진 단순한 시스템에서는 직관적이고 효과적인 설계 도구로 기능한다. 그러나 상태의 수가 증가함에 따라 전이 조합이 조합적으로 폭증하여 이른바 “상태 폭발(state explosion)” 문제가 발생하며, 이로 인하여 시스템의 유지보수성, 확장성, 가독성이 급격히 저하된다. 특히 복수의 하위 임무를 순차적 또는 병렬적으로 조합하여 실행해야 하는 복합 임무 시나리오에서는 FSM 기반 설계가 구조적 경직성을 드러낸다. 행동 트리는 이러한 제약을 트리(tree) 구조의 계층적 분해를 통하여 해소하며, 각 노드가 독립적인 행동 단위로서 조합 가능한 모듈을 구성한다.
2. 행동 트리의 구조적 기초
행동 트리는 유향 비순환 그래프(Directed Acyclic Graph, DAG)의 특수한 형태인 근트리(rooted tree)로 정의되며, 루트 노드(root node)에서 리프 노드(leaf node)까지의 계층적 경로를 따라 실행 흐름이 전파된다. 트리의 각 노드는 실행 시 세 가지 상태 중 하나를 반환한다: 성공(Success), 실패(Failure), 실행 중(Running). 이 삼진(ternary) 반환 체계는 행동 트리의 핵심적 설계 원리이며, 비동기적(asynchronous) 행동의 표현과 장기 실행 태스크의 관리를 가능하게 한다.
행동 트리의 노드는 기능에 따라 다음과 같이 분류된다:
- 제어 노드(Control Node): 자식 노드의 실행 순서와 논리적 조합을 결정한다. 대표적으로 Sequence 노드는 모든 자식 노드가 순차적으로 성공할 것을 요구하며, Fallback(또는 Selector) 노드는 자식 노드 중 하나가 성공하면 즉시 성공을 반환한다. Parallel 노드는 복수의 자식 노드를 동시에 실행하고, 성공 임계값(success threshold)에 따라 결과를 결정한다.
- 액션 노드(Action Node): 실제 로봇 행동을 수행하는 리프 노드로서, 모터 구동, 센서 데이터 취득, ROS2 액션 클라이언트 호출 등 물리적 또는 계산적 작업을 실행한다.
- 조건 노드(Condition Node): 환경 상태나 내부 변수를 평가하여 참/거짓(Success/Failure)을 반환하는 리프 노드이다. 배터리 잔량 확인, 장애물 감지 여부 판단 등이 이에 해당한다.
- 데코레이터 노드(Decorator Node): 단일 자식 노드의 반환값이나 실행 방식을 변환하는 래퍼(wrapper) 노드이다. 반복(Repeat), 반전(Inverter), 시간 제한(Timeout) 등의 기능을 제공한다.
3. Tick 메커니즘과 실행 제어
행동 트리의 실행은 Tick 메커니즘을 통하여 구동된다. Tick은 루트 노드에서 시작하여 트리 구조를 깊이 우선(depth-first) 방식으로 순회하며, 각 노드의 실행 함수를 호출하는 주기적 신호이다. 각 Tick 주기에서 트리는 현재 환경 상태에 기반하여 적절한 리프 노드까지 실행 경로를 결정하며, 이전 Tick에서 Running 상태를 반환한 노드가 있을 경우 해당 노드로부터 실행을 재개한다.
이러한 Tick 기반 실행 모델은 행동 트리에 본질적인 반응성을 부여한다. 매 Tick 주기마다 루트로부터 트리를 재평가함으로써, 환경 변화에 즉각적으로 대응하는 반응적 행동(reactive behavior)의 구현이 가능하다. 이는 FSM에서 명시적 전이 조건을 사전에 정의해야 하는 것과 대비되는 구조적 이점이다.
4. BehaviorTree.CPP와 ROS2 통합
BehaviorTree.CPP는 C++로 구현된 행동 트리 라이브러리로서, 로봇공학 분야에서 사실상 표준(de facto standard)의 지위를 확보하고 있다 (Faconti, 2018). 이 라이브러리는 XML 기반의 트리 정의, 런타임 트리 전환, 블랙보드(Blackboard)를 통한 노드 간 데이터 공유, 포트(port) 기반 타입 안전한 인터페이스 등의 기능을 제공한다.
ROS2(Robot Operating System 2) 환경에서 BehaviorTree.CPP는 Nav2(Navigation2) 프레임워크의 핵심 의사 결정 엔진으로 채택되어 있으며, 자율 내비게이션의 행동 계획, 복구 전략, 예외 처리 등을 행동 트리 구조로 관리한다. ROS2의 액션(Action), 서비스(Service), 토픽(Topic) 인터페이스와 행동 트리 노드를 연동함으로써, 분산 로봇 시스템 내에서 복합 임무의 계층적 분해와 실행이 실현된다.
5. 블랙보드와 데이터 공유
블랙보드(Blackboard)는 행동 트리 내 노드 간 데이터를 공유하기 위한 키-값(key-value) 저장소이다. 각 노드는 입력 포트(input port)와 출력 포트(output port)를 통하여 블랙보드에 데이터를 읽고 쓰며, 이를 통하여 노드 간의 직접적 결합(coupling)을 회피하고 간접적 통신(indirect communication)을 구현한다.
블랙보드 포트 시스템은 컴파일 타임에 각 포트의 데이터 타입을 검증하는 타입 안전성(type safety)을 제공하며, 이는 런타임 오류를 사전에 방지하는 데 기여한다. 서브트리(subtree) 간의 포트 재매핑(port remapping)을 통하여 모듈화된 행동 트리 간의 데이터 전달이 가능하며, 이는 대규모 행동 트리의 구조적 분해와 재사용을 촉진한다.
6. 서브트리와 모듈화 설계
행동 트리는 서브트리(subtree)를 통한 모듈화 설계를 본질적으로 지원한다. 복잡한 행동 로직을 독립적인 서브트리로 분리하고, 상위 트리에서 이를 참조하여 조합함으로써, 소프트웨어 공학에서의 함수 추상화(function abstraction)와 유사한 재사용 패턴을 구현할 수 있다. XML 기반 트리 정의 형식은 서브트리의 외부 파일 참조를 지원하며, 이를 통하여 팀 단위의 협업 개발과 행동 모듈의 독립적 검증이 가능하다.
7. 동적 전환과 예외 처리
동적 행동 트리 전환(dynamic behavior tree switching)은 런타임에 실행 중인 행동 트리를 다른 트리로 교체하는 기법이다. 이는 임무 단계의 전환, 비상 상황 대응, 운용 모드 변경 등의 시나리오에서 활용된다. 행동 트리의 계층적 구조는 예외 처리(exception handling)와 복구(recovery) 전략의 체계적 설계를 가능하게 한다. Fallback 노드를 활용한 대안 행동의 정의, 데코레이터 노드를 통한 재시도(retry) 및 시간 제한 부여, 전용 복구 서브트리의 설계 등이 대표적인 예외 처리 패턴이다.
8. 검증과 최적화
행동 트리의 체계적 검증을 위하여 단위 테스트(unit testing) 전략이 수립되어야 한다. 개별 노드의 독립적 테스트, 서브트리 수준의 통합 테스트, 전체 트리의 시나리오 기반 테스트가 계층적으로 수행되어야 하며, 블랙보드 상태의 모의(mock) 설정과 ROS2 인터페이스의 시뮬레이션이 테스트 환경 구성에 포함된다.
성능 최적화 측면에서는 Tick 주기의 조정, 불필요한 노드 재평가의 회피, 비동기 액션 노드의 효율적 관리 등이 핵심 과제이다. 행동 트리 로깅(logging)과 시각화(visualization) 도구는 실행 흐름의 추적, 디버깅, 성능 병목 지점의 파악에 필수적인 관측 수단을 제공한다.
9. 참고 문헌
- Colledanchise, M., & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Faconti, D. (2018). BehaviorTree.CPP: A C++ library for behavior trees. GitHub Repository.
- Macenski, S., Martín, F., White, R., & Clavero, J. G. (2020). “The Marathon 2: A Navigation System.” IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS).
- Marzinotto, A., Colledanchise, M., Smith, C., & Ögren, P. (2014). “Towards a Unified Behavior Trees Framework for Robot Control.” IEEE International Conference on Robotics and Automation (ICRA).
- Iovino, M., Scukins, E., Styrud, J., Ögren, P., & Smith, C. (2022). “A Survey of Behavior Trees in Robotics and AI.” Robotics and Autonomous Systems, 154, 104096.
v0.1.0