12
12
// See the License for the specific language governing permissions and
13
13
// limitations under the License.
14
14
15
- #include " nav2_controller/plugins/pose_progress_checker.hpp"
16
15
#include < cmath>
17
16
#include < string>
18
17
#include < memory>
19
18
#include < vector>
19
+
20
20
#include " angles/angles.h"
21
21
#include " nav_2d_utils/conversions.hpp"
22
22
#include " geometry_msgs/msg/pose_stamped.hpp"
23
23
#include " geometry_msgs/msg/pose2_d.hpp"
24
24
#include " nav2_util/node_utils.hpp"
25
25
#include " pluginlib/class_list_macros.hpp"
26
+ #include " nav2_controller/plugins/pose_progress_checker.hpp"
27
+ #include " nav2_core/controller_exceptions.hpp"
26
28
27
29
using rcl_interfaces::msg::ParameterType;
28
30
using std::placeholders::_1;
29
31
30
32
namespace nav2_controller
31
33
{
34
+ using nav2_util::declare_parameter_if_not_declared;
35
+ using rcl_interfaces::msg::ParameterType;
36
+
37
+
38
+ PoseProgressChecker::ParameterHandler::ParameterHandler (
39
+ rclcpp_lifecycle::LifecycleNode::SharedPtr node,
40
+ std::string & plugin_name, rclcpp::Logger & logger)
41
+ {
42
+ node_ = node;
43
+ plugin_name_ = plugin_name;
44
+ logger_ = logger;
45
+
46
+ declare_parameter_if_not_declared (node, plugin_name + " .required_movement_angle" ,
47
+ rclcpp::ParameterValue (0.5 ));
48
+ node->get_parameter (plugin_name + " .required_movement_angle" ,
49
+ params_.required_movement_angle );
50
+ on_set_params_handler_ = node->add_on_set_parameters_callback (
51
+ [this ](const auto & params) {
52
+ return this ->validateParameterUpdatesCallback (params);
53
+ });
54
+ post_set_params_handler_ = node->add_post_set_parameters_callback (
55
+ [this ](const auto & params) {
56
+ return this ->updateParametersCallback (params);
57
+ });
58
+ }
59
+ PoseProgressChecker::ParameterHandler::~ParameterHandler () = default ;
60
+
61
+ void PoseProgressChecker::ParameterHandler::updateParametersCallback (
62
+ std::vector<rclcpp::Parameter> parameters)
63
+ {
64
+ for (const auto & param : parameters) {
65
+ const auto & name = param.get_name ();
66
+ const auto & type = param.get_type ();
67
+ if (name == plugin_name_ + " .required_movement_angle" &&
68
+ type == ParameterType::PARAMETER_DOUBLE)
69
+ {
70
+ params_.required_movement_angle = param.as_double ();
71
+ }
72
+ }
73
+ }
74
+ rcl_interfaces::msg::SetParametersResult
75
+ PoseProgressChecker::ParameterHandler::validateParameterUpdatesCallback (
76
+ std::vector<rclcpp::Parameter> parameters)
77
+ {
78
+ rcl_interfaces::msg::SetParametersResult result;
79
+ for (auto parameter : parameters) {
80
+ const auto & type = parameter.get_type ();
81
+ const auto & name = parameter.get_name ();
82
+ {
83
+ if (name.find (plugin_name_ + " ." ) != 0 ) {
84
+ continue ;
85
+ }
86
+ if (name == plugin_name_ + " .required_movement_angle" &&
87
+ type == ParameterType::PARAMETER_DOUBLE &&
88
+ (parameter.as_double () <= 0.0 || parameter.as_double () >= 2 * M_PI))
89
+ {
90
+ result.successful = false ;
91
+ result.reason = " The value required_movement_angle is incorrectly set, "
92
+ " it should be 0 < required_movement_angle < 2PI. Ignoring parameter update." ;
93
+ return result;
94
+ }
95
+ }
96
+ }
97
+ result.successful = true ;
98
+ return result;
99
+ }
32
100
33
101
void PoseProgressChecker::initialize (
34
102
const rclcpp_lifecycle::LifecycleNode::WeakPtr & parent,
35
103
const std::string & plugin_name)
36
104
{
105
+ auto node = parent.lock ();
106
+ if (!node) {
107
+ throw nav2_core::ControllerException (" Unable to lock node!" );
108
+ }
109
+ node_ = parent;
37
110
plugin_name_ = plugin_name;
111
+ logger_ = node->get_logger ();
112
+ param_handler_ = std::make_unique<ParameterHandler>(node, plugin_name_, logger_);
113
+ params_ = param_handler_->getParams ();
38
114
SimpleProgressChecker::initialize (parent, plugin_name);
39
- auto node = parent.lock ();
40
-
41
- nav2_util::declare_parameter_if_not_declared (
42
- node, plugin_name + " .required_movement_angle" , rclcpp::ParameterValue (0.5 ));
43
- node->get_parameter_or (plugin_name + " .required_movement_angle" , required_movement_angle_, 0.5 );
44
-
45
- // Add callback for dynamic parameters
46
- dyn_params_handler_ = node->add_on_set_parameters_callback (
47
- std::bind (&PoseProgressChecker::dynamicParametersCallback, this , _1));
48
115
}
49
116
50
117
bool PoseProgressChecker::check (geometry_msgs::msg::PoseStamped & current_pose)
@@ -64,7 +131,7 @@ bool PoseProgressChecker::check(geometry_msgs::msg::PoseStamped & current_pose)
64
131
bool PoseProgressChecker::isRobotMovedEnough (const geometry_msgs::msg::Pose2D & pose)
65
132
{
66
133
return pose_distance (pose, baseline_pose_) > radius_ ||
67
- poseAngleDistance (pose, baseline_pose_) > required_movement_angle_ ;
134
+ poseAngleDistance (pose, baseline_pose_) > params_-> required_movement_angle ;
68
135
}
69
136
70
137
double PoseProgressChecker::poseAngleDistance (
@@ -74,23 +141,6 @@ double PoseProgressChecker::poseAngleDistance(
74
141
return abs (angles::shortest_angular_distance (pose1.theta , pose2.theta ));
75
142
}
76
143
77
- rcl_interfaces::msg::SetParametersResult
78
- PoseProgressChecker::dynamicParametersCallback (std::vector<rclcpp::Parameter> parameters)
79
- {
80
- rcl_interfaces::msg::SetParametersResult result;
81
- for (auto parameter : parameters) {
82
- const auto & type = parameter.get_type ();
83
- const auto & name = parameter.get_name ();
84
-
85
- if (type == ParameterType::PARAMETER_DOUBLE) {
86
- if (name == plugin_name_ + " .required_movement_angle" ) {
87
- required_movement_angle_ = parameter.as_double ();
88
- }
89
- }
90
- }
91
- result.successful = true ;
92
- return result;
93
- }
94
144
95
145
} // namespace nav2_controller
96
146
0 commit comments