Repeat+ForceSuccess 조합 패턴 (Repeat+ForceSuccess Combination Pattern)
1. 개요
Repeat+ForceSuccess 조합 패턴은 자식 행동의 실패를 무시하면서 지정된 횟수만큼 반복을 보장하는 데코레이터 조합이다. 일반 Repeat는 자식이 FAILURE를 반환하면 반복을 중단하지만, ForceSuccess를 내부에 배치하면 자식의 FAILURE가 SUCCESS로 변환되어 Repeat가 반복을 계속한다.
2. 패턴의 구조
<Repeat num_cycles="10">
<ForceSuccess>
<Action ID="TryScan"/>
</ForceSuccess>
</Repeat>
2.1 동작 흐름
| 자식(TryScan) 반환 | ForceSuccess 반환 | Repeat 동작 |
|---|---|---|
| SUCCESS | SUCCESS | 반복 계속 |
| FAILURE | SUCCESS | 반복 계속 (실패 무시) |
| RUNNING | RUNNING | 자식 실행 계속 |
ForceSuccess에 의해 자식의 FAILURE가 SUCCESS로 변환되므로, Repeat는 항상 지정된 횟수만큼 반복을 완료한다.
3. 일반 Repeat와의 비교
| 자식 결과 패턴 | Repeat 단독 | Repeat+ForceSuccess |
|---|---|---|
| S, S, S, S, S | 5회 완료 (SUCCESS) | 5회 완료 (SUCCESS) |
| S, S, F, -, - | 3회에서 중단 (FAILURE) | 5회 완료 (SUCCESS) |
| F, -, -, -, - | 1회에서 중단 (FAILURE) | 5회 완료 (SUCCESS) |
| S, F, S, F, S | 2회에서 중단 (FAILURE) | 5회 완료 (SUCCESS) |
4. 활용 사례
4.1 다중 지점 스캔 (일부 실패 허용)
<Repeat num_cycles="10">
<ForceSuccess>
<Sequence>
<Action ID="MoveToNextPoint"/>
<Action ID="PerformScan"/>
</Sequence>
</ForceSuccess>
</Repeat>
10개 지점을 스캔하되, 일부 지점에서 스캔이 실패해도 나머지 지점의 스캔을 계속한다.
4.2 데이터 수집 (최선의 노력)
<Repeat num_cycles="5">
<ForceSuccess>
<Action ID="CollectSample"/>
</ForceSuccess>
</Repeat>
5회의 샘플 수집을 시도하되, 일부 수집이 실패해도 나머지를 계속 시도한다.
4.3 알림 반복 전송
<Repeat num_cycles="3">
<ForceSuccess>
<Action ID="SendStatusReport"/>
</ForceSuccess>
</Repeat>
상태 보고를 3회 전송하되, 전송 실패를 무시한다.
5. ForceSuccess 위치에 따른 의미 차이
5.1 ForceSuccess가 Repeat 내부 (본 패턴)
<Repeat num_cycles="5">
<ForceSuccess>
<Action ID="Task"/>
</ForceSuccess>
</Repeat>
각 반복에서 실패를 무시한다. Repeat는 항상 5회 반복을 완료하고 SUCCESS를 반환한다.
5.2 ForceSuccess가 Repeat 외부
<ForceSuccess>
<Repeat num_cycles="5">
<Action ID="Task"/>
</Repeat>
</ForceSuccess>
Repeat가 자식의 FAILURE에 의해 조기 종료되더라도, ForceSuccess가 전체 결과를 SUCCESS로 변환한다. 그러나 반복은 5회를 완료하지 못한다.
6. 실패 카운터와의 결합
실패 횟수를 추적하면서도 반복을 계속하려면, 자식 내부에서 실패를 기록한다.
<Repeat num_cycles="10">
<ForceSuccess>
<Sequence>
<Action ID="AttemptTask"
_onFailure="fail_count = fail_count + 1"/>
</Sequence>
</ForceSuccess>
</Repeat>
7. 설계 시 고려 사항
7.1 실패 정보의 손실
ForceSuccess에 의해 자식의 실패 정보가 은폐되므로, 실패 원인 추적이 어려워진다. 로깅을 추가하여 실패 발생 사실을 기록하는 것이 바람직하다.
7.2 안전 행동에서의 사용 제한
안전에 중요한 행동의 실패를 ForceSuccess로 무시하면 위험하다. 이 패턴은 선택적이거나 부가적인 행동에만 적용하여야 한다.
8. 참고 문헌
- Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-05 | 초안 작성 |