ForceFailure의 Success→Failure 변환 규칙 (ForceFailure’s Success→Failure Conversion Rule)
1. 개요
ForceFailure 데코레이터의 핵심 변환 규칙은 자식 노드가 SUCCESS를 반환할 때 이를 FAILURE로 변환하는 것이다. 이 단방향 변환은 자식 행동의 성공을 의도적으로 차단하여, Fallback 제어 노드에서의 단락 평가를 우회하거나, 특정 분기가 선택되는 것을 방지하는 데 활용된다.
2. 변환 규칙의 정형적 정의
f_{\text{ForceFailure}}(\text{SUCCESS}) = \text{FAILURE}
이 변환에 의해, 자식이 SUCCESS를 반환하더라도 ForceFailure의 부모 노드는 FAILURE를 수신한다. 자식의 성공이 부모에게 전달되지 않는다.
Fallback에서의 효과
ForceFailure 없이
<Fallback>
<Action ID="ActionA"/> <!-- SUCCESS 반환 -->
<Action ID="ActionB"/> <!-- 실행되지 않음 (단락 평가) -->
</Fallback>
ActionA가 SUCCESS → Fallback이 SUCCESS → ActionB는 평가되지 않음.
ForceFailure 적용
<Fallback>
<ForceFailure>
<Action ID="ActionA"/> <!-- SUCCESS 반환해도 -->
</ForceFailure>
<Action ID="ActionB"/> <!-- 실행됨 -->
</Fallback>
ActionA가 SUCCESS → ForceFailure가 FAILURE → Fallback이 ActionB를 시도.
이 패턴은 ActionA를 부작용(side effect)으로 실행하면서도, Fallback이 ActionB로 진행하도록 하는 데 사용된다. 그러나 데코레이터의 부작용 발생은 행동 트리의 설계 원칙에 부합하지 않을 수 있으므로 주의가 필요하다.
Inverter와의 비교
| 입력 | Inverter 출력 | ForceFailure 출력 |
|---|---|---|
| SUCCESS | FAILURE | FAILURE |
| FAILURE | SUCCESS | FAILURE |
Inverter는 FAILURE를 SUCCESS로 반전하지만, ForceFailure는 FAILURE를 FAILURE로 유지한다. 따라서 ForceFailure는 항상 FAILURE를 반환하며, 자식의 결과를 구별하지 않는다.
SUCCESS→FAILURE 변환의 한계
이 변환은 자식의 성공 정보를 소실시킨다. 자식이 성공적으로 완료되었는지의 정보가 부모에게 전달되지 않으므로, 후속 로직에서 자식의 성공 여부를 참조할 수 없다. 필요한 경우 블랙보드에 결과를 별도로 기록하여야 한다.
실용적 사용 빈도
ForceFailure는 ForceSuccess에 비해 사용 빈도가 현저히 낮다. 대부분의 실용적 상황에서 자식의 성공을 차단하여야 할 필요성이 적기 때문이다. 주요 사용처는 다음과 같다.
- Fallback의 단락 평가 우회
- 테스트 및 디버깅 목적의 강제 실패
- 특정 분기의 비활성화
참고 문헌
- 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 | 초안 작성 |