15 #include "nav2_controller/plugins/simple_progress_checker.hpp"
20 #include "geometry_msgs/msg/pose_stamped.hpp"
21 #include "geometry_msgs/msg/pose.hpp"
22 #include "nav2_ros_common/node_utils.hpp"
23 #include "pluginlib/class_list_macros.hpp"
25 using rcl_interfaces::msg::ParameterType;
26 using std::placeholders::_1;
28 namespace nav2_controller
32 auto node = node_.lock();
33 if (post_set_params_handler_ && node) {
34 node->remove_post_set_parameters_callback(post_set_params_handler_.get());
36 post_set_params_handler_.reset();
37 if (on_set_params_handler_ && node) {
38 node->remove_on_set_parameters_callback(on_set_params_handler_.get());
40 on_set_params_handler_.reset();
44 const nav2::LifecycleNode::WeakPtr & parent,
45 const std::string & plugin_name)
47 plugin_name_ = plugin_name;
49 auto node = node_.lock();
51 clock_ = node->get_clock();
52 logger_ = node->get_logger();
54 radius_ = node->declare_or_get_parameter(plugin_name +
".required_movement_radius", 0.5);
55 double time_allowance_param = node->declare_or_get_parameter(
56 plugin_name +
".movement_time_allowance", 10.0);
57 time_allowance_ = rclcpp::Duration::from_seconds(time_allowance_param);
60 post_set_params_handler_ = node->add_post_set_parameters_callback(
63 this, std::placeholders::_1));
64 on_set_params_handler_ = node->add_on_set_parameters_callback(
67 this, std::placeholders::_1));
72 std::lock_guard<std::mutex> lock_reinit(mutex_);
79 return !((clock_->now() - baseline_time_) > time_allowance_);
84 baseline_pose_set_ =
false;
89 baseline_pose_ = pose;
90 baseline_time_ = clock_->now();
91 baseline_pose_set_ =
true;
100 const geometry_msgs::msg::Pose & pose1,
101 const geometry_msgs::msg::Pose & pose2)
103 double dx = pose1.position.x - pose2.position.x;
104 double dy = pose1.position.y - pose2.position.y;
106 return std::hypot(dx, dy);
109 rcl_interfaces::msg::SetParametersResult
111 const std::vector<rclcpp::Parameter> & parameters)
113 rcl_interfaces::msg::SetParametersResult result;
114 result.successful =
true;
115 for (
const auto & parameter : parameters) {
116 const auto & param_type = parameter.get_type();
117 const auto & param_name = parameter.get_name();
118 if (param_name.find(plugin_name_ +
".") != 0) {
121 if (param_type == ParameterType::PARAMETER_DOUBLE) {
122 if (parameter.as_double() < 0.0) {
124 logger_,
"The value of parameter '%s' is incorrectly set to %f, "
125 "it should be >=0. Ignoring parameter update.",
126 param_name.c_str(), parameter.as_double());
127 result.successful =
false;
136 const std::vector<rclcpp::Parameter> & parameters)
138 std::lock_guard<std::mutex> lock_reinit(mutex_);
139 for (
const auto & parameter : parameters) {
140 const auto & param_type = parameter.get_type();
141 const auto & param_name = parameter.get_name();
142 if (param_name.find(plugin_name_ +
".") != 0) {
145 if (param_type == ParameterType::PARAMETER_DOUBLE) {
146 if (param_name == plugin_name_ +
".required_movement_radius") {
147 radius_ = parameter.as_double();
148 }
else if (param_name == plugin_name_ +
".movement_time_allowance") {
149 time_allowance_ = rclcpp::Duration::from_seconds(parameter.as_double());
This plugin is used to check the position of the robot to make sure that it is actually progressing t...
bool check(geometry_msgs::msg::PoseStamped ¤t_pose) override
Checks if the robot has moved compare to previous.
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...
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.
bool isRobotMovedEnough(const geometry_msgs::msg::Pose &pose)
Calculates robots movement from baseline pose.
void reset() override
Reset the progress checker state.
~SimpleProgressChecker()
Destroy the Simple 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...
This class defines the plugin interface used to check the position of the robot to make sure that it ...