조건부 Halt 데코레이터 구현 (Conditional Halt Decorator Implementation)
1. 개요
조건부 Halt 데코레이터는 블랙보드 조건을 매 tick마다 평가하여, 조건이 위반되면 실행 중인 자식을 halt하고 지정된 상태를 반환하는 커스텀 데코레이터이다. ReactiveSequence와 조건 노드의 조합으로 구현할 수 있는 패턴을 단일 데코레이터로 캡슐화한 것이다.
2. 구현
class ConditionalHaltDecorator : public BT::DecoratorNode
{
public:
ConditionalHaltDecorator(const std::string& name,
const BT::NodeConfiguration& config)
: DecoratorNode(name, config) {}
static BT::PortsList providedPorts()
{
return {
BT::InputPort<bool>("condition", true,
"지속 실행 조건 (false이면 halt)"),
BT::InputPort<std::string>("halt_status", "FAILURE",
"halt 시 반환 상태 (FAILURE 또는 SUCCESS)")
};
}
private:
BT::NodeStatus tick() override
{
setStatus(BT::NodeStatus::RUNNING);
bool condition;
getInput("condition", condition);
if (!condition)
{
haltChild();
std::string halt_status_str;
getInput("halt_status", halt_status_str);
return (halt_status_str == "SUCCESS")
? BT::NodeStatus::SUCCESS
: BT::NodeStatus::FAILURE;
}
return child_node_->executeTick();
}
};
3. XML에서의 사용
<ConditionalHalt condition="{is_system_active}"
halt_status="FAILURE">
<Action ID="LongRunningTask"/>
</ConditionalHalt>
is_system_active 블랙보드 값이 false가 되면 자식을 즉시 halt하고 FAILURE를 반환한다.
4. ReactiveSequence+Condition과의 비교
| 특성 | ConditionalHalt | ReactiveSequence+Condition |
|---|---|---|
| 구조 | 단일 데코레이터 | 2개 노드 결합 |
| 가독성 | 높음 (의도 명시적) | 보통 |
| 재사용성 | 데코레이터 재사용 | 매번 구조 구성 필요 |
| 유연성 | 제한적 (블랙보드 기반) | 높음 (임의의 조건 노드) |
5. 참고 문헌
- BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-05 | 초안 작성 |