Retry의 모든 재시도 실패 시 반환 (Retry's Return When All Attempts Fail)

Retry의 모든 재시도 실패 시 반환 (Retry’s Return When All Attempts Fail)

1. 개요

Retry 데코레이터가 지정된 최대 재시도 횟수를 모두 소진하였음에도 자식이 SUCCESS를 반환하지 못한 경우, Retry는 최종적으로 FAILURE를 반환한다. 이 최종 FAILURE는 “모든 재시도를 시도하였으나 성공하지 못하였다“는 의미를 가지며, 상위 제어 구조에서 복구 전략이나 대체 행동으로의 전환을 유발한다.

2. 최종 FAILURE 반환의 조건

2.1 정형적 정의

f_{\text{Retry}}(\text{FAILURE}, k, N) = \text{FAILURE} \quad \text{if } k \geq N

재시도 카운터 k가 최대 횟수 N에 도달하고, 마지막 시도의 자식이 FAILURE를 반환하면, Retry는 FAILURE를 반환하고 카운터를 리셋한다.

시퀀스 예시 (num_attempts=3)

시도 1: Child → FAILURE (k=1)
시도 2: Child → FAILURE (k=2)
시도 3: Child → FAILURE (k=3, k≥N)
→ Retry = FAILURE (최종)

최종 FAILURE의 상위 전파

Retry의 FAILURE는 부모 노드에 전달되어 행동 트리의 제어 흐름에 영향을 미친다.

Sequence 내 Retry

<Sequence>
    <RetryNode num_attempts="3">
        <Action ID="ConnectToSensor"/>
    </RetryNode>
    <Action ID="ReadSensorData"/>
</Sequence>

Retry가 FAILURE → Sequence가 FAILUREReadSensorData는 실행되지 않음.

Fallback 내 Retry

<Fallback>
    <RetryNode num_attempts="3">
        <Action ID="PrimaryMethod"/>
    </RetryNode>
    <Action ID="FallbackMethod"/>
</Fallback>

Retry가 FAILURE → Fallback이 FallbackMethod를 시도 → 대체 방법 실행.

ReactiveSequence 내 Retry

<ReactiveSequence>
    <Condition ID="IsSystemActive"/>
    <RetryNode num_attempts="5">
        <Action ID="PerformTask"/>
    </RetryNode>
</ReactiveSequence>

Retry가 FAILURE → ReactiveSequence가 FAILURE → 상위 노드에서 처리.

최종 FAILURE 후의 복구 패턴

패턴 1: Fallback에 의한 대체 행동

<Fallback>
    <RetryNode num_attempts="3">
        <Action ID="ConnectViaPrimary"/>
    </RetryNode>
    <RetryNode num_attempts="3">
        <Action ID="ConnectViaBackup"/>
    </RetryNode>
    <Action ID="ReportConnectionFailure"/>
</Fallback>

주 연결 3회 재시도 실패 → 백업 연결 3회 재시도 → 이마저도 실패 → 연결 실패 보고.

패턴 2: 상위 Retry에 의한 전체 재시도

<RetryNode num_attempts="2">
    <Sequence>
        <Action ID="ResetSystem"/>
        <RetryNode num_attempts="3">
            <Action ID="InitializeSensor"/>
        </RetryNode>
    </Sequence>
</RetryNode>

내부 Retry가 3회 실패 → 시스템 리셋 후 다시 3회 재시도 → 총 6회 시도.

패턴 3: 실패 로깅 후 계속 진행

<Sequence>
    <ForceSuccess>
        <RetryNode num_attempts="3">
            <Action ID="OptionalSetup"/>
        </RetryNode>
    </ForceSuccess>
    <Action ID="MainAction"/>
</Sequence>

선택적 설정이 3회 모두 실패하더라도, ForceSuccess에 의해 MainAction이 실행된다.

설계 시 고려 사항

FAILURE의 의미론

Retry의 최종 FAILURE는 단순한 1회 실패와 의미론적으로 구분된다. 이는 “지정된 횟수만큼 시도하였으나 해결되지 않은 실패“를 나타내므로, 상위 구조에서 더 강력한 복구 전략을 적용하거나 운용자에게 알림을 발행하는 것이 적절하다.

실패 정보의 보존

최종 FAILURE 반환 시, 어떤 오류로 인해 실패하였는지의 정보를 블랙보드에 기록하면 상위 노드에서 적절한 복구 전략을 선택하는 데 활용할 수 있다.

재시도 후 상태 정리

모든 재시도가 실패한 후, 자식 행동이 남긴 부분적 상태(열린 파일, 활성화된 서비스 등)를 정리하는 것이 중요하다. 이를 위해 ForceSuccess로 감싼 정리 행동을 Retry 후에 배치할 수 있다.

참고 문헌

  • Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/

버전날짜변경 사항
v0.12026-04-04초안 작성