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 데코레이터와의 비교
| 속성 | Repeat | Retry |
|---|---|---|
| 반복 조건 | 자식이 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 재시도 후 성공
| Tick | retry_count | A1 반환 | Retry 반환 | 비고 |
|---|---|---|---|---|
| t_1 | 0 → 1 | Failure | Running | 1회차 실패, 재시도 |
| t_2 | 1 | Running | Running | 2회차 실행 중 |
| t_3 | 1 | Success | Success | 2회차 성공, 종료 |
5.2 모든 재시도 소진
| Tick | retry_count | A1 반환 | Retry 반환 | 비고 |
|---|---|---|---|---|
| t_1 | 0 → 1 | Failure | Running | 1회차 실패 |
| t_2 | 1 → 2 | Failure | Running | 2회차 실패 |
| t_3 | 2 → 3 | Failure | Failure | 3회차 실패, 재시도 소진 |
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/