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 XMLFallback XML
기본 태그<Sequence><Fallback>
Reactive 태그<ReactiveSequence><ReactiveFallback>
자식 순서 의미순차 실행 순서우선순위 순서
성공 조건모든 자식 SUCCESS하나의 자식 SUCCESS
실패 조건하나의 자식 FAILURE모든 자식 FAILURE

9. XML 정의 시 주의 사항

  1. 태그명과 동작의 일치: <Fallback>은 FallbackWithMemory, <ReactiveFallback>은 비상태적 Fallback이다. 의도한 동작에 맞는 태그를 선택해야 한다.

  2. 자식 순서의 의미: XML에서 자식 요소의 순서가 대안의 우선순위를 결정한다. 가장 선호되는 대안을 먼저 배치한다.

  3. 최후 수단의 명시적 포함: 안전이 중요한 시스템에서는 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/