Skip to content

Commit baae2fd

Browse files
committed
mppi parameters_handler: Improve verbose handling (#4704)
The "verbose" parameter of the parameters_handler is a special case that needs registration before the dynamic parameter handler callback is registered. In verbose mode make the parameter handler info/warn/debug messages more expressive.
1 parent 4e62a89 commit baae2fd

File tree

3 files changed

+66
-7
lines changed

3 files changed

+66
-7
lines changed

‎nav2_mppi_controller/include/nav2_mppi_controller/tools/parameters_handler.hpp‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,16 @@ void ParametersHandler::getParam(
210210
setParam<ParamT>(setting, name, node);
211211

212212
if (param_type == ParameterType::Dynamic) {
213+
if (verbose_) {
214+
RCLCPP_INFO(node->get_logger(), "setDynamicParamCallback for %s", name.c_str());
215+
}
213216
setDynamicParamCallback(setting, name);
217+
} else {
218+
if (verbose_) {
219+
RCLCPP_DEBUG(
220+
node->get_logger(), "ParameterType::Static therefore no setDynamicParamCallback for %s",
221+
name.c_str());
222+
}
214223
}
215224
}
216225

‎nav2_mppi_controller/src/parameters_handler.cpp‎

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,15 @@ ParametersHandler::~ParametersHandler()
3838
void ParametersHandler::start()
3939
{
4040
auto node = node_.lock();
41+
42+
// Register the special case "verbose" parameter before registering dynamicParamsCallback
43+
auto get_param = getParamGetter(node_name_);
44+
get_param(verbose_, "verbose", false);
45+
4146
on_set_param_handler_ = node->add_on_set_parameters_callback(
4247
std::bind(
4348
&ParametersHandler::dynamicParamsCallback, this,
4449
std::placeholders::_1));
45-
46-
auto get_param = getParamGetter(node_name_);
47-
get_param(verbose_, "verbose", false);
4850
}
4951

5052
rcl_interfaces::msg::SetParametersResult
@@ -53,6 +55,7 @@ ParametersHandler::dynamicParamsCallback(
5355
{
5456
rcl_interfaces::msg::SetParametersResult result;
5557
std::lock_guard<std::mutex> lock(parameters_change_mutex_);
58+
bool success;
5659

5760
for (auto & pre_cb : pre_callbacks_) {
5861
pre_cb();
@@ -66,15 +69,21 @@ ParametersHandler::dynamicParamsCallback(
6669
{
6770
callback->second(param);
6871
} else {
69-
RCLCPP_WARN(logger_, "Parameter %s not found", param_name.c_str());
72+
if (verbose_) {
73+
// Expected if static parameter, ie one with no registered callback is attempted
74+
// to be changed
75+
RCLCPP_WARN(logger_, "Parameter callback func for '%s' not found", param_name.c_str());
76+
}
77+
// success = true; // Decision ??? Still return true to avoid exception ???
78+
success = false;
7079
}
7180
}
7281

7382
for (auto & post_cb : post_callbacks_) {
7483
post_cb();
7584
}
7685

77-
result.successful = true;
86+
result.successful = success;
7887
return result;
7988
}
8089

‎nav2_mppi_controller/test/parameter_handler_test.cpp‎

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,49 @@ TEST(ParameterHandlerTest, DynamicAndStaticParametersTest)
168168
node->get_node_services_interface());
169169

170170
auto results = rec_param->set_parameters_atomically(
171-
{rclcpp::Parameter("dynamic_int", 10),
172-
rclcpp::Parameter("static_int", 10)});
171+
{
172+
rclcpp::Parameter("my_node.verbose", true),
173+
rclcpp::Parameter("dynamic_int", 10),
174+
rclcpp::Parameter("static_int", 10)
175+
});
176+
177+
rclcpp::spin_until_future_complete(
178+
node->get_node_base_interface(),
179+
results);
180+
181+
// Now, only param1 should change, param 2 should be the same
182+
EXPECT_EQ(p1, 10);
183+
EXPECT_EQ(p2, 7);
184+
}
185+
186+
TEST(ParameterHandlerTest, DynamicAndStaticParametersNotVerboseTest)
187+
{
188+
auto node = std::make_shared<rclcpp_lifecycle::LifecycleNode>("my_node");
189+
node->declare_parameter("dynamic_int", rclcpp::ParameterValue(7));
190+
node->declare_parameter("static_int", rclcpp::ParameterValue(7));
191+
ParametersHandlerWrapper handler(node);
192+
handler.start();
193+
194+
// Get parameters and check they have initial values
195+
auto getParamer = handler.getParamGetter("");
196+
int p1 = 0, p2 = 0;
197+
getParamer(p1, "dynamic_int", 0, ParameterType::Dynamic);
198+
getParamer(p2, "static_int", 0, ParameterType::Static);
199+
EXPECT_EQ(p1, 7);
200+
EXPECT_EQ(p2, 7);
201+
202+
// Now change them both via dynamic parameters
203+
auto rec_param = std::make_shared<rclcpp::AsyncParametersClient>(
204+
node->get_node_base_interface(), node->get_node_topics_interface(),
205+
node->get_node_graph_interface(),
206+
node->get_node_services_interface());
207+
208+
auto results = rec_param->set_parameters_atomically(
209+
{
210+
// Don't set default param rclcpp::Parameter("my_node.verbose", false),
211+
rclcpp::Parameter("dynamic_int", 10),
212+
rclcpp::Parameter("static_int", 10)
213+
});
173214

174215
rclcpp::spin_until_future_complete(
175216
node->get_node_base_interface(),

0 commit comments

Comments
 (0)