16 #ifndef NAV2_UTIL__NODE_UTILS_HPP_
17 #define NAV2_UTIL__NODE_UTILS_HPP_
21 #include "rclcpp/rclcpp.hpp"
22 #include "rcl_interfaces/srv/list_parameters.hpp"
23 #include "pluginlib/exceptions.hpp"
38 std::string sanitize_node_name(
const std::string & potential_node_name);
46 std::string add_namespaces(
const std::string & top_ns,
const std::string & sub_ns =
"");
59 std::string generate_internal_node_name(
const std::string & prefix =
"");
71 rclcpp::Node::SharedPtr generate_internal_node(
const std::string & prefix =
"");
82 std::string time_to_string(
size_t len);
84 using ParameterDescriptor = rcl_interfaces::msg::ParameterDescriptor;
95 template<
typename NodeT>
96 void declare_parameter_if_not_declared(
98 const std::string & parameter_name,
99 const rclcpp::ParameterValue & default_value,
100 const ParameterDescriptor & parameter_descriptor = ParameterDescriptor())
102 if (!node->has_parameter(parameter_name)) {
103 node->declare_parameter(parameter_name, default_value, parameter_descriptor);
115 template<
typename NodeT>
116 void declare_parameter_if_not_declared(
118 const std::string & parameter_name,
119 const rclcpp::ParameterType & param_type,
120 const ParameterDescriptor & parameter_descriptor = ParameterDescriptor())
122 if (!node->has_parameter(parameter_name)) {
123 node->declare_parameter(parameter_name, param_type, parameter_descriptor);
139 template<
typename ParameterT,
typename NodeT>
140 ParameterT declare_or_get_parameter(
142 const std::string & parameter_name,
143 const rclcpp::ParameterType & param_type,
144 const ParameterDescriptor & parameter_descriptor = ParameterDescriptor())
146 if (node->has_parameter(parameter_name)) {
147 return node->get_parameter(parameter_name).template get_value<ParameterT>();
149 auto parameter = node->declare_parameter(parameter_name, param_type, parameter_descriptor);
150 if (parameter.get_type() == rclcpp::ParameterType::PARAMETER_NOT_SET) {
151 std::string description =
"Parameter " + parameter_name +
" not in overrides";
152 throw rclcpp::exceptions::InvalidParameterValueException(description.c_str());
154 return parameter.template get<ParameterT>();
157 using NodeParamInterfacePtr = rclcpp::node_interfaces::NodeParametersInterface::SharedPtr;
175 template<
typename ParamType>
176 ParamType declare_or_get_parameter(
177 const rclcpp::Logger & logger, NodeParamInterfacePtr param_interface,
178 const std::string & parameter_name,
const ParamType & default_value,
179 bool warn_if_no_override =
false,
bool strict_param_loading =
false,
180 const ParameterDescriptor & parameter_descriptor = ParameterDescriptor())
182 if (param_interface->has_parameter(parameter_name)) {
183 rclcpp::Parameter param(parameter_name, default_value);
184 param_interface->get_parameter(parameter_name, param);
185 return param.get_value<ParamType>();
188 auto return_value = param_interface
189 ->declare_parameter(parameter_name, rclcpp::ParameterValue{default_value},
190 parameter_descriptor)
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) {
199 "Failed to get param " << parameter_name <<
" from overrides, using default value.");
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());
226 template<
typename ParamType,
typename NodeT>
227 ParamType declare_or_get_parameter(
228 NodeT node,
const std::string & parameter_name,
229 const ParamType & default_value,
230 const ParameterDescriptor & parameter_descriptor = ParameterDescriptor())
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);
238 return declare_or_get_parameter(node->get_logger(), node->get_node_parameters_interface(),
239 parameter_name, default_value, warn_if_no_override, strict_param_loading, parameter_descriptor);
251 template<
typename NodeT>
252 std::string get_plugin_type_param(
254 const std::string & plugin_name)
256 declare_parameter_if_not_declared(node, plugin_name +
".plugin", rclcpp::PARAMETER_STRING);
257 std::string plugin_type;
259 if (!node->get_parameter(plugin_name +
".plugin", plugin_type)) {
261 node->get_logger(),
"Can not get 'plugin' param value for %s", plugin_name.c_str());
262 throw pluginlib::PluginlibException(
"No 'plugin' param for param ns!");
264 }
catch (rclcpp::exceptions::ParameterUninitializedException & ex) {
265 RCLCPP_FATAL(node->get_logger(),
"'plugin' param not defined for %s", plugin_name.c_str());
266 throw pluginlib::PluginlibException(
"No 'plugin' param for param ns!");
277 void setSoftRealTimePriority();