15 #ifndef NAV2_BEHAVIOR_TREE__ROS_TOPIC_LOGGER_HPP_
16 #define NAV2_BEHAVIOR_TREE__ROS_TOPIC_LOGGER_HPP_
22 #include "behaviortree_cpp_v3/loggers/abstract_logger.h"
23 #include "rclcpp/rclcpp.hpp"
24 #include "nav2_msgs/msg/behavior_tree_log.hpp"
25 #include "nav2_msgs/msg/behavior_tree_status_change.h"
26 #include "tf2_ros/buffer_interface.h"
28 namespace nav2_behavior_tree
42 RosTopicLogger(
const rclcpp::Node::WeakPtr & ros_node,
const BT::Tree & tree)
43 : StatusChangeLogger(tree.rootNode())
45 auto node = ros_node.lock();
46 clock_ = node->get_clock();
47 logger_ = node->get_logger();
48 log_pub_ = node->create_publisher<nav2_msgs::msg::BehaviorTreeLog>(
61 BT::Duration timestamp,
62 const BT::TreeNode & node,
63 BT::NodeStatus prev_status,
64 BT::NodeStatus status)
override
66 nav2_msgs::msg::BehaviorTreeStatusChange event;
70 event.timestamp = tf2_ros::toMsg(tf2::TimePoint(timestamp));
71 event.node_name = node.name();
72 event.previous_status = toStr(prev_status,
false);
73 event.current_status = toStr(status,
false);
74 event_log_.push_back(std::move(event));
77 logger_,
"[%.3f]: %25s %s -> %s",
78 std::chrono::duration<double>(timestamp).count(),
80 toStr(prev_status,
true).c_str(),
81 toStr(status,
true).c_str() );
89 if (!event_log_.empty()) {
90 auto log_msg = std::make_unique<nav2_msgs::msg::BehaviorTreeLog>();
91 log_msg->timestamp = clock_->now();
92 log_msg->event_log = event_log_;
93 log_pub_->publish(std::move(log_msg));
99 rclcpp::Clock::SharedPtr clock_;
100 rclcpp::Logger logger_{rclcpp::get_logger(
"bt_navigator")};
101 rclcpp::Publisher<nav2_msgs::msg::BehaviorTreeLog>::SharedPtr log_pub_;
102 std::vector<nav2_msgs::msg::BehaviorTreeStatusChange> event_log_;
A class to publish BT logs on BT status change.
RosTopicLogger(const rclcpp::Node::WeakPtr &ros_node, const BT::Tree &tree)
A constructor for nav2_behavior_tree::RosTopicLogger.
void flush() override
Clear log buffer if any.
void callback(BT::Duration timestamp, const BT::TreeNode &node, BT::NodeStatus prev_status, BT::NodeStatus status) override
Callback function which is called each time BT changes status.