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_ros_common/lifecycle_node.hpp"
26 #include "nav2_ros_common/node_utils.hpp"
27 #include "rclcpp/logger.hpp"
28 #include "rclcpp/logging.hpp"
29 #include "rclcpp/node_interfaces/node_parameters_interface.hpp"
30 #include "rclcpp/parameter.hpp"
31 #include "rclcpp/parameter_value.hpp"
32 #include "rclcpp_lifecycle/lifecycle_node.hpp"
39 enum class ParameterType { Dynamic, Static };
48 using get_param_func_t = void (
const rclcpp::Parameter & param,
49 rcl_interfaces::msg::SetParametersResult & result);
50 using post_callback_t = void ();
51 using pre_callback_t = void ();
62 const nav2::LifecycleNode::WeakPtr & parent, std::string & name);
83 const std::vector<rclcpp::Parameter> & parameters);
122 T & setting,
const std::string & name, ParameterType param_type = ParameterType::Dynamic);
130 return ¶meters_change_mutex_;
157 template<
typename SettingT,
typename ParamT>
159 SettingT & setting,
const std::string & name, ParamT default_value,
160 ParameterType param_type = ParameterType::Dynamic);
168 template<
typename ParamT,
typename SettingT>
171 const std::string & name,
172 nav2::LifecycleNode::SharedPtr node)
const;
180 static auto as(
const rclcpp::Parameter & parameter);
182 std::mutex parameters_change_mutex_;
183 rclcpp::Logger logger_{rclcpp::get_logger(
"MPPIController")};
184 rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr
185 on_set_param_handler_;
186 rclcpp::node_interfaces::PostSetParametersCallbackHandle::SharedPtr
187 post_set_param_handler_;
188 nav2::LifecycleNode::WeakPtr node_;
189 std::string node_name_;
192 bool verbose_{
false};
194 std::unordered_map<std::string,
195 std::function<void(
const rclcpp::Parameter &)>> get_param_callbacks_;
196 std::unordered_map<std::string, std::function<get_param_func_t>> get_pre_callbacks_;
198 std::vector<std::function<post_callback_t>> post_callbacks_;
204 auto & setting,
const std::string & name,
auto default_value,
205 ParameterType param_type = ParameterType::Dynamic) {
207 setting, ns.empty() ? name : ns +
"." + name,
208 std::move(default_value), param_type);
215 get_param_callbacks_[name] = callback;
221 post_callbacks_.push_back(callback);
227 get_pre_callbacks_[name] = callback;
230 template<
typename SettingT,
typename ParamT>
232 SettingT & setting,
const std::string & name,
233 ParamT default_value,
234 ParameterType param_type)
236 auto node = node_.lock();
238 nav2::declare_parameter_if_not_declared(
239 node, name, rclcpp::ParameterValue(default_value));
241 setParam<ParamT>(setting, name, node);
245 template<
typename ParamT,
typename SettingT>
247 SettingT & setting,
const std::string & name, nav2::LifecycleNode::SharedPtr node)
const
250 node->get_parameter(name, param_in);
251 setting =
static_cast<SettingT
>(param_in);
256 T & setting,
const std::string & name, ParameterType param_type)
258 if (get_param_callbacks_.find(name) != get_param_callbacks_.end()) {
262 auto dynamic_callback =
263 [
this, &setting, name](
264 const rclcpp::Parameter & param) {
265 setting = as<T>(param);
267 RCLCPP_INFO(logger_,
"Dynamic parameter changed: %s", std::to_string(param).c_str());
271 auto static_callback =
273 const rclcpp::Parameter & param, rcl_interfaces::msg::SetParametersResult & result) {
274 std::string reason =
"Rejected change to static parameter: " + std::to_string(param);
275 result.successful =
false;
276 if (!result.reason.empty()) {
277 result.reason +=
"\n";
279 result.reason += reason;
282 if (param_type == ParameterType::Dynamic) {
292 if constexpr (std::is_same_v<T, bool>) {
293 return parameter.as_bool();
294 }
else if constexpr (std::is_integral_v<T>) {
295 return parameter.as_int();
296 }
else if constexpr (std::is_floating_point_v<T>) {
297 return parameter.as_double();
298 }
else if constexpr (std::is_same_v<T, std::string>) {
299 return parameter.as_string();
300 }
else if constexpr (std::is_same_v<T, std::vector<int64_t>>) {
301 return parameter.as_integer_array();
302 }
else if constexpr (std::is_same_v<T, std::vector<double>>) {
303 return parameter.as_double_array();
304 }
else if constexpr (std::is_same_v<T, std::vector<std::string>>) {
305 return parameter.as_string_array();
306 }
else if constexpr (std::is_same_v<T, std::vector<bool>>) {
307 return parameter.as_bool_array();
Handles getting parameters and dynamic parameter changes.
void setParamCallback(T &setting, const std::string &name, ParameterType param_type=ParameterType::Dynamic)
Set a parameter to a dynamic parameter callback.
rcl_interfaces::msg::SetParametersResult validateParameterUpdatesCallback(const std::vector< rclcpp::Parameter > ¶meters)
Validate incoming parameter updates before applying them. This callback is triggered when one or more...
void getParam(SettingT &setting, const std::string &name, ParamT default_value, ParameterType param_type=ParameterType::Dynamic)
Gets parameter.
void setParam(SettingT &setting, const std::string &name, nav2::LifecycleNode::SharedPtr node) const
Set a parameter.
void addPostCallback(T &&callback)
Set a callback to process after parameter changes.
void addPreCallback(const std::string &name, T &&callback)
Set a callback to process before parameter changes.
auto getParamGetter(const std::string &ns)
Get an object to retrieve parameters.
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.
void updateParametersCallback(const std::vector< rclcpp::Parameter > ¶meters)
Apply parameter updates after validation This callback is executed when parameters have been successf...
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