@@ -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 */
174175template <typename ParamType>
175176ParamType 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 */
213226template <typename ParamType, typename NodeT>
214227ParamType 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
0 commit comments