1292.7 제어 흐름 노드 (Control Flow Node)의 개요
1. 제어 흐름 노드의 정의
제어 흐름 노드(Control Flow Node)란 행동 트리(Behavior Tree)에서 자식 노드(child node)의 실행 순서와 조건부 분기를 결정하는 비단말 노드(non-terminal node)이다. 제어 흐름 노드는 리프 노드(leaf node)에 해당하는 실행 노드(Execution Node)와 달리, 스스로 구체적인 로봇 동작이나 환경 조건 판정을 수행하지 않는다. 대신, 하나 이상의 자식 노드를 보유하며, 이들에 대한 Tick 전파(tick propagation) 방식과 반환 상태(return status) 해석 규칙을 정의함으로써 행동 트리 전체의 논리적 흐름을 제어한다.
Colledanchise와 Ögren (2018)은 행동 트리의 형식적 정의에서 제어 흐름 노드를 다음과 같이 규정하였다. 트리 T의 내부 노드(internal node) 집합 \mathcal{N}_{\text{cf}} \subset \mathcal{N}에 속하는 각 노드 n_i \in \mathcal{N}_{\text{cf}}는 자식 노드의 순서열(ordered sequence) \langle c_1, c_2, \ldots, c_k \rangle을 가지며, 각 c_j의 반환 상태 s_j \in \{\text{Success}, \text{Failure}, \text{Running}\}에 기반하여 자신의 반환 상태 s_i를 결정하는 매핑 함수 f_i: \{s_1, s_2, \ldots, s_k\} \rightarrow \{\text{Success}, \text{Failure}, \text{Running}\}를 정의한다.
2. 행동 트리 내에서의 구조적 위치
행동 트리는 루트 노드(Root Node)를 정점으로 하는 방향 비순환 그래프(Directed Acyclic Graph, DAG)의 특수한 형태인 유근 트리(rooted tree)로 구성된다. 이 트리 구조에서 제어 흐름 노드는 루트 노드와 리프 노드 사이의 중간 계층(intermediate layer)에 위치한다. 루트 노드로부터 전파된 Tick 신호는 제어 흐름 노드를 거쳐 하위의 실행 노드까지 전달되며, 실행 노드의 반환 상태는 역방향으로 제어 흐름 노드에 전달되어 해당 노드의 반환 상태 결정에 사용된다.
제어 흐름 노드는 반드시 하나 이상의 자식 노드를 가진다. 자식 노드가 없는 제어 흐름 노드는 행동 트리의 구조적 정의에 위배되며, 이는 정적 분석(static analysis) 단계에서 구조적 일관성 오류로 검출되어야 한다. 자식 노드는 다른 제어 흐름 노드, 데코레이터 노드(Decorator Node), 또는 리프 노드인 실행 노드(액션 노드, 조건 노드)가 될 수 있으며, 이러한 재귀적 구성(recursive composition)이 행동 트리의 모듈성(modularity)과 확장성(scalability)을 보장한다.
3. 제어 흐름 노드의 기본 동작 원리
제어 흐름 노드가 부모 노드로부터 Tick을 수신하면, 사전에 정의된 정책(policy)에 따라 자식 노드들에게 Tick을 전파한다. 이때 핵심적인 동작 원리는 다음 세 가지 측면으로 구분된다.
3.1 Tick 전파 순서
대부분의 제어 흐름 노드는 자식 노드에 대해 왼쪽에서 오른쪽 순서(left-to-right order)로 Tick을 전파한다. 이는 자식 노드의 순서열 \langle c_1, c_2, \ldots, c_k \rangle에서 인덱스 순서에 따라 순차적으로 Tick이 전달됨을 의미한다. 다만, Parallel 노드와 같이 모든 자식 노드에 동시적(concurrent)으로 Tick을 전파하는 예외적 유형도 존재한다.
3.2 반환 상태 결정 규칙
각 제어 흐름 노드는 자식 노드들의 반환 상태 조합에 기반하여 고유한 규칙으로 자신의 반환 상태를 결정한다. 예를 들어, Sequence 노드는 모든 자식이 Success를 반환할 때에만 Success를 반환하고, 하나라도 Failure를 반환하면 즉시 Failure를 반환한다. Fallback 노드는 이와 반대로, 하나의 자식이 Success를 반환하면 즉시 Success를 반환하고, 모든 자식이 Failure를 반환할 때에만 Failure를 반환한다.
3.3 조기 종료 (Short-Circuit Evaluation)
제어 흐름 노드는 효율적 실행을 위해 조기 종료 메커니즘을 채택한다. Sequence 노드에서 특정 자식이 Failure를 반환하면 나머지 자식 노드에 대한 Tick 전파를 중단(short-circuit)하고, 해당 제어 흐름 노드는 즉시 Failure를 상위 노드에 반환한다. 이러한 조기 종료는 불필요한 연산을 배제하여 행동 트리의 실행 효율성을 향상시키며, 이는 프로그래밍 언어에서의 단축 평가(short-circuit evaluation)와 유사한 의미론을 가진다.
4. 제어 흐름 노드의 유형 분류
행동 트리에서 사용되는 제어 흐름 노드는 다음과 같이 분류된다.
4.1 Sequence 노드
Sequence 노드는 논리 연산의 AND 의미론(semantics)을 구현한다. 자식 노드를 순서대로 실행하며, 모든 자식이 Success를 반환할 경우에만 자신도 Success를 반환한다. 임의의 자식이 Failure를 반환하면 나머지 자식의 실행을 중단하고 Failure를 반환한다. 자식이 Running을 반환하면 해당 노드의 실행을 보류하고 Running을 반환한다.
4.2 Fallback 노드
Fallback 노드(Selector 노드라고도 칭한다)는 논리 연산의 OR 의미론을 구현한다. 자식 노드를 순서대로 실행하며, 하나의 자식이 Success를 반환하면 즉시 Success를 반환한다. 모든 자식이 Failure를 반환하는 경우에만 Failure를 반환한다. 이 노드는 대안적 행동(alternative behavior)의 우선순위 기반 선택을 구현하는 데 사용된다.
4.3 Parallel 노드
Parallel 노드는 복수의 자식 노드를 동시에 실행(concurrent execution)하며, 성공 임계값(success threshold) 또는 실패 임계값(failure threshold) 정책에 의해 반환 상태를 결정한다. 예를 들어, 성공 임계값이 M으로 설정된 경우, M개 이상의 자식이 Success를 반환하면 Parallel 노드는 Success를 반환한다. 이 노드는 다중 작업의 병행 수행이 요구되는 로봇 행동 제어 시나리오에서 활용된다.
4.4 ReactiveSequence 노드
ReactiveSequence 노드는 일반 Sequence 노드와 유사하게 작동하나, 매 Tick마다 첫 번째 자식부터 재평가(re-evaluation)를 수행하는 점에서 차이가 있다. 이는 선행 조건(precondition)의 지속적 검증이 필요한 반응적 행동(reactive behavior) 패턴의 구현에 적합하다. 특정 자식이 Running 상태에 있더라도, 선행 자식의 조건이 변화하면 이를 즉각 반영할 수 있다.
4.5 ReactiveFallback 노드
ReactiveFallback 노드는 일반 Fallback 노드의 반응적 변형으로서, 매 Tick마다 첫 번째 자식부터 재평가를 수행한다. 우선순위가 높은 대안이 유효해지면 현재 Running 상태인 하위 우선순위 자식을 Halt하고 상위 우선순위 자식의 실행으로 전환한다.
4.6 조건부 제어 노드
IfThenElse, WhileDoElse, Switch 등의 조건부 제어 노드는 프로그래밍 언어의 조건 분기 구문에 대응하는 고수준 제어 흐름을 제공한다. 이들은 기본 제어 흐름 노드의 조합으로 표현 가능하나, 가독성과 설계 편의성을 위해 독립적 노드 유형으로 제공되는 것이 일반적이다.
5. 제어 흐름 노드와 실행 노드의 관계
제어 흐름 노드는 행동 트리에서 “어떤 순서로, 어떤 조건에서 행동을 수행할 것인가“를 결정하는 의사 결정 계층(decision layer)을 형성한다. 반면, 실행 노드는 “구체적으로 무엇을 수행하거나 확인할 것인가“를 정의하는 행동 계층(action layer)을 형성한다. 이 두 계층의 분리는 관심사의 분리(separation of concerns) 원칙을 따르며, 행동 트리의 핵심적인 설계 철학에 해당한다.
제어 흐름 노드는 자식 노드의 구체적인 구현에 의존하지 않고, 오직 반환 상태의 추상적 프로토콜에만 의존한다. 이러한 설계는 노드 간의 낮은 결합도(low coupling)를 보장하며, 개별 행동의 재사용성(reusability)과 서브트리(subtree) 단위의 모듈적 조합을 가능하게 한다.
6. 제어 흐름 노드의 공학적 의의
제어 흐름 노드는 행동 트리가 유한 상태 머신(Finite State Machine, FSM)에 비해 우월한 확장성과 유지보수성을 갖는 핵심적 요인이다. FSM에서는 상태 전이(state transition)가 상태 간의 명시적 간선(edge)으로 표현되므로, 상태 수 n에 대해 최대 O(n^2)개의 전이 규칙이 요구될 수 있다. 이에 반해, 행동 트리에서는 제어 흐름 노드가 자식 노드의 반환 상태에 기반한 암묵적 전이(implicit transition)를 수행하므로, 새로운 행동의 추가가 기존 구조에 미치는 영향을 최소화한다.
Marzinotto 등 (2014)은 행동 트리의 제어 흐름 노드가 제공하는 구조적 계층화(structural layering)가 대규모 로봇 임무 계획에서의 복잡도 관리에 효과적임을 실험적으로 입증하였다. 특히 Sequence와 Fallback 노드의 조합만으로도 FSM의 모든 상태 전이 패턴을 표현할 수 있으며, 동시에 트리의 깊이를 제한하여 실행 예측 가능성(execution predictability)을 유지할 수 있음을 보였다.
BehaviorTree.CPP 라이브러리에서는 제어 흐름 노드를 BT::ControlNode 추상 클래스의 파생 클래스로 구현하며, 각 구체적 유형(Sequence, Fallback, Parallel 등)은 tick() 가상 함수를 재정의(override)하여 고유한 Tick 전파 및 반환 상태 결정 로직을 정의한다.
7. 참고 문헌
- 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.” In Proceedings of the IEEE International Conference on Robotics and Automation (ICRA), pp. 5420–5427.
- 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.
- Ghzouli, R., Berger, T., & Johnsen, E. B. (2020). “Behavior Trees in Action: A Study of Robotics Applications.” In Proceedings of the ACM/IEEE International Conference on Software Engineering (ICSE), pp. 81–90.
본 절은 행동 트리의 제어 흐름 노드에 대한 개관으로서, 각 노드 유형의 상세한 동작 원리 및 구현 세부 사항은 이후 해당 절에서 별도로 다루도록 한다.