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. 동작 차이 요약
| 사례 | FallbackWithMemory | ReactiveFallback |
|---|---|---|
| 우선 대안 가용성 변화 | 미감지 (비효율) | 즉시 감지 (효율적) |
| 외부 목표 달성 | 미감지 (불필요한 작업) | 즉시 감지 (즉시 중단) |
| 부수 효과 액션 | 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/