KeepRunningUntilFailure의 Success→Running 변환 (KeepRunningUntilFailure’s Success→Running Conversion)
1. 개요
KeepRunningUntilFailure 데코레이터의 핵심 변환은 자식 노드의 SUCCESS를 RUNNING으로 변환하는 것이다. 이 변환에 의해 자식의 성공적 완료가 전체 데코레이터의 완료로 이어지지 않으며, 다음 tick에서 자식이 다시 실행된다. 이는 “성공해도 계속 실행“하는 의미론을 구현한다.
2. 변환 규칙
f_{\text{KRUF}}(\text{SUCCESS}) = \text{RUNNING}
자식이 SUCCESS를 반환하면, KeepRunningUntilFailure는 RUNNING을 반환한다. 부모 노드는 데코레이터가 아직 실행 중인 것으로 인식하며, 다음 tick에서 데코레이터를 다시 tick한다.
변환의 효과
반복 실행 유발
SUCCESS가 RUNNING으로 변환되므로, 자식이 반복적으로 재실행된다.
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>
MonitorSensor가 SUCCESS를 반환하는 한, NextStep은 실행되지 않는다. MonitorSensor가 FAILURE를 반환해야만 NextStep으로 진행한다.
SUCCESS→RUNNING 변환이 필요한 이유
일반적인 행동 트리에서 SUCCESS는 “행동이 완료되었으며 다음으로 진행하라“는 신호이다. 그러나 지속적 감시나 영구 실행이 필요한 행동에서는 한 번의 SUCCESS가 행동의 종료를 의미하지 않는다. SUCCESS→RUNNING 변환은 이 의미론적 차이를 해소한다.
ForceSuccess와의 비교
| 특성 | KeepRunningUntilFailure | ForceSuccess |
|---|---|---|
| SUCCESS 입력 | RUNNING | SUCCESS |
| FAILURE 입력 | FAILURE | SUCCESS |
| 용도 | 지속 실행 | 실패 무시 |
| 자식 재실행 | 예 (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.1 | 2026-04-04 | 초안 작성 |