1294.60 조건 기반 분기 Fallback 패턴
1. 패턴의 정의
조건 기반 분기 Fallback 패턴이란, Fallback 노드의 각 자식이 “조건-행동” Sequence로 구성되어, 조건에 따라 서로 다른 행동을 선택하는 구조이다. 이 패턴은 프로그래밍 언어의 if-elseif-else 조건 분기문에 대응하며, 행동 트리에서 조건부 의사 결정을 구현하는 가장 일반적인 구조이다(Colledanchise & Ogren, 2018).
2. 기본 구조
<Fallback>
<Sequence>
<Condition ID="ConditionA"/>
<Action ID="ActionA"/>
</Sequence>
<Sequence>
<Condition ID="ConditionB"/>
<Action ID="ActionB"/>
</Sequence>
<Sequence>
<Condition ID="ConditionC"/>
<Action ID="ActionC"/>
</Sequence>
<Action ID="DefaultAction"/> <!-- else 절 -->
</Fallback>
2.1 프로그래밍 언어 대응
if (ConditionA) {
ActionA();
} else if (ConditionB) {
ActionB();
} else if (ConditionC) {
ActionC();
} else {
DefaultAction();
}
3. 실행 흐름
3.1 분기 선택 과정
- Fallback이 첫 번째 Sequence를 평가한다.
- Sequence 내부에서 ConditionA가 평가된다.
- SUCCESS이면 ActionA를 실행하고, Sequence가 SUCCESS를 반환하여 Fallback이 종료된다.
- FAILURE이면 Sequence가 FAILURE를 반환하고, Fallback이 다음 Sequence로 진행한다.
- 동일한 과정이 ConditionB, ConditionC에 대해 반복된다.
- 모든 조건이 FAILURE이면 DefaultAction이 실행된다.
3.2 실행 추적
시나리오: ConditionA=F, ConditionB=S
Fallback:
Sequence 1:
ConditionA → FAILURE
→ Sequence 1 FAILURE (ActionA 미실행)
Sequence 2:
ConditionB → SUCCESS
ActionB → SUCCESS
→ Sequence 2 SUCCESS
→ Fallback SUCCESS (Sequence 3, DefaultAction 미평가)
4. 조건의 상호 배타성
4.1 상호 배타적 조건
조건들이 상호 배타적(mutually exclusive)이면, 정확히 하나의 분기만 실행된다.
<Fallback>
<Sequence>
<Condition ID="IsObjectSmall"/> <!-- 소형 물체 -->
<Action ID="PrecisionGrasp"/>
</Sequence>
<Sequence>
<Condition ID="IsObjectMedium"/> <!-- 중형 물체 -->
<Action ID="NormalGrasp"/>
</Sequence>
<Sequence>
<Condition ID="IsObjectLarge"/> <!-- 대형 물체 -->
<Action ID="TwoHandGrasp"/>
</Sequence>
</Fallback>
4.2 비상호 배타적 조건
조건들이 상호 배타적이지 않으면, 여러 조건이 동시에 참일 수 있다. 이 경우 Fallback의 좌→우 평가 순서에 의해 가장 왼쪽의 참인 조건에 해당하는 행동만 실행된다.
<Fallback>
<Sequence>
<Condition ID="IsEmergency"/> <!-- 비상 (최우선) -->
<Action ID="EmergencyStop"/>
</Sequence>
<Sequence>
<Condition ID="IsLowBattery"/> <!-- 배터리 부족 -->
<Action ID="GoCharge"/>
</Sequence>
<Action ID="ContinueMission"/>
</Fallback>
비상 상황과 배터리 부족이 동시에 참이면, 비상 정지가 우선 실행된다.
5. 로봇 공학에서의 적용 사례
5.1 사례 1: 로봇 상태 기반 행동 선택
<Fallback>
<Sequence>
<Condition ID="IsBatteryBelow10"/>
<Action ID="EmergencyReturn"/>
</Sequence>
<Sequence>
<Condition ID="IsBatteryBelow30"/>
<Action ID="GoToChargingStation"/>
</Sequence>
<Sequence>
<Condition ID="HasAssignedTask"/>
<Action ID="ExecuteTask"/>
</Sequence>
<Action ID="Patrol"/>
</Fallback>
배터리가 10% 미만이면 비상 귀환, 30% 미만이면 충전, 할당된 작업이 있으면 작업 수행, 그 외에는 순찰한다.
5.2 사례 2: 환경 기반 이동 전략 선택
<Fallback>
<Sequence>
<Condition ID="IsNarrowCorridor"/>
<Action ID="UseWallFollowing"/>
</Sequence>
<Sequence>
<Condition ID="IsOpenArea"/>
<Action ID="UseGlobalPlanner"/>
</Sequence>
<Sequence>
<Condition ID="IsCrowdedArea"/>
<Action ID="UseSocialNavigation"/>
</Sequence>
<Action ID="UseDefaultNavigation"/>
</Fallback>
5.3 사례 3: 센서 가용성 기반 위치 추정 선택
<Fallback>
<Sequence>
<Condition ID="IsGPSAndLidarAvailable"/>
<Action ID="FusedLocalization"/>
</Sequence>
<Sequence>
<Condition ID="IsLidarOnly"/>
<Action ID="LidarLocalization"/>
</Sequence>
<Sequence>
<Condition ID="IsGPSOnly"/>
<Action ID="GPSLocalization"/>
</Sequence>
<Action ID="DeadReckoning"/>
</Fallback>
6. Reactive 변형에서의 분기 패턴
ReactiveFallback을 사용하면, 조건의 변화에 따라 분기가 동적으로 전환된다.
<ReactiveFallback>
<Sequence>
<Condition ID="IsHighPriorityTask"/>
<Action ID="HandleHighPriority"/>
</Sequence>
<Sequence>
<Condition ID="IsMediumPriorityTask"/>
<Action ID="HandleMediumPriority"/>
</Sequence>
<Action ID="HandleLowPriority"/>
</ReactiveFallback>
중간 우선순위 작업을 처리하는 동안 높은 우선순위 작업이 발생하면, 중간 우선순위 처리가 Halt되고 높은 우선순위 작업으로 즉시 전환된다.
7. 설계 시 고려사항
- 조건 평가 순서: 가장 긴급하거나 중요한 조건을 먼저 배치한다.
- 기본 행동(else 절): 마지막 자식에 무조건 실행되는 기본 행동을 배치하면, Fallback이 FAILURE를 반환하는 것을 방지한다.
- 조건의 완전성: 모든 가능한 상태를 조건으로 포함하지 않으면, 기본 행동이 없는 경우 Fallback이 FAILURE를 반환할 수 있다.
- 변형 선택: 조건 변화에 대한 동적 전환이 필요하면 ReactiveFallback을, 현재 분기를 완료할 때까지 유지해야 하면 FallbackWithMemory를 사용한다(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/