1292.66 Repeat 데코레이터의 동작
1. Repeat 데코레이터의 정의
Repeat 데코레이터는 자식 노드를 지정된 횟수만큼 반복적으로 실행하는 데코레이터 노드이다. 자식이 Success를 반환하면 반복 카운터를 증가시키고, 카운터가 지정된 횟수에 도달할 때까지 자식을 다시 실행한다. 지정된 횟수의 반복이 모두 완료되면 Success를 반환한다. 자식이 Failure를 반환하면 반복을 중단하고 Failure를 반환한다 (Faconti, BehaviorTree.CPP Documentation, 2024).
2. 알고리즘
Repeat 데코레이터의 동작을 의사 코드로 표현하면 다음과 같다. N은 반복 횟수이다.
function Repeat.tick():
if status == Idle:
repeat_count = 0
while repeat_count < N:
child_status = child.tick()
if child_status == Running:
return Running
else if child_status == Failure:
return Failure
else: // Success
repeat_count += 1
return Success
이 알고리즘에서 Repeat 데코레이터는 자식이 Success를 반환할 때마다 카운터를 증가시키고, 카운터가 N에 도달하면 Success를 반환한다. 자식이 Running을 반환하면 Running을 전파하고, 다음 tick에서 자식의 실행을 계속한다.
3. 상태 변환 규칙
| 자식 반환 상태 | Repeat 동작 | Repeat 반환 상태 |
|---|---|---|
| Success (반복 미완료) | 카운터 증가, 자식 재실행 | Running |
| Success (반복 완료) | 반복 종료 | Success |
| Failure | 반복 중단 | Failure |
| Running | 대기 | Running |
4. 실행 흐름 예제
다음의 Repeat 데코레이터를 고려한다. 자식 액션을 3회 반복 실행한다.
Repeat [N=3]
└─ Action [A1: 센서 측정]
4.1 모든 반복이 성공하는 경우
| Tick | repeat_count | A1 반환 | Repeat 반환 | 비고 |
|---|---|---|---|---|
| t_1 | 0 → 1 | Success | Running | 1회 완료, 계속 |
| t_2 | 1 → 2 | Success | Running | 2회 완료, 계속 |
| t_3 | 2 → 3 | Success | Success | 3회 완료, 종료 |
4.2 비동기 자식의 경우
| Tick | repeat_count | A1 반환 | Repeat 반환 | 비고 |
|---|---|---|---|---|
| t_1 | 0 | Running | Running | 1회차 실행 중 |
| t_2 | 0 → 1 | Success | Running | 1회차 완료 |
| t_3 | 1 | Running | Running | 2회차 실행 중 |
| t_4 | 1 → 2 | Success | Running | 2회차 완료 |
| t_5 | 2 | Running | Running | 3회차 실행 중 |
| t_6 | 2 → 3 | Success | Success | 3회차 완료, 종료 |
4.3 반복 중 실패 발생
| Tick | repeat_count | A1 반환 | Repeat 반환 | 비고 |
|---|---|---|---|---|
| t_1 | 0 → 1 | Success | Running | 1회 완료 |
| t_2 | 1 | Failure | Failure | 2회차 실패, 반복 중단 |
자식이 Failure를 반환하면 Repeat 데코레이터는 즉시 Failure를 반환하고 반복을 중단한다 (Faconti, 2024).
5. 내부 상태 관리
Repeat 데코레이터는 반복 카운터(repeat_count)를 내부 상태로 유지한다. 이 카운터는 노드가 Idle에서 활성화될 때 0으로 초기화되며, 자식이 Success를 반환할 때마다 증가한다. halt 요청 시 카운터는 초기화된다.
6. 무한 반복
반복 횟수를 -1 또는 특수 값으로 설정하면 무한 반복(infinite repeat)이 가능하다. 무한 반복 모드에서 Repeat 데코레이터는 자식이 Failure를 반환하거나 외부 halt 요청을 수신할 때까지 자식을 계속 실행한다. 이 모드는 행동 트리의 메인 루프 역할을 수행하는 데 활용된다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).
7. Halt 전파
Repeat가 halt 요청을 수신하면, Running 상태의 자식에게 halt를 전파하고 반복 카운터를 초기화한다.
function Repeat.halt():
if child.status == Running:
child.halt()
repeat_count = 0
set_status(Idle)
8. 로봇 공학에서의 활용
8.1 반복 측정
센서 데이터의 정밀도를 높이기 위해 동일한 측정을 여러 번 반복하고 결과를 평균하는 패턴에서 Repeat 데코레이터가 활용된다.
8.2 순찰 패턴
로봇의 순찰 경로를 지정된 횟수만큼 반복하는 임무에서 Repeat 데코레이터가 사용된다. 무한 반복 모드를 사용하면 외부 중단 신호가 올 때까지 순찰을 계속 수행한다.
8.3 반복적 시도
환경의 불확실성으로 인해 한 번에 성공하지 못할 수 있는 행동을 여러 번 시도하는 패턴에서 활용된다. 다만 실패 시 재시도하는 패턴은 Retry 데코레이터가 더 적합하다 (Faconti, 2024).
참고 문헌
- 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/