조건부 Halt 데코레이터 구현 (Conditional Halt Decorator Implementation)

조건부 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과의 비교

특성ConditionalHaltReactiveSequence+Condition
구조단일 데코레이터2개 노드 결합
가독성높음 (의도 명시적)보통
재사용성데코레이터 재사용매번 구조 구성 필요
유연성제한적 (블랙보드 기반)높음 (임의의 조건 노드)

5. 참고 문헌

  • BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/

버전날짜변경 사항
v0.12026-04-05초안 작성