ForceFailure 데코레이터의 동작 (Operation of the ForceFailure Decorator)
1. 개요
ForceFailure 데코레이터는 자식 노드의 반환 상태가 SUCCESS이더라도 이를 FAILURE로 변환하여 부모 노드에 전달하는 데코레이터이다. RUNNING 상태는 변환하지 않고 그대로 통과시킨다. ForceSuccess의 대칭적 쌍(counterpart)으로, 자식의 성공을 의도적으로 실패로 변환하여 행동 트리의 제어 흐름을 조정하는 데 사용된다.
2. 상태 변환 규칙
2.1 변환 테이블
| 자식 반환 | ForceFailure 반환 | 변환 여부 |
|---|---|---|
| SUCCESS | FAILURE | 변환 |
| FAILURE | FAILURE | 통과 |
| RUNNING | RUNNING | 통과 |
2.2 수학적 표현
f_{\text{ForceFailure}}(s) = \begin{cases} \text{FAILURE} & \text{if } s \in \{\text{SUCCESS}, \text{FAILURE}\} \\ \text{RUNNING} & \text{if } s = \text{RUNNING} \end{cases}
구현
class ForceFailureNode : public BT::DecoratorNode
{
BT::NodeStatus tick() override
{
setStatus(BT::NodeStatus::RUNNING);
auto child_status = child_node_->executeTick();
if (child_status == BT::NodeStatus::RUNNING)
{
return BT::NodeStatus::RUNNING;
}
return BT::NodeStatus::FAILURE;
}
};
활용 사례
Fallback에서의 강제 분기 진행
Fallback 내에서 첫 번째 자식이 성공하더라도 후속 분기를 시도하도록 강제한다.
<Fallback>
<ForceFailure>
<Action ID="LogCurrentState"/>
</ForceFailure>
<Action ID="PerformMainAction"/>
</Fallback>
LogCurrentState가 성공하더라도 ForceFailure가 FAILURE를 반환하므로, Fallback이 PerformMainAction을 시도한다. 이 패턴은 Fallback의 단락 평가를 우회하여, 로깅을 수행한 후 다음 분기로 진행하는 데 활용된다.
조건 평가 없이 행동 실행 후 Sequence 중단
<Sequence>
<Action ID="Step1"/>
<ForceFailure>
<Action ID="RecordProgress"/>
</ForceFailure>
<!-- 이후 단계는 실행되지 않음 -->
<Action ID="Step2"/>
</Sequence>
RecordProgress의 결과와 관계없이 Sequence가 FAILURE를 반환하여 중단된다. 이 패턴은 특수한 상황에서만 사용된다.
상태 변환 데코레이터의 조합
ForceFailure와 다른 데코레이터의 조합은 다음과 같은 변환을 생성한다.
| 조합 | SUCCESS 입력 | FAILURE 입력 |
|---|---|---|
ForceFailure | FAILURE | FAILURE |
Inverter(ForceFailure) | SUCCESS | SUCCESS |
ForceFailure(Inverter) | FAILURE | FAILURE |
ForceSuccess(ForceFailure) | SUCCESS | SUCCESS |
Inverter(ForceFailure(C))는 항상 SUCCESS를 반환하므로 ForceSuccess와 동치이다.
ForceSuccess와의 비교
| 특성 | ForceSuccess | ForceFailure |
|---|---|---|
| SUCCESS 입력 | SUCCESS (통과) | FAILURE (변환) |
| FAILURE 입력 | SUCCESS (변환) | FAILURE (통과) |
| 출력 | 항상 SUCCESS | 항상 FAILURE |
| 용도 | 실패 무시 | 성공 차단 |
| 사용 빈도 | 높음 | 낮음 |
ForceFailure는 ForceSuccess보다 사용 빈도가 낮으며, 주로 Fallback의 단락 평가 우회나 테스트 목적으로 사용된다.
설계 시 고려 사항
제한적 사용
ForceFailure는 자식의 성공을 은폐하므로, 사용 목적이 명확하여야 한다. 행동 트리의 논리를 의도적으로 우회하는 경우에만 제한적으로 사용하여야 한다.
조건 노드에 대한 적용
ForceFailure를 조건 노드에 적용하면 조건이 항상 FAILURE를 반환하므로, 조건 평가 자체가 무의미해진다. 이 패턴은 일반적으로 설계 오류이다.
참고 문헌
- 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 | 초안 작성 |