1292.71 KeepRunningUntilFailure 데코레이터의 동작
1. KeepRunningUntilFailure 데코레이터의 정의
KeepRunningUntilFailure 데코레이터는 자식 노드가 Failure를 반환할 때까지 자식의 실행을 계속 유지하는 데코레이터 노드이다. 자식이 Success를 반환하면 이를 Running으로 변환하여 자식을 다시 실행하고, Failure를 반환하면 Failure를 그대로 전파한다. Running은 변환 없이 전파한다. 이 데코레이터는 자식이 실패할 때까지 자식을 반복적으로 실행하는 무한 반복의 의미론을 구현한다 (Faconti, BehaviorTree.CPP Documentation, 2024).
2. 알고리즘
function KeepRunningUntilFailure.tick():
child_status = child.tick()
if child_status == Failure:
return Failure
else:
return Running
이 알고리즘에서 자식이 Success를 반환하면 Running으로 변환되어 상위 노드에 전파된다. 다음 tick에서 자식이 다시 tick을 수신하면, 자식은 Idle 상태에서 새로 시작한다(이전 실행이 Success로 완료되어 Idle로 복귀하였으므로). 자식이 Running을 반환하면 그대로 Running이 전파되어, 자식의 실행이 계속된다.
3. 상태 변환 규칙
| 자식 반환 상태 | KeepRunningUntilFailure 반환 상태 |
|---|---|
| Success | Running (자식 재실행) |
| Failure | Failure |
| Running | Running |
Success와 Running 모두 Running으로 반환되므로, 이 데코레이터는 자식이 Failure를 반환하기 전까지는 항상 Running을 유지한다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).
4. 실행 흐름 예제
KeepRunningUntilFailure [KRUF1]
└─ Action [A1: 순찰 경유점 방문]
4.1 자식이 반복 성공하다 실패하는 경우
| Tick | A1 반환 | KRUF1 반환 | 비고 |
|---|---|---|---|
| t_1 | Running | Running | A1 실행 중 |
| t_2 | Success | Running | 경유점 1 도달, 재실행 |
| t_3 | Running | Running | A1 재실행 중 |
| t_4 | Success | Running | 경유점 2 도달, 재실행 |
| t_5 | Running | Running | A1 재실행 중 |
| t_6 | Failure | Failure | 경유점 도달 실패, 종료 |
A1이 Success를 반환할 때마다 KRUF1은 Running을 반환하여 자식의 재실행을 유도한다. A1이 Failure를 반환하면 KRUF1도 Failure를 반환하여 반복이 종료된다.
5. Repeat 데코레이터와의 비교
| 속성 | KeepRunningUntilFailure | Repeat |
|---|---|---|
| 반복 횟수 | 무한 (Failure까지) | 지정된 횟수 |
| Success 시 동작 | Running 변환 (재실행) | 카운터 증가 |
| Failure 시 동작 | Failure 반환 (종료) | Failure 반환 (종료) |
| 정상 종료 조건 | 자식의 Failure | 지정 횟수 도달 |
KeepRunningUntilFailure는 반복 횟수를 사전에 지정하지 않고, 자식의 실패를 종료 조건으로 사용하는 무한 반복 패턴을 구현한다. Repeat의 무한 반복 모드(N = -1)와 유사하나, KeepRunningUntilFailure는 자식의 Success를 명시적으로 Running으로 변환하여 반복의 의도를 더 직관적으로 표현한다 (Faconti, 2024).
6. Halt 전파
function KeepRunningUntilFailure.halt():
if child.status == Running:
child.halt()
set_status(Idle)
7. 로봇 공학에서의 활용
7.1 지속적 순찰
로봇이 경유점을 순차적으로 방문하는 행동을 KeepRunningUntilFailure로 감싸면, 각 경유점 방문이 성공할 때마다 다음 방문이 자동으로 시작된다. 특정 경유점 방문에 실패하면(경로 차단, 접근 불가 등) 순찰이 종료된다.
7.2 이벤트 대기 루프
특정 이벤트(실패 조건)가 발생할 때까지 행동을 계속 반복 수행하는 패턴에서 활용된다. 자식이 이벤트의 발생 여부를 검사하고, 이벤트가 발생하지 않으면 Success를, 발생하면 Failure를 반환하는 구조로 구현된다 (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/