1294.81 Sequence-Fallback 중첩에서의 오류 전파 흐름
1. 중첩 구조에서의 오류 전파 개관
행동 트리의 실제 설계에서 Sequence와 Fallback은 다층으로 중첩되어 복잡한 오류 처리 구조를 형성한다. 오류(FAILURE)는 발생 지점에서 트리 구조를 따라 상향 전파되며, 각 노드의 유형에 따라 전파되거나 흡수된다. Sequence는 FAILURE를 즉시 상위로 전파하고, Fallback은 FAILURE를 흡수하여 다음 대안을 시도한다. 이 두 노드의 조합에 의해 오류의 전파 범위와 복구 전략이 결정된다(Colledanchise & Ogren, 2018).
2. 오류 전파의 기본 규칙
2.1 노드 유형별 FAILURE 처리
| 노드 유형 | FAILURE 수신 시 동작 | 결과 |
|---|---|---|
| Sequence | 즉시 FAILURE 반환 (전파) | 상위로 전파 |
| Fallback | 다음 자식 시도 (흡수) | 모두 실패 시에만 전파 |
| 데코레이터 | 데코레이터 유형에 따라 다름 | ForceSuccess: 흡수, Inverter: 반전 |
3. 계층 중첩의 오류 전파
3.1 Fallback 내 Sequence 중첩
<Fallback>
<Sequence>
<Condition ID="CondA"/> <!-- FAILURE 발생 -->
<Action ID="ActionA"/>
</Sequence>
<Sequence>
<Condition ID="CondB"/> <!-- SUCCESS -->
<Action ID="ActionB"/> <!-- SUCCESS -->
</Sequence>
</Fallback>
오류 전파 흐름:
CondA→F → Sequence1: FAILURE
↓ (Fallback이 흡수)
CondB→S, ActionB→S → Sequence2: SUCCESS
→ Fallback: SUCCESS
CondA의 FAILURE가 Sequence1을 통해 전파되지만, Fallback이 이를 흡수하고 Sequence2를 시도한다. Sequence2가 성공하면 전체 Fallback이 SUCCESS를 반환한다.
3.2 Sequence 내 Fallback 중첩
<Sequence>
<Action ID="Step1"/> <!-- SUCCESS -->
<Fallback>
<Action ID="Primary"/> <!-- FAILURE -->
<Action ID="Alternative"/> <!-- FAILURE -->
</Fallback>
<Action ID="Step3"/>
</Sequence>
오류 전파 흐름:
Step1→S
Primary→F → (Fallback이 흡수) → Alternative→F
→ Fallback: FAILURE (모든 대안 소진)
↓ (Sequence로 전파)
→ Sequence: FAILURE (Step3 미실행)
Fallback이 오류를 흡수하려 했으나 모든 대안이 실패하여, FAILURE가 Fallback을 벗어나 상위 Sequence로 전파된다.
4. 계층 중첩의 오류 전파
4.1 전형적인 3계층 구조
<Fallback name="L1">
<Sequence name="L2_Seq">
<Condition ID="IsPrecondition"/> <!-- FAILURE -->
<Fallback name="L3_FB">
<Action ID="Method1"/>
<Action ID="Method2"/>
</Fallback>
</Sequence>
<Action ID="SafeAction"/>
</Fallback>
오류 전파 흐름:
IsPrecondition→F → L2_Seq: FAILURE (L3_FB 미실행)
↓ (L1이 흡수)
SafeAction→S
→ L1: SUCCESS
전제 조건의 FAILURE가 L2_Seq를 통해 전파되지만, 최외곽 L1 Fallback이 흡수하여 SafeAction을 실행한다.
4.2 깊은 중첩에서의 전파 경로
<Sequence name="Mission">
<Fallback name="NavFB">
<Sequence name="PrimaryNav">
<Action ID="ComputePath"/>
<Action ID="FollowPath"/> <!-- FAILURE 발생 -->
</Sequence>
<Sequence name="RecoveryNav">
<Action ID="ClearCostmap"/>
<Action ID="ComputePath"/>
<Action ID="FollowPath"/> <!-- FAILURE 발생 -->
</Sequence>
</Fallback>
<Action ID="PerformTask"/>
</Sequence>
오류 전파 흐름 (최악의 경우):
FollowPath→F → PrimaryNav: FAILURE
↓ (NavFB가 흡수)
ClearCostmap→S, ComputePath→S, FollowPath→F
→ RecoveryNav: FAILURE
→ NavFB: FAILURE (모든 대안 소진)
↓ (Mission Sequence로 전파)
→ Mission: FAILURE (PerformTask 미실행)
5. 오류 전파의 시각적 추적
5.1 전파 경로 다이어그램
Mission (Sequence)
├── NavFB (Fallback)
│ ├── PrimaryNav (Sequence)
│ │ ├── ComputePath → S
│ │ └── FollowPath → F ←── 오류 발생 지점
│ │ ↓ FAILURE 전파
│ │ PrimaryNav → F
│ │ ↓ Fallback 흡수
│ ├── RecoveryNav (Sequence)
│ │ ├── ClearCostmap → S
│ │ ├── ComputePath → S
│ │ └── FollowPath → F ←── 2차 오류 발생
│ │ ↓ FAILURE 전파
│ │ RecoveryNav → F
│ │ ↓ 모든 대안 소진
│ NavFB → F
│ ↓ FAILURE 전파
Mission → F
오류는 발생 지점에서 시작하여, Sequence를 만나면 상향 전파되고, Fallback을 만나면 흡수되어 다음 대안으로 전환된다. 모든 대안이 소진되면 다시 상향 전파가 시작된다.
6. 오류 차단 지점의 설계
6.1 차단 지점의 배치
<Sequence name="Mission">
<!-- 차단 지점 1: 네비게이션 실패 차단 -->
<Fallback>
<Action ID="Navigate"/>
<Action ID="RecoverAndNavigate"/>
<Action ID="WaitAndNavigate"/>
</Fallback>
<!-- 차단 지점 2: 파지 실패 차단 -->
<Fallback>
<Action ID="Grasp"/>
<Action ID="AdjustAndGrasp"/>
<Action ID="RequestHelp"/>
</Fallback>
<Action ID="Deliver"/>
</Sequence>
각 Sequence 단계에서 실패 가능성이 있는 행동을 Fallback으로 감싸서, 개별 단계의 실패가 전체 임무를 중단시키지 않도록 오류를 차단한다.
6.2 오류 차단의 범위 결정
| 차단 범위 | 구조 | 효과 |
|---|---|---|
| 좁은 차단 | 개별 행동에 Fallback | 세밀한 복구, 높은 가용성 |
| 넓은 차단 | 행동 그룹에 Fallback | 간결한 구조, 전체적 복구 |
| 차단 없음 | Fallback 없이 Sequence | 단일 실패로 전체 중단 |
7. Halt와 오류 전파의 결합
7.1 ReactiveSequence에서의 Halt + Fallback 복구
<Fallback>
<ReactiveSequence>
<Condition ID="IsSafe"/>
<Action ID="Mission"/> <!-- Halt 발생 가능 -->
</ReactiveSequence>
<Action ID="SafeStop"/>
</Fallback>
IsSafe→F → Mission.halt() (Halt 발생)
→ ReactiveSequence: FAILURE
→ Fallback이 흡수 → SafeStop 실행
안전 조건 위반에 의한 Halt와 이로 인한 FAILURE가 Fallback에 의해 흡수되어, 안전 정지 행동으로 전환된다. Halt에 의한 오류와 Fallback에 의한 복구가 단일 Tick 내에서 결합된다.
8. 설계 시 고려 사항
-
전파 경로의 예측: 트리를 설계할 때 FAILURE의 전파 경로를 사전에 추적하여, 의도하지 않은 곳까지 오류가 전파되지 않도록 한다.
-
차단 지점의 적절한 배치: 복구 가능한 오류는 발생 지점 가까이에서 차단하고, 치명적 오류는 상위까지 전파되도록 설계한다.
-
부수 효과의 누적 인지: Sequence 내에서 여러 자식이 성공한 후 FAILURE가 발생하면, 이전 자식들의 부수 효과가 누적된 상태이다. 복구 행동은 이 누적된 부수 효과를 고려해야 한다.
-
디버깅을 위한 추적: 복잡한 중첩 구조에서의 오류 전파는 추적이 어려우므로, 각 노드의 반환 상태를 로깅하여 오류 경로를 시각화할 수 있도록 한다(Faconti, 2022).
참고 문헌
- 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/