Skip to content
7 changes: 7 additions & 0 deletions nav2_amcl/src/amcl_node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1021,6 +1021,13 @@ rcl_interfaces::msg::SetParametersResult AmclNode::validateParameterUpdatesCallb
param_name.c_str(), parameter.as_double());
result.successful = false;
}
if (parameter.as_double() <= 0.0 && param_name == "save_pose_rate") {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should also move this to the first condition, and make the second condition elif

RCLCPP_WARN(
get_logger(), "The value of parameter '%s' is incorrectly set to %f, "
"it should be >0. Ignoring parameter update.",
param_name.c_str(), parameter.as_double());
result.successful = false;
}
} else if (param_type == ParameterType::PARAMETER_INTEGER) {
if (parameter.as_int() <= 0.0 && param_name == "resample_interval") {
RCLCPP_WARN(
Expand Down
12 changes: 12 additions & 0 deletions nav2_amcl/test/test_dynamic_parameters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,18 @@ TEST(WPTest, test_dynamic_parameters)
results = rec_param->set_parameters_atomically({rclcpp::Parameter("min_particles", 2000)});
rclcpp::spin_until_future_complete(amcl->get_node_base_interface(), results);
EXPECT_EQ(amcl->get_parameter("min_particles").as_int(), 100);

// Test zero save_pose_rate rejection
results = rec_param->set_parameters_atomically({rclcpp::Parameter("save_pose_rate", 0.0)});
rclcpp::spin_until_future_complete(amcl->get_node_base_interface(), results);
EXPECT_FALSE(results.get().successful);
EXPECT_EQ(amcl->get_parameter("save_pose_rate").as_double(), 2.0);

// Test negative save_pose_rate rejection
results = rec_param->set_parameters_atomically({rclcpp::Parameter("save_pose_rate", -1.0)});
rclcpp::spin_until_future_complete(amcl->get_node_base_interface(), results);
EXPECT_FALSE(results.get().successful);
EXPECT_EQ(amcl->get_parameter("save_pose_rate").as_double(), 2.0);
}

int main(int argc, char ** argv)
Expand Down
12 changes: 11 additions & 1 deletion nav2_velocity_smoother/src/velocity_smoother.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -503,7 +503,17 @@ VelocitySmoother::dynamicParametersCallback(std::vector<rclcpp::Parameter> param

if (param_type == ParameterType::PARAMETER_DOUBLE) {
if (param_name == "smoothing_frequency") {
smoothing_frequency_ = parameter.as_double();
double smoothing_frequency = parameter.as_double();
if (smoothing_frequency <= 0.0) {
RCLCPP_WARN(
get_logger(),
"smoothing_frequency must be positive, received: %f. Ignoring update.",
smoothing_frequency);
result.successful = false;
result.reason = "smoothing_frequency must be greater than 0.0";
break;
}
smoothing_frequency_ = smoothing_frequency;
if (timer_) {
timer_->cancel();
timer_.reset();
Expand Down
12 changes: 12 additions & 0 deletions nav2_velocity_smoother/test/test_velocity_smoother.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -809,6 +809,18 @@ TEST(VelocitySmootherTest, testDynamicParameter)
rclcpp::spin_until_future_complete(smoother->get_node_base_interface(), results);
EXPECT_FALSE(results.get().successful);

// Test zero smoothing_frequency_ rejection
results = rec_param->set_parameters_atomically(
{rclcpp::Parameter("smoothing_frequency_", 0.0)});
rclcpp::spin_until_future_complete(smoother->get_node_base_interface(), results);
EXPECT_FALSE(results.get().successful);

// Test negative smoothing_frequency_ rejection
results = rec_param->set_parameters_atomically(
{rclcpp::Parameter("smoothing_frequency_", -1.0)});
rclcpp::spin_until_future_complete(smoother->get_node_base_interface(), results);
EXPECT_FALSE(results.get().successful);

// test full state after major changes
smoother->deactivate(state);
smoother->cleanup(state);
Expand Down
Loading