1292.67 Retry 데코레이터의 동작

1. Retry 데코레이터의 정의

Retry 데코레이터는 자식 노드가 Failure를 반환할 때, 지정된 최대 횟수까지 자식을 재시도하는 데코레이터 노드이다. 자식이 Success를 반환하면 즉시 Success를 반환하고, Failure를 반환하면 재시도 카운터를 증가시켜 최대 횟수에 도달할 때까지 자식을 다시 실행한다. 최대 재시도 횟수에 도달한 후에도 자식이 Failure를 반환하면 Failure를 반환한다 (Faconti, BehaviorTree.CPP Documentation, 2024).

2. 알고리즘

function Retry.tick():
    if status == Idle:
        retry_count = 0

    while retry_count < max_retries:
        child_status = child.tick()

        if child_status == Running:
            return Running
        else if child_status == Success:
            return Success
        else:  // Failure
            retry_count += 1

    return Failure

3. 상태 변환 규칙

자식 반환 상태Retry 동작Retry 반환 상태
Success재시도 종료Success
Failure (재시도 남음)카운터 증가, 자식 재실행Running
Failure (재시도 소진)재시도 종료Failure
Running대기Running

4. Repeat 데코레이터와의 비교

속성RepeatRetry
반복 조건자식이 Success일 때 반복자식이 Failure일 때 반복
종료 조건 (성공)지정 횟수 완료 시 Success자식이 Success 시 즉시 Success
종료 조건 (실패)자식이 Failure 시 즉시 Failure지정 횟수 소진 시 Failure
용도행동의 반복 수행실패한 행동의 재시도

Repeat는 성공하는 행동을 여러 번 반복하고, Retry는 실패하는 행동을 여러 번 재시도한다. 두 데코레이터는 반복과 재시도라는 서로 다른 의미론을 구현한다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).

5. 실행 흐름 예제

다음의 Retry 데코레이터를 고려한다. 자식 액션을 최대 3회 재시도한다.

Retry [max=3]
 └─ Action [A1: 서버 연결]

5.1 재시도 후 성공

Tickretry_countA1 반환Retry 반환비고
t_10 → 1FailureRunning1회차 실패, 재시도
t_21RunningRunning2회차 실행 중
t_31SuccessSuccess2회차 성공, 종료

5.2 모든 재시도 소진

Tickretry_countA1 반환Retry 반환비고
t_10 → 1FailureRunning1회차 실패
t_21 → 2FailureRunning2회차 실패
t_32 → 3FailureFailure3회차 실패, 재시도 소진

6. 내부 상태 관리

Retry 데코레이터는 재시도 카운터(retry_count)를 내부 상태로 유지한다. 이 카운터는 노드가 활성화될 때 0으로 초기화되며, 자식이 Failure를 반환할 때마다 증가한다. halt 요청 시 카운터는 초기화된다 (Faconti, 2024).

7. Halt 전파

function Retry.halt():
    if child.status == Running:
        child.halt()
    retry_count = 0
    set_status(Idle)

8. 로봇 공학에서의 활용

8.1 일시적 실패에 대한 복원력

네트워크 통신 실패, 센서 읽기 오류, 매니퓰레이션 실패 등 일시적 요인에 의한 실패에 대해 Retry 데코레이터가 자동 재시도를 제공한다. 일시적 실패는 재시도에 의해 해결될 가능성이 높으므로, Retry를 통해 시스템의 복원력(resilience)이 향상된다.

8.2 통신 재시도

외부 서비스 호출, 액션 서버 요청 등의 통신 작업에서 Retry 데코레이터가 활용된다. 네트워크 지연이나 일시적 서버 부하에 의한 실패를 자동으로 재시도하여, 통신의 안정성을 높인다.

8.3 Timeout과의 결합

Retry와 Timeout 데코레이터를 결합하여, 시간 제한이 있는 재시도 패턴을 구현할 수 있다.

Retry [max=3]
 └─ Timeout [5초]
      └─ Action [A1: 서버 연결]

이 구조에서 각 시도는 5초의 시간 제한이 적용되며, 시간 초과 시 Failure가 반환되어 Retry에 의해 재시도된다 (Colledanchise & Ögren, 2018).


참고 문헌

  • Colledanchise, M. & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • Faconti, D. (2024). BehaviorTree.CPP Documentation. https://www.behaviortree.dev/