Inverter+Retry 조합 패턴 (Inverter+Retry Combination Pattern)

1. 개요

Inverter+Retry 조합 패턴은 자식 노드가 SUCCESS를 반환할 때까지 재시도하는 역 재시도(inverse retry) 패턴을 구현한다. 일반 Retry는 FAILURE 시 재시도하지만, Inverter로 감싸면 SUCCESSFAILURE로 변환하여 Retry를 트리거하고, 최종 결과를 다시 반전시켜 원래의 의미론을 복원한다.

2. 패턴의 구조

<Inverter>
    <RetryNode num_attempts="10">
        <Inverter>
            <Action ID="WaitForCondition"/>
        </Inverter>
    </RetryNode>
</Inverter>

2.1 동작 흐름

  1. WaitForConditionSUCCESS 반환 → 내부 Inverter가 FAILURE로 변환 → Retry가 재시도
  2. WaitForConditionFAILURE 반환 → 내부 Inverter가 SUCCESS로 변환 → Retry가 SUCCESS 반환 → 외부 Inverter가 FAILURE로 변환

수정: 이 패턴의 의도는 “자식이 SUCCESS를 반환할 때까지 재시도“이므로:

  1. WaitForCondition FAILURE → 내부 Inverter SUCCESS → Retry에서 SUCCESS 간주 → 외부 Inverter FAILURE

이는 직관적이지 않다. 보다 명확한 패턴은 KeepRunningUntilFailureRepeat를 활용하는 것이다.

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.12026-04-05초안 작성