1294.63 다중 대안 Fallback 체인

1. 다중 대안 Fallback 체인의 개념

다중 대안 Fallback 체인이란, Fallback 노드에 3개 이상의 자식을 배치하여 다수의 대안을 순차적으로 시도하는 구조이다. 각 자식은 하나의 대안을 나타내며, 왼쪽에서 오른쪽으로 우선순위가 감소한다. 이 구조는 Fallback의 OR 의미론을 N개의 피연산자로 확장한 것이다(Colledanchise & Ogren, 2018).

2. 체인의 구조

<Fallback>
    <Action ID="Alternative1"/>    <!-- 1순위 -->
    <Action ID="Alternative2"/>    <!-- 2순위 -->
    <Action ID="Alternative3"/>    <!-- 3순위 -->
    ...
    <Action ID="AlternativeN"/>    <!-- N순위 -->
</Fallback>

체인의 실행 규칙:

  1. Alternative1을 시도한다. 성공하면 체인 종료.
  2. Alternative1이 실패하면 Alternative2를 시도한다. 성공하면 체인 종료.
  3. 이 과정을 AlternativeN까지 반복한다.
  4. 모든 대안이 실패하면 Fallback이 FAILURE를 반환한다.

3. 체인 길이의 설계

3.1 짧은 체인 (2-3개)

<Fallback>
    <Action ID="TryDirect"/>
    <Action ID="TryDetour"/>
    <Action ID="WaitAndRetry"/>
</Fallback>

짧은 체인은 가독성이 높고 디버깅이 용이하다. 대부분의 경우 2-4개의 대안이 충분하다.

3.2 긴 체인 (5개 이상)

<Fallback>
    <Action ID="Method1"/>
    <Action ID="Method2"/>
    <Action ID="Method3"/>
    <Action ID="Method4"/>
    <Action ID="Method5"/>
    <Action ID="Method6"/>
    <Action ID="FinalFallback"/>
</Fallback>

긴 체인은 포괄적인 복구 전략을 제공하지만, 가독성이 저하되고 FAILURE까지의 지연 시간이 길어질 수 있다. 5개 이상의 대안이 필요한 경우, 서브트리로 분리하거나 대안을 범주화하여 중첩 Fallback으로 구성하는 것이 권장된다.

4. 중첩 Fallback 체인

대안을 범주별로 그룹화하여 Fallback을 중첩하는 구조이다.

<Fallback>
    <!-- 범주 1: 소프트웨어 복구 -->
    <Fallback>
        <Action ID="SoftRestart"/>
        <Action ID="ClearCacheAndRetry"/>
        <Action ID="ReloadConfiguration"/>
    </Fallback>
    <!-- 범주 2: 하드웨어 복구 -->
    <Fallback>
        <Action ID="RecalibrateHardware"/>
        <Action ID="ResetHardware"/>
    </Fallback>
    <!-- 범주 3: 최후 수단 -->
    <Action ID="EnterSafeMode"/>
</Fallback>

외부 Fallback이 범주 수준의 대안 탐색을 수행하고, 내부 Fallback이 각 범주 내의 세부 대안을 탐색한다. 소프트웨어 복구의 모든 방법이 실패해야 하드웨어 복구로 진행한다.

5. 로봇 공학에서의 적용 사례

5.1 사례 1: Nav2의 복구 행동 체인

ROS2 Nav2에서는 네비게이션 실패 시 다중 복구 행동을 Fallback 체인으로 구성한다.

<Fallback>
    <Action ID="ComputePathToPose"/>
    <Fallback>
        <Action ID="ClearGlobalCostmap"/>
        <Action ID="Spin"/>
        <Action ID="Wait"/>
        <Action ID="BackUp"/>
    </Fallback>
</Fallback>

경로 계산이 실패하면, 코스트맵 정리 → 회전 → 대기 → 후진의 순서로 복구를 시도한다.

5.2 사례 2: 드론의 비상 착륙 체인

<Fallback>
    <Action ID="LandAtDesignatedZone"/>
    <Action ID="LandAtNearestSafeSpot"/>
    <Action ID="AutorotationLanding"/>
    <Action ID="ParachuteDeploy"/>
</Fallback>

5.3 사례 3: 매니퓰레이터의 파지 체인

<Fallback>
    <Action ID="PrecisionGrasp"/>
    <Action ID="EnvelopingGrasp"/>
    <Action ID="SuctionGrasp"/>
    <Action ID="PushToEdgeAndGrasp"/>
    <Action ID="RequestHumanAssist"/>
</Fallback>

6. 체인에서의 RUNNING 상태 관리

6.1 FallbackWithMemory에서의 체인 진행

Tick 1: Alt1→F, Alt2→R (idx=1)
Tick 2: Alt2→R          (Alt1 건너뜀)
Tick 3: Alt2→F, Alt3→R  (idx=2)
Tick 4: Alt3→S          → SUCCESS

비동기 대안이 RUNNING에서 FAILURE로 전환되면, 체인은 자연스럽게 다음 대안으로 진행한다.

6.2 ReactiveFallback에서의 체인 동작

Tick 1: Alt1→F, Alt2→R
Tick 2: Alt1→S           (Alt1 복구 → Alt2 Halt)
        → SUCCESS

ReactiveFallback에서는 앞쪽 대안이 다시 가용해지면 현재 대안을 중단하고 전환한다.

7. 체인 설계의 모범 사례

  1. 최후 수단 포함: 체인의 마지막 자식에 항상 성공하는 안전 행동을 배치한다.
  2. 비용 순서 배치: 비용이 낮은 대안을 앞에, 높은 대안을 뒤에 배치한다.
  3. 독립적 대안: 각 대안이 이전 대안의 부수 효과에 의존하지 않도록 한다.
  4. 적절한 체인 길이: 일반적으로 3-5개의 대안이 적절하며, 초과 시 서브트리로 분리한다.
  5. 타임아웃 고려: 비동기 대안에 타임아웃 데코레이터를 적용하여 무한 대기를 방지한다(Faconti, 2022).
<Fallback>
    <Timeout msec="5000">
        <Action ID="TryMethod1"/>
    </Timeout>
    <Timeout msec="10000">
        <Action ID="TryMethod2"/>
    </Timeout>
    <Action ID="SafeStop"/>
</Fallback>

참고 문헌

  • 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/