KeepRunningUntilFailure의 Success→Running 변환 (KeepRunningUntilFailure's Success→Running Conversion)

KeepRunningUntilFailure의 Success→Running 변환 (KeepRunningUntilFailure’s Success→Running Conversion)

1. 개요

KeepRunningUntilFailure 데코레이터의 핵심 변환은 자식 노드의 SUCCESSRUNNING으로 변환하는 것이다. 이 변환에 의해 자식의 성공적 완료가 전체 데코레이터의 완료로 이어지지 않으며, 다음 tick에서 자식이 다시 실행된다. 이는 “성공해도 계속 실행“하는 의미론을 구현한다.

2. 변환 규칙

f_{\text{KRUF}}(\text{SUCCESS}) = \text{RUNNING}

자식이 SUCCESS를 반환하면, KeepRunningUntilFailure는 RUNNING을 반환한다. 부모 노드는 데코레이터가 아직 실행 중인 것으로 인식하며, 다음 tick에서 데코레이터를 다시 tick한다.

변환의 효과

반복 실행 유발

SUCCESSRUNNING으로 변환되므로, 자식이 반복적으로 재실행된다.

Tick 1: Child → SUCCESS → KRUF → RUNNING → 다음 tick에서 재실행
Tick 2: Child → SUCCESS → KRUF → RUNNING → 다음 tick에서 재실행
Tick 3: Child → FAILURE → KRUF → FAILURE → 종료

부모 Sequence에서의 효과

<Sequence>
    <KeepRunningUntilFailure>
        <Action ID="MonitorSensor"/>
    </KeepRunningUntilFailure>
    <Action ID="NextStep"/>  <!-- KRUF가 FAILURE를 반환할 때까지 실행되지 않음 -->
</Sequence>

MonitorSensorSUCCESS를 반환하는 한, NextStep은 실행되지 않는다. MonitorSensorFAILURE를 반환해야만 NextStep으로 진행한다.

SUCCESS→RUNNING 변환이 필요한 이유

일반적인 행동 트리에서 SUCCESS는 “행동이 완료되었으며 다음으로 진행하라“는 신호이다. 그러나 지속적 감시나 영구 실행이 필요한 행동에서는 한 번의 SUCCESS가 행동의 종료를 의미하지 않는다. SUCCESS→RUNNING 변환은 이 의미론적 차이를 해소한다.

ForceSuccess와의 비교

특성KeepRunningUntilFailureForceSuccess
SUCCESS 입력RUNNINGSUCCESS
FAILURE 입력FAILURESUCCESS
용도지속 실행실패 무시
자식 재실행예 (SUCCESS 후)아니오

설계 시 고려 사항

자식이 항상 SUCCESS를 반환하면 KeepRunningUntilFailure는 영원히 RUNNING을 반환한다. 외부 종료 메커니즘(ReactiveSequence + 조건, Timeout)이 반드시 필요하다.

참고 문헌

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