1291.37 행동 트리의 제어 흐름 노드 개요
1. 제어 흐름 노드의 정의
제어 흐름 노드(control flow node)는 행동 트리(Behavior Tree, BT)에서 내부 노드(internal node)로 기능하며, 자식 노드들의 실행 순서와 방식을 결정하는 노드이다. 제어 흐름 노드는 리프 노드와 달리 외부 환경과 직접 상호작용하지 않으며, 자식 노드들에게 Tick 신호를 전파하고, 각 자식의 반환 상태(return status)를 조합하여 자신의 반환 상태를 결정하는 역할을 수행한다.
형식적으로, 제어 흐름 노드 N은 자식 노드 집합 \{c_1, c_2, \ldots, c_n\}을 가지며 (n \geq 1), 각 자식 c_i로부터 반환되는 상태 s_i \in \{\text{Success}, \text{Failure}, \text{Running}\}에 기반하여 자신의 반환 상태 s_N을 산출하는 함수 f를 정의한다.
s_N = f(s_1, s_2, \ldots, s_k), \quad k \leq n
여기서 k는 실제로 Tick이 전달된 자식의 수이며, 단축 평가(short-circuit evaluation)에 의하여 k < n이 될 수 있다.
2. 제어 흐름 노드의 분류
행동 트리의 제어 흐름 노드는 자식 노드에 대한 Tick 전파 규칙과 반환 상태 결정 규칙에 따라 다음과 같이 분류된다.
2.1 Sequence 노드
Sequence 노드는 자식 노드들을 왼쪽에서 오른쪽으로 순차적으로 실행하며, 모든 자식이 Success를 반환하여야 자신도 Success를 반환하는 노드이다. 논리 연산의 관점에서 Sequence 노드는 논리곱(logical AND)에 대응한다.
Sequence 노드의 실행 규칙은 다음과 같다.
- 첫 번째 자식부터 순서대로 Tick을 전달한다.
- 현재 자식이 Success를 반환하면, 다음 자식에 Tick을 전달한다.
- 현재 자식이 Failure를 반환하면, 나머지 자식의 실행을 중단하고 즉시 Failure를 반환한다.
- 현재 자식이 Running을 반환하면, 나머지 자식의 실행을 중단하고 Running을 반환한다.
- 모든 자식이 Success를 반환하면, Sequence 노드는 Success를 반환한다.
Sequence 노드는 로봇의 순차적 임무 수행을 표현하는 데 적합하다. 예를 들어, “목표 지점으로 이동 → 물체 파지 → 배치 위치로 이동 → 물체 해제“와 같은 일련의 행동을 하나의 Sequence 노드 아래에 배치할 수 있다.
2.2 Fallback 노드
Fallback 노드(Selector 노드라고도 불린다)는 자식 노드들을 왼쪽에서 오른쪽으로 순차적으로 실행하며, 하나의 자식이라도 Success를 반환하면 자신도 Success를 반환하는 노드이다. 논리 연산의 관점에서 Fallback 노드는 논리합(logical OR)에 대응한다.
Fallback 노드의 실행 규칙은 다음과 같다.
- 첫 번째 자식부터 순서대로 Tick을 전달한다.
- 현재 자식이 Failure를 반환하면, 다음 자식에 Tick을 전달한다.
- 현재 자식이 Success를 반환하면, 나머지 자식의 실행을 중단하고 즉시 Success를 반환한다.
- 현재 자식이 Running을 반환하면, 나머지 자식의 실행을 중단하고 Running을 반환한다.
- 모든 자식이 Failure를 반환하면, Fallback 노드는 Failure를 반환한다.
Fallback 노드는 대안적 행동 전략의 표현에 적합하다. 예를 들어, “우선 경로 A로 이동 시도 → 실패 시 경로 B로 이동 시도 → 실패 시 대기“와 같은 대안적 전략을 표현할 수 있다.
2.3 Parallel 노드
Parallel 노드는 복수의 자식 노드를 동시에 실행하는 제어 흐름 노드이다. Parallel 노드는 성공 임계값(success threshold) M을 매개변수로 가지며, M개 이상의 자식이 Success를 반환하면 자신도 Success를 반환한다.
Parallel 노드의 실행 규칙은 다음과 같다.
- 모든 자식 노드에 동시에 Tick을 전달한다.
- M개 이상의 자식이 Success를 반환하면 Success를 반환한다.
- (n - M + 1)개 이상의 자식이 Failure를 반환하면 (즉, M개의 Success 달성이 불가능해지면) Failure를 반환한다.
- 그 외의 경우 Running을 반환한다.
Parallel 노드는 로봇이 여러 행동을 병행하여 수행하여야 하는 상황을 표현한다. 예를 들어, 이동 중에 장애물을 동시에 감시하는 행동을 Parallel 노드로 구성할 수 있다.
2.4 Decorator 노드
Decorator 노드는 정확히 하나의 자식 노드만을 갖는 단항(unary) 제어 흐름 노드이다. Decorator 노드는 자식 노드의 반환 상태를 변환하거나, 자식 노드의 실행을 조건부로 통제하는 역할을 수행한다. 주요 Decorator 유형은 다음과 같다.
| Decorator 유형 | 기능 |
|---|---|
| Inverter | 자식의 Success를 Failure로, Failure를 Success로 반전 |
| ForceSuccess | 자식의 반환 상태를 항상 Success로 변환 |
| ForceFailure | 자식의 반환 상태를 항상 Failure로 변환 |
| Repeat | 자식을 지정된 횟수만큼 반복 실행 |
| RetryUntilSuccessful | 자식이 Success를 반환할 때까지 반복 실행 |
| Timeout | 자식이 지정된 시간 내에 완료되지 않으면 Failure 반환 |
Decorator 노드는 디자인 패턴(design pattern)의 데코레이터 패턴과 유사한 개념으로, 기존 노드의 의미론을 수정 없이 확장하는 수단을 제공한다.
3. 제어 흐름 노드의 반응적 변형
표준 Sequence 및 Fallback 노드에 대하여 반응적(reactive) 변형이 존재한다. ReactiveSequence와 ReactiveFallback은 Running 상태를 반환한 자식이 있을 때, 다음 Tick에서도 첫 번째 자식부터 다시 평가를 시작한다. 이러한 반응적 변형은 환경 조건의 변화에 즉각적으로 대응하여야 하는 로봇 시스템에서 중요한 역할을 수행한다.
표준 Sequence 노드가 이전 Tick에서 Running을 반환한 자식의 위치를 기억하고 해당 자식부터 실행을 재개하는 반면, ReactiveSequence 노드는 매 Tick마다 첫 번째 자식부터 재평가를 수행한다. 이로 인하여 선행 조건이 더 이상 충족되지 않는 경우 현재 진행 중인 행동을 중단(preempt)할 수 있다.
4. 제어 흐름 노드 간의 의미론적 관계
Sequence와 Fallback 노드의 관계는 드 모르간 법칙(De Morgan’s laws)과 유사한 쌍대성(duality)을 가진다. Inverter Decorator를 활용하면 Sequence를 Fallback으로, Fallback을 Sequence로 상호 변환할 수 있다. 이를 형식적으로 표현하면 다음과 같다.
\text{Sequence}(c_1, c_2, \ldots, c_n) \equiv \text{Inverter}(\text{Fallback}(\text{Inverter}(c_1), \text{Inverter}(c_2), \ldots, \text{Inverter}(c_n)))
이 쌍대 관계는 행동 트리의 이론적 분석에서 중요한 역할을 하며, 행동 트리의 등가 변환(equivalence transformation)과 최적화의 기반이 된다.
5. 제어 흐름 노드의 트리 내 배치 원칙
제어 흐름 노드를 행동 트리 내에 배치할 때 준수하여야 하는 설계 원칙은 다음과 같다.
첫째, 제어 흐름 노드의 자식 순서는 실행 의미론에 직접적 영향을 미치므로, 자식의 배치 순서를 논리적 우선순위에 따라 신중하게 결정하여야 한다. Sequence 노드에서는 선행 조건이 먼저, 주요 행동이 나중에 배치되어야 하며, Fallback 노드에서는 가장 선호되는 행동이 가장 먼저 배치되어야 한다.
둘째, 제어 흐름 노드의 중첩(nesting)을 통하여 복잡한 의사 결정 로직을 표현할 수 있다. Sequence 노드의 자식으로 Fallback 노드를, Fallback 노드의 자식으로 Sequence 노드를 배치하는 등의 결합을 통하여, “먼저 A를 시도하되, A가 불가능하면 B를 시도하고, B가 성공하면 C를 수행하라“와 같은 복합적 행동 패턴을 구성할 수 있다.
셋째, Parallel 노드의 사용은 의미론적 복잡성을 동반하므로, 실제로 동시 실행이 필요한 경우에만 제한적으로 사용하여야 한다. 자원 경합이나 행동 간 간섭이 발생할 가능성이 있는 경우, Parallel 노드 대신 Sequence 노드를 사용하여 순차적으로 실행하는 것이 안전하다.
6. 참고 문헌
- Colledanchise, M., & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Marzinotto, A., Colledanchise, M., Smith, C., & Ögren, P. (2014). “Towards a Unified Behavior Trees Framework for Robot Control.” Proceedings of the IEEE International Conference on Robotics and Automation (ICRA).
- Faconti, D. (2022). BehaviorTree.CPP 4.x Documentation. https://www.behaviortree.dev/
- 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.
- Champandard, A. J., & Dunstan, P. (2012). “The Behavior Tree Starter Kit.” Game AI Pro: Collected Wisdom of Game AI Professionals, CRC Press.
버전: 2026-03-31