40 #include "nav2_controller/plugins/stopped_goal_checker.hpp"
41 #include "pluginlib/class_list_macros.hpp"
42 #include "nav2_ros_common/node_utils.hpp"
47 using rcl_interfaces::msg::ParameterType;
48 using std::placeholders::_1;
50 namespace nav2_controller
60 auto node = node_.lock();
61 if (post_set_params_handler_ && node) {
62 node->remove_post_set_parameters_callback(post_set_params_handler_.get());
64 post_set_params_handler_.reset();
65 if (on_set_params_handler_ && node) {
66 node->remove_on_set_parameters_callback(on_set_params_handler_.get());
68 on_set_params_handler_.reset();
72 const nav2::LifecycleNode::WeakPtr & parent,
73 const std::string & plugin_name,
74 const std::shared_ptr<nav2_costmap_2d::Costmap2DROS> costmap_ros)
76 plugin_name_ = plugin_name;
80 auto node = node_.lock();
81 logger_ = node->get_logger();
83 rot_stopped_velocity_ = node->declare_or_get_parameter(
84 plugin_name +
".rot_stopped_velocity", 0.25);
85 trans_stopped_velocity_ = node->declare_or_get_parameter(
86 plugin_name +
".trans_stopped_velocity", 0.25);
89 post_set_params_handler_ = node->add_post_set_parameters_callback(
92 this, std::placeholders::_1));
93 on_set_params_handler_ = node->add_on_set_parameters_callback(
96 this, std::placeholders::_1));
100 const geometry_msgs::msg::Pose & query_pose,
const geometry_msgs::msg::Pose & goal_pose,
101 const geometry_msgs::msg::Twist & velocity,
const nav_msgs::msg::Path & transformed_global_plan)
103 std::lock_guard<std::mutex> lock_reinit(mutex_);
105 transformed_global_plan);
110 return fabs(velocity.angular.z) <= rot_stopped_velocity_ &&
111 hypot(velocity.linear.x, velocity.linear.y) <= trans_stopped_velocity_;
115 const geometry_msgs::msg::Pose & query_pose,
const geometry_msgs::msg::Pose & goal_pose,
116 const geometry_msgs::msg::Twist & velocity,
const nav_msgs::msg::Path & transformed_global_plan)
119 transformed_global_plan);
123 geometry_msgs::msg::Pose & pose_tolerance,
124 geometry_msgs::msg::Twist & vel_tolerance,
125 double & path_length_tolerance)
127 std::lock_guard<std::mutex> lock_reinit(mutex_);
128 double invalid_field = std::numeric_limits<double>::lowest();
134 vel_tolerance.linear.x = trans_stopped_velocity_;
135 vel_tolerance.linear.y = trans_stopped_velocity_;
136 vel_tolerance.linear.z = invalid_field;
138 vel_tolerance.angular.x = invalid_field;
139 vel_tolerance.angular.y = invalid_field;
140 vel_tolerance.angular.z = rot_stopped_velocity_;
142 path_length_tolerance = path_length_tolerance_;
147 rcl_interfaces::msg::SetParametersResult
149 const std::vector<rclcpp::Parameter> & parameters)
151 rcl_interfaces::msg::SetParametersResult result;
152 result.successful =
true;
153 for (
const auto & parameter : parameters) {
154 const auto & param_type = parameter.get_type();
155 const auto & param_name = parameter.get_name();
156 if (param_name.find(plugin_name_ +
".") != 0) {
159 if (param_type == ParameterType::PARAMETER_DOUBLE) {
160 if (parameter.as_double() < 0.0) {
162 logger_,
"The value of parameter '%s' is incorrectly set to %f, "
163 "it should be >=0. Ignoring parameter update.",
164 param_name.c_str(), parameter.as_double());
165 result.successful =
false;
174 const std::vector<rclcpp::Parameter> & parameters)
176 std::lock_guard<std::mutex> lock_reinit(mutex_);
177 rcl_interfaces::msg::SetParametersResult result;
178 for (
const auto & parameter : parameters) {
179 const auto & param_type = parameter.get_type();
180 const auto & param_name = parameter.get_name();
181 if (param_name.find(plugin_name_ +
".") != 0) {
185 if (param_type == ParameterType::PARAMETER_DOUBLE) {
186 if (param_name == plugin_name_ +
".rot_stopped_velocity") {
187 rot_stopped_velocity_ = parameter.as_double();
188 }
else if (param_name == plugin_name_ +
".trans_stopped_velocity") {
189 trans_stopped_velocity_ = parameter.as_double();
Goal Checker plugin that only checks the position difference.
bool getTolerances(geometry_msgs::msg::Pose &pose_tolerance, geometry_msgs::msg::Twist &vel_tolerance, double &path_length_tolerance) override
Get the position and velocity tolerances.
bool isGoalReached(const geometry_msgs::msg::Pose &query_pose, const geometry_msgs::msg::Pose &goal_pose, const geometry_msgs::msg::Twist &velocity, const nav_msgs::msg::Path &transformed_global_plan) override
Check if the goal is reached.
bool isGoalXYReached(const geometry_msgs::msg::Pose &query_pose, const geometry_msgs::msg::Pose &goal_pose, const geometry_msgs::msg::Twist &velocity, const nav_msgs::msg::Path &transformed_global_plan) override
Check if XY goal position has been reached (without considering yaw)
void initialize(const nav2::LifecycleNode::WeakPtr &parent, const std::string &plugin_name, const std::shared_ptr< nav2_costmap_2d::Costmap2DROS > costmap_ros) override
Initialize the goal checker.
Goal Checker plugin that checks the position difference and velocity.
bool isGoalReached(const geometry_msgs::msg::Pose &query_pose, const geometry_msgs::msg::Pose &goal_pose, const geometry_msgs::msg::Twist &velocity, const nav_msgs::msg::Path &transformed_global_plan) override
Check if the goal is reached.
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 getTolerances(geometry_msgs::msg::Pose &pose_tolerance, geometry_msgs::msg::Twist &vel_tolerance, double &path_length_tolerance) override
Get the position and velocity tolerances.
bool isGoalXYReached(const geometry_msgs::msg::Pose &query_pose, const geometry_msgs::msg::Pose &goal_pose, const geometry_msgs::msg::Twist &velocity, const nav_msgs::msg::Path &transformed_global_plan) override
Check if XY goal position has been reached (without considering yaw)
StoppedGoalChecker()
Construct a new Stopped Goal 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, const std::shared_ptr< nav2_costmap_2d::Costmap2DROS > costmap_ros) override
Initialize the goal checker.
~StoppedGoalChecker()
Destroy the Stopped Goal Checker object.
Function-object for checking whether a goal has been reached.