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_1 | 0.0초 | 대기 | 미전달 | Running |
| t_2 | 0.5초 | 대기 | 미전달 | Running |
| t_3 | 1.0초 | 대기 | 미전달 | Running |
| t_4 | 2.1초 | 실행 | 전달 | A1의 반환 상태 |
| t_5 | 2.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과의 비교
| 속성 | Delay | Timeout |
|---|---|---|
| 시간의 역할 | 실행 전 대기 시간 | 실행의 최대 허용 시간 |
| 자식 실행 시점 | 지연 후 실행 | 즉시 실행 |
| 시간 초과 시 | 해당 없음 | 자식 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/