1292.69 Delay 데코레이터의 동작

1. Delay 데코레이터의 정의

Delay 데코레이터는 자식 노드의 실행을 지정된 시간만큼 지연시키는 데코레이터 노드이다. Delay 데코레이터가 처음 tick을 수신하면, 지정된 시간이 경과할 때까지 자식에 tick을 전달하지 않고 Running을 반환한다. 지연 시간이 경과한 후에야 자식에 tick을 전달하고, 자식의 반환 상태를 그대로 전파한다 (Faconti, BehaviorTree.CPP Documentation, 2024).

2. 알고리즘

function Delay.tick():
    if status == Idle:
        start_time = current_time()
        delay_completed = false

    if not delay_completed:
        elapsed = current_time() - start_time
        if elapsed < delay_duration:
            return Running
        else:
            delay_completed = true

    child_status = child.tick()
    return child_status

3. 동작 단계

Delay 데코레이터의 동작은 두 단계로 구분된다.

단계조건동작반환 상태
대기 단계경과 시간 < 지연 시간자식에 tick 미전달Running
실행 단계경과 시간 ≥ 지연 시간자식에 tick 전달자식의 반환 상태

대기 단계에서 Delay 데코레이터는 자식 노드에 tick을 전달하지 않으므로, 자식 노드는 대기 기간 동안 완전히 비활성 상태를 유지한다. 지연 시간이 경과하면 실행 단계로 전이하여 자식에 tick을 전달하고, 이후에는 자식의 반환 상태를 그대로 전파한다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).

4. 실행 흐름 예제

다음의 Delay 데코레이터를 고려한다. 자식 액션의 실행을 2초 지연시킨다.

Delay [2초]
 └─ Action [A1: 이동 시작]
Tick경과 시간단계A1 tick 전달Delay 반환
t_10.0초대기미전달Running
t_20.5초대기미전달Running
t_31.0초대기미전달Running
t_42.1초실행전달A1의 반환 상태
t_52.6초실행전달A1의 반환 상태

tick t_4에서 경과 시간이 2초를 초과하므로, 대기 단계가 종료되고 A1에 tick이 전달된다. 이후의 tick에서는 대기 없이 A1에 직접 tick이 전달된다.

5. 내부 상태 관리

Delay 데코레이터는 다음의 내부 상태를 유지한다.

상태설명
start_time대기 시작 시각
delay_completed지연 시간 경과 여부

이 상태는 노드가 Idle에서 활성화될 때 초기화되며, halt 요청 시에도 초기화된다. 노드가 다시 tick을 수신하면 대기 단계부터 새로 시작된다.

6. Halt 전파

function Delay.halt():
    if delay_completed and child.status == Running:
        child.halt()
    delay_completed = false
    start_time = 0
    set_status(Idle)

대기 단계에서 halt가 요청되면, 자식에 tick이 전달된 적이 없으므로 자식에 대한 halt 전파는 발생하지 않는다. 실행 단계에서 halt가 요청되면, Running 상태의 자식에 halt가 전파된다 (Faconti, 2024).

7. Timeout과의 비교

속성DelayTimeout
시간의 역할실행 전 대기 시간실행의 최대 허용 시간
자식 실행 시점지연 후 실행즉시 실행
시간 초과 시해당 없음자식 halt, Failure 반환
시간 내 동작Running 반환자식에 tick 전달

8. 로봇 공학에서의 활용

8.1 행동 간 시간 간격

연속된 행동 사이에 물리적 안정화 시간이 필요한 경우에 Delay가 활용된다. 예를 들어, 로봇 팔이 물체를 놓은 후 그리퍼를 닫기 전에 물체가 안정될 때까지 대기하는 패턴에서 사용된다.

8.2 시간 기반 스케줄링

행동의 시작을 특정 시간만큼 지연시켜, 다른 시스템의 준비 완료를 기다리거나, 물리적 프로세스의 완료를 대기하는 데 활용된다 (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/