1212// See the License for the specific language governing permissions and
1313// limitations under the License.
1414
15- #include " nav2_controller/plugins/pose_progress_checker.hpp"
1615#include < cmath>
1716#include < string>
1817#include < memory>
1918#include < vector>
19+
2020#include " angles/angles.h"
2121#include " nav_2d_utils/conversions.hpp"
2222#include " geometry_msgs/msg/pose_stamped.hpp"
2323#include " geometry_msgs/msg/pose2_d.hpp"
2424#include " nav2_util/node_utils.hpp"
2525#include " pluginlib/class_list_macros.hpp"
26+ #include " nav2_controller/plugins/pose_progress_checker.hpp"
27+ #include " nav2_core/controller_exceptions.hpp"
2628
2729using rcl_interfaces::msg::ParameterType;
2830using std::placeholders::_1;
2931
3032namespace nav2_controller
3133{
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+ }
32100
33101void PoseProgressChecker::initialize (
34102 const rclcpp_lifecycle::LifecycleNode::WeakPtr & parent,
35103 const std::string & plugin_name)
36104{
105+ auto node = parent.lock ();
106+ if (!node) {
107+ throw nav2_core::ControllerException (" Unable to lock node!" );
108+ }
109+ node_ = parent;
37110 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 ();
38114 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));
48115}
49116
50117bool PoseProgressChecker::check (geometry_msgs::msg::PoseStamped & current_pose)
@@ -64,7 +131,7 @@ bool PoseProgressChecker::check(geometry_msgs::msg::PoseStamped & current_pose)
64131bool PoseProgressChecker::isRobotMovedEnough (const geometry_msgs::msg::Pose2D & pose)
65132{
66133 return pose_distance (pose, baseline_pose_) > radius_ ||
67- poseAngleDistance (pose, baseline_pose_) > required_movement_angle_ ;
134+ poseAngleDistance (pose, baseline_pose_) > params_-> required_movement_angle ;
68135}
69136
70137double PoseProgressChecker::poseAngleDistance (
@@ -74,23 +141,6 @@ double PoseProgressChecker::poseAngleDistance(
74141 return abs (angles::shortest_angular_distance (pose1.theta , pose2.theta ));
75142}
76143
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- }
94144
95145} // namespace nav2_controller
96146
0 commit comments