Nav2 Navigation Stack - jazzy  jazzy
ROS 2 Navigation Stack
are_poses_near_condition.cpp
1 // Copyright (c) 2025 Open Navigation LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "nav2_behavior_tree/plugins/condition/are_poses_near_condition.hpp"
16 
17 namespace nav2_behavior_tree
18 {
19 
20 ArePosesNearCondition::ArePosesNearCondition(
21  const std::string & condition_name,
22  const BT::NodeConfiguration & conf)
23 : BT::ConditionNode(condition_name, conf)
24 {
25  auto node = config().blackboard->get<rclcpp::Node::SharedPtr>("node");
26  global_frame_ = BT::deconflictPortAndParamFrame<std::string>(
27  node, "global_frame", this);
28 }
29 
31 {
32  node_ = config().blackboard->get<rclcpp::Node::SharedPtr>("node");
33  tf_ = config().blackboard->get<std::shared_ptr<tf2_ros::Buffer>>("tf_buffer");
34  node_->get_parameter("transform_tolerance", transform_tolerance_);
35 }
36 
38 {
39  if (!BT::isStatusActive(status())) {
40  initialize();
41  }
42 
43  if (arePosesNearby()) {
44  return BT::NodeStatus::SUCCESS;
45  }
46  return BT::NodeStatus::FAILURE;
47 }
48 
50 {
51  geometry_msgs::msg::PoseStamped pose1, pose2;
52  double tol;
53  getInput("ref_pose", pose1);
54  getInput("target_pose", pose2);
55  getInput("tolerance", tol);
56 
57  if (pose1.header.frame_id != pose2.header.frame_id) {
58  if (!nav2_util::transformPoseInTargetFrame(
59  pose1, pose1, *tf_, global_frame_, transform_tolerance_) ||
60  !nav2_util::transformPoseInTargetFrame(
61  pose2, pose2, *tf_, global_frame_, transform_tolerance_))
62  {
63  RCLCPP_ERROR(node_->get_logger(), "Failed to transform poses to the same frame");
64  return false;
65  }
66  }
67 
68  double dx = pose1.pose.position.x - pose2.pose.position.x;
69  double dy = pose1.pose.position.y - pose2.pose.position.y;
70  return (dx * dx + dy * dy) <= (tol * tol);
71 }
72 
73 } // namespace nav2_behavior_tree
74 
75 #include "behaviortree_cpp/bt_factory.h"
76 BT_REGISTER_NODES(factory)
77 {
78  factory.registerNodeType<nav2_behavior_tree::ArePosesNearCondition>("ArePosesNear");
79 }
A BT::ConditionNode that returns SUCCESS when a specified goal is reached and FAILURE otherwise.
BT::NodeStatus tick() override
The main override required by a BT action.
bool arePosesNearby()
Checks if the current robot pose lies within a given distance from the goal.
void initialize()
Function to read parameters and initialize class variables.