Repeat의 반복 중 Failure 처리 (Repeat's Failure Handling During Repetition)

Repeat의 반복 중 Failure 처리 (Repeat’s Failure Handling During Repetition)

1. 개요

Repeat 데코레이터의 반복 중 Failure 처리는 자식 노드가 반복 실행 도중 FAILURE를 반환하였을 때의 동작을 정의한다. 기본적으로 Repeat 데코레이터는 자식의 FAILURE를 반복 중단의 신호로 해석하여, 남은 반복 횟수와 관계없이 즉시 FAILURE를 반환한다.

2. 기본 Failure 처리 규칙

2.1 즉시 중단 규칙

자식이 반복 중 어느 시점에서든 FAILURE를 반환하면, Repeat 데코레이터는 반복을 즉시 중단하고 FAILURE를 반환한다.

f_{\text{Repeat}}(\text{FAILURE}, k, N) = \text{FAILURE}, \quad \forall k, N

반복 카운터 kN에 도달하지 않았더라도, 자식의 FAILURE는 전체 반복의 실패를 의미한다.

동작 흐름 예시 (N = 5)

Tick 1: Child → SUCCESS, k=1 → Repeat=RUNNING
Tick 2: Child → SUCCESS, k=2 → Repeat=RUNNING
Tick 3: Child → FAILURE       → Repeat=FAILURE (반복 중단)

3번째 반복에서 자식이 FAILURE를 반환하면, 남은 2회의 반복(4, 5번째)은 수행되지 않는다.

Failure에 대한 대응 전략

전략 1: 기본 동작 (즉시 중단)

자식의 FAILURE를 심각한 오류로 간주하고 반복을 중단한다.

<Repeat num_cycles="10">
    <Action ID="ProcessItem"/>
</Repeat>

전략 2: 실패 무시 (ForceSuccess 적용)

자식의 FAILURE를 무시하고 반복을 계속한다.

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

ForceSuccess가 자식의 FAILURE를 SUCCESS로 변환하므로, Repeat는 항상 10회 반복을 완료한다.

전략 3: 재시도 후 계속 (Retry 중첩)

자식이 실패하면 재시도하고, 재시도도 실패하면 반복을 중단한다.

<Repeat num_cycles="10">
    <RetryNode num_attempts="3">
        <Action ID="ProcessItem"/>
    </RetryNode>
</Repeat>

각 반복에서 최대 3회 재시도 후에도 실패하면 전체 반복이 중단된다.

전략 4: 실패 횟수 제한 (ForceSuccess + 카운터)

일정 횟수까지의 실패를 허용하고, 누적 실패 횟수가 한계를 초과하면 중단한다.

<Repeat num_cycles="10">
    <Sequence>
        <ForceSuccess>
            <Action ID="ProcessItem"
                    output_success="{item_success}"/>
        </ForceSuccess>
        <Action ID="CheckFailureCount"
                item_success="{item_success}"
                max_failures="3"/>
    </Sequence>
</Repeat>

Failure 원인의 진단

반복 중 발생한 FAILURE의 원인을 파악하기 위해, 자식 노드가 실패 이유를 블랙보드에 기록하도록 설계한다.

<Repeat num_cycles="5">
    <Sequence>
        <Action ID="AttemptTask"
                output_error="{last_error}"/>
    </Sequence>
</Repeat>

반복이 FAILURE로 중단된 후, {last_error} 블랙보드 키를 통해 실패 원인을 확인할 수 있다.

설계 시 고려 사항

FAILURE의 의미론적 해석

자식의 FAILURE가 “일시적 오류“인지 “영구적 오류“인지에 따라 대응 전략이 달라진다. 일시적 오류(네트워크 지연, 센서 잡음)는 재시도로 해결될 수 있으나, 영구적 오류(하드웨어 고장)는 반복 자체를 중단하여야 한다.

부분 완료 상태의 처리

N회 반복 중 k회 완료 후 실패한 경우, k회까지의 부분 결과가 유효한지를 판단하여야 한다. 예를 들어, 10개 중 7개의 웨이포인트를 순찰한 후 실패하였다면, 7개의 순찰 결과는 유효할 수 있다.

halt에 의한 중단과 FAILURE에 의한 중단의 구분

외부 halt(ReactiveSequence의 조건 실패 등)에 의한 중단과 자식 FAILURE에 의한 중단은 의미론적으로 다르다. halt는 “외부 조건 변화에 의한 정상적 중단“이며, FAILURE는 “행동 실행 중 발생한 오류에 의한 비정상적 중단“이다.

참고 문헌

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