22 #include "opennav_following/parameter_handler.hpp"
24 namespace opennav_following
27 using nav2::declare_parameter_if_not_declared;
28 using rcl_interfaces::msg::ParameterType;
31 const nav2::LifecycleNode::SharedPtr & node,
32 const rclcpp::Logger & logger)
35 params_.controller_frequency = node->declare_or_get_parameter(
36 "controller_frequency", 50.0);
37 params_.detection_timeout = node->declare_or_get_parameter(
38 "detection_timeout", 2.0);
39 params_.rotate_to_object_timeout = node->declare_or_get_parameter(
40 "rotate_to_object_timeout", 10.0);
41 params_.static_object_timeout = node->declare_or_get_parameter(
42 "static_object_timeout", -1.0);
43 params_.linear_tolerance = node->declare_or_get_parameter(
44 "linear_tolerance", 0.15);
45 params_.angular_tolerance = node->declare_or_get_parameter(
46 "angular_tolerance", 0.15);
47 params_.max_retries = node->declare_or_get_parameter(
"max_retries", 3);
48 params_.base_frame = node->declare_or_get_parameter(
49 "base_frame", std::string(
"base_link"));
50 params_.fixed_frame = node->declare_or_get_parameter(
51 "fixed_frame", std::string(
"odom"));
52 params_.desired_distance = node->declare_or_get_parameter(
53 "desired_distance", 1.0);
54 params_.skip_orientation = node->declare_or_get_parameter(
55 "skip_orientation",
true);
56 params_.search_by_rotating = node->declare_or_get_parameter(
57 "search_by_rotating",
false);
58 params_.search_angle = node->declare_or_get_parameter(
59 "search_angle", M_PI_2);
60 params_.transform_tolerance = node->declare_or_get_parameter(
61 "transform_tolerance", 0.1);
62 params_.odom_topic = node->declare_or_get_parameter(
63 "odom_topic", std::string(
"odom"));
64 params_.odom_duration = node->declare_or_get_parameter(
65 "odom_duration", 0.3);
66 params_.use_collision_detection = node->declare_or_get_parameter(
67 "controller.use_collision_detection",
false);
68 params_.filter_coef = node->declare_or_get_parameter(
"filter_coef", 0.1);
69 RCLCPP_INFO(logger_,
"Controller frequency set to %.4fHz", params_.controller_frequency);
73 const std::vector<rclcpp::Parameter> & parameters)
75 rcl_interfaces::msg::SetParametersResult result;
76 result.successful =
true;
77 for (
const auto & parameter : parameters) {
78 const auto & param_type = parameter.get_type();
79 const auto & param_name = parameter.get_name();
82 if (param_name.find(
'.') != std::string::npos) {
85 if (param_type == ParameterType::PARAMETER_DOUBLE) {
86 if (parameter.as_double() <= 0.0 &&
87 (param_name ==
"controller_frequency" || param_name ==
"detection_timeout" ||
88 param_name ==
"rotate_to_object_timeout"))
91 logger_,
"The value of parameter '%s' is incorrectly set to %f, "
92 "it should be >0. Ignoring parameter update.",
93 param_name.c_str(), parameter.as_double());
94 result.successful =
false;
95 }
else if (parameter.as_double() < 0.0 && param_name !=
"static_object_timeout") {
97 logger_,
"The value of parameter '%s' is incorrectly set to %f, "
98 "it should be >=0. Ignoring parameter update.",
99 param_name.c_str(), parameter.as_double());
100 result.successful =
false;
109 const std::vector<rclcpp::Parameter> & parameters)
111 std::lock_guard<std::mutex> lock_reinit(mutex_);
113 for (
const auto & parameter : parameters) {
114 const auto & param_type = parameter.get_type();
115 const auto & param_name = parameter.get_name();
116 if (param_name.find(
'.') != std::string::npos) {
119 if (param_type == ParameterType::PARAMETER_DOUBLE) {
120 if (param_name ==
"controller_frequency") {
121 params_.controller_frequency = parameter.as_double();
122 }
else if (param_name ==
"detection_timeout") {
123 params_.detection_timeout = parameter.as_double();
124 }
else if (param_name ==
"rotate_to_object_timeout") {
125 params_.rotate_to_object_timeout = parameter.as_double();
126 }
else if (param_name ==
"static_object_timeout") {
127 params_.static_object_timeout = parameter.as_double();
128 }
else if (param_name ==
"linear_tolerance") {
129 params_.linear_tolerance = parameter.as_double();
130 }
else if (param_name ==
"angular_tolerance") {
131 params_.angular_tolerance = parameter.as_double();
132 }
else if (param_name ==
"desired_distance") {
133 params_.desired_distance = parameter.as_double();
134 }
else if (param_name ==
"transform_tolerance") {
135 params_.transform_tolerance = parameter.as_double();
136 }
else if (param_name ==
"search_angle") {
137 params_.search_angle = parameter.as_double();
139 }
else if (param_type == ParameterType::PARAMETER_STRING) {
140 if (param_name ==
"base_frame") {
141 params_.base_frame = parameter.as_string();
142 }
else if (param_name ==
"fixed_frame") {
143 params_.fixed_frame = parameter.as_string();
145 }
else if (param_type == ParameterType::PARAMETER_BOOL) {
146 if (param_name ==
"skip_orientation") {
147 params_.skip_orientation = parameter.as_bool();
148 }
else if (param_name ==
"search_by_rotating") {
149 params_.search_by_rotating = parameter.as_bool();
Handles parameters and dynamic parameters for Planner Server.
void updateParametersCallback(const std::vector< rclcpp::Parameter > ¶meters) override
Apply parameter updates after validation This callback is executed when parameters have been successf...
ParameterHandler(const nav2::LifecycleNode::SharedPtr &node, const rclcpp::Logger &logger)
Constructor for opennav_following::ParameterHandler.
rcl_interfaces::msg::SetParametersResult validateParameterUpdatesCallback(const std::vector< rclcpp::Parameter > ¶meters) override
Validate incoming parameter updates before applying them. This callback is triggered when one or more...