Inverter+Retry 조합 패턴 (Inverter+Retry Combination Pattern)
1. 개요
Inverter+Retry 조합 패턴은 자식 노드가 SUCCESS를 반환할 때까지 재시도하는 역 재시도(inverse retry) 패턴을 구현한다. 일반 Retry는 FAILURE 시 재시도하지만, Inverter로 감싸면 SUCCESS를 FAILURE로 변환하여 Retry를 트리거하고, 최종 결과를 다시 반전시켜 원래의 의미론을 복원한다.
2. 패턴의 구조
<Inverter>
<RetryNode num_attempts="10">
<Inverter>
<Action ID="WaitForCondition"/>
</Inverter>
</RetryNode>
</Inverter>
2.1 동작 흐름
WaitForCondition이SUCCESS반환 → 내부 Inverter가FAILURE로 변환 → Retry가 재시도WaitForCondition이FAILURE반환 → 내부 Inverter가SUCCESS로 변환 → Retry가SUCCESS반환 → 외부 Inverter가FAILURE로 변환
수정: 이 패턴의 의도는 “자식이 SUCCESS를 반환할 때까지 재시도“이므로:
WaitForConditionFAILURE→ 내부 InverterSUCCESS→ Retry에서 SUCCESS 간주 → 외부 InverterFAILURE
이는 직관적이지 않다. 보다 명확한 패턴은 KeepRunningUntilFailure나 Repeat를 활용하는 것이다.
3. 실용적 대안: Repeat 기반 패턴
<Repeat num_cycles="10">
<Fallback>
<Condition ID="IsEventDetected"/>
<ForceSuccess><Action ID="Sleep" ms="100"/></ForceSuccess>
</Fallback>
</Repeat>
이벤트가 감지될 때까지 최대 10회 반복 확인한다.
4. Inverter+Retry의 올바른 사용
Inverter+Retry 조합이 유용한 경우는 자식의 SUCCESS/FAILURE 의미가 반전되어야 하는 상황이다.
<RetryNode num_attempts="5">
<Inverter>
<Condition ID="IsObstacleDetected"/>
</Inverter>
</RetryNode>
장애물이 감지되지 않을 때까지(IsObstacleDetected FAILURE → Inverter SUCCESS) 최대 5회 대기한다. 장애물이 계속 감지되면(Inverter FAILURE) Retry가 재시도한다.
5. 설계 시 고려 사항
5.1 가독성
이중 Inverter를 사용한 역 재시도 패턴은 이해하기 어려우므로, 동일한 동작을 KeepRunningUntilFailure, Repeat, 또는 전용 데코레이터로 구현하는 것이 가독성 측면에서 우수하다.
5.2 대안 패턴 권장
SUCCESS까지 재시도하는 패턴이 필요한 경우, 다음 대안을 고려한다.
| 방법 | 구조 |
|---|---|
| KeepRunningUntilFailure + Inverter | 자식 SUCCESS 시 FAILURE 변환 → 재실행 |
| Repeat | 자식 FAILURE 시 종료 |
| 전용 RetryUntilSuccess 노드 | 사용자 정의 구현 |
6. 참고 문헌
- 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 | 초안 작성 |