1294.61 시도-대안 패턴 (Try-Alternative Pattern)
1. 패턴의 정의
시도-대안 패턴(Try-Alternative Pattern)은 Fallback 노드를 사용하여 주 방안(primary approach)을 먼저 시도하고, 실패 시 하나 이상의 대안(alternative)을 순차적으로 시도하는 구조이다. 이 패턴은 Fallback의 가장 본질적인 사용 사례이며, “첫 번째 방법이 안 되면 두 번째를, 두 번째도 안 되면 세 번째를” 시도하는 점진적 대안 탐색(escalation) 전략을 구현한다(Colledanchise & Ogren, 2018).
2. 기본 구조
<Fallback>
<Action ID="PrimaryMethod"/> <!-- 주 방안 -->
<Action ID="AlternativeMethod"/> <!-- 대안 -->
</Fallback>
PrimaryMethod가 SUCCESS를 반환하면 AlternativeMethod는 실행되지 않는다. PrimaryMethod가 FAILURE를 반환하면 AlternativeMethod가 실행된다.
3. 다중 대안 구조
<Fallback>
<Action ID="Method1"/> <!-- 1순위: 최선의 방안 -->
<Action ID="Method2"/> <!-- 2순위: 차선의 방안 -->
<Action ID="Method3"/> <!-- 3순위: 차차선의 방안 -->
<Action ID="LastResort"/> <!-- 최후 수단 -->
</Fallback>
대안은 일반적으로 다음 기준 중 하나로 정렬된다:
- 효율성 순: 가장 효율적인 방법을 먼저 시도
- 비용 순: 가장 비용이 낮은 방법을 먼저 시도
- 안전성 순: 가장 안전한 방법을 먼저 시도
- 성공 확률 순: 성공 확률이 높은 방법을 먼저 시도
4. 조건 기반 시도-대안 패턴
각 대안에 적용 조건을 추가하여, 조건이 충족되는 대안만 시도하는 확장 구조이다.
<Fallback>
<Sequence>
<Condition ID="IsToolAAvailable"/>
<Action ID="UseToolA"/>
</Sequence>
<Sequence>
<Condition ID="IsToolBAvailable"/>
<Action ID="UseToolB"/>
</Sequence>
<Action ID="UseManualMethod"/>
</Fallback>
도구 A가 가용하면 도구 A를 사용하고, 가용하지 않으면 도구 B를 확인한다. 둘 다 불가하면 수동 방법을 사용한다.
5. 로봇 공학에서의 적용 사례
5.1 사례 1: 경로 탐색의 점진적 대안
<Fallback>
<Action ID="FollowGlobalPlan"/>
<Action ID="ComputeLocalDetour"/>
<Action ID="WaitAndRetry"/>
<Action ID="RequestHumanAssistance"/>
</Fallback>
글로벌 경로를 따르다 실패하면 로컬 우회로를 계산하고, 그래도 실패하면 대기 후 재시도, 최후에는 사람의 도움을 요청한다.
5.2 사례 2: 통신 채널의 점진적 대안
<Fallback>
<Action ID="TransmitViaWifi"/>
<Action ID="TransmitVia5G"/>
<Action ID="TransmitViaSatellite"/>
<Action ID="BufferLocally"/>
</Fallback>
WiFi 전송을 먼저 시도하고, 실패하면 5G, 위성 순서로 시도한다. 모든 통신이 불가하면 로컬에 버퍼링한다.
5.3 사례 3: 물체 파지의 점진적 대안
<Fallback>
<Action ID="GraspFromTop"/>
<Action ID="GraspFromSide"/>
<Action ID="SuctionGrasp"/>
<Action ID="PushToEdgeAndGrasp"/>
</Fallback>
5.4 사례 4: 센서 오류 복구
<Fallback>
<Action ID="RecalibrateInPlace"/>
<Action ID="MoveAndRecalibrate"/>
<Action ID="SwitchToBackupSensor"/>
<Action ID="OperateWithoutSensor"/>
</Fallback>
6. WithMemory와 Reactive에서의 시도-대안 동작
6.1 FallbackWithMemory
이미 실패한 대안을 건너뛰고, 현재 RUNNING인 대안부터 재개한다.
Tick 1: Method1→F, Method2→R (idx=1)
Tick 2: Method2→R (Method1 건너뜀)
Tick 3: Method2→S → SUCCESS
6.2 ReactiveFallback
매 Tick마다 처음부터 재평가하므로, 이전에 실패한 앞쪽 대안이 성공 가능해지면 현재 대안을 중단하고 전환한다.
Tick 1: Method1→F, Method2→R
Tick 2: Method1→S (Method1 복구 → Method2 Halt)
→ SUCCESS
7. 최후 수단(Last Resort)의 설계
시도-대안 패턴의 마지막 자식은 “최후 수단“으로, 가능한 한 항상 SUCCESS를 반환하도록 설계하는 것이 권장된다. 이렇게 하면 Fallback이 FAILURE를 반환하는 상황을 방지한다.
<Fallback>
<Action ID="AdvancedMethod"/>
<Action ID="BasicMethod"/>
<Action ID="SafeStop"/> <!-- 최후 수단: 안전 정지 (항상 성공) -->
</Fallback>
최후 수단이 없거나 최후 수단마저 실패하면, Fallback이 FAILURE를 반환하며 이는 상위 노드에서 처리해야 하는 심각한 상황을 나타낸다(Faconti, 2022).
8. 점진적 확대(Escalation) 전략
시도-대안 패턴은 자연스럽게 점진적 확대 전략을 구현한다. 각 대안은 이전 대안보다 비용이 높거나, 침습적이거나, 시간이 오래 걸리지만 성공 가능성이 다른 접근 방식을 제공한다.
| 단계 | 대안 | 비용 | 침습도 | 성공 확률 |
|---|---|---|---|---|
| 1 | 소프트웨어 리셋 | 낮음 | 낮음 | 중간 |
| 2 | 센서 재보정 | 중간 | 중간 | 높음 |
| 3 | 하드웨어 리셋 | 높음 | 높음 | 높음 |
| 4 | 안전 모드 진입 | 매우 높음 | 매우 높음 | 매우 높음 |
이러한 점진적 확대는 불필요하게 비용이 높은 방법을 먼저 시도하는 것을 방지하면서도, 최종적으로 문제를 해결할 수 있는 포괄적 복구 체계를 제공한다.
참고 문헌
- 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/