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/rclcpp.hpp"
28 #include "rclcpp/parameter_value.hpp"
29 #include "rclcpp_lifecycle/lifecycle_node.hpp"
36 enum class ParameterType { Dynamic, Static };
45 using get_param_func_t = void (
const rclcpp::Parameter & param,
46 rcl_interfaces::msg::SetParametersResult & result);
47 using post_callback_t = void ();
48 using pre_callback_t = void ();
59 const nav2::LifecycleNode::WeakPtr & parent, std::string & name);
80 const std::vector<rclcpp::Parameter> & parameters);
119 T & setting,
const std::string & name, ParameterType param_type = ParameterType::Dynamic);
127 return ¶meters_change_mutex_;
154 template<
typename SettingT,
typename ParamT>
156 SettingT & setting,
const std::string & name, ParamT default_value,
157 ParameterType param_type = ParameterType::Dynamic);
165 template<
typename ParamT,
typename SettingT>
168 const std::string & name,
169 nav2::LifecycleNode::SharedPtr node)
const;
177 static auto as(
const rclcpp::Parameter & parameter);
179 std::mutex parameters_change_mutex_;
180 rclcpp::Logger logger_{rclcpp::get_logger(
"MPPIController")};
181 rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr
182 on_set_param_handler_;
183 rclcpp::node_interfaces::PostSetParametersCallbackHandle::SharedPtr
184 post_set_param_handler_;
185 nav2::LifecycleNode::WeakPtr node_;
186 std::string node_name_;
189 bool verbose_{
false};
191 std::unordered_map<std::string,
192 std::function<void(
const rclcpp::Parameter &)>> get_param_callbacks_;
193 std::unordered_map<std::string, std::function<get_param_func_t>> get_pre_callbacks_;
195 std::vector<std::function<post_callback_t>> post_callbacks_;
201 auto & setting,
const std::string & name,
auto default_value,
202 ParameterType param_type = ParameterType::Dynamic) {
204 setting, ns.empty() ? name : ns +
"." + name,
205 std::move(default_value), param_type);
212 get_param_callbacks_[name] = callback;
218 post_callbacks_.push_back(callback);
224 get_pre_callbacks_[name] = callback;
227 template<
typename SettingT,
typename ParamT>
229 SettingT & setting,
const std::string & name,
230 ParamT default_value,
231 ParameterType param_type)
233 auto node = node_.lock();
235 nav2::declare_parameter_if_not_declared(
236 node, name, rclcpp::ParameterValue(default_value));
238 setParam<ParamT>(setting, name, node);
242 template<
typename ParamT,
typename SettingT>
244 SettingT & setting,
const std::string & name, nav2::LifecycleNode::SharedPtr node)
const
247 node->get_parameter(name, param_in);
248 setting =
static_cast<SettingT
>(param_in);
253 T & setting,
const std::string & name, ParameterType param_type)
255 if (get_param_callbacks_.find(name) != get_param_callbacks_.end()) {
259 auto dynamic_callback =
260 [
this, &setting, name](
261 const rclcpp::Parameter & param) {
262 setting = as<T>(param);
264 RCLCPP_INFO(logger_,
"Dynamic parameter changed: %s", std::to_string(param).c_str());
268 auto static_callback =
270 const rclcpp::Parameter & param, rcl_interfaces::msg::SetParametersResult & result) {
271 std::string reason =
"Rejected change to static parameter: " + std::to_string(param);
272 result.successful =
false;
273 if (!result.reason.empty()) {
274 result.reason +=
"\n";
276 result.reason += reason;
279 if (param_type == ParameterType::Dynamic) {
289 if constexpr (std::is_same_v<T, bool>) {
290 return parameter.as_bool();
291 }
else if constexpr (std::is_integral_v<T>) {
292 return parameter.as_int();
293 }
else if constexpr (std::is_floating_point_v<T>) {
294 return parameter.as_double();
295 }
else if constexpr (std::is_same_v<T, std::string>) {
296 return parameter.as_string();
297 }
else if constexpr (std::is_same_v<T, std::vector<int64_t>>) {
298 return parameter.as_integer_array();
299 }
else if constexpr (std::is_same_v<T, std::vector<double>>) {
300 return parameter.as_double_array();
301 }
else if constexpr (std::is_same_v<T, std::vector<std::string>>) {
302 return parameter.as_string_array();
303 }
else if constexpr (std::is_same_v<T, std::vector<bool>>) {
304 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