1294.57 다중 계층 Sequence-Fallback 구조
1. 다중 계층 구조의 개념
다중 계층 Sequence-Fallback 구조란, Sequence와 Fallback 노드가 3층 이상의 깊이로 교대하여 중첩된 행동 트리 구조를 의미한다. 이 구조는 복잡한 로봇 임무를 계층적으로 분해하여, 각 계층에서 순차 실행(AND)과 대안 탐색(OR)을 적절히 조합한다(Colledanchise & Ogren, 2018).
2. 계층적 분해의 원리
2.1 계층 구조
<!-- 계층 1: Fallback (대안 선택) -->
<Fallback>
<!-- 계층 2: Sequence (조건부 행동) -->
<Sequence>
<Condition ID="CondA"/>
<Action ID="ActA"/>
</Sequence>
<Action ID="Default"/>
</Fallback>
2.2 계층 구조
<!-- 계층 1: Sequence (순차 임무) -->
<Sequence>
<Action ID="Phase1"/>
<!-- 계층 2: Fallback (대안 탐색) -->
<Fallback>
<!-- 계층 3: Sequence (조건부 대안) -->
<Sequence>
<Condition ID="CondA"/>
<Action ID="Phase2_MethodA"/>
</Sequence>
<Action ID="Phase2_Default"/>
</Fallback>
<Action ID="Phase3"/>
</Sequence>
2.3 계층 구조
<!-- 계층 1: ReactiveSequence (안전 감시) -->
<ReactiveSequence>
<Condition ID="IsNotEmergency"/>
<!-- 계층 2: Fallback (임무 선택) -->
<Fallback>
<!-- 계층 3: Sequence (임무 A) -->
<Sequence>
<Condition ID="IsMissionAValid"/>
<!-- 계층 4: Fallback (임무 A의 방법 선택) -->
<Fallback>
<Action ID="MissionA_Fast"/>
<Action ID="MissionA_Slow"/>
</Fallback>
</Sequence>
<Action ID="IdleBehavior"/>
</Fallback>
</ReactiveSequence>
3. 전형적인 다중 계층 패턴
3.1 안전-임무-행동 3계층 패턴
<!-- 계층 1: 안전 계층 (ReactiveSequence) -->
<ReactiveSequence>
<Condition ID="IsSystemHealthy"/>
<Condition ID="IsBatteryOK"/>
<!-- 계층 2: 임무 계층 (Fallback) -->
<Fallback>
<Sequence>
<Condition ID="HasMission"/>
<!-- 계층 3: 행동 계층 (Sequence) -->
<Sequence>
<Action ID="NavigateToTarget"/>
<Action ID="PerformTask"/>
<Action ID="ReturnToBase"/>
</Sequence>
</Sequence>
<Action ID="Idle"/>
</Fallback>
</ReactiveSequence>
- 계층 1 (안전): 시스템 건강 상태와 배터리를 매 Tick 감시한다.
- 계층 2 (임무): 임무가 있으면 수행하고, 없으면 대기한다.
- 계층 3 (행동): 임무의 순차적 단계를 수행한다.
3.2 임무-전략-실행 3계층 패턴
<!-- 계층 1: 임무 계층 (Sequence) -->
<Sequence>
<Action ID="PlanMission"/>
<!-- 계층 2: 전략 계층 (Fallback) -->
<Fallback>
<!-- 계층 3: 실행 계층 (Sequence) -->
<Sequence>
<Condition ID="IsDirectPathClear"/>
<Action ID="ExecuteDirectPlan"/>
</Sequence>
<Sequence>
<Condition ID="IsDetourPossible"/>
<Action ID="ExecuteDetourPlan"/>
</Sequence>
<Action ID="WaitAndRetry"/>
</Fallback>
<Action ID="ReportCompletion"/>
</Sequence>
4. 실행 흐름의 추적
4.1 계층 구조의 전체 실행 추적
<ReactiveSequence>
<Condition ID="IsSafe"/>
<Fallback>
<Sequence>
<Condition ID="HasGoal"/>
<Action ID="Navigate"/>
</Sequence>
<Action ID="Patrol"/>
</Fallback>
</ReactiveSequence>
시나리오: 목표 있음, 안전 상태
Tick 1:
ReactiveSequence:
IsSafe → SUCCESS
Fallback:
Sequence:
HasGoal → SUCCESS
Navigate → RUNNING
→ RUNNING
→ RUNNING
Tick 2:
ReactiveSequence:
IsSafe → SUCCESS (재평가)
Fallback (FallbackWithMemory 재진입):
Sequence (재진입):
Navigate → RUNNING
→ RUNNING
→ RUNNING
Tick 3 (안전 위반):
ReactiveSequence:
IsSafe → FAILURE
Fallback → Halt (Navigate Halt)
→ FAILURE
5. Reactive 변형의 계층적 조합
5.1 ReactiveSequence + ReactiveFallback 조합
<ReactiveSequence>
<Condition ID="IsNotEmergency"/>
<ReactiveFallback>
<Condition ID="IsTaskDone"/>
<Sequence>
<Condition ID="HasResources"/>
<Action ID="DoTask"/>
</Sequence>
<Action ID="AcquireResources"/>
</ReactiveFallback>
</ReactiveSequence>
- 외부 ReactiveSequence: 비상 상태를 매 Tick 감시한다.
- 내부 ReactiveFallback: 작업 완료 여부를 매 Tick 확인하고, 자원이 있으면 작업을, 없으면 자원 확보를 수행한다.
6. 계층 깊이의 관리
6.1 서브트리를 통한 분해
계층이 깊어지면 가독성이 저하되므로, BehaviorTree.CPP v4의 서브트리(SubTree) 기능을 사용하여 하위 계층을 별도의 트리로 분리할 수 있다(Faconti, 2022).
<!-- 주 트리 -->
<ReactiveSequence>
<Condition ID="IsSafe"/>
<SubTree ID="MissionTree"/>
</ReactiveSequence>
<!-- MissionTree (별도 정의) -->
<BehaviorTree ID="MissionTree">
<Fallback>
<Sequence>
<Condition ID="HasGoal"/>
<SubTree ID="NavigationTree"/>
</Sequence>
<Action ID="Idle"/>
</Fallback>
</BehaviorTree>
6.2 권장 계층 깊이
실무에서 단일 트리 파일 내의 계층 깊이는 3-4층을 초과하지 않는 것이 권장된다. 그 이상의 깊이가 필요한 경우 서브트리로 분리하여 각 서브트리의 깊이를 2-3층 이내로 유지한다.
7. 상태 전파의 계층적 흐름
다중 계층 구조에서 상태(SUCCESS, FAILURE, RUNNING)는 하위 계층에서 상위 계층으로 전파된다. 각 계층의 노드 유형(Sequence/Fallback)에 따라 상태가 변환되어 전파된다.
계층 4 (Action): SUCCESS →
계층 3 (Sequence): SUCCESS (다음 자식으로) →
계층 2 (Fallback): SUCCESS (조기 종료) →
계층 1 (ReactiveSequence): SUCCESS (다음 자식으로)
계층 4 (Action): FAILURE →
계층 3 (Sequence): FAILURE (조기 종료) →
계층 2 (Fallback): FAILURE (다음 대안으로) →
계층 1 (ReactiveSequence): 대안에 따라 결정
이 전파 규칙을 이해하는 것이 다중 계층 구조의 설계와 디버깅에 필수적이다.
참고 문헌
- 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/