1294.52 세 가지 Fallback 변형의 동작 차이 사례

1294.52 세 가지 Fallback 변형의 동작 차이 사례

1. 사례의 목적

동일한 행동 트리 구조에 대해 FallbackWithMemory와 ReactiveFallback이 각각 어떻게 다른 동작을 생성하는지를 구체적 시나리오를 통해 비교한다(Colledanchise & Ogren, 2018).

2. 사례 1: 우선 대안 가용성 변화 감지

2.1 트리 구조

<Fallback변형>
    <Condition ID="IsPrimaryPathClear"/>
    <Action ID="UseDetourPath"/>
</Fallback변형>

2.2 환경 변화 시나리오

Tick 1에서 주 경로가 막혀 있고, Tick 3에서 주 경로가 정리된다. UseDetourPath는 5 Tick이 소요되는 비동기 액션이다.

2.3 FallbackWithMemory의 동작

Tick 1: IsPrimaryPathClear→F, UseDetourPath→R (idx=1)
Tick 2: UseDetourPath→R                       (주 경로 확인 안 함)
Tick 3: UseDetourPath→R                       (주 경로 정리됐지만 미감지)
Tick 4: UseDetourPath→R                       (불필요한 우회 계속)
Tick 5: UseDetourPath→S                       (우회 완료)
        → SUCCESS

로봇은 주 경로가 Tick 3에서 정리되었음에도 불구하고 Tick 5까지 우회 경로를 계속 사용한다.

2.4 ReactiveFallback의 동작

Tick 1: IsPrimaryPathClear→F, UseDetourPath→R
Tick 2: IsPrimaryPathClear→F, UseDetourPath→R
Tick 3: IsPrimaryPathClear→S                  (주 경로 정리 즉시 감지)
        UseDetourPath→Halt                    (우회 즉시 중단)
        → SUCCESS

주 경로가 정리되는 즉시 우회가 중단되어, 불필요한 이동이 방지된다.

3. 사례 2: 목표 달성 상태의 외부 변화 감지

3.1 트리 구조

<Fallback변형>
    <Condition ID="IsObjectGrasped"/>
    <Action ID="GraspObject"/>
</Fallback변형>

3.2 환경 시나리오

로봇이 물체를 파지하려는 동안(Tick 3), 다른 로봇이 해당 물체를 이미 파지하여 목표 상태가 외부적으로 충족된다.

3.3 FallbackWithMemory의 동작

Tick 1: IsObjectGrasped→F, GraspObject→R (idx=1)
Tick 2: GraspObject→R                    (상태 확인 안 함)
Tick 3: GraspObject→R                    (외부 변화 미감지, 파지 계속 시도)
Tick 4: GraspObject→F                    (이미 다른 로봇이 가져감)
        → FAILURE

물체가 이미 다른 로봇에 의해 파지되었음에도 파지 시도를 계속하다가 최종 실패한다.

3.4 ReactiveFallback의 동작

Tick 1: IsObjectGrasped→F, GraspObject→R
Tick 2: IsObjectGrasped→F, GraspObject→R
Tick 3: IsObjectGrasped→S                (외부 변화 즉시 감지)
        GraspObject→Halt                 (파지 시도 중단)
        → SUCCESS

물체가 이미 파지된 상태임을 즉시 감지하여 불필요한 파지 시도를 중단한다.

4. 사례 3: 부수 효과가 있는 대안의 재시도

4.1 트리 구조

<Fallback변형>
    <Action ID="SendAlertAndTryPrimary"/>
    <Action ID="UseBackup"/>
</Fallback변형>

4.2 환경 시나리오

SendAlertAndTryPrimary는 동기 액션으로 FAILURE를 반환하며, 서버에 경고 알림을 전송하는 부수 효과를 가진다. UseBackup은 3 Tick이 소요되는 비동기 액션이다.

4.3 FallbackWithMemory의 동작

Tick 1: SendAlertAndTryPrimary→F (알림 1회 전송), UseBackup→R (idx=1)
Tick 2: UseBackup→R              (SendAlert 건너뜀)
Tick 3: UseBackup→S              (완료)
        → SUCCESS

결과: 알림 1회 전송 (의도된 동작)

