Repeat의 무한 반복 설정 (Repeat's Infinite Repetition Configuration)

Repeat의 무한 반복 설정 (Repeat’s Infinite Repetition Configuration)

1. 개요

Repeat 데코레이터의 무한 반복 설정은 num_cycles 매개변수를 -1로 지정하여, 자식 노드를 횟수 제한 없이 무기한 반복 실행하는 구성이다. 무한 반복은 지속적 감시, 영구 순찰, 연속 데이터 수집 등 종료 시점이 사전에 정의되지 않는 행동에 활용된다. 그러나 종료 조건이 보장되지 않으면 행동 트리가 영원히 반복에 머물러 다른 행동이 실행되지 않으므로, 외부 종료 메커니즘과 반드시 결합하여야 한다.

2. 무한 반복의 설정

2.1 XML 설정

<Repeat num_cycles="-1">
    <Action ID="MonitorEnvironment"/>
</Repeat>

num_cycles="-1"은 BehaviorTree.CPP에서 무한 반복을 의미하는 규약이다.

2.2 동작 규칙

무한 반복에서는 반복 카운터가 종료 조건에 도달하지 않으므로, 자식이 SUCCESS를 반환하면 항상 RUNNING을 반환하여 다음 tick에서 자식을 재실행한다.

f_{\text{Repeat}}(\text{SUCCESS}, k, -1) = \text{RUNNING}, \quad \forall k

자식이 FAILURE를 반환하는 경우에만 반복이 종료된다.

f_{\text{Repeat}}(\text{FAILURE}, k, -1) = \text{FAILURE}

3. 종료 메커니즘

3.1 방법 1: ReactiveSequence + 조건 노드

외부 조건에 의해 반복을 중단한다.

<ReactiveSequence>
    <Condition ID="IsBatteryAbove" min_percentage="0.15"/>
    <Repeat num_cycles="-1">
        <Action ID="PatrolRoute"/>
    </Repeat>
</ReactiveSequence>

배터리가 15% 미만이 되면 ReactiveSequence가 Repeat를 halt하여 반복이 중단된다.

3.2 방법 2: Timeout 데코레이터

시간 제한에 의해 반복을 중단한다.

<Timeout msec="3600000">
    <Repeat num_cycles="-1">
        <Action ID="CollectData"/>
    </Repeat>
</Timeout>

1시간(3,600,000ms) 후 타임아웃에 의해 반복이 중단된다.

3.3 방법 3: 자식 내부의 조건부 FAILURE

자식 행동 내부에서 조건을 평가하여 FAILURE를 반환함으로써 반복을 종료한다.

<Repeat num_cycles="-1">
    <Sequence>
        <Condition ID="IsMoreWorkAvailable"/>
        <Action ID="ProcessNextItem"/>
    </Sequence>
</Repeat>

더 이상 처리할 작업이 없으면 조건이 FAILURE를 반환하여 Sequence가 FAILURE를 반환하고, Repeat가 반복을 종료한다.

4. 무한 반복의 실용적 사례

4.1 지속적 순찰

<ReactiveSequence>
    <Condition ID="IsSystemOperational"/>
    <Repeat num_cycles="-1">
        <Sequence>
            <Action ID="NavigateToWaypoint_A"/>
            <Action ID="NavigateToWaypoint_B"/>
            <Action ID="NavigateToWaypoint_C"/>
        </Sequence>
    </Repeat>
</ReactiveSequence>

시스템이 운용 가능한 동안 A→B→C 순찰을 무한 반복한다.

4.2 지속적 센서 감시

<Repeat num_cycles="-1">
    <Sequence>
        <Action ID="ReadSensorData"/>
        <Action ID="ProcessAndPublish"/>
    </Sequence>
</Repeat>

4.3 이벤트 대기 루프

<Repeat num_cycles="-1">
    <Fallback>
        <Sequence>
            <Condition ID="IsEventDetected"/>
            <Action ID="HandleEvent"/>
        </Sequence>
        <ForceSuccess>
            <Action ID="Sleep" duration_ms="100"/>
        </ForceSuccess>
    </Fallback>
</Repeat>

이벤트가 감지될 때까지 대기하며, 이벤트 발생 시 처리한 후 다시 대기한다.

5. 설계 시 주의 사항

5.1 반드시 종료 메커니즘 확보

무한 반복은 반드시 외부 종료 메커니즘(조건 감시, 타임아웃, 자식 FAILURE)과 결합하여야 한다. 종료 메커니즘 없는 무한 반복은 행동 트리의 다른 분기가 영원히 실행되지 못하게 한다.

5.2 tick 주기와 CPU 사용

무한 반복 내에서 자식이 즉시 SUCCESS를 반환하면, 매 tick마다 자식이 재실행된다. tick 주기가 짧으면 CPU 사용량이 과도해질 수 있으므로, Delay 데코레이터를 삽입하여 반복 간격을 조절하는 것이 바람직하다.

5.3 상태 누적 방지

무한 반복 내에서 블랙보드에 데이터가 무한히 누적되지 않도록 주의한다. 메모리 누수를 방지하기 위해 주기적으로 불필요한 데이터를 정리하여야 한다.

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