Delay의 지연 완료 후 자식 Tick 시작 (Delay’s Child Tick Initiation After Delay Completion)
1. 개요
Delay 데코레이터의 지연 시간이 경과하면, 데코레이터는 자식 노드의 executeTick()을 호출하여 자식의 실행을 시작한다. 이 시점부터 Delay는 자식의 반환 상태를 그대로 전달하는 투명한 래퍼로 동작하며, 자식이 SUCCESS, FAILURE, 또는 RUNNING을 반환하면 이를 변환 없이 부모에게 전달한다.
2. 지연 완료 후 동작
2.1 상태 전이
[지연 중] → 시간 경과 → [자식 tick 시작] → 자식 상태 전달
지연이 완료된 tick부터 Delay는 매 tick마다 자식을 tick한다.
2.2 tick 흐름 예시
Tick 1~20: 지연 중 → RUNNING (자식 미실행)
Tick 21: 지연 완료 → 자식 tick → RUNNING (자식 실행 시작)
Tick 22: 자식 tick → RUNNING (자식 실행 중)
Tick 23: 자식 tick → SUCCESS (자식 완료)
→ Delay = SUCCESS
2.3 자식 반환 상태의 통과
지연 완료 후에는 자식의 반환 상태가 그대로 전달된다.
| 자식 반환 | Delay 반환 |
|---|---|
| SUCCESS | SUCCESS |
| FAILURE | FAILURE |
| RUNNING | RUNNING |
3. 자식의 첫 tick
지연 완료 후 자식이 처음 tick되는 시점에서, 자식은 IDLE 상태이다. executeTick()이 호출되면 자식은 IDLE에서 다른 상태로 전이하며, 자식의 초기화 로직이 실행된다.
4. 지연 완료와 자식 완료 후의 재실행
Delay가 완료된 후(지연 + 자식 실행 완료), 상위 노드에 의해 다시 tick되면(예: Repeat 내부), 새로운 지연이 다시 시작된다. 이는 Delay의 타이머가 halt 시 리셋되기 때문이다.
<Repeat num_cycles="3">
<Delay delay_msec="1000">
<Action ID="PerformScan"/>
</Delay>
</Repeat>
각 반복에서 1초 지연 후 스캔을 수행한다. 총 3회 반복되며, 각 반복에 독립적인 1초 지연이 적용된다.
5. 설계 시 고려 사항
5.1 지연과 자식 실행의 구분
Delay의 전체 실행 시간은 지연 시간과 자식 실행 시간의 합이다.
T_{\text{total}} = T_{\text{delay}} + T_{\text{child}}
Timeout과 결합 시 이를 고려하여야 한다.
<Timeout msec="10000">
<Delay delay_msec="5000">
<Action ID="Task"/>
</Delay>
</Timeout>
Timeout의 10초에는 Delay의 5초가 포함되므로, 자식(Task)에 허용되는 실제 실행 시간은 약 5초이다.
지연 완료 시점의 정밀도
지연 완료는 tick 단위로 확인되므로, 실제 지연은 [T_d, T_d + \Delta t) 범위에 있다. 여기서 \Delta t는 tick 주기이다. 정밀한 시간 제어가 필요한 경우 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 | 초안 작성 |