데코레이터 노드의 조합 패턴 (Decorator Node Combination Patterns)

데코레이터 노드의 조합 패턴 (Decorator Node Combination Patterns)

1. 개요

데코레이터 노드의 조합 패턴은 복수의 데코레이터를 중첩하여 더 복잡한 실행 정책을 구현하는 설계 패턴이다. 각 데코레이터는 단일 기능을 담당하며, 이들을 계층적으로 조합함으로써 시간 제한 + 재시도, 반복 + 실패 무시, 지연 + 행동 등의 복합 동작을 표현한다.

2. 조합의 원리

2.1 중첩 순서

데코레이터의 중첩에서 외부 데코레이터가 먼저 tick되고, 내부 데코레이터를 자식으로 tick한다. 따라서 외부 데코레이터의 정책이 우선 적용된다.

<Outer>
    <Inner>
        <Action ID="Task"/>
    </Inner>
</Outer>

Outer가 먼저 평가되며, Outer의 조건이 충족되면 Inner를 tick하고, Inner의 조건이 충족되면 Task를 tick한다.

3. 주요 조합 패턴

3.1 Timeout + Retry: 시간 제한 재시도

<Timeout msec="60000">
    <RetryNode num_attempts="5">
        <Action ID="DownloadMap"/>
    </RetryNode>
</Timeout>

전체 60초 이내에서 최대 5회 재시도한다. Timeout이 외부이므로, 재시도 중이라도 60초가 경과하면 전체가 halt된다.

3.2 Retry + Delay: 지연을 포함한 재시도

<RetryNode num_attempts="3">
    <Delay delay_msec="2000">
        <Action ID="ConnectToServer"/>
    </Delay>
</RetryNode>

각 재시도 사이에 2초 간격을 둔다.

3.3 Repeat + ForceSuccess: 실패 무시 반복

<Repeat num_cycles="10">
    <ForceSuccess>
        <Action ID="TryScan"/>
    </ForceSuccess>
</Repeat>

스캔이 실패해도 10회 반복을 완료한다.

3.4 Timeout + Repeat: 시간 제한 반복

<Timeout msec="300000">
    <Repeat num_cycles="-1">
        <Action ID="PatrolWaypoint"/>
    </Repeat>
</Timeout>

5분 동안 순찰을 무한 반복한다.

3.5 Inverter + Retry: 성공할 때까지 반복 (역 Retry)

<Inverter>
    <RetryNode num_attempts="10">
        <Inverter>
            <Action ID="WaitForEvent"/>
        </Inverter>
    </RetryNode>
</Inverter>

WaitForEventSUCCESS를 반환할 때까지 최대 10회 반복한다. 내부 Inverter가 SUCCESS를 FAILURE로 변환하여 Retry를 트리거하고, 외부 Inverter가 최종 결과를 다시 반전한다.

3.6 RunOnce + Retry: 초기화 재시도 후 캐싱

<RunOnce>
    <RetryNode num_attempts="3">
        <Action ID="InitializeSensor"/>
    </RetryNode>
</RunOnce>

센서 초기화를 최대 3회 재시도하고, 결과를 캐싱하여 이후에는 재실행하지 않는다.

4. 다중 중첩 규칙

4.1 중첩 깊이 권장

데코레이터 중첩은 2~3단계 이내로 제한하는 것이 가독성 측면에서 바람직하다. 3단계를 초과하면 서브트리로 분리한다.

4.2 중첩 순서의 의미론

외부내부의미
TimeoutRetry전체 시간 내에서 재시도
RetryTimeout각 시도에 시간 제한
RepeatForceSuccess실패 무시하고 반복
ForceSuccessRepeat반복 전체 실패를 무시

외부-내부 순서에 따라 의미가 완전히 달라지므로 주의하여야 한다.

5. 설계 시 고려 사항

5.1 halt 전파의 올바름

다중 중첩 데코레이터에서 halt가 발생하면, 외부에서 내부로 순차적으로 전파되어야 한다. 각 데코레이터의 halt()가 올바르게 자식의 halt를 호출하는지 검증하여야 한다.

5.2 상태 변환의 합성 결과 예측

복수의 상태 변환 데코레이터가 중첩되면, 합성 변환 결과가 직관적이지 않을 수 있다. 변환 테이블을 작성하여 각 입력에 대한 최종 출력을 사전에 확인한다.

6. 참고 문헌

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

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