15 #include "nav2_controller/plugins/simple_progress_checker.hpp"
20 #include "nav_2d_utils/conversions.hpp"
21 #include "geometry_msgs/msg/pose_stamped.hpp"
22 #include "geometry_msgs/msg/pose2_d.hpp"
23 #include "nav2_util/node_utils.hpp"
24 #include "pluginlib/class_list_macros.hpp"
26 using rcl_interfaces::msg::ParameterType;
27 using std::placeholders::_1;
29 namespace nav2_controller
32 const rclcpp_lifecycle::LifecycleNode::WeakPtr & parent,
33 const std::string & plugin_name)
35 plugin_name_ = plugin_name;
36 auto node = parent.lock();
38 clock_ = node->get_clock();
40 nav2_util::declare_parameter_if_not_declared(
41 node, plugin_name +
".required_movement_radius", rclcpp::ParameterValue(0.5));
42 nav2_util::declare_parameter_if_not_declared(
43 node, plugin_name +
".movement_time_allowance", rclcpp::ParameterValue(10.0));
45 node->get_parameter_or(plugin_name +
".required_movement_radius", radius_, 0.5);
46 double time_allowance_param = 0.0;
47 node->get_parameter_or(plugin_name +
".movement_time_allowance", time_allowance_param, 10.0);
48 time_allowance_ = rclcpp::Duration::from_seconds(time_allowance_param);
51 dyn_params_handler_ = node->add_on_set_parameters_callback(
59 geometry_msgs::msg::Pose2D current_pose2d;
60 current_pose2d = nav_2d_utils::poseToPose2D(current_pose.pose);
66 return !((clock_->now() - baseline_time_) > time_allowance_);
71 baseline_pose_set_ =
false;
76 baseline_pose_ = pose;
77 baseline_time_ = clock_->now();
78 baseline_pose_set_ =
true;
83 return pose_distance(pose, baseline_pose_) > radius_;
86 double SimpleProgressChecker::pose_distance(
87 const geometry_msgs::msg::Pose2D & pose1,
88 const geometry_msgs::msg::Pose2D & pose2)
90 double dx = pose1.x - pose2.x;
91 double dy = pose1.y - pose2.y;
93 return std::hypot(dx, dy);
96 rcl_interfaces::msg::SetParametersResult
99 rcl_interfaces::msg::SetParametersResult result;
100 for (
auto parameter : parameters) {
101 const auto & param_type = parameter.get_type();
102 const auto & param_name = parameter.get_name();
103 if (param_name.find(plugin_name_ +
".") != 0) {
107 if (param_type == ParameterType::PARAMETER_DOUBLE) {
108 if (param_name == plugin_name_ +
".required_movement_radius") {
109 radius_ = parameter.as_double();
110 }
else if (param_name == plugin_name_ +
".movement_time_allowance") {
111 time_allowance_ = rclcpp::Duration::from_seconds(parameter.as_double());
115 result.successful =
true;
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 pose.
rcl_interfaces::msg::SetParametersResult dynamicParametersCallback(std::vector< rclcpp::Parameter > parameters)
Callback executed when a parameter change is detected.
void reset() override
Reset class state upon calling.
void resetBaselinePose(const geometry_msgs::msg::Pose2D &pose)
Resets baseline pose with the current pose of the robot.
void initialize(const rclcpp_lifecycle::LifecycleNode::WeakPtr &parent, const std::string &plugin_name) override
Initialize parameters for ProgressChecker.
bool isRobotMovedEnough(const geometry_msgs::msg::Pose2D &pose)
Calculates robots movement from baseline pose.
This class defines the plugin interface used to check the position of the robot to make sure that it ...