Delay의 지연 완료 후 자식 Tick 시작 (Delay's Child Tick Initiation After Delay Completion)

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 반환
SUCCESSSUCCESS
FAILUREFAILURE
RUNNINGRUNNING

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.12026-04-04초안 작성