RunOnce의 초기화 메커니즘 (RunOnce's Reset Mechanism)

RunOnce의 초기화 메커니즘 (RunOnce’s Reset Mechanism)

1. 개요

RunOnce 데코레이터의 초기화 메커니즘은 already_completed_ 플래그와 cached_status_ 값을 리셋하여, RunOnce가 자식을 다시 실행할 수 있는 상태로 복원하는 과정이다. 이 초기화는 halt 호출, 행동 트리 재생성, 명시적 리셋 등에 의해 발생하며, RunOnce의 “단일 실행” 범위를 결정하는 핵심 요소이다.

2. 초기화가 발생하는 시점

2.1 halt() 호출에 의한 초기화

RunOnce가 외부에서 halt되면, 구현 정책에 따라 캐시가 리셋될 수 있다.

void halt() override
{
    already_completed_ = false;
    cached_status_ = BT::NodeStatus::IDLE;
    DecoratorNode::halt();
}

BehaviorTree.CPP 4.x에서 RunOncethen_skip 매개변수를 통해 halt 후의 동작을 제어한다.

2.2 행동 트리 재생성

BT::BehaviorTreeFactory::createTree()를 통해 행동 트리가 새로 생성되면, 모든 노드의 내부 상태가 초기화된다. RunOnce의 캐시도 자연스럽게 리셋된다.

2.3 BehaviorTree.CPP의 then_skip 매개변수

BehaviorTree.CPP 4.x에서는 RunOncethen_skip 매개변수를 지원한다.

<RunOnce then_skip="true">
    <Action ID="Initialize"/>
</RunOnce>
then_skip 값완료 후 동작halt 후 동작
true자식을 skip (SKIPPED 반환)리셋하여 재실행
false캐싱된 결과 반환리셋하여 재실행

3. 초기화 정책의 선택

3.1 정책 1: halt 시 항상 리셋

halt 시 캐시를 리셋하여, 다음 실행에서 자식을 재실행한다. 행동 트리가 반복적으로 시작·정지되는 환경에서 적합하다.

3.2 정책 2: halt 시 리셋하지 않음

halt 후에도 캐시를 유지하여, 다음 실행에서도 캐싱된 결과를 반환한다. 전체 시스템 생명주기에서 단 한 번만 실행되어야 하는 행동에 적합하다.

3.3 정책 3: 외부 트리거에 의한 리셋

블랙보드의 특정 키 값 변경에 의해 캐시를 리셋하는 사용자 정의 RunOnce이다.

BT::NodeStatus tick() override
{
    bool reset_flag;
    if (getInput("reset", reset_flag) && reset_flag)
    {
        already_completed_ = false;
        setOutput("reset", false);
    }
    // 기존 RunOnce 로직
}

4. 설계 시 고려 사항

4.1 초기화 범위의 명확화

RunOnce의 “단일 실행“이 무엇을 의미하는지(tick 세션당 한 번, 행동 트리 인스턴스당 한 번, 프로세스 생명주기당 한 번)를 명확히 정의하고, 이에 맞는 초기화 정책을 선택하여야 한다.

4.2 초기화와 자식 상태의 일관성

RunOnce가 리셋되면, 자식도 IDLE 상태에서 새로 시작하여야 한다. 자식의 내부 상태가 이전 실행의 잔여를 포함하지 않도록 halt()에서 완전한 초기화가 이루어져야 한다.

5. 참고 문헌

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

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