커스텀 데코레이터의 등록 (Custom Decorator Registration)

커스텀 데코레이터의 등록 (Custom Decorator Registration)

1. 개요

커스텀 데코레이터를 행동 트리에서 사용하려면 BT::BehaviorTreeFactory에 등록하여야 한다. 등록 시 XML에서 사용할 이름과 C++ 클래스를 매핑하며, 추가 생성자 매개변수가 필요한 경우 이를 함께 전달한다.

2. 등록 방법

2.1 기본 등록

BT::BehaviorTreeFactory factory;
factory.registerNodeType<CooldownDecorator>("Cooldown");

이후 XML에서 다음과 같이 사용한다.

<Cooldown cooldown_sec="5.0">
    <Action ID="RecoveryAction"/>
</Cooldown>

2.2 추가 매개변수와 함께 등록

ROS2 노드 등 추가 매개변수가 필요한 경우:

auto ros_node = std::make_shared<rclcpp::Node>("bt_node");
factory.registerNodeType<RosDecorator>("RosDecorator", ros_node);

커스텀 데코레이터의 생성자는 표준 매개변수 뒤에 추가 매개변수를 받는다.

RosDecorator(const std::string& name,
             const BT::NodeConfiguration& config,
             rclcpp::Node::SharedPtr node)
    : DecoratorNode(name, config), node_(node) {}

2.3 빌더 함수를 통한 등록

더 복잡한 생성 로직이 필요한 경우 빌더 함수를 사용한다.

BT::NodeBuilder builder =
    [ros_node](const%20std::string&%20name,
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20BT::NodeConfiguration&%20config)
    {
        return std::make_unique<RosDecorator>(
            name, config, ros_node);
    };

factory.registerBuilder<RosDecorator>("RosDecorator", builder);

3. 등록 확인

등록된 노드 목록을 조회하여 올바르게 등록되었는지 확인한다.

auto manifest = factory.manifests();
for (const auto& [id, info] : manifest)
{
    std::cout << "Registered: " << id << std::endl;
}

4. 등록 시 주의 사항

4.1 이름 충돌 방지

동일한 이름으로 중복 등록하면 오류가 발생한다. 커스텀 데코레이터의 이름이 내장 데코레이터와 충돌하지 않도록 한다.

4.2 providedPorts()의 일관성

등록되는 클래스의 providedPorts() 메서드가 올바르게 정의되어 있어야 한다. XML에서 참조하는 포트 이름이 providedPorts()에 선언되지 않으면 오류가 발생한다.

5. ROS2 패키지에서의 플러그인 등록

ROS2 환경에서는 플러그인 시스템을 통해 커스텀 데코레이터를 동적으로 등록할 수 있다.

#include <behaviortree_cpp/bt_factory.h>

BT_REGISTER_NODES(factory)
{
    factory.registerNodeType<CooldownDecorator>("Cooldown");
    factory.registerNodeType<LoggingDecorator>("LoggingDec");
}

6. 참고 문헌

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

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