Timeout의 시간 내 완료 시 자식 상태 통과 (Timeout’s Child Status Pass-Through on Timely Completion)
1. 개요
Timeout 데코레이터는 자식 노드가 지정된 시간 내에 SUCCESS 또는 FAILURE로 완료되면, 자식의 반환 상태를 변환 없이 그대로 부모 노드에 전달한다. 이 경우 Timeout은 투명한(transparent) 래퍼로 동작하며, 자식의 결과에 영향을 미치지 않는다. Timeout은 오직 시간 초과가 발생한 경우에만 자식의 상태를 FAILURE로 대체한다.
2. 통과 규칙
2.1 시간 내 완료 시의 상태 전달
| 자식 반환 | 시간 조건 | Timeout 반환 |
|---|---|---|
| SUCCESS | 시간 내 | SUCCESS (통과) |
| FAILURE | 시간 내 | FAILURE (통과) |
| RUNNING | 시간 내 | RUNNING (통과) |
2.2 수학적 표현
f_{\text{Timeout}}(s, t) = s \quad \text{if } (t - t_0) < T
시간 초과가 발생하지 않은 동안에는 항등 변환(identity transformation)이 적용된다.
투명성의 의미
시간 내 완료 시 Timeout이 투명하게 동작한다는 것은 다음을 의미한다.
- SUCCESS 보존: 자식이 성공적으로 완료되면 Timeout도 성공을 반환한다.
- FAILURE 보존: 자식이 논리적으로 실패하면 Timeout도 실패를 반환한다. 이때의 FAILURE는 타임아웃에 의한 것이 아니라 자식 자체의 실패이다.
- RUNNING 보존: 자식이 실행 중이면 Timeout도 실행 중을 반환하며, 타이머가 계속 진행된다.
타이머 리셋
자식이 SUCCESS 또는 FAILURE로 완료되면, Timeout의 타이머가 리셋된다. 다음번 자식 실행에서는 새로운 타이머가 시작된다. 이는 Repeat나 Retry와 결합된 경우에 특히 중요하다.
<RetryNode num_attempts="3">
<Timeout msec="10000">
<Action ID="ConnectToServer"/>
</Timeout>
</RetryNode>
각 재시도에서 Timeout의 타이머가 리셋되므로, 각 시도에 독립적으로 10초의 시간이 주어진다.
설계 시 고려 사항
자식 FAILURE와 타임아웃 FAILURE의 구분
시간 내에 자식이 FAILURE를 반환한 경우와 타임아웃에 의해 FAILURE가 반환된 경우를 부모 노드에서 구분할 수 없다. 구분이 필요한 경우 사용자 정의 Timeout에서 블랙보드에 타임아웃 발생 여부를 기록한다.
빈번한 SUCCESS 반환 시의 오버헤드
자식이 매 tick마다 즉시 SUCCESS를 반환하는 경우(조건 노드 등), Timeout의 타이머 시작과 리셋이 매 tick마다 반복된다. 이 오버헤드는 미미하지만, 극도로 높은 빈도에서는 고려할 수 있다.
참고 문헌
- Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-04 | 초안 작성 |