SkipUnlessUpdated 데코레이터의 동작 (Operation of the SkipUnlessUpdated Decorator)

SkipUnlessUpdated 데코레이터의 동작 (Operation of the SkipUnlessUpdated Decorator)

1. 개요

SkipUnlessUpdated 데코레이터는 BehaviorTree.CPP 4.x에서 도입된 조건부 실행 데코레이터로, 자식 노드의 입력 포트에 연결된 블랙보드 값이 변경된 경우에만 자식을 tick하고, 값이 변경되지 않은 경우에는 자식을 skip하여 이전 결과를 반환한다. 이 데코레이터는 불필요한 재평가를 방지하여 성능을 최적화하는 데 활용된다.

2. 동작 규칙

블랙보드 값 상태동작반환
값이 변경됨자식을 tick자식의 반환 상태
값이 변경되지 않음자식을 skipSKIPPED 또는 이전 결과

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는 노드가 실행되지 않았음을 나타내는 특별한 상태이다. 이 상태는 SequenceFallback에서 특별히 처리되어, skip된 노드를 건너뛴다.

7. 참고 문헌

  • BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
  • Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.

버전날짜변경 사항
v0.12026-04-04초안 작성