1294.8 Sequence 노드의 Success 반환 조건
1. Success 반환의 정의
Sequence 노드가 SUCCESS를 반환하는 유일한 조건은 모든 자식 노드가 SUCCESS를 반환한 경우이다. N개의 자식 C_1, C_2, \ldots, C_N을 가진 Sequence에서:
\text{Sequence} = \text{SUCCESS} \iff \forall\, i \in \{1, \ldots, N\},\ C_i = \text{SUCCESS}
이 조건은 논리곱(AND)의 정의와 직접적으로 대응한다. 하나라도 SUCCESS가 아닌 자식이 존재하면 Sequence는 SUCCESS를 반환하지 않는다(Colledanchise & Ogren, 2018).
단일 Tick에서의 Success
모든 자식이 동기 노드(조건 노드 또는 즉시 완료되는 액션 노드)인 경우, 단일 Tick에서 모든 자식이 SUCCESS를 반환하여 Sequence도 즉시 SUCCESS를 반환할 수 있다.
Tick:
children[0]: IsBatteryAbove20 → SUCCESS
children[1]: IsLocalized → SUCCESS
children[2]: IsPathClear → SUCCESS
Sequence → SUCCESS (단일 Tick에서 완료)
다수 Tick에 걸친 Success
비동기 액션 노드가 포함된 Sequence에서는 SUCCESS가 다수의 Tick에 걸쳐 달성된다. WithMemory 모드에서 각 자식이 순차적으로 SUCCESS를 반환하고, 마지막 자식이 SUCCESS를 반환하는 Tick에서 Sequence의 SUCCESS가 확정된다.
Tick 1:
children[0]: CheckCondition → SUCCESS
children[1]: NavigateToGoal → RUNNING
Sequence → RUNNING
Tick 2:
children[1]: NavigateToGoal → RUNNING
Sequence → RUNNING
Tick 3:
children[1]: NavigateToGoal → SUCCESS
children[2]: PickObject → RUNNING
Sequence → RUNNING
Tick 4:
children[2]: PickObject → SUCCESS
Sequence → SUCCESS ← 모든 자식 완료
Success 후 상태 초기화
Sequence가 SUCCESS를 반환하면, 모든 자식 노드의 상태가 IDLE로 초기화된다. 이는 다음에 Sequence가 다시 Tick될 때 모든 자식이 처음부터 실행될 수 있도록 보장한다.
// BehaviorTree.CPP의 SequenceNode 구현 (개념적)
NodeStatus SequenceNode::tick() {
for (size_t i = current_child_idx_; i < childrenCount(); i++) {
auto status = children_nodes_[i]->executeTick();
if (status != NodeStatus::SUCCESS) {
return status;
}
}
// 모든 자식이 SUCCESS — 인덱스 초기화
current_child_idx_ = 0;
haltChildren(); // 모든 자식을 IDLE로 복귀
return NodeStatus::SUCCESS;
}
ReactiveSequence에서의 Success
ReactiveSequence에서는 매 Tick마다 첫 번째 자식부터 모든 자식을 재평가한다. 따라서 SUCCESS가 반환되려면 해당 Tick에서 모든 자식이 동시에 SUCCESS를 반환해야 한다. RUNNING 상태의 비동기 자식이 있는 한 ReactiveSequence는 RUNNING을 반환하며, 모든 자식이 SUCCESS인 Tick에서 비로소 SUCCESS를 반환한다.
Success 반환의 의미
Sequence의 SUCCESS는 “모든 순차 작업이 성공적으로 완료되었음“을 의미한다. 로봇 시스템에서 이는 다음과 같은 상황에 해당한다.
| 시나리오 | Success의 의미 |
|---|---|
| 조건 검사 Sequence | 모든 전제 조건이 충족됨 |
| 순차 임무 Sequence | 모든 임무 단계가 완료됨 |
| 초기화 Sequence | 모든 초기화 절차가 성공함 |
| 검증 Sequence | 모든 검증 항목이 통과함 |
Sequence의 SUCCESS는 부모 노드에 전달되어, 상위 트리의 의사 결정에 사용된다. 예를 들어, Fallback의 자식인 Sequence가 SUCCESS를 반환하면 Fallback도 SUCCESS를 반환하고 나머지 대안의 평가를 생략한다.
참고 문헌
- 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/