15 #ifndef NAV2_MPPI_CONTROLLER__TOOLS__PARAMETERS_HANDLER_HPP_
16 #define NAV2_MPPI_CONTROLLER__TOOLS__PARAMETERS_HANDLER_HPP_
20 #include <type_traits>
21 #include <unordered_map>
25 #include "nav2_util/node_utils.hpp"
26 #include "rclcpp/rclcpp.hpp"
27 #include "rclcpp/parameter_value.hpp"
28 #include "rclcpp_lifecycle/lifecycle_node.hpp"
35 enum class ParameterType { Dynamic, Static };
44 using get_param_func_t = void (
const rclcpp::Parameter & param,
45 rcl_interfaces::msg::SetParametersResult & result);
46 using post_callback_t = void ();
47 using pre_callback_t = void ();
58 const rclcpp_lifecycle::LifecycleNode::WeakPtr & parent, std::string & name);
76 std::vector<rclcpp::Parameter> parameters);
107 T & setting,
const std::string & name, ParameterType param_type = ParameterType::Dynamic);
115 return ¶meters_change_mutex_;
142 template<
typename SettingT,
typename ParamT>
144 SettingT & setting,
const std::string & name, ParamT default_value,
145 ParameterType param_type = ParameterType::Dynamic);
153 template<
typename ParamT,
typename SettingT,
typename NodeT>
154 void setParam(SettingT & setting,
const std::string & name, NodeT node)
const;
162 static auto as(
const rclcpp::Parameter & parameter);
164 std::mutex parameters_change_mutex_;
165 rclcpp::Logger logger_{rclcpp::get_logger(
"MPPIController")};
166 rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr
167 on_set_param_handler_;
168 rclcpp_lifecycle::LifecycleNode::WeakPtr node_;
169 std::string node_name_;
172 bool verbose_{
false};
174 std::unordered_map<std::string, std::function<get_param_func_t>> get_param_callbacks_;
175 std::unordered_map<std::string, std::function<get_param_func_t>> get_pre_callbacks_;
177 std::vector<std::function<pre_callback_t>> pre_callbacks_;
178 std::vector<std::function<post_callback_t>> post_callbacks_;
184 auto & setting,
const std::string & name,
auto default_value,
185 ParameterType param_type = ParameterType::Dynamic) {
187 setting, ns.empty() ? name : ns +
"." + name,
188 std::move(default_value), param_type);
195 get_param_callbacks_[name] = callback;
201 post_callbacks_.push_back(callback);
207 pre_callbacks_.push_back(callback);
210 template<
typename SettingT,
typename ParamT>
212 SettingT & setting,
const std::string & name,
213 ParamT default_value,
214 ParameterType param_type)
216 auto node = node_.lock();
218 nav2_util::declare_parameter_if_not_declared(
219 node, name, rclcpp::ParameterValue(default_value));
221 setParam<ParamT>(setting, name, node);
225 template<
typename ParamT,
typename SettingT,
typename NodeT>
227 SettingT & setting,
const std::string & name, NodeT node)
const
230 node->get_parameter(name, param_in);
231 setting =
static_cast<SettingT
>(param_in);
236 T & setting,
const std::string & name, ParameterType param_type)
238 if (get_param_callbacks_.find(name) != get_param_callbacks_.end()) {
242 auto dynamic_callback =
243 [
this, &setting, name](
244 const rclcpp::Parameter & param, rcl_interfaces::msg::SetParametersResult & ) {
245 setting = as<T>(param);
247 RCLCPP_INFO(logger_,
"Dynamic parameter changed: %s", std::to_string(param).c_str());
251 auto static_callback =
252 [
this, &setting, name](
253 const rclcpp::Parameter & param, rcl_interfaces::msg::SetParametersResult & result) {
254 std::string reason =
"Rejected change to static parameter: " + std::to_string(param);
255 result.successful =
false;
256 if (!result.reason.empty()) {
257 result.reason +=
"\n";
259 result.reason += reason;
262 if (param_type == ParameterType::Dynamic) {
272 if constexpr (std::is_same_v<T, bool>) {
273 return parameter.as_bool();
274 }
else if constexpr (std::is_integral_v<T>) {
275 return parameter.as_int();
276 }
else if constexpr (std::is_floating_point_v<T>) {
277 return parameter.as_double();
278 }
else if constexpr (std::is_same_v<T, std::string>) {
279 return parameter.as_string();
280 }
else if constexpr (std::is_same_v<T, std::vector<int64_t>>) {
281 return parameter.as_integer_array();
282 }
else if constexpr (std::is_same_v<T, std::vector<double>>) {
283 return parameter.as_double_array();
284 }
else if constexpr (std::is_same_v<T, std::vector<std::string>>) {
285 return parameter.as_string_array();
286 }
else if constexpr (std::is_same_v<T, std::vector<bool>>) {
287 return parameter.as_bool_array();
Handles getting parameters and dynamic parameter changes.
rcl_interfaces::msg::SetParametersResult dynamicParamsCallback(std::vector< rclcpp::Parameter > parameters)
Dynamic parameter callback.
void setParamCallback(T &setting, const std::string &name, ParameterType param_type=ParameterType::Dynamic)
Set a parameter to a dynamic parameter callback.
void addPreCallback(T &&callback)
Set a callback to process before parameter changes.
void getParam(SettingT &setting, const std::string &name, ParamT default_value, ParameterType param_type=ParameterType::Dynamic)
Gets parameter.
void addPostCallback(T &&callback)
Set a callback to process after parameter changes.
auto getParamGetter(const std::string &ns)
Get an object to retrieve parameters.
void setParam(SettingT &setting, const std::string &name, NodeT node) const
Set a parameter.
std::mutex * getLock()
Get mutex lock for changing parameters.
static auto as(const rclcpp::Parameter ¶meter)
Converts parameter type to real types.
void start()
Starts processing dynamic parameter changes.
ParametersHandler()=default
Constructor for mppi::ParametersHandler.
~ParametersHandler()
Destructor for mppi::ParametersHandler.
void addParamCallback(const std::string &name, T &&callback)
register a function to be called when setting a parameter