1294.88 XML에서의 Fallback 노드 정의
1. Fallback 노드의 XML 태그
1.1 기본 Fallback (FallbackWithMemory)
<Fallback name="optional_name">
<!-- 대안 자식 노드들 -->
</Fallback>
<Fallback> 태그는 BehaviorTree.CPP v4의 FallbackNode 클래스에 매핑된다. 이 노드는 FallbackWithMemory 동작을 수행하며, 이전에 FAILURE를 반환한 자식을 건너뛰고 마지막 RUNNING 자식부터 재진입한다(Faconti, 2022).
1.2 ReactiveFallback
<ReactiveFallback name="optional_name">
<!-- 대안 자식 노드들 -->
</ReactiveFallback>
<ReactiveFallback> 태그는 ReactiveFallback 클래스에 매핑되며, 매 Tick 첫 번째 자식부터 재평가하는 비상태적 Fallback을 정의한다.
2. Fallback의 기본 XML 패턴
2.1 단순 대안 구성
<Fallback>
<Action ID="PrimaryAction"/>
<Action ID="AlternativeAction"/>
<Action ID="LastResort"/>
</Fallback>
2.2 조건부 대안 구성
<Fallback>
<Sequence>
<Condition ID="IsConditionA"/>
<Action ID="ActionForA"/>
</Sequence>
<Sequence>
<Condition ID="IsConditionB"/>
<Action ID="ActionForB"/>
</Sequence>
<Action ID="DefaultAction"/>
</Fallback>
조건-행동 쌍을 Sequence로 감싸서 Fallback의 자식으로 배치하면, 조건 기반 분기(if-elseif-else) 패턴을 구현할 수 있다.
3. 목표 달성 확인 패턴
3.1 조건-행동 Fallback
<Fallback>
<Condition ID="IsGoalAchieved"/>
<Action ID="AchieveGoal"/>
</Fallback>
목표가 이미 달성되었으면 아무 행동도 수행하지 않고 SUCCESS를 반환한다. 이 패턴은 Fallback의 가장 기본적인 XML 구조이다.
4. 복구 행동 체인
4.1 Nav2 스타일의 복구 Fallback
<Fallback name="navigate_with_recovery">
<Sequence>
<Action ID="ComputePathToPose"
goal="{goal}" path="{path}"
planner_id="GridBased"/>
<Action ID="FollowPath"
path="{path}"
controller_id="FollowPath"/>
</Sequence>
<Sequence>
<Action ID="ClearEntireCostmap"
service_name="global_costmap/clear_entirely_global_costmap"/>
<Action ID="ClearEntireCostmap"
service_name="local_costmap/clear_entirely_local_costmap"/>
<Action ID="ComputePathToPose"
goal="{goal}" path="{path}"/>
<Action ID="FollowPath" path="{path}"/>
</Sequence>
<Sequence>
<Action ID="Spin" spin_dist="1.57"/>
<Action ID="ComputePathToPose"
goal="{goal}" path="{path}"/>
<Action ID="FollowPath" path="{path}"/>
</Sequence>
</Fallback>
5. ReactiveFallback의 XML 패턴
5.1 우선순위 기반 행동 선택
<ReactiveFallback>
<Sequence>
<Condition ID="IsEmergency"/>
<Action ID="HandleEmergency"/>
</Sequence>
<Sequence>
<Condition ID="IsHighPriority"/>
<Action ID="HandleHighPriority"/>
</Sequence>
<Action ID="NormalOperation"/>
</ReactiveFallback>
5.2 정상-비상 전환 패턴
<ReactiveFallback>
<Sequence>
<Condition ID="IsAllNormal"/>
<SubTree ID="NormalMission"/>
</Sequence>
<SubTree ID="EmergencyResponse"/>
</ReactiveFallback>
6. 중첩 Fallback의 XML 구조
6.1 범주별 대안 그룹화
<Fallback name="recovery_chain">
<Fallback name="software_recovery">
<Action ID="SoftRestart"/>
<Action ID="ClearCacheAndRetry"/>
</Fallback>
<Fallback name="hardware_recovery">
<Action ID="RecalibrateHardware"/>
<Action ID="ResetHardware"/>
</Fallback>
<Action ID="EnterSafeMode"/>
</Fallback>
7. 데코레이터와의 결합
7.1 Fallback 자식에 데코레이터 적용
<Fallback>
<Timeout msec="5000">
<Action ID="TryMethod1"/>
</Timeout>
<Timeout msec="10000">
<Action ID="TryMethod2"/>
</Timeout>
<Action ID="SafeStop"/>
</Fallback>
각 대안에 타임아웃을 적용하여, 단일 대안에서의 무한 대기를 방지한다.
7.2 Retry와의 결합
<Fallback>
<Retry num_attempts="3">
<Action ID="PrimaryMethod"/>
</Retry>
<Action ID="AlternativeMethod"/>
</Fallback>
PrimaryMethod를 최대 3회 재시도한 후, 여전히 실패하면 AlternativeMethod로 전환한다.
8. Sequence와 Fallback의 XML 대칭성
| 특성 | Sequence XML | Fallback XML |
|---|---|---|
| 기본 태그 | <Sequence> | <Fallback> |
| Reactive 태그 | <ReactiveSequence> | <ReactiveFallback> |
| 자식 순서 의미 | 순차 실행 순서 | 우선순위 순서 |
| 성공 조건 | 모든 자식 SUCCESS | 하나의 자식 SUCCESS |
| 실패 조건 | 하나의 자식 FAILURE | 모든 자식 FAILURE |
9. XML 정의 시 주의 사항
-
태그명과 동작의 일치:
<Fallback>은 FallbackWithMemory,<ReactiveFallback>은 비상태적 Fallback이다. 의도한 동작에 맞는 태그를 선택해야 한다. -
자식 순서의 의미: XML에서 자식 요소의 순서가 대안의 우선순위를 결정한다. 가장 선호되는 대안을 먼저 배치한다.
-
최후 수단의 명시적 포함: 안전이 중요한 시스템에서는 Fallback의 마지막 자식에 항상 성공하는 안전 행동을 명시적으로 배치한다(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/