15 #include "nav2_controller/plugins/pose_progress_checker.hpp"
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"
28 using rcl_interfaces::msg::ParameterType;
29 using std::placeholders::_1;
31 namespace nav2_controller
36 auto node = node_.lock();
37 if (post_set_params_handler_ && node) {
38 node->remove_post_set_parameters_callback(post_set_params_handler_.get());
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());
44 on_set_params_handler_.reset();
48 const nav2::LifecycleNode::WeakPtr & parent,
49 const std::string & plugin_name)
51 plugin_name_ = plugin_name;
54 auto node = node_.lock();
55 logger_ = node->get_logger();
57 required_movement_angle_ = node->declare_or_get_parameter(
58 plugin_name +
".required_movement_angle", 0.5);
61 post_set_params_handler_ = node->add_post_set_parameters_callback(
64 this, std::placeholders::_1));
65 on_set_params_handler_ = node->add_on_set_parameters_callback(
68 this, std::placeholders::_1));
73 std::lock_guard<std::mutex> lock_reinit(mutex_);
80 return clock_->now() - baseline_time_ <= time_allowance_;
90 const geometry_msgs::msg::Pose & pose1,
91 const geometry_msgs::msg::Pose & pose2)
93 double theta1 = tf2::getYaw(pose1.orientation);
94 double theta2 = tf2::getYaw(pose2.orientation);
95 return std::abs(angles::shortest_angular_distance(theta1, theta2));
98 rcl_interfaces::msg::SetParametersResult
100 const std::vector<rclcpp::Parameter> & parameters)
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) {
110 if (param_type == ParameterType::PARAMETER_DOUBLE) {
111 if (parameter.as_double() < 0.0) {
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;
125 const std::vector<rclcpp::Parameter> & parameters)
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) {
134 if (param_type == ParameterType::PARAMETER_DOUBLE) {
135 if (param_name == plugin_name_ +
".required_movement_angle") {
136 required_movement_angle_ = parameter.as_double();
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 > ¶meters)
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 > ¶meters)
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 ¤t_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 ...