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의 SUCCESSFallback의 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/