22 #include "opennav_following/parameter_handler.hpp"
24 namespace opennav_following
27 using rcl_interfaces::msg::ParameterType;
30 const nav2_util::LifecycleNode::SharedPtr & node,
31 const rclcpp::Logger & logger)
32 : node_(node), logger_(logger)
34 nav2_util::declare_parameter_if_not_declared(
35 node,
"controller_frequency", rclcpp::ParameterValue(50.0));
36 nav2_util::declare_parameter_if_not_declared(
37 node,
"detection_timeout", rclcpp::ParameterValue(2.0));
38 nav2_util::declare_parameter_if_not_declared(
39 node,
"rotate_to_object_timeout", rclcpp::ParameterValue(10.0));
40 nav2_util::declare_parameter_if_not_declared(
41 node,
"static_object_timeout", rclcpp::ParameterValue(-1.0));
42 nav2_util::declare_parameter_if_not_declared(
43 node,
"linear_tolerance", rclcpp::ParameterValue(0.15));
44 nav2_util::declare_parameter_if_not_declared(
45 node,
"angular_tolerance", rclcpp::ParameterValue(0.15));
46 nav2_util::declare_parameter_if_not_declared(
47 node,
"max_retries", rclcpp::ParameterValue(3));
48 nav2_util::declare_parameter_if_not_declared(
49 node,
"base_frame", rclcpp::ParameterValue(std::string(
"base_link")));
50 nav2_util::declare_parameter_if_not_declared(
51 node,
"fixed_frame", rclcpp::ParameterValue(std::string(
"odom")));
52 nav2_util::declare_parameter_if_not_declared(
53 node,
"desired_distance", rclcpp::ParameterValue(1.0));
54 nav2_util::declare_parameter_if_not_declared(
55 node,
"skip_orientation", rclcpp::ParameterValue(
true));
56 nav2_util::declare_parameter_if_not_declared(
57 node,
"search_by_rotating", rclcpp::ParameterValue(
false));
58 nav2_util::declare_parameter_if_not_declared(
59 node,
"search_angle", rclcpp::ParameterValue(M_PI_2));
60 nav2_util::declare_parameter_if_not_declared(
61 node,
"transform_tolerance", rclcpp::ParameterValue(0.1));
62 nav2_util::declare_parameter_if_not_declared(
63 node,
"odom_topic", rclcpp::ParameterValue(std::string(
"odom")));
64 nav2_util::declare_parameter_if_not_declared(
65 node,
"odom_duration", rclcpp::ParameterValue(0.3));
66 nav2_util::declare_parameter_if_not_declared(
67 node,
"controller.use_collision_detection", rclcpp::ParameterValue(
false));
68 nav2_util::declare_parameter_if_not_declared(
69 node,
"filter_coef", rclcpp::ParameterValue(0.1));
71 node->get_parameter(
"controller_frequency", params_.controller_frequency);
72 node->get_parameter(
"detection_timeout", params_.detection_timeout);
73 node->get_parameter(
"rotate_to_object_timeout", params_.rotate_to_object_timeout);
74 node->get_parameter(
"static_object_timeout", params_.static_object_timeout);
75 node->get_parameter(
"linear_tolerance", params_.linear_tolerance);
76 node->get_parameter(
"angular_tolerance", params_.angular_tolerance);
77 node->get_parameter(
"max_retries", params_.max_retries);
78 node->get_parameter(
"base_frame", params_.base_frame);
79 node->get_parameter(
"fixed_frame", params_.fixed_frame);
80 node->get_parameter(
"desired_distance", params_.desired_distance);
81 node->get_parameter(
"skip_orientation", params_.skip_orientation);
82 node->get_parameter(
"search_by_rotating", params_.search_by_rotating);
83 node->get_parameter(
"search_angle", params_.search_angle);
84 node->get_parameter(
"transform_tolerance", params_.transform_tolerance);
85 node->get_parameter(
"odom_topic", params_.odom_topic);
86 node->get_parameter(
"odom_duration", params_.odom_duration);
87 node->get_parameter(
"controller.use_collision_detection", params_.use_collision_detection);
88 node->get_parameter(
"filter_coef", params_.filter_coef);
90 RCLCPP_INFO(logger_,
"Controller frequency set to %.4fHz", params_.controller_frequency);
95 auto node = node_.lock();
96 dyn_params_handler_ = node->add_on_set_parameters_callback(
102 auto node = node_.lock();
103 if (dyn_params_handler_ && node) {
104 node->remove_on_set_parameters_callback(dyn_params_handler_.get());
106 dyn_params_handler_.reset();
110 const std::vector<rclcpp::Parameter> & parameters)
112 std::lock_guard<std::mutex> lock_reinit(mutex_);
113 rcl_interfaces::msg::SetParametersResult result;
115 for (
const auto & parameter : parameters) {
116 const auto & param_type = parameter.get_type();
117 const auto & param_name = parameter.get_name();
120 if (param_name.find(
'.') != std::string::npos) {
124 if (param_type == ParameterType::PARAMETER_DOUBLE) {
126 if (parameter.as_double() <= 0.0 &&
127 (param_name ==
"controller_frequency" || param_name ==
"detection_timeout" ||
128 param_name ==
"rotate_to_object_timeout"))
131 logger_,
"The value of parameter '%s' is incorrectly set to %f, "
132 "it should be >0. Ignoring parameter update.",
133 param_name.c_str(), parameter.as_double());
134 result.successful =
false;
136 }
else if (parameter.as_double() < 0.0 && param_name !=
"static_object_timeout") {
138 logger_,
"The value of parameter '%s' is incorrectly set to %f, "
139 "it should be >=0. Ignoring parameter update.",
140 param_name.c_str(), parameter.as_double());
141 result.successful =
false;
145 if (param_name ==
"controller_frequency") {
146 params_.controller_frequency = parameter.as_double();
147 }
else if (param_name ==
"detection_timeout") {
148 params_.detection_timeout = parameter.as_double();
149 }
else if (param_name ==
"rotate_to_object_timeout") {
150 params_.rotate_to_object_timeout = parameter.as_double();
151 }
else if (param_name ==
"static_object_timeout") {
152 params_.static_object_timeout = parameter.as_double();
153 }
else if (param_name ==
"linear_tolerance") {
154 params_.linear_tolerance = parameter.as_double();
155 }
else if (param_name ==
"angular_tolerance") {
156 params_.angular_tolerance = parameter.as_double();
157 }
else if (param_name ==
"desired_distance") {
158 params_.desired_distance = parameter.as_double();
159 }
else if (param_name ==
"transform_tolerance") {
160 params_.transform_tolerance = parameter.as_double();
161 }
else if (param_name ==
"search_angle") {
162 params_.search_angle = parameter.as_double();
164 }
else if (param_type == ParameterType::PARAMETER_STRING) {
165 if (param_name ==
"base_frame") {
166 params_.base_frame = parameter.as_string();
167 }
else if (param_name ==
"fixed_frame") {
168 params_.fixed_frame = parameter.as_string();
170 }
else if (param_type == ParameterType::PARAMETER_BOOL) {
171 if (param_name ==
"skip_orientation") {
172 params_.skip_orientation = parameter.as_bool();
173 }
else if (param_name ==
"search_by_rotating") {
174 params_.search_by_rotating = parameter.as_bool();
179 result.successful =
true;
void deactivate()
Resets callbacks for dynamic parameter handling.
void activate()
Registers callbacks for dynamic parameter handling.
rcl_interfaces::msg::SetParametersResult dynamicParametersCallback(const std::vector< rclcpp::Parameter > ¶meters)
Callback executed when a parameter change is detected.
ParameterHandler(const nav2_util::LifecycleNode::SharedPtr &node, const rclcpp::Logger &logger)
Constructor for opennav_following::ParameterHandler.