1294.1 제어 흐름 노드의 역할과 분류

1. 제어 흐름 노드의 정의

제어 흐름 노드(control flow node)는 행동 트리에서 자식 노드들의 실행 순서, 실행 조건, 결과 해석 방식을 결정하는 내부 노드이다. 리프 노드(leaf node)가 로봇의 구체적인 동작(액션)과 환경 상태의 판단(조건)을 담당하는 반면, 제어 흐름 노드는 이러한 동작과 판단을 논리적으로 조직화하여 복합적인 행동 패턴을 구성한다(Colledanchise & Ogren, 2018).

제어 흐름 노드는 하나 이상의 자식 노드를 가지며, Tick 전파 시 자식 노드들에 대한 Tick의 전달 여부와 순서를 제어한다. 각 자식의 반환 상태(SUCCESS, FAILURE, RUNNING)를 수집하고, 미리 정의된 규칙에 따라 부모 노드에 전달할 최종 상태를 결정한다.

2. 제어 흐름 노드의 역할

2.1 실행 순서의 결정

제어 흐름 노드는 자식 노드들이 어떤 순서로 Tick을 수신하는지를 결정한다. 대부분의 제어 흐름 노드는 왼쪽에서 오른쪽으로 자식을 순차적으로 Tick하지만, 노드의 유형에 따라 특정 자식을 건너뛰거나 병렬로 Tick하는 것도 가능하다.

2.2 결과의 조합

자식 노드들의 반환 상태를 논리적으로 조합하여 단일 상태를 산출한다. 이 조합 규칙이 제어 흐름 노드의 핵심 의미론(semantics)을 정의한다.

2.3 실행 흐름의 제어

조건에 따라 특정 자식의 실행을 중단(Halt)하거나, 이전에 완료된 자식을 건너뛰거나, 모든 자식을 처음부터 다시 평가하는 등의 실행 흐름 제어를 수행한다.

3. 제어 흐름 노드의 분류

행동 트리의 제어 흐름 노드는 결과 조합 규칙에 따라 다음과 같이 분류된다.

3.1 Sequence 계열

모든 자식이 성공해야 자신도 성공을 반환하는 노드이다. 논리적 AND 연산에 대응한다. 하나의 자식이 실패하면 즉시 실패를 반환하고 나머지 자식의 실행을 중단한다.

변형재진입 규칙
Sequence (WithMemory)RUNNING 자식부터 재개, 이전 성공 자식 건너뛰기
ReactiveSequence매 Tick마다 첫 자식부터 재평가

3.2 Fallback 계열

하나의 자식이라도 성공하면 자신도 성공을 반환하는 노드이다. 논리적 OR 연산에 대응하며, Selector라고도 불린다. 하나의 자식이 성공하면 즉시 성공을 반환하고 나머지 자식의 실행을 건너뛴다.

변형재진입 규칙
Fallback (WithMemory)RUNNING 자식부터 재개, 이전 실패 자식 건너뛰기
ReactiveFallback매 Tick마다 첫 자식부터 재평가

3.3 Parallel 계열

다수의 자식을 동시에 Tick하고, 성공 및 실패의 임계값에 따라 결과를 결정하는 노드이다. 예를 들어, M개 이상의 자식이 성공하면 성공을 반환하는 방식이다.

3.4 데코레이터

단일 자식을 가지며, 자식의 반환 상태를 변환하거나 실행 조건을 부가하는 특수한 제어 노드이다. 반복(Repeat), 반전(Inverter), 타임아웃(Timeout) 등이 포함된다.

4. 제어 흐름 노드와 프로그래밍 구조의 대응

제어 흐름 노드는 전통적 프로그래밍의 제어 구조와 개념적으로 대응된다.

제어 흐름 노드프로그래밍 대응논리 연산
Sequenceif (A && B && C)AND
Fallbackif (A || B || C)OR
Parallel스레드 병렬 실행다수결
Decorator래퍼 함수변환

그러나 행동 트리의 제어 흐름 노드는 RUNNING 상태의 처리, Halt에 의한 중단, 재진입 규칙 등 전통적 제어 구조에 없는 시간적·동적 의미론을 포함하므로, 단순한 대응으로 이해해서는 안 된다.

5. BehaviorTree.CPP v4에서의 분류

BehaviorTree.CPP v4에서 제어 흐름 노드는 BT::ControlNode 기반 클래스를 상속하여 구현되며, 다음과 같은 내장 제어 노드를 제공한다(Faconti, 2022).

  • BT::SequenceNode — WithMemory 기본 동작의 Sequence
  • BT::ReactiveSequence — 매 Tick 재평가 Sequence
  • BT::FallbackNode — WithMemory 기본 동작의 Fallback
  • BT::ReactiveFallback — 매 Tick 재평가 Fallback
  • BT::ParallelNode — 병렬 실행
  • BT::ParallelAllNode — 전체 병렬 실행
  • BT::IfThenElseNode — 조건 분기
  • BT::SwitchNode — 다중 분기

이들 각각은 자식 노드의 Tick 전파와 상태 조합에 대해 고유한 규칙을 구현하며, XML 트리 정의에서 해당 이름으로 참조된다.


참고 문헌

  • Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • Faconti, D. (2022). BehaviorTree.CPP documentation and API reference. https://www.behaviortree.dev/