데코레이터 노드의 자식 실행 제어 역할 (Child Execution Control Role of Decorator Nodes)

데코레이터 노드의 자식 실행 제어 역할 (Child Execution Control Role of Decorator Nodes)

1. 개요

데코레이터 노드의 자식 실행 제어 역할은 자식 노드의 실행 횟수, 시점, 빈도, 지속 시간 등을 제어하는 기능이다. 상태 변환이 자식의 결과를 수정하는 것이라면, 실행 제어는 자식이 언제, 몇 번 실행되는지를 결정하는 것이다. 이 역할을 수행하는 데코레이터에는 RetryNode, RepeatNode, TimeoutNode, Delay, RateController, RunOnce 등이 포함된다.

2. 실행 횟수 제어

2.1 RetryNode (재시도)

자식이 FAILURE를 반환하면 지정된 횟수만큼 재시도한다.

<RetryNode num_attempts="3">
    <Action ID="ConnectToServer"/>
</RetryNode>

동작 흐름:

  1. 자식을 tick한다.
  2. 자식이 SUCCESS → 데코레이터가 SUCCESS 반환
  3. 자식이 FAILURE → 재시도 카운터 증가, 한계 미도달 시 RUNNING 반환
  4. 재시도 횟수 초과 → 데코레이터가 FAILURE 반환
  5. 자식이 RUNNING → 데코레이터가 RUNNING 반환

2.2 RepeatNode (반복)

자식이 SUCCESS를 반환하면 지정된 횟수만큼 반복 실행한다.

<Repeat num_cycles="5">
    <Action ID="PatrolWaypoint"/>
</Repeat>

2.3 RunOnce (일회 실행)

자식을 최초 한 번만 실행하고, 이후에는 이전 결과를 캐싱하여 반환한다.

<RunOnce>
    <Action ID="InitializeSystem"/>
</RunOnce>

3. 시간 기반 실행 제어

3.1 TimeoutNode (타임아웃)

자식의 실행 시간을 제한하며, 시간 초과 시 자식을 halt하고 FAILURE를 반환한다.

<Timeout msec="30000">
    <Action ID="NavigateToGoal"/>
</Timeout>

3.2 Delay (지연)

지정된 시간이 경과한 후에 자식을 실행한다. 지연 시간 동안 RUNNING을 반환한다.

<Delay delay_msec="2000">
    <Action ID="StartMotor"/>
</Delay>

3.3 RateController (빈도 제한)

자식의 tick 빈도를 제한한다. 지정된 주기 내에서는 이전 결과를 캐싱하여 반환한다.

<RateController hz="1.0">
    <Action ID="CheckPathValidity"/>
</RateController>

4. 실행 제어 데코레이터의 조합

데코레이터를 중첩하여 복합적인 실행 제어를 구현한다.

<Timeout msec="60000">
    <RetryNode num_attempts="5">
        <Delay delay_msec="1000">
            <Action ID="AttemptConnection"/>
        </Delay>
    </RetryNode>
</Timeout>

전체 60초 이내에서, 1초 간격으로 연결을 최대 5회 재시도한다.

5. 조건부 실행 제어

5.1 KeepRunningUntilFailure

자식이 FAILURE를 반환할 때까지 계속 RUNNING을 반환한다.

<KeepRunningUntilFailure>
    <Action ID="MonitorSensor"/>
</KeepRunningUntilFailure>

6. 설계 시 고려 사항

6.1 내부 상태의 생명주기

실행 제어 데코레이터는 내부 상태(카운터, 타이머)를 유지한다. 이 상태는 데코레이터가 halt될 때 초기화되어야 하며, 다음 실행 시 깨끗한 상태에서 시작하여야 한다.

6.2 무한 반복 방지

RepeatNode-1을 설정하면 무한 반복이 발생한다. TimeoutNode와 함께 사용하여 전체 실행 시간을 제한하는 것이 안전하다.

6.3 RUNNING 상태의 의미

RetryNodeRepeatNode는 자식이 완료된 후 다음 시도를 준비할 때 RUNNING을 반환한다. 이 RUNNING은 자식이 실행 중임을 나타내는 것이 아니라, 데코레이터 자체가 다음 단계를 준비 중임을 나타낸다.

7. 참고 문헌

  • 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초안 작성