Skip to content

Commit 7b5e7e0

Browse files
Adding parameter warn_when_defaulting_parameters to control default parameter warnings (#5189)
* Adding a parameter warn_when_defaulting_parameters to control default parameter warnings instead of using a flag Signed-off-by: Marco Bassa <marco.bassa@idealworks.com> * Adding parameter strict_param_loading for optionally throwing an exception if parameter overrides are missing Signed-off-by: Marco Bassa <marco.bassa@idealworks.com> * Using default false declaration instead of declare_or_get in param util Signed-off-by: Marco Bassa <marco.bassa@idealworks.com> --------- Signed-off-by: Marco Bassa <marco.bassa@idealworks.com>
1 parent 97df8b9 commit 7b5e7e0

File tree

2 files changed

+54
-19
lines changed

2 files changed

+54
-19
lines changed

‎nav2_util/include/nav2_util/node_utils.hpp‎

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -161,63 +161,82 @@ using NodeParamInterfacePtr = rclcpp::node_interfaces::NodeParametersInterface::
161161
/**
162162
* If the parameter is already declared, returns its value,
163163
* otherwise declares it and returns the default value.
164-
* The method will by default print a warning when the override is missing.
164+
* The method can optionally print a warning or throw when the override is missing.
165165
*
166166
* \param[in] logger Node logging interface
167167
* \param[in] param_interface Node parameter interface
168168
* \param[in] parameter_name Name of the parameter
169169
* \param[in] default_value Default value of the parameter
170170
* \param[in] warn_if_no_override If true, prints a warning whenever the parameter override is missing
171+
* \param[in] strict_param_loading If true, throws an InvalidParameterValueException if the parameter override is missing
171172
* \param[in] parameter_descriptor Optional parameter descriptor
172173
* \return The value of the param from the override if existent, otherwise the default value
173174
*/
174175
template<typename ParamType>
175176
ParamType declare_or_get_parameter(
176177
const rclcpp::Logger & logger, NodeParamInterfacePtr param_interface,
177178
const std::string & parameter_name, const ParamType & default_value,
178-
bool warn_if_no_override = false,
179+
bool warn_if_no_override = false, bool strict_param_loading = false,
179180
const ParameterDescriptor & parameter_descriptor = ParameterDescriptor())
180181
{
181182
if (param_interface->has_parameter(parameter_name)) {
182183
rclcpp::Parameter param(parameter_name, default_value);
183184
param_interface->get_parameter(parameter_name, param);
184185
return param.get_value<ParamType>();
185186
}
186-
if (warn_if_no_override && param_interface->get_parameter_overrides().find(parameter_name) ==
187-
param_interface->get_parameter_overrides().end())
188-
{
189-
RCLCPP_WARN_STREAM(
190-
logger,
191-
"Failed to get param " << parameter_name << " from overrides, using default value.");
192-
}
193-
return param_interface
194-
->declare_parameter(parameter_name, rclcpp::ParameterValue{default_value},
187+
188+
auto return_value = param_interface
189+
->declare_parameter(parameter_name, rclcpp::ParameterValue{default_value},
195190
parameter_descriptor)
196-
.get<ParamType>();
191+
.get<ParamType>();
192+
193+
const bool no_param_override = param_interface->get_parameter_overrides().find(parameter_name) ==
194+
param_interface->get_parameter_overrides().end();
195+
if (no_param_override) {
196+
if (warn_if_no_override) {
197+
RCLCPP_WARN_STREAM(
198+
logger,
199+
"Failed to get param " << parameter_name << " from overrides, using default value.");
200+
}
201+
if (strict_param_loading) {
202+
std::string description = "Parameter " + parameter_name +
203+
" not in overrides and strict_param_loading is True";
204+
throw rclcpp::exceptions::InvalidParameterValueException(description.c_str());
205+
}
206+
}
207+
208+
return return_value;
197209
}
198210

199211
/// If the parameter is already declared, returns its value,
200212
/// otherwise declares it and returns the default value
201213
/**
202214
* If the parameter is already declared, returns its value,
203215
* otherwise declares it and returns the default value.
204-
* The method will by default print a warning when the override is missing.
216+
* The method can be configured to print a warn message or throw an InvalidParameterValueException
217+
* when the override is missing by enabling the parameters warn_on_missing_params
218+
* or strict_param_loading respectively.
205219
*
206220
* \param[in] node Pointer to a node object
207221
* \param[in] parameter_name Name of the parameter
208222
* \param[in] default_value Default value of the parameter
209-
* \param[in] warn_if_no_override If true, prints a warning whenever the parameter override is missing
210223
* \param[in] parameter_descriptor Optional parameter descriptor
211224
* \return The value of the param from the override if existent, otherwise the default value
212225
*/
213226
template<typename ParamType, typename NodeT>
214227
ParamType declare_or_get_parameter(
215228
NodeT node, const std::string & parameter_name,
216-
const ParamType & default_value, bool warn_if_no_override = false,
229+
const ParamType & default_value,
217230
const ParameterDescriptor & parameter_descriptor = ParameterDescriptor())
218231
{
232+
declare_parameter_if_not_declared(node, "warn_on_missing_params", rclcpp::ParameterValue(false));
233+
bool warn_if_no_override{false};
234+
node->get_parameter("warn_on_missing_params", warn_if_no_override);
235+
declare_parameter_if_not_declared(node, "strict_param_loading", rclcpp::ParameterValue(false));
236+
bool strict_param_loading{false};
237+
node->get_parameter("strict_param_loading", strict_param_loading);
219238
return declare_or_get_parameter(node->get_logger(), node->get_node_parameters_interface(),
220-
parameter_name, default_value, warn_if_no_override, parameter_descriptor);
239+
parameter_name, default_value, warn_if_no_override, strict_param_loading, parameter_descriptor);
221240
}
222241

223242
/// Gets the type of plugin for the selected node and its plugin

‎nav2_util/test/test_node_utils.cpp‎

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,19 +85,35 @@ TEST(DeclareOrGetParam, DeclareOrGetParam)
8585

8686
// test declared parameter
8787
node->declare_parameter("foobar", "foo");
88-
std::string param = declare_or_get_parameter(node, "foobar", std::string{"bar"}, true);
88+
std::string param = declare_or_get_parameter(node, "foobar", std::string{"bar"});
8989
EXPECT_EQ(param, "foo");
9090
node->get_parameter("foobar", param);
9191
EXPECT_EQ(param, "foo");
92+
9293
// test undeclared parameter
93-
int int_param = declare_or_get_parameter(node, "waldo", 3, true);
94+
node->set_parameter(rclcpp::Parameter("warn_on_missing_params", true));
95+
int int_param = declare_or_get_parameter(node, "waldo", 3);
9496
EXPECT_EQ(int_param, 3);
97+
98+
// test unknown parameter with strict_param_loading enabled
99+
bool got_exception{false};
100+
node->set_parameter(rclcpp::Parameter("strict_param_loading", true));
101+
try {
102+
declare_or_get_parameter(node, "burpy", true);
103+
} catch (const rclcpp::exceptions::InvalidParameterValueException & exc) {
104+
got_exception = true;
105+
}
106+
EXPECT_TRUE(got_exception);
107+
// The parameter is anyway declared with the default val and subsequent calls won't fail
108+
EXPECT_TRUE(declare_or_get_parameter(node, "burpy", true));
109+
95110
// test declaration by type of existing param
96111
int_param = declare_or_get_parameter<int>(node, "waldo",
97112
rclcpp::ParameterType::PARAMETER_INTEGER);
98113
EXPECT_EQ(int_param, 3);
114+
99115
// test declaration by type of non existing param
100-
bool got_exception{false};
116+
got_exception = false;
101117
try {
102118
int_param = declare_or_get_parameter<int>(node, "wololo",
103119
rclcpp::ParameterType::PARAMETER_INTEGER);

0 commit comments

Comments
 (0)