@@ -115,31 +115,77 @@ ParameterHandler::ParameterHandler(
115115 params_.allow_backward = false ;
116116 }
117117
118- dyn_params_handler_ = node->add_on_set_parameters_callback (
119- std::bind (&ParameterHandler::dynamicParametersCallback, this , std::placeholders::_1));
118+ post_set_params_handler_ = node->add_post_set_parameters_callback (
119+ std::bind (
120+ &ParameterHandler::updateParametersCallback,
121+ this , std::placeholders::_1));
122+ on_set_params_handler_ = node->add_on_set_parameters_callback (
123+ std::bind (
124+ &ParameterHandler::validateParameterUpdatesCallback,
125+ this , std::placeholders::_1));
120126}
121127
122128ParameterHandler::~ParameterHandler ()
123129{
124130 auto node = node_.lock ();
125- if (dyn_params_handler_ && node) {
126- node->remove_on_set_parameters_callback (dyn_params_handler_ .get ());
131+ if (post_set_params_handler_ && node) {
132+ node->remove_post_set_parameters_callback (post_set_params_handler_ .get ());
127133 }
128- dyn_params_handler_.reset ();
134+ post_set_params_handler_.reset ();
135+ if (on_set_params_handler_ && node) {
136+ node->remove_on_set_parameters_callback (on_set_params_handler_.get ());
137+ }
138+ on_set_params_handler_.reset ();
129139}
130140
131- rcl_interfaces::msg::SetParametersResult
132- ParameterHandler::dynamicParametersCallback ( std::vector<rclcpp::Parameter> parameters)
141+ rcl_interfaces::msg::SetParametersResult ParameterHandler::validateParameterUpdatesCallback (
142+ std::vector<rclcpp::Parameter> parameters)
133143{
134144 rcl_interfaces::msg::SetParametersResult result;
135- std::lock_guard<std::mutex> lock_reinit (mutex_);
136-
145+ result.successful = true ;
137146 for (auto parameter : parameters) {
138147 const auto & param_type = parameter.get_type ();
139148 const auto & param_name = parameter.get_name ();
140149 if (param_name.find (plugin_name_ + " ." ) != 0 ) {
141150 continue ;
142151 }
152+ if (param_type == ParameterType::PARAMETER_DOUBLE) {
153+ if (parameter.as_double () < 0.0 ) {
154+ RCLCPP_WARN (
155+ logger_, " The value of parameter '%s' is incorrectly set to %f, "
156+ " it should be >=0. Ignoring parameter update." ,
157+ param_name.c_str (), parameter.as_double ());
158+ result.successful = false ;
159+ }
160+ } else if (param_type == ParameterType::PARAMETER_BOOL) {
161+ if (param_name == plugin_name_ + " .allow_backward" ) {
162+ if (params_.initial_rotation && parameter.as_bool ()) {
163+ RCLCPP_WARN (
164+ logger_, " Initial rotation and allow backward parameters are both true, "
165+ " rejecting parameter change." );
166+ result.successful = false ;
167+ }
168+ } else if (param_name == plugin_name_ + " .initial_rotation" ) {
169+ if (parameter.as_bool () && params_.allow_backward ) {
170+ RCLCPP_WARN (
171+ logger_, " Initial rotation and allow backward parameters are both true, "
172+ " rejecting parameter change." );
173+ result.successful = false ;
174+ }
175+ }
176+ }
177+ }
178+ return result;
179+ }
180+ void
181+ ParameterHandler::updateParametersCallback (
182+ std::vector<rclcpp::Parameter> parameters)
183+ {
184+ std::lock_guard<std::mutex> lock_reinit (mutex_);
185+
186+ for (const auto & parameter : parameters) {
187+ const auto & param_type = parameter.get_type ();
188+ const auto & param_name = parameter.get_name ();
143189
144190 if (param_type == ParameterType::PARAMETER_DOUBLE) {
145191 if (param_name == plugin_name_ + " .transform_tolerance" ) {
@@ -177,31 +223,16 @@ ParameterHandler::dynamicParametersCallback(std::vector<rclcpp::Parameter> param
177223 }
178224 } else if (param_type == ParameterType::PARAMETER_BOOL) {
179225 if (param_name == plugin_name_ + " .initial_rotation" ) {
180- if (parameter.as_bool () && params_.allow_backward ) {
181- RCLCPP_WARN (
182- logger_, " Initial rotation and allow backward parameters are both true, "
183- " rejecting parameter change." );
184- continue ;
185- }
186226 params_.initial_rotation = parameter.as_bool ();
187227 } else if (param_name == plugin_name_ + " .prefer_final_rotation" ) {
188228 params_.prefer_final_rotation = parameter.as_bool ();
189229 } else if (param_name == plugin_name_ + " .allow_backward" ) {
190- if (params_.initial_rotation && parameter.as_bool ()) {
191- RCLCPP_WARN (
192- logger_, " Initial rotation and allow backward parameters are both true, "
193- " rejecting parameter change." );
194- continue ;
195- }
196230 params_.allow_backward = parameter.as_bool ();
197231 } else if (param_name == plugin_name_ + " .use_collision_detection" ) {
198232 params_.use_collision_detection = parameter.as_bool ();
199233 }
200234 }
201235 }
202-
203- result.successful = true ;
204- return result;
205236}
206237
207238} // namespace nav2_graceful_controller
0 commit comments