4.4 ReactiveFallback의 동작

Tick 1: SendAlertAndTryPrimary→F (알림 전송), UseBackup→R
Tick 2: SendAlertAndTryPrimary→F (알림 재전송!), UseBackup→R
Tick 3: SendAlertAndTryPrimary→F (알림 재전송!), UseBackup→S
        → SUCCESS

결과: 알림 3회 전송 (의도하지 않은 부수 효과)

ReactiveFallback에서 부수 효과가 있는 액션을 앞쪽에 배치하면, 매 Tick마다 부수 효과가 반복 발생한다.

5. 사례 4: 다중 대안의 순차 이동

5.1 트리 구조

<Fallback변형>
    <Action ID="AsyncMethodA"/>
    <Action ID="AsyncMethodB"/>
    <Action ID="SyncMethodC"/>
</Fallback변형>

5.2 환경 시나리오

AsyncMethodA는 2 Tick 후 FAILURE, AsyncMethodB는 3 Tick 후 SUCCESS를 반환한다.

5.3 FallbackWithMemory의 동작

Tick 1: AsyncMethodA→R (idx=0)
Tick 2: AsyncMethodA→F, AsyncMethodB→R (idx=1)
Tick 3: AsyncMethodB→R                 (AsyncMethodA 건너뜀)
Tick 4: AsyncMethodB→S
        → SUCCESS

총 Tick: 4, 총 노드 방문: 1+2+1+1 = 5

5.4 ReactiveFallback의 동작

Tick 1: AsyncMethodA→R
Tick 2: AsyncMethodA→F, AsyncMethodB→R
Tick 3: AsyncMethodA→R (재시작!), haltChild(AsyncMethodB)
        → RUNNING (AsyncMethodA가 다시 RUNNING)
Tick 4: AsyncMethodA→F, AsyncMethodB→R (AsyncMethodB도 재시작!)
...

ReactiveFallback에서 앞쪽에 비동기 액션을 배치하면, 해당 액션이 매 Tick 재실행되어 뒤쪽 대안의 진행이 방해받을 수 있다. 이 사례는 ReactiveFallback에서 앞쪽에 액션 노드를 배치하는 것이 위험한 이유를 보여준다.

6. 사례 5: Halt 후 재시작

6.1 트리 구조

<Fallback변형>
    <Condition ID="IsServiceOnline"/>
    <Action ID="UseOfflineMode"/>
</Fallback변형>

6.2 환경 시나리오

Tick 3에서 서비스가 복구되고(SUCCESS), Tick 5에서 다시 중단된다(FAILURE).

6.3 FallbackWithMemory의 동작

Tick 1: IsServiceOnline→F, UseOfflineMode→R (idx=1)
Tick 2: UseOfflineMode→R                    (서비스 상태 확인 안 함)
Tick 3: UseOfflineMode→R                    (서비스 복구 미감지)
Tick 4: UseOfflineMode→R
Tick 5: UseOfflineMode→S
        → SUCCESS

6.4 ReactiveFallback의 동작

Tick 1: IsServiceOnline→F, UseOfflineMode→R
Tick 2: IsServiceOnline→F, UseOfflineMode→R
Tick 3: IsServiceOnline→S                   (서비스 복구 감지)
        UseOfflineMode→Halt                 (오프라인 모드 중단)
        → SUCCESS
Tick 4: (상위 노드가 다시 Tick 전달 시)
        IsServiceOnline→S
        → SUCCESS
Tick 5: IsServiceOnline→F, UseOfflineMode→R (서비스 재중단 → 오프라인 재시작)

ReactiveFallback에서는 서비스 상태 변화에 즉각적으로 반응한다.

7. 동작 차이 요약

사례FallbackWithMemoryReactiveFallback
우선 대안 가용성 변화미감지 (비효율)즉시 감지 (효율적)
외부 목표 달성미감지 (불필요한 작업)즉시 감지 (즉시 중단)
부수 효과 액션1회 실행 (안전)매 Tick 재실행 (위험)
비동기 액션 순차 이동안정적 진행앞쪽 재시작 위험
Halt 후 재시작해당 없음자연스러운 전환

참고 문헌

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