1292.14 노드 반환 상태 (Node Status)의 정의
1. 서론
행동 트리(Behavior Tree)의 모든 노드는 Tick을 수신하였을 때 반환 상태(Return Status, Node Status)를 생성하여 상위 노드에 전달한다. 반환 상태는 행동 트리의 실행 의미론(Execution Semantics)의 핵심 구성 요소로서, 제어 흐름 노드의 의사결정, Tick 전파의 제어, 노드 생명주기의 관리 등 행동 트리 전반의 동작을 결정한다. 본 절에서는 노드 반환 상태의 형식적 정의, 상태 집합의 구성, 그리고 각 상태의 의미론적 역할을 체계적으로 기술한다.
2. 반환 상태의 형식적 정의
2.1 상태 집합
행동 트리의 노드 반환 상태는 유한한 상태 집합 \mathcal{S}의 원소로 정의된다. 표준 행동 트리 모델에서 기본 반환 상태 집합은 다음과 같다:
\mathcal{S}_{\text{core}} = \{\text{Success}, \text{Failure}, \text{Running}\}
이 세 가지 상태는 행동 트리의 고전적 정의에서 규정된 핵심 반환 상태이며, 모든 행동 트리 프레임워크에서 공통적으로 지원된다. 일부 확장 프레임워크에서는 추가적인 상태를 도입하여 확장된 상태 집합을 사용한다:
\mathcal{S}_{\text{extended}} = \{\text{Success}, \text{Failure}, \text{Running}, \text{Idle}, \text{Skipped}\}
2.2 반환 상태 함수
행동 트리의 노드 N이 Tick을 수신하였을 때 반환 상태를 생성하는 과정을 반환 상태 함수(Status Function)로 형식화하면 다음과 같다:
\text{tick}(N) : N \rightarrow \mathcal{S}
즉, Tick은 노드를 입력으로 받아 상태 집합 \mathcal{S}의 원소를 출력으로 생성하는 함수이다. 이 반환 상태는 부모 노드(Parent Node)의 의사결정에 직접 활용되며, 궁극적으로 루트 노드까지 역전파되어 행동 트리 전체의 실행 결과를 결정한다.
3. 핵심 반환 상태의 정의
3.1 Success (성공)
Success 상태는 노드가 수행하여야 할 작업이 성공적으로 완료되었거나, 평가한 조건이 참(True)임을 나타낸다. Success는 종결 상태(Terminal Status)에 해당하며, 이 상태가 반환된 노드는 현재 Tick 주기에서 추가적인 실행을 수행하지 않는다.
- 액션 노드의 경우: 지정된 작업이 오류 없이 완료되었음을 나타낸다.
- 조건 노드의 경우: 평가된 논리적 조건이 참이다.
- 제어 흐름 노드의 경우: 자식 노드들의 반환 상태가 해당 제어 흐름 노드의 성공 조건을 충족하였다.
- 데코레이터 노드의 경우: 변환 함수의 적용 결과가 Success이다.
3.2 Failure (실패)
Failure 상태는 노드가 수행하여야 할 작업이 실패하였거나, 평가한 조건이 거짓(False)임을 나타낸다. Failure 역시 종결 상태에 해당한다.
- 액션 노드의 경우: 작업 수행 중 오류가 발생하였거나, 목표 달성에 실패하였다.
- 조건 노드의 경우: 평가된 논리적 조건이 거짓이다.
- 제어 흐름 노드의 경우: 자식 노드들의 반환 상태가 해당 제어 흐름 노드의 실패 조건을 충족하였다.
- 데코레이터 노드의 경우: 변환 함수의 적용 결과가 Failure이다.
Success와 Failure는 의미론적으로 대칭적(Symmetric)이며, 어느 쪽이 “더 좋은” 상태라는 가치 판단을 내포하지 않는다. 두 상태는 오직 노드의 목적에 비추어 해석되어야 한다.
3.3 Running (실행 중)
Running 상태는 노드가 수행 중인 작업이 현재 Tick 주기 내에서 완료되지 않았으며, 후속 Tick에서 계속 실행되어야 함을 나타낸다. Running은 중간 상태(Intermediate Status)에 해당하며, 종결 상태가 아닌 유일한 핵심 반환 상태이다.
- 액션 노드의 경우: 장시간 소요 작업(이동, 매니퓰레이션 등)이 진행 중이며, 아직 완료되지 않았다.
- 조건 노드의 경우: 조건 노드는 Running을 반환하지 않는다. 조건 평가는 즉각적으로 완료되어야 하기 때문이다.
- 제어 흐름 노드의 경우: 자식 노드 중 하나 이상이 Running을 반환하여, 전체 제어 흐름이 아직 종결되지 않았다.
- 데코레이터 노드의 경우: 자식 노드가 Running을 반환하였으며, 대부분의 데코레이터 노드에서 Running은 변환 없이 그대로 전달된다.
Running 상태가 반환된 노드는 다음 Tick에서 다시 실행이 재개되며, 이를 통해 비동기적(Asynchronous) 작업의 표현이 가능해진다.
4. 확장 반환 상태의 정의
4.1 Idle (유휴)
Idle 상태는 노드가 아직 Tick을 수신하지 않은 초기 상태를 나타낸다. Idle은 Tick의 반환 결과로 생성되는 상태가 아니라, 노드의 생명주기 초기에 부여되는 사전 실행 상태(Pre-Execution Status)이다.
\text{status}(N) = \text{Idle} \iff N\text{이 아직 Tick을 수신하지 않았거나, Halt에 의해 초기화되었다}
Idle 상태에 있는 노드가 Tick을 수신하면, 생명주기의 onStart 콜백이 호출되어 실행이 개시된다. 또한, Running 상태에 있던 노드가 Halt를 수신하면 Idle 상태로 복귀한다.
4.2 Skipped (건너뜀)
Skipped 상태는 특정 조건에 의해 노드의 실행이 의도적으로 생략되었음을 나타낸다. 이 상태는 표준 행동 트리 모델에는 포함되지 않으나, BehaviorTree.CPP 등 일부 고급 프레임워크에서 도입되었다.
Skipped 상태는 주로 사전 조건(Pre-condition)이 충족되지 않아 노드의 실행이 불필요한 경우에 반환된다. 예를 들어, 특정 제어 흐름 노드가 자식 노드의 실행 여부를 사전 조건에 따라 결정할 때, 실행이 생략된 자식 노드는 Skipped 상태로 표시된다.
5. 반환 상태의 분류 체계
반환 상태는 기능적 특성에 따라 다음과 같이 분류된다:
5.1 종결 상태와 비종결 상태
| 분류 | 상태 | 특성 |
|---|---|---|
| 종결 상태 (Terminal) | Success, Failure | 현재 Tick 주기에서 노드의 실행이 완결되었음을 나타낸다. |
| 비종결 상태 (Non-terminal) | Running | 실행이 아직 완결되지 않았으며, 후속 Tick에서 계속되어야 한다. |
| 사전 실행 상태 (Pre-execution) | Idle | Tick 수신 전의 초기 상태이다. |
| 생략 상태 (Skip) | Skipped | 의도적으로 실행이 생략되었다. |
5.2 반환 가능 상태와 내부 상태
| 분류 | 상태 | 설명 |
|---|---|---|
| 반환 가능 상태 | Success, Failure, Running | Tick의 결과로 상위 노드에 반환될 수 있는 상태이다. |
| 내부 전용 상태 | Idle, Skipped | Tick의 반환 결과가 아니라, 노드의 내부 생명주기 관리에 사용되는 상태이다. |
6. 반환 상태와 노드 유형의 관계
각 노드 유형이 반환할 수 있는 상태의 범위는 다음과 같이 제한된다:
| 노드 유형 | 반환 가능 상태 |
|---|---|
| 액션 노드 (동기적) | Success, Failure |
| 액션 노드 (비동기적) | Success, Failure, Running |
| 조건 노드 | Success, Failure |
| 제어 흐름 노드 | Success, Failure, Running |
| 데코레이터 노드 | Success, Failure, Running |
| 루트 노드 | 자식 노드의 반환 상태를 그대로 전달 |
조건 노드와 동기적 액션 노드는 Running 상태를 반환하지 않으며, 이 제약은 해당 노드들의 단일 Tick 내 즉각적 완료 특성에 기인한다.
7. 반환 상태의 의미론적 중립성
반환 상태 자체는 “좋음“이나 “나쁨“의 가치 판단을 내포하지 않는다. Success는 “작업이 의도대로 완료되었다“를 의미할 뿐, 긍정적 결과를 보장하지 않으며, Failure는 “작업이 의도대로 완료되지 않았다“를 의미할 뿐, 시스템 오류를 나타내지 않는다.
예를 들어, “장애물이 존재하는가?“를 평가하는 조건 노드에서:
- 장애물이 존재하면 Success를 반환한다 (조건이 참이므로).
- 장애물이 존재하지 않으면 Failure를 반환한다 (조건이 거짓이므로).
이 경우 Failure가 반환되었다고 하여 시스템에 문제가 있는 것이 아니라, 단순히 “장애물이 없다“는 사실이 확인된 것이다. 이러한 의미론적 중립성을 올바르게 이해하는 것은 행동 트리의 설계와 디버깅에 필수적이다.
8. 반환 상태의 전파 메커니즘
8.1 상향 전파 (Bottom-Up Propagation)
반환 상태는 리프 노드(실행 노드)에서 생성되어, 부모 노드, 조부모 노드를 거쳐 루트 노드까지 상향 전파된다. 각 중간 노드(제어 흐름 노드, 데코레이터 노드)는 자식 노드의 반환 상태를 자체 정책에 따라 해석하고, 자신의 반환 상태를 생성하여 상위로 전파한다.
\text{status}(\text{Root}) = f_{\text{Root}}(f_{\text{ControlFlow}}(\ldots f_{\text{Decorator}}(\text{status}(\text{Leaf})) \ldots))
8.2 제어 흐름 노드에 의한 상태 집계
제어 흐름 노드는 다수의 자식 노드로부터 수신한 반환 상태를 집계(Aggregation)하여 자신의 반환 상태를 결정한다. 집계 정책은 노드 유형에 따라 상이하다:
| 제어 흐름 노드 | 성공 조건 | 실패 조건 |
|---|---|---|
| Sequence | 모든 자식이 Success | 임의의 자식이 Failure |
| Fallback | 임의의 자식이 Success | 모든 자식이 Failure |
| Parallel | 성공 임계값 M 이상의 자식이 Success | 실패 임계값 이상의 자식이 Failure |
9. 반환 상태와 행동 트리의 결정론성
행동 트리의 결정론적 실행을 보장하기 위해, 반환 상태에 관한 다음의 원칙이 준수되어야 한다:
- 완전성(Completeness): Tick을 수신한 모든 노드는 반드시 반환 상태를 생성하여야 한다. 반환 상태 없이 Tick이 소멸되는 것은 허용되지 않는다.
- 결정론성(Determinism): 동일한 입력 조건(시스템 상태, 블랙보드 상태)에서 동일한 노드는 항상 동일한 반환 상태를 생성하여야 한다.
- 즉시성(Immediacy): 종결 상태(Success, Failure)와 Running 상태의 반환은 단일 Tick 주기 내에서 완료되어야 한다. 반환 상태의 지연은 실시간 제어 시스템의 시간적 제약을 위반한다.
- 배타성(Exclusivity): 하나의 Tick에 대해 노드는 정확히 하나의 반환 상태만을 생성한다. 복수의 상태를 동시에 반환하는 것은 허용되지 않는다.
이러한 원칙들은 행동 트리가 복잡한 로봇 임무 환경에서도 예측 가능하고 재현 가능한 행동을 보장하는 이론적 기반이 된다.
참고 문헌
- Colledanchise, M., & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Colledanchise, M., & Ögren, P. (2017). “How Behavior Trees Modularize Hybrid Control Systems and Generalize Sequential Behavior Compositions, the Subsumption Architecture, and Decision Trees.” IEEE Transactions on Robotics, 33(2), 372–389.
- 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), 5420–5427.
- Faconti, D., & Contributors. (2024). BehaviorTree.CPP Documentation. https://www.behaviortree.dev/
v1.0