21 #include "nav2_util/robot_utils.hpp"
22 #include "nav2_util/geometry_utils.hpp"
23 #include "geometry_msgs/msg/pose_stamped.hpp"
24 #include "nav2_ros_common/tf2_factories.hpp"
26 #include "behaviortree_cpp/decorator_node.h"
28 #include "nav2_behavior_tree/plugins/decorator/distance_controller.hpp"
30 namespace nav2_behavior_tree
34 const std::string & name,
35 const BT::NodeConfiguration & conf)
36 : BT::DecoratorNode(name, conf),
40 getInput(
"distance", distance_);
41 node_ = config().blackboard->get<nav2::LifecycleNode::SharedPtr>(
"node");
42 clock_ = node_->get_clock();
43 tf_ = config().blackboard->get<nav2::TransformBuffer::SharedPtr>(
"tf_buffer");
44 node_->get_parameter(
"transform_tolerance", transform_tolerance_);
45 transform_staleness_threshold_ = node_->declare_or_get_parameter(
46 "transform_staleness_threshold", 0.0);
48 global_frame_ = BT::deconflictPortAndParamFrame<std::string>(
49 node_,
"global_frame",
this);
50 robot_base_frame_ = BT::deconflictPortAndParamFrame<std::string>(
51 node_,
"robot_base_frame",
this);
54 inline BT::NodeStatus DistanceController::tick()
56 if (!BT::isStatusActive(status())) {
59 if (!nav2_util::getFreshPose(
60 *tf_, global_frame_, robot_base_frame_, clock_->now(), transform_staleness_threshold_,
63 RCLCPP_DEBUG(node_->get_logger(),
"Current robot pose is not available.");
64 return BT::NodeStatus::FAILURE;
69 setStatus(BT::NodeStatus::RUNNING);
72 geometry_msgs::msg::PoseStamped current_pose;
73 if (!nav2_util::getFreshPose(
74 *tf_, global_frame_, robot_base_frame_, clock_->now(), transform_staleness_threshold_,
77 RCLCPP_DEBUG(node_->get_logger(),
"Current robot pose is not available.");
78 return BT::NodeStatus::FAILURE;
82 auto travelled = nav2_util::geometry_utils::euclidean_distance(
83 start_pose_.pose, current_pose.pose);
88 if (first_time_ || (child_node_->status() == BT::NodeStatus::RUNNING) ||
89 travelled >= distance_)
92 const BT::NodeStatus child_state = child_node_->executeTick();
94 switch (child_state) {
95 case BT::NodeStatus::SKIPPED:
96 case BT::NodeStatus::RUNNING:
99 case BT::NodeStatus::SUCCESS:
100 if (!nav2_util::getFreshPose(
101 *tf_, global_frame_, robot_base_frame_, clock_->now(), transform_staleness_threshold_,
104 RCLCPP_DEBUG(node_->get_logger(),
"Current robot pose is not available.");
105 return BT::NodeStatus::FAILURE;
107 return BT::NodeStatus::SUCCESS;
109 case BT::NodeStatus::FAILURE:
111 return BT::NodeStatus::FAILURE;
120 #include "behaviortree_cpp/bt_factory.h"
121 BT_REGISTER_NODES(factory)
A BT::DecoratorNode that ticks its child every time the robot travels a specified distance.
DistanceController(const std::string &name, const BT::NodeConfiguration &conf)
A constructor for nav2_behavior_tree::DistanceController.