1297.3 조건 노드의 리프 노드 특성

1. 행동 트리의 노드 분류와 리프 노드

행동 트리(Behavior Tree)의 노드는 크게 내부 노드(internal node)와 리프 노드(leaf node)로 분류된다. 내부 노드는 하나 이상의 자식 노드를 가지며, 자식 노드의 실행 순서와 흐름을 제어하는 역할을 수행한다. 제어 노드(Sequence, Fallback, Parallel 등)와 데코레이터 노드(Inverter, Retry, Repeat 등)가 내부 노드에 해당한다. 리프 노드는 자식 노드를 갖지 않는 말단 노드로서, 행동 트리가 실제로 환경과 상호작용하는 지점이다(Colledanchise & Ogren, 2018).

조건 노드(Condition Node)는 액션 노드(Action Node)와 함께 리프 노드를 구성하는 두 가지 유형 중 하나이다. 리프 노드로서의 특성은 조건 노드의 설계와 동작 방식을 근본적으로 규정한다.

2. 자식 노드 부재

리프 노드의 가장 기본적인 특성은 자식 노드를 갖지 않는다는 것이다. 조건 노드는 트리 구조의 최하위 계층에 위치하며, tick 신호를 하위로 전파하지 않는다. 부모 노드로부터 수신한 tick에 대하여 자체적으로 조건 평가를 수행하고 결과를 즉시 반환한다.

이 특성은 행동 트리의 재귀적(recursive) 실행 구조에서 재귀의 종료 조건(base case)에 해당한다. 트리의 루트에서 시작된 tick 신호는 내부 노드를 거치며 하위로 전파되고, 리프 노드에 도달하면 실제 연산이 수행되어 결과가 상위로 반환된다.

Root
└── Sequence           ← 내부 노드: tick을 자식에게 전파
    ├── Condition      ← 리프 노드: 조건 평가 후 결과 반환
    └── Action         ← 리프 노드: 행동 수행 후 결과 반환

3. 환경과의 직접 상호작용

리프 노드는 행동 트리에서 환경(environment)과 직접 상호작용하는 유일한 노드 유형이다. 내부 노드는 자식 노드의 반환 상태에 기반하여 실행 흐름을 결정할 뿐, 환경의 상태를 직접 읽거나 변경하지 않는다.

조건 노드는 환경과의 상호작용에서 읽기 전용(read-only) 인터페이스 역할을 수행한다. 센서 데이터의 참조, 블랙보드(blackboard) 변수의 조회, ROS2 토픽 메시지의 확인 등을 통해 환경의 현재 상태를 관측(observe)한다. 이는 환경의 상태를 변경하는 액션 노드의 읽기-쓰기(read-write) 상호작용과 대비된다.

형식적으로, 조건 노드 c는 환경 상태 \mathcal{E}에서 관측 가능한 변수 집합 \mathcal{O} \subseteq \mathcal{E}를 참조하여 불리언(boolean) 판정을 수행하는 함수로 표현된다:

f_c: \mathcal{O} \rightarrow \{\text{SUCCESS}, \text{FAILURE}\}

이 함수는 \mathcal{E}의 어떠한 원소도 변경하지 않으므로, 실행 전후로 \mathcal{E}의 상태가 동일하게 유지된다.

4. 독립적 실행 단위

각 리프 노드는 독립적인 실행 단위(execution unit)로 기능한다. 조건 노드는 자신에게 할당된 조건 평가 로직만을 수행하며, 다른 노드의 내부 상태에 직접 접근하거나 다른 노드의 실행을 제어하지 않는다. 노드 간의 데이터 교환은 블랙보드를 통한 간접적 방식으로만 이루어진다.

이러한 독립성은 행동 트리의 핵심 장점인 모듈성(modularity)을 보장한다. 각 조건 노드는 트리 구조 내에서 자유롭게 위치를 변경하거나, 다른 트리에 재사용하거나, 독립적으로 단위 테스트를 수행할 수 있다. 조건 노드의 동작은 오직 입력(블랙보드 포트, 외부 데이터 소스)과 출력(반환 상태)에 의해서만 정의되므로, 트리 구조의 변경이 개별 노드의 동작에 영향을 미치지 않는다.

5. Tick 수신과 즉시 응답

리프 노드로서 조건 노드는 부모 노드로부터 tick을 수신할 때마다 tick() 메서드가 호출된다. 조건 노드의 고유한 특성은 이 tick에 대하여 항상 즉시(immediately) 응답한다는 점이다. RUNNING 상태를 반환하지 않으므로, 단일 tick 내에서 조건 평가가 완료되고 결과가 부모 노드에 전달된다.

이는 액션 노드가 RUNNING을 반환하여 복수의 tick에 걸쳐 실행을 지속할 수 있는 것과 대조된다. 조건 노드의 즉시 응답 특성은 행동 트리의 tick 주기(tick period) 내에서 조건 평가가 반드시 완료됨을 보장하며, 이로 인해 제어 노드는 조건 노드의 결과를 기반으로 즉각적인 분기 결정을 내릴 수 있다.

6. 상태 비보존 특성

조건 노드는 tick 간에 내부 상태를 보존하지 않는 무상태(stateless) 노드로 설계하는 것이 원칙이다. 매 tick마다 동일한 평가 절차를 수행하며, 이전 tick의 평가 결과가 현재 tick의 평가에 영향을 미치지 않아야 한다.

BehaviorTree.CPP에서 ConditionNodehalt() 메서드가 final로 선언되어 재정의가 불가능한 것은 이 특성을 반영한다. 조건 노드는 중단 시 복원해야 할 내부 상태가 존재하지 않으므로, halt 처리에서 노드 상태의 초기화(resetStatus())만을 수행한다.

virtual void halt() override final
{
    resetStatus();
}

다만, 성능 최적화를 위해 캐싱(caching)을 적용하는 경우에는 제한적으로 내부 상태를 유지할 수 있다. 이 경우에도 캐시의 무효화(invalidation)가 적절히 처리되어 조건 평가의 정확성이 보장되어야 한다.

7. 트리 구조에서의 배치 패턴

조건 노드는 리프 노드로서 제어 노드의 직접적인 자식 위치에 배치된다. 배치 위치에 따라 조건 노드의 역할이 달라진다.

7.1 Sequence 노드의 자식으로 배치

Sequence 노드의 첫 번째 자식으로 배치된 조건 노드는 후속 액션의 전제 조건(precondition)을 검증하는 가드(guard) 역할을 수행한다.

Sequence
├── ConditionNode: "전제 조건 확인"    ← 가드
└── ActionNode: "행동 실행"

7.2 Fallback 노드의 자식으로 배치

Fallback 노드의 각 분기 선두에 배치된 조건 노드는 행동 대안 간의 선택 기준을 제공한다.

7.3 ReactiveSequence의 자식으로 배치

ReactiveSequence의 자식으로 배치된 조건 노드는 매 tick마다 재평가되어, 진행 중인 액션의 지속 가능 여부를 실시간으로 감시한다.

8. 리프 노드 특성의 설계적 함의

조건 노드의 리프 노드 특성은 다음과 같은 설계적 함의를 갖는다.

첫째, 조건 노드는 **단일 책임 원칙(Single Responsibility Principle)**을 따라야 한다. 하나의 조건 노드는 하나의 명확한 조건만을 평가해야 하며, 복합 조건은 제어 노드의 구조적 조합(Sequence를 통한 AND, Fallback을 통한 OR)으로 표현한다.

둘째, 조건 노드의 입출력이 명확히 정의되어야 한다. 입력은 블랙보드 포트와 외부 데이터 소스를 통해, 출력은 SUCCESS 또는 FAILURE의 반환 상태를 통해 표현된다. 이 명확한 인터페이스 정의가 노드의 재사용성과 테스트 용이성을 보장한다.

셋째, 조건 노드는 **위치 독립적(position-independent)**으로 동작해야 한다. 트리 내의 어떤 위치에 배치되더라도 동일한 입력에 대해 동일한 결과를 반환해야 하며, 트리 구조나 형제 노드의 존재에 의존하지 않아야 한다.

9. 참고 문헌

  • Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • Marzinotto, A., Colledanchise, M., Smith, C., & Ogren, P. (2014). Towards a unified behavior trees framework for robot control. Proceedings of the 2014 IEEE International Conference on Robotics and Automation (ICRA), 5420-5427.
  • Faconti, D., & Colledanchise, M. (2022). BehaviorTree.CPP Documentation. https://www.behaviortree.dev/

version: 0.1.0