1294.33 Fallback 노드의 Success 반환 조건
1. SUCCESS 반환의 정의
Fallback 노드가 SUCCESS를 반환하는 조건은 “하나 이상의 자식이 SUCCESS를 반환하는 것“이다. 더 정확하게는, 좌→우 순차 평가에서 최초로 SUCCESS를 반환하는 자식이 발견되면, Fallback은 즉시 SUCCESS를 반환하고 나머지 자식의 평가를 중단한다(Colledanchise & Ogren, 2018).
2. 형식적 조건
자식 c_1, c_2, ..., c_N을 가진 Fallback이 SUCCESS를 반환하는 필요충분조건은 다음과 같다:
\exists k \in [1, N]: c_k = \text{SUCCESS} \land \forall j < k: c_j = \text{FAILURE}
즉, 인덱스 k의 자식이 SUCCESS를 반환하고, 그 앞의 모든 자식(c_1부터 c_{k-1}까지)이 FAILURE를 반환해야 한다.
SUCCESS 반환의 다양한 경우
경우 1: 첫 번째 자식의 즉시 성공
children: [A, B, C]
tick():
A.executeTick() → SUCCESS
→ return SUCCESS (B, C 미평가)
가장 선호되는 방안(A)이 성공하여 대안 탐색이 불필요한 경우이다.
경우 2: 중간 자식의 성공
children: [A, B, C]
tick():
A.executeTick() → FAILURE
B.executeTick() → SUCCESS
→ return SUCCESS (C 미평가)
첫 번째 방안이 실패하고 두 번째 대안이 성공한 경우이다.
경우 3: 마지막 자식의 성공
children: [A, B, C]
tick():
A.executeTick() → FAILURE
B.executeTick() → FAILURE
C.executeTick() → SUCCESS
→ return SUCCESS
모든 선호 방안이 실패하고 최후 수단이 성공한 경우이다. 모든 자식이 평가되었지만 최종적으로 SUCCESS를 반환한다.
SUCCESS와 조기 종료
Fallback에서 SUCCESS 반환은 곧 조기 종료(short-circuit)를 의미한다. SUCCESS가 발생한 자식 이후의 모든 자식은 평가되지 않으며, 이는 OR 연산의 단락 평가 특성과 동일하다.
children: [A, B, C, D, E]
A→FAILURE, B→SUCCESS
→ return SUCCESS
평가된 자식: A, B (2개)
미평가 자식: C, D, E (3개)
이 조기 종료 특성은 성능 최적화에 기여한다. 성공 확률이 높은 자식을 왼쪽에 배치하면, 평균적으로 더 적은 자식이 평가된다.
조건 노드의 SUCCESS와 Fallback
Fallback의 첫 번째 자식이 조건 노드인 경우, 조건의 SUCCESS는 “이미 목표 상태에 도달해 있으므로 행동이 불필요하다“는 의미를 가진다.
<Fallback>
<Condition ID="IsAtChargingStation"/> <!-- 이미 충전소에 있는가? -->
<Action ID="NavigateToChargingStation"/> <!-- 아니라면 충전소로 이동 -->
</Fallback>
시나리오 1: 로봇이 충전소에 위치
IsAtChargingStation → SUCCESS
→ Fallback SUCCESS (네비게이션 불필요)
시나리오 2: 로봇이 충전소에 없음
IsAtChargingStation → FAILURE
NavigateToChargingStation → RUNNING/SUCCESS
조건의 SUCCESS는 Fallback을 즉시 종료시키므로, 불필요한 액션의 실행을 방지한다.
WithMemory와 Reactive에서의 SUCCESS 차이
FallbackWithMemory의 SUCCESS
FallbackWithMemory에서 SUCCESS가 반환되면, current_child_idx가 0으로 초기화된다.
Tick 1: A→F, B→R (idx=1)
Tick 2: B→S (A 건너뜀)
idx ← 0
→ SUCCESS
ReactiveFallback의 SUCCESS
ReactiveFallback에서는 매 Tick마다 처음부터 재평가하므로, 이전에 FAILURE였던 앞쪽 자식이 SUCCESS로 변하면 뒤쪽의 RUNNING 자식이 Halt된다.
Tick 1: A→F, B→R
Tick 2: A→S (A가 SUCCESS로 변경)
B→Halt (RUNNING 자식 중단)
→ SUCCESS
이 동작은 “더 우선순위가 높은 방안이 가용해지면 즉시 전환“하는 의미론을 구현한다.
Sequence의 SUCCESS와의 비교
| 특성 | Sequence의 SUCCESS | Fallback의 SUCCESS |
|---|---|---|
| 조건 | 모든 자식 SUCCESS | 하나의 자식 SUCCESS |
| 의미 | “모든 단계 완료” | “하나의 대안 성공” |
| 평가된 자식 수 | 항상 N개 | 1개~N개 |
| 조기 종료 여부 | 아니오 (모든 자식 필요) | 예 (첫 SUCCESS에서 종료) |
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/