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 using post_callback_t = void ();
46 using pre_callback_t = void ();
58 const rclcpp_lifecycle::LifecycleNode::WeakPtr & parent);
76 std::vector<rclcpp::Parameter> parameters);
113 return ¶meters_change_mutex_;
132 template<
typename SettingT,
typename ParamT>
134 SettingT & setting,
const std::string & name, ParamT default_value,
135 ParameterType param_type = ParameterType::Dynamic);
143 template<
typename ParamT,
typename SettingT,
typename NodeT>
144 void setParam(SettingT & setting,
const std::string & name, NodeT node)
const;
152 static auto as(
const rclcpp::Parameter & parameter);
154 std::mutex parameters_change_mutex_;
155 rclcpp::Logger logger_{rclcpp::get_logger(
"MPPIController")};
156 rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr
157 on_set_param_handler_;
158 rclcpp_lifecycle::LifecycleNode::WeakPtr node_;
159 std::string node_name_;
161 bool verbose_{
false};
163 std::unordered_map<std::string, std::function<get_param_func_t>>
164 get_param_callbacks_;
166 std::vector<std::function<pre_callback_t>> pre_callbacks_;
167 std::vector<std::function<post_callback_t>> post_callbacks_;
173 auto & setting,
const std::string & name,
auto default_value,
174 ParameterType param_type = ParameterType::Dynamic) {
176 setting, ns.empty() ? name : ns +
"." + name,
177 std::move(default_value), param_type);
184 get_param_callbacks_[name] = callback;
190 post_callbacks_.push_back(callback);
196 pre_callbacks_.push_back(callback);
199 template<
typename SettingT,
typename ParamT>
201 SettingT & setting,
const std::string & name,
202 ParamT default_value,
203 ParameterType param_type)
205 auto node = node_.lock();
207 nav2_util::declare_parameter_if_not_declared(
208 node, name, rclcpp::ParameterValue(default_value));
210 setParam<ParamT>(setting, name, node);
212 if (param_type == ParameterType::Dynamic) {
217 template<
typename ParamT,
typename SettingT,
typename NodeT>
219 SettingT & setting,
const std::string & name, NodeT node)
const
222 node->get_parameter(name, param_in);
223 setting =
static_cast<SettingT
>(param_in);
229 if (get_param_callbacks_.find(name) != get_param_callbacks_.end()) {
233 auto callback = [
this, &setting, name](
const rclcpp::Parameter & param) {
234 setting = as<T>(param);
237 RCLCPP_INFO(logger_,
"Dynamic parameter changed: %s", std::to_string(param).c_str());
244 RCLCPP_INFO(logger_,
"Dynamic Parameter added %s", name.c_str());
251 if constexpr (std::is_same_v<T, bool>) {
252 return parameter.as_bool();
253 }
else if constexpr (std::is_integral_v<T>) {
254 return parameter.as_int();
255 }
else if constexpr (std::is_floating_point_v<T>) {
256 return parameter.as_double();
257 }
else if constexpr (std::is_same_v<T, std::string>) {
258 return parameter.as_string();
259 }
else if constexpr (std::is_same_v<T, std::vector<int64_t>>) {
260 return parameter.as_integer_array();
261 }
else if constexpr (std::is_same_v<T, std::vector<double>>) {
262 return parameter.as_double_array();
263 }
else if constexpr (std::is_same_v<T, std::vector<std::string>>) {
264 return parameter.as_string_array();
265 }
else if constexpr (std::is_same_v<T, std::vector<bool>>) {
266 return parameter.as_bool_array();
Handles getting parameters and dynamic parmaeter changes.
rcl_interfaces::msg::SetParametersResult dynamicParamsCallback(std::vector< rclcpp::Parameter > parameters)
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.
void addDynamicParamCallback(const std::string &name, T &&callback)
Set a parameter to a dynamic parameter callback.
auto getParamGetter(const std::string &ns)
Get an object to retreive parameters.
void setParam(SettingT &setting, const std::string &name, NodeT node) const
Set a parameter.
std::mutex * getLock()
Get mutex lock for changing parameters.
void setDynamicParamCallback(T &setting, const std::string &name)
Set a parameter to a dynamic parameter callback.
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.