RunOnce의 이후 Tick에서의 이전 결과 반환 (RunOnce’s Previous Result Return in Subsequent Ticks)
1. 개요
RunOnce 데코레이터가 자식의 실행을 완료한 후, 이후의 모든 tick에서는 자식을 tick하지 않고 캐싱된 이전 결과를 즉시 반환한다. 이 동작은 자식의 실행 비용을 제거하면서도 행동 트리의 제어 흐름에 올바른 상태를 전달하는 것을 보장한다.
2. 캐싱된 결과의 반환 메커니즘
2.1 캐시 저장
자식이 SUCCESS 또는 FAILURE를 반환하면, 그 결과가 내부 변수 cached_status_에 저장된다.
if (status != BT::NodeStatus::RUNNING)
{
already_completed_ = true;
cached_status_ = status; // SUCCESS 또는 FAILURE
}
2.2 캐시 반환
이후 tick에서 already_completed_가 true이면, 자식을 tick하지 않고 cached_status_를 즉시 반환한다.
if (already_completed_)
{
return cached_status_; // 자식 미실행, 캐시 반환
}
3. 캐시 반환의 성능 효과
3.1 실행 비용 제거
캐시 반환은 자식 노드의 tick을 완전히 생략하므로, 자식의 실행 비용(센서 읽기, 서비스 호출, 복잡한 계산 등)이 제거된다. RunOnce가 적용된 노드의 이후 tick 비용은 불리언 변수 확인과 상태 반환에 해당하는 최소 수준이다.
3.2 ReactiveSequence에서의 성능 효과
<ReactiveSequence>
<RunOnce>
<Action ID="ExpensiveInitialization"/>
</RunOnce>
<Action ID="MainTask"/>
</ReactiveSequence>
ExpensiveInitialization은 최초 한 번만 실행되고, 이후 매 tick에서는 캐시가 반환되므로 tick 주기에 영향을 미치지 않는다.
4. SUCCESS와 FAILURE 캐싱의 차이
4.1 SUCCESS 캐싱
자식이 SUCCESS를 반환하여 캐싱된 경우:
Sequence내: 후속 노드로 진행 가능Fallback내: 해당 분기가 선택됨ReactiveSequence내: 후속 노드가 매 tick마다 실행됨
4.2 FAILURE 캐싱
자식이 FAILURE를 반환하여 캐싱된 경우:
Sequence내: Sequence가 FAILURE, 후속 노드 미실행Fallback내: 다음 분기로 진행ReactiveSequence내: 매 tick마다 FAILURE 반환, 후속 노드 미실행
FAILURE 캐싱은 의도적인 경우(예: 초기화 실패가 허용되는 선택적 행동)에만 적절하며, 예상치 못한 FAILURE 캐싱은 행동 트리의 기능을 영구적으로 차단할 수 있다.
5. 캐시 무효화
5.1 halt에 의한 무효화
BehaviorTree.CPP의 구현에 따라, halt 시 캐시가 무효화될 수 있다.
void halt() override
{
already_completed_ = false; // 구현 정책에 따라
cached_status_ = BT::NodeStatus::IDLE;
DecoratorNode::halt();
}
5.2 행동 트리 재생성에 의한 무효화
행동 트리가 재생성되면 모든 노드의 내부 상태가 초기화되므로, RunOnce의 캐시도 자연스럽게 무효화된다.
6. 설계 시 고려 사항
6.1 영구 FAILURE 캐싱의 위험
자식이 일시적 원인으로 FAILURE를 반환한 경우, 그 결과가 영구적으로 캐싱되면 시스템 재시작 없이는 복구할 수 없다. Retry를 내부에 배치하여 초기화 성공 가능성을 높이는 것이 바람직하다.
6.2 캐시와 실제 상태의 불일치
시간이 경과하면 초기화 당시의 결과가 더 이상 유효하지 않을 수 있다. 예를 들어, 센서 캘리브레이션이 SUCCESS로 캐싱되었으나, 온도 변화에 의해 캘리브레이션이 무효화된 경우가 이에 해당한다.
7. 참고 문헌
- 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 | 초안 작성 |