로깅 데코레이터 구현 (Logging Decorator Implementation)

로깅 데코레이터 구현 (Logging Decorator Implementation)

1. 개요

로깅 데코레이터는 자식 노드의 상태 전환을 자동으로 기록하는 투명한(transparent) 커스텀 데코레이터이다. 자식의 반환 상태를 변환하지 않고 그대로 전달하면서, 상태 변화가 발생할 때마다 로그 메시지를 출력한다. 행동 트리의 디버깅과 동작 분석에 유용하다.

2. 구현

class LoggingDecorator : public BT::DecoratorNode
{
public:
    LoggingDecorator(const std::string& name,
                     const BT::NodeConfiguration& config)
        : DecoratorNode(name, config),
          previous_status_(BT::NodeStatus::IDLE) {}

    static BT::PortsList providedPorts()
    {
        return {
            BT::InputPort<std::string>("prefix", "",
                "로그 메시지 접두어")
        };
    }

private:
    BT::NodeStatus tick() override
    {
        setStatus(BT::NodeStatus::RUNNING);
        auto status = child_node_->executeTick();

        if (status != previous_status_)
        {
            std::string prefix;
            getInput("prefix", prefix);

            std::cout << "[" << prefix << name() << "] "
                      << child()->name() << ": "
                      << BT::toStr(previous_status_)
                      << " -> "
                      << BT::toStr(status) << std::endl;

            previous_status_ = status;
        }

        return status;  // 투명 전달
    }

    void halt() override
    {
        previous_status_ = BT::NodeStatus::IDLE;
        DecoratorNode::halt();
    }

    BT::NodeStatus previous_status_;
};

3. 핵심 특성

3.1 투명성

로깅 데코레이터는 자식의 반환 상태를 변환하지 않으므로, 행동 트리의 동작에 영향을 미치지 않는다. 로깅 데코레이터를 추가하거나 제거해도 행동의 논리가 변하지 않는다.

3.2 상태 전환 감지

매 tick이 아닌 상태가 변경된 시점에서만 로깅하여 로그 볼륨을 줄인다.

4. XML에서의 사용

<Log prefix="NAV: ">
    <Action ID="NavigateToPose"/>
</Log>

내비게이션 상태 전환을 [NAV: Log] NavigateToPose: IDLE -> RUNNING 형식으로 기록한다.

5. ROS2 로거와의 연동

std::cout 대신 RCLCPP_INFO를 사용하여 ROS2 로깅 시스템과 통합할 수 있다.

RCLCPP_INFO(node_->get_logger(),
    "[%s] %s: %s -> %s",
    name().c_str(), child()->name().c_str(),
    BT::toStr(previous_status_).c_str(),
    BT::toStr(status).c_str());

6. 참고 문헌

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

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