1291.36 행동 트리의 루트 노드
1. 루트 노드의 정의
루트 노드(root node)는 행동 트리(Behavior Tree, BT)의 최상위에 위치하는 유일한 진입점 노드이다. 트리 자료 구조의 정의에 따라, 루트 노드는 부모 노드가 존재하지 않는 유일한 노드이며, 행동 트리 전체의 실행 기점 역할을 수행한다. 형식적으로, 행동 트리 \mathcal{T} = (V, A)에서 루트 노드 r \in V는 다음 조건을 만족하는 유일한 노드로 정의된다.
\nexists\, v \in V : (v, r) \in A
즉, 루트 노드 r을 목적지로 하는 유향 간선이 존재하지 않는다. 루트 노드를 제외한 모든 노드 v \in V \setminus \{r\}는 정확히 하나의 진입 간선을 가지므로, 루트 노드의 유일성은 유근 트리(rooted tree)의 정의로부터 보장된다.
2. 루트 노드의 구조적 특성
2.1 단일 자식 구조
행동 트리의 루트 노드는 일반적으로 정확히 하나의 자식 노드만을 갖도록 설계된다. 이는 BehaviorTree.CPP 라이브러리를 비롯한 주요 행동 트리 프레임워크에서 채택하는 표준 관례이다. 루트 노드가 단일 자식만을 허용하는 이유는 다음과 같다.
첫째, 행동 트리의 실행 결과를 단일 반환 상태(return status)로 집약하기 위함이다. 루트 노드가 여러 자식을 가질 경우, 각 자식의 반환 상태를 어떻게 조합할 것인지에 대한 모호성이 발생한다. 단일 자식 구조에서는 해당 자식의 반환 상태가 곧 행동 트리 전체의 실행 결과가 되므로, 의미론적 명료성이 확보된다.
둘째, 행동 트리의 구조적 일관성을 유지하기 위함이다. 다수의 행동을 조합하여야 하는 경우에는 루트 노드의 자식으로 Sequence, Fallback 등의 제어 흐름 노드를 배치하고, 해당 제어 흐름 노드 아래에 복수의 자식을 배치하는 것이 설계 원칙에 부합한다.
2.2 루트 노드의 차수
루트 노드의 출력 차수(out-degree)는 1이다. 입력 차수(in-degree)는 0이다. 따라서 루트 노드의 총 차수(degree)는 1이 된다. 이 특성은 루트 노드가 트리 순회의 시작점이자 Tick 전파의 최초 발원점으로서의 역할에 부합한다.
3. 루트 노드의 기능
3.1 Tick 신호의 수신 및 전파
루트 노드의 가장 핵심적인 기능은 외부로부터 Tick 신호를 수신하여 자식 노드로 전달하는 것이다. Tick이란 행동 트리의 실행 주기를 구동하는 이산적 신호(discrete signal)로서, 일정한 주기 또는 이벤트에 의하여 루트 노드에 인가된다. 루트 노드는 수신한 Tick을 자신의 유일한 자식 노드에 전달하며, 이로써 행동 트리 전체의 깊이 우선 순회(depth-first traversal)가 개시된다.
Tick 수신의 형식적 표현은 다음과 같다. 시각 t에서 외부 실행 엔진이 루트 노드 r에 Tick을 인가하면, 루트 노드는 자식 노드 c에 대하여 \text{tick}(c)를 호출한다.
\text{tick}(r) \rightarrow \text{tick}(c), \quad c = \text{child}(r)
3.2 반환 상태의 전파
자식 노드로부터 반환된 상태(Success, Failure, Running)는 루트 노드를 통하여 외부 실행 엔진으로 전달된다. 루트 노드는 자식의 반환 상태를 변경 없이 그대로 전파하는 투명 전달(transparent forwarding) 방식을 취한다.
\text{status}(r) = \text{status}(c)
이 반환 상태는 외부 시스템이 행동 트리의 현재 실행 상태를 판단하는 근거가 된다. 예를 들어, 로봇의 임무 관리 시스템은 루트 노드의 반환 상태가 Success이면 현재 임무가 성공적으로 완료되었음을, Failure이면 임무 수행에 실패하였음을, Running이면 임무가 아직 진행 중임을 인식한다.
3.3 실행 주기의 제어
루트 노드에 Tick이 인가되는 빈도는 행동 트리의 실행 주기(execution frequency)를 결정한다. 실시간 로봇 시스템에서는 일반적으로 제어 루프의 주기에 맞추어 Tick이 인가된다. 예를 들어, 10Hz의 제어 루프에서는 루트 노드에 100ms 간격으로 Tick이 인가되며, 이에 따라 행동 트리 전체가 초당 10회 순회된다.
이때 중요한 제약 조건은, 행동 트리의 단일 Tick 순회가 Tick 주기 내에 완료되어야 한다는 것이다. 순회 시간이 Tick 주기를 초과하면 실시간성이 보장되지 않으므로, 트리의 규모와 각 노드의 실행 시간을 고려한 설계가 필요하다.
4. 루트 노드의 구현
4.1 BehaviorTree.CPP에서의 루트 노드
BehaviorTree.CPP 라이브러리에서 루트 노드는 Tree 클래스를 통하여 관리된다. Tree 객체는 내부적으로 루트 노드에 대한 참조를 보유하며, tickWhileRunning() 또는 tickOnce() 메서드 호출 시 루트 노드에 Tick을 인가한다.
BT::Tree tree = factory.createTreeFromFile("my_tree.xml");
BT::NodeStatus status = tree.tickWhileRunning();
위 코드에서 tickWhileRunning()은 루트 노드에 반복적으로 Tick을 인가하여, 반환 상태가 Running인 동안 실행을 계속한다. 반환 상태가 Success 또는 Failure가 되면 실행을 종료한다.
4.2 XML 정의에서의 루트 노드
행동 트리를 XML 형식으로 정의할 때, 루트 노드는 <BehaviorTree> 요소의 직접적인 자식 요소로 표현된다. XML 스키마에서 <BehaviorTree> 요소는 정확히 하나의 자식 요소만을 허용하며, 이 자식이 행동 트리의 실질적인 최상위 제어 노드가 된다.
<root BTCPP_format="4">
<BehaviorTree ID="MainTree">
<Sequence>
<!-- 자식 노드들 -->
</Sequence>
</BehaviorTree>
</root>
위 예시에서 <Sequence> 노드가 루트 노드의 유일한 자식이며, 이 노드 아래에 실제 행동 로직이 구성된다.
5. 루트 노드와 외부 시스템의 인터페이스
5.1 실행 엔진과의 결합
루트 노드는 행동 트리와 외부 실행 엔진(execution engine) 사이의 경계 인터페이스이다. 외부 실행 엔진은 타이머, 이벤트 핸들러, 또는 제어 루프의 형태로 구현되며, 주기적으로 루트 노드에 Tick을 인가한다. ROS2 환경에서는 타이머 콜백(timer callback) 내에서 행동 트리의 Tick을 호출하는 것이 일반적인 패턴이다.
void MyNode::timer_callback() {
BT::NodeStatus status = tree_.tickOnce();
if (status == BT::NodeStatus::SUCCESS) {
RCLCPP_INFO(get_logger(), "Mission completed successfully.");
}
}
5.2 블랙보드와의 연결
루트 노드는 행동 트리의 블랙보드(blackboard)와 연결되는 최상위 노드이기도 하다. 블랙보드는 행동 트리 내 노드 간 데이터 교환을 위한 공유 저장소이며, 루트 노드 수준에서 생성된 블랙보드는 트리 내 모든 노드가 접근할 수 있는 전역 데이터 공간을 제공한다. BehaviorTree.CPP에서는 트리 생성 시 자동으로 루트 블랙보드가 할당되며, 서브트리를 사용하는 경우 서브트리별로 별도의 블랙보드가 생성되어 계층적 블랙보드 구조를 형성한다.
6. 루트 노드의 설계 원칙
루트 노드를 설계할 때 준수하여야 하는 원칙은 다음과 같다.
첫째, 루트 노드 자체에 복잡한 로직을 포함하지 않아야 한다. 루트 노드는 Tick 전달과 상태 반환이라는 단순한 기능만을 수행하는 경량 노드로 유지되어야 하며, 행동 로직은 하위의 제어 흐름 노드와 실행 노드에 위임하여야 한다.
둘째, 루트 노드의 자식으로는 반드시 제어 흐름 노드를 배치하여야 한다. 리프 노드(액션 또는 조건)를 루트 노드의 직접 자식으로 배치하면, 행동 트리가 단일 행동만을 표현하게 되어 트리 구조의 이점이 상실된다.
셋째, 루트 노드의 반환 상태에 대한 외부 처리 로직을 명확하게 정의하여야 한다. 루트 노드가 Success, Failure, Running 각각의 상태를 반환할 때 외부 시스템이 취하여야 할 행동을 사전에 설계하는 것이 안정적인 시스템 운영의 기반이 된다.
7. 참고 문헌
- Colledanchise, M., & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Faconti, D. (2022). BehaviorTree.CPP 4.x Documentation. https://www.behaviortree.dev/
- Macenski, S., Martín, F., White, R., & Clavero, J. G. (2020). “The Marathon 2: A Navigation System.” Proceedings of the IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS).
- 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.
버전: 2026-03-31