SkipUnlessUpdated 데코레이터의 동작 (Operation of the SkipUnlessUpdated Decorator)
1. 개요
SkipUnlessUpdated 데코레이터는 BehaviorTree.CPP 4.x에서 도입된 조건부 실행 데코레이터로, 자식 노드의 입력 포트에 연결된 블랙보드 값이 변경된 경우에만 자식을 tick하고, 값이 변경되지 않은 경우에는 자식을 skip하여 이전 결과를 반환한다. 이 데코레이터는 불필요한 재평가를 방지하여 성능을 최적화하는 데 활용된다.
2. 동작 규칙
| 블랙보드 값 상태 | 동작 | 반환 |
|---|---|---|
| 값이 변경됨 | 자식을 tick | 자식의 반환 상태 |
| 값이 변경되지 않음 | 자식을 skip | SKIPPED 또는 이전 결과 |
3. 블랙보드 변경 감지 메커니즘
BehaviorTree.CPP 4.x에서 블랙보드는 각 항목(entry)에 대해 마지막 수정 시퀀스 번호를 추적한다. SkipUnlessUpdated는 자식의 입력 포트에 연결된 블랙보드 항목의 시퀀스 번호가 마지막 tick 이후 변경되었는지를 확인하여, 변경된 경우에만 자식을 tick한다.
4. XML에서의 사용
<SkipUnlessUpdated>
<Action ID="RecomputePath"
goal="{target_goal}"/>
</SkipUnlessUpdated>
target_goal 블랙보드 값이 변경된 경우에만 경로 재계산을 수행한다. 값이 변경되지 않으면 이전에 계산된 경로를 계속 사용한다.
5. BehaviorTree.CPP 4.x의 스크립트 기반 대안
BehaviorTree.CPP 4.x에서는 _skipIf 속성을 통해 유사한 기능을 구현할 수 있다.
<Action ID="RecomputePath"
goal="{target_goal}"
_skipIf="goal_unchanged == true"/>
6. 설계 시 고려 사항
6.1 초기 tick 처리
최초 tick에서는 블랙보드 값의 이전 상태가 없으므로, 항상 자식을 tick하여야 한다.
6.2 복수 입력 포트의 처리
자식이 복수의 입력 포트를 가지는 경우, 하나라도 변경되면 자식을 tick하여야 한다.
6.3 SKIPPED 상태의 처리
BehaviorTree.CPP 4.x에서 SKIPPED는 노드가 실행되지 않았음을 나타내는 특별한 상태이다. 이 상태는 Sequence와 Fallback에서 특별히 처리되어, skip된 노드를 건너뛴다.
7. 참고 문헌
- BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
- Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-04 | 초안 작성 |