Nav2 Navigation Stack - lyrical  lyrical
ROS 2 Navigation Stack
pose_progress_checker.cpp
1 // Copyright (c) 2023 Dexory
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_controller/plugins/pose_progress_checker.hpp"
16 #include <cmath>
17 #include <string>
18 #include <memory>
19 #include <vector>
20 #include "angles/angles.h"
21 #include "geometry_msgs/msg/pose_stamped.hpp"
22 #include "geometry_msgs/msg/pose.hpp"
23 #include "nav2_ros_common/node_utils.hpp"
24 #include "pluginlib/class_list_macros.hpp"
25 #include "tf2/utils.hpp"
26 #include "tf2_geometry_msgs/tf2_geometry_msgs.hpp"
27 
28 using rcl_interfaces::msg::ParameterType;
29 using std::placeholders::_1;
30 
31 namespace nav2_controller
32 {
33 
35 {
36  auto node = node_.lock();
37  if (post_set_params_handler_ && node) {
38  node->remove_post_set_parameters_callback(post_set_params_handler_.get());
39  }
40  post_set_params_handler_.reset();
41  if (on_set_params_handler_ && node) {
42  node->remove_on_set_parameters_callback(on_set_params_handler_.get());
43  }
44  on_set_params_handler_.reset();
45 }
46 
48  const nav2::LifecycleNode::WeakPtr & parent,
49  const std::string & plugin_name)
50 {
51  plugin_name_ = plugin_name;
52  SimpleProgressChecker::initialize(parent, plugin_name);
53  node_ = parent;
54  auto node = node_.lock();
55  logger_ = node->get_logger();
56 
57  required_movement_angle_ = node->declare_or_get_parameter(
58  plugin_name + ".required_movement_angle", 0.5);
59 
60  // Add callback for dynamic parameters
61  post_set_params_handler_ = node->add_post_set_parameters_callback(
62  std::bind(
64  this, std::placeholders::_1));
65  on_set_params_handler_ = node->add_on_set_parameters_callback(
66  std::bind(
68  this, std::placeholders::_1));
69 }
70 
71 bool PoseProgressChecker::check(geometry_msgs::msg::PoseStamped & current_pose)
72 {
73  std::lock_guard<std::mutex> lock_reinit(mutex_);
74  // relies on short circuit evaluation to not call is_robot_moved_enough if
75  // baseline_pose is not set.
76  if (!baseline_pose_set_ || PoseProgressChecker::isRobotMovedEnough(current_pose.pose)) {
77  resetBaselinePose(current_pose.pose);
78  return true;
79  }
80  return clock_->now() - baseline_time_ <= time_allowance_;
81 }
82 
83 bool PoseProgressChecker::isRobotMovedEnough(const geometry_msgs::msg::Pose & pose)
84 {
85  return pose_distance(pose, baseline_pose_) > radius_ ||
86  poseAngleDistance(pose, baseline_pose_) > required_movement_angle_;
87 }
88 
90  const geometry_msgs::msg::Pose & pose1,
91  const geometry_msgs::msg::Pose & pose2)
92 {
93  double theta1 = tf2::getYaw(pose1.orientation);
94  double theta2 = tf2::getYaw(pose2.orientation);
95  return std::abs(angles::shortest_angular_distance(theta1, theta2));
96 }
97 
98 rcl_interfaces::msg::SetParametersResult
100  const std::vector<rclcpp::Parameter> & parameters)
101 {
102  rcl_interfaces::msg::SetParametersResult result;
103  result.successful = true;
104  for (auto parameter : parameters) {
105  const auto & param_type = parameter.get_type();
106  const auto & param_name = parameter.get_name();
107  if (param_name.find(plugin_name_ + ".") != 0) {
108  continue;
109  }
110  if (param_type == ParameterType::PARAMETER_DOUBLE) {
111  if (parameter.as_double() < 0.0) {
112  RCLCPP_WARN(
113  logger_, "The value of parameter '%s' is incorrectly set to %f, "
114  "it should be >=0. Ignoring parameter update.",
115  param_name.c_str(), parameter.as_double());
116  result.successful = false;
117  }
118  }
119  }
120  return result;
121 }
122 
123 void
125  const std::vector<rclcpp::Parameter> & parameters)
126 {
127  std::lock_guard<std::mutex> lock_reinit(mutex_);
128  for (const auto & parameter : parameters) {
129  const auto & param_type = parameter.get_type();
130  const auto & param_name = parameter.get_name();
131  if (param_name.find(plugin_name_ + ".") != 0) {
132  continue;
133  }
134  if (param_type == ParameterType::PARAMETER_DOUBLE) {
135  if (param_name == plugin_name_ + ".required_movement_angle") {
136  required_movement_angle_ = parameter.as_double();
137  }
138  }
139  }
140 }
141 
142 } // namespace nav2_controller
143 
This plugin is used to check the position and the angle of the robot to make sure that it is actually...
static double poseAngleDistance(const geometry_msgs::msg::Pose &, const geometry_msgs::msg::Pose &)
Calculates angle difference between two poses.
rcl_interfaces::msg::SetParametersResult validateParameterUpdatesCallback(const std::vector< rclcpp::Parameter > &parameters)
Validate incoming parameter updates before applying them. This callback is triggered when one or more...
bool isRobotMovedEnough(const geometry_msgs::msg::Pose &pose)
Calculates robots movement from baseline pose.
~PoseProgressChecker()
Destroy the Pose Progress Checker object.
void updateParametersCallback(const std::vector< rclcpp::Parameter > &parameters)
Apply parameter updates after validation This callback is executed when parameters have been successf...
void initialize(const nav2::LifecycleNode::WeakPtr &parent, const std::string &plugin_name) override
Initialize the goal checker.
bool check(geometry_msgs::msg::PoseStamped &current_pose) override
Checks if the robot has moved compare to previous.
static double pose_distance(const geometry_msgs::msg::Pose &, const geometry_msgs::msg::Pose &)
Calculates distance between two poses.
void resetBaselinePose(const geometry_msgs::msg::Pose &pose)
Resets baseline pose with the current pose of the robot.
void initialize(const nav2::LifecycleNode::WeakPtr &parent, const std::string &plugin_name) override
Initialize the goal checker.
This class defines the plugin interface used to check the position of the robot to make sure that it ...