1294.54 Sequence와 Fallback의 조합 패턴
1. 조합의 필요성
Sequence와 Fallback은 각각 AND와 OR 의미론을 구현하는 기본 제어 흐름 노드이다. 실제 로봇 행동 제어에서는 단일 Sequence나 단일 Fallback만으로 복잡한 의사 결정을 표현하기 어렵다. 두 노드를 계층적으로 중첩하여 조합함으로써, 조건부 행동, 대안 탐색, 순차적 임무 수행, 복구 전략 등 다양한 행동 패턴을 표현할 수 있다(Colledanchise & Ogren, 2018).
2. 기본 조합 구조
2.1 Sequence 내부의 Fallback
Sequence의 자식으로 Fallback을 배치하면, “순차적 단계 중 하나의 단계에서 여러 대안을 시도“하는 패턴이 구현된다.
<Sequence>
<Action ID="Step1"/>
<Fallback> <!-- Step2에 대한 대안 탐색 -->
<Action ID="Step2_MethodA"/>
<Action ID="Step2_MethodB"/>
</Fallback>
<Action ID="Step3"/>
</Sequence>
Step1이 성공한 후, Step2를 수행하기 위해 MethodA를 먼저 시도하고, 실패하면 MethodB를 시도한다. Step2가 어떤 방법으로든 성공하면 Step3으로 진행한다.
2.2 Fallback 내부의 Sequence
Fallback의 자식으로 Sequence를 배치하면, “조건부 행동의 대안 탐색“하는 패턴이 구현된다.
<Fallback>
<Sequence> <!-- 대안 1: 조건 A 하에서 행동 -->
<Condition ID="ConditionA"/>
<Action ID="ActionA"/>
</Sequence>
<Sequence> <!-- 대안 2: 조건 B 하에서 행동 -->
<Condition ID="ConditionB"/>
<Action ID="ActionB"/>
</Sequence>
<Action ID="DefaultAction"/> <!-- 기본 행동 -->
</Fallback>
ConditionA가 참이면 ActionA를 수행하고, ConditionA가 거짓이면 ConditionB를 확인하여 ActionB를 수행한다. 둘 다 거짓이면 DefaultAction을 수행한다. 이 구조는 if-elseif-else 분기문에 대응한다.
3. 전형적 조합 패턴
3.1 조건-행동 패턴 (Condition-Action Pattern)
가장 기본적인 조합으로, Sequence에서 조건을 확인한 후 행동을 수행한다.
<Sequence>
<Condition ID="IsBatteryLow"/>
<Action ID="NavigateToCharger"/>
</Sequence>
배터리가 낮을 때만 충전소로 이동한다. 조건이 FAILURE이면 Sequence 전체가 FAILURE를 반환하여 행동이 실행되지 않는다.
3.2 시도-대안 패턴 (Try-Alternative Pattern)
Fallback에서 주 방안을 시도하고, 실패 시 대안으로 전환한다.
<Fallback>
<Action ID="PrimaryApproach"/>
<Action ID="AlternativeApproach"/>
</Fallback>
3.3 조건부 대안 선택 패턴
Fallback 내부에 조건-행동 Sequence를 배치하여, 조건에 따라 다른 행동을 선택한다.
<Fallback>
<Sequence>
<Condition ID="IsIndoor"/>
<Action ID="UseIndoorNavigation"/>
</Sequence>
<Sequence>
<Condition ID="IsOutdoor"/>
<Action ID="UseOutdoorNavigation"/>
</Sequence>
<Action ID="UseDeadReckoning"/>
</Fallback>
4. 논리적 해석
4.1 AND-OR 트리로서의 해석
Sequence와 Fallback의 조합은 AND-OR 트리(AND-OR tree)를 형성한다. AND 노드(Sequence)와 OR 노드(Fallback)의 교대 배치는 복합 논리식을 트리 구조로 표현한다.
<!-- 논리식: (A AND B) OR (C AND D) OR E -->
<Fallback>
<Sequence>
<Action ID="A"/>
<Action ID="B"/>
</Sequence>
<Sequence>
<Action ID="C"/>
<Action ID="D"/>
</Sequence>
<Action ID="E"/>
</Fallback>
4.2 if-elseif-else 구조와의 대응
<!-- if (CondA) ActionA; elseif (CondB) ActionB; else ActionC; -->
<Fallback>
<Sequence>
<Condition ID="CondA"/>
<Action ID="ActionA"/>
</Sequence>
<Sequence>
<Condition ID="CondB"/>
<Action ID="ActionB"/>
</Sequence>
<Action ID="ActionC"/>
</Fallback>
이 대응에서:
- Fallback = if-elseif-else 블록
- Sequence(조건+행동) = 각 분기
- 마지막 단독 Action = else 절
5. Reactive 변형의 조합
5.1 ReactiveSequence + Fallback
안전 조건 감시 하에서 대안을 탐색하는 패턴이다.
<ReactiveSequence>
<Condition ID="IsNotEmergency"/>
<Fallback>
<Action ID="PrimaryMethod"/>
<Action ID="BackupMethod"/>
</Fallback>
</ReactiveSequence>
비상 상황이 발생하면 어떤 방법을 시도 중이든 즉시 중단된다.
5.2 Sequence + ReactiveFallback
순차적 단계 중 하나에서 목표 달성을 동적으로 감시하는 패턴이다.
<Sequence>
<Action ID="PrepareTools"/>
<ReactiveFallback>
<Condition ID="IsAssembled"/>
<Action ID="AssembleParts"/>
</ReactiveFallback>
<Action ID="Verify"/>
</Sequence>
6. 조합의 깊이와 복잡도
6.1 단층 조합
<Sequence>
<Condition/>
<Action/>
</Sequence>
6.2 층 조합
<Fallback>
<Sequence>
<Condition/>
<Action/>
</Sequence>
<Action/>
</Fallback>
6.3 층 조합
<ReactiveSequence>
<Condition/>
<Fallback>
<Sequence>
<Condition/>
<Action/>
</Sequence>
<Action/>
</Fallback>
</ReactiveSequence>
조합의 깊이가 증가할수록 표현력이 향상되지만, 트리의 가독성과 디버깅 난이도가 함께 증가한다. 실무에서는 3층 이상의 깊은 중첩은 서브트리(SubTree)로 분리하여 관리하는 것이 권장된다(Faconti, 2022).
7. 조합 패턴 선택 지침
| 요구사항 | 조합 패턴 |
|---|---|
| 조건 확인 후 행동 | Sequence(조건, 행동) |
| 여러 대안 시도 | Fallback(대안1, 대안2, …) |
| 조건부 대안 선택 | Fallback(Sequence(조건, 행동), …) |
| 안전 감시 하 대안 탐색 | ReactiveSequence(조건, Fallback(…)) |
| 순차 단계 중 대안 시도 | Sequence(단계1, Fallback(방법A, 방법B), 단계3) |
| 목표 달성 감시 하 행동 | ReactiveFallback(조건, 행동) |
참고 문헌
- 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/