22 #include "nav2_rotation_shim_controller/parameter_handler.hpp"
23 #include "nav2_core/controller_exceptions.hpp"
24 #include "nav2_costmap_2d/cost_values.hpp"
26 namespace nav2_rotation_shim_controller
29 using nav2::declare_parameter_if_not_declared;
30 using rcl_interfaces::msg::ParameterType;
33 const nav2::LifecycleNode::SharedPtr & node,
34 std::string & plugin_name, rclcpp::Logger & logger)
37 plugin_name_ = plugin_name;
39 params_.angular_dist_threshold = node->declare_or_get_parameter(plugin_name_ +
40 ".angular_dist_threshold", 0.785);
41 params_.angular_disengage_threshold = node->declare_or_get_parameter(plugin_name_ +
42 ".angular_disengage_threshold", 0.785 / 2.0);
43 params_.forward_sampling_distance = node->declare_or_get_parameter(plugin_name_ +
44 ".forward_sampling_distance", 0.5);
45 params_.rotate_to_heading_angular_vel = node->declare_or_get_parameter(plugin_name_ +
46 ".rotate_to_heading_angular_vel", 1.8);
47 params_.max_angular_accel = node->declare_or_get_parameter(plugin_name_ +
".max_angular_accel",
49 params_.max_cost_threshold = node->declare_or_get_parameter(plugin_name_ +
".max_cost_threshold",
50 static_cast<double>(nav2_costmap_2d::LETHAL_OBSTACLE));
51 params_.simulate_ahead_time = node->declare_or_get_parameter(plugin_name_ +
52 ".simulate_ahead_time", 1.0);
54 params_.primary_controller = node->declare_or_get_parameter<std::string>(plugin_name_ +
55 ".primary_controller.plugin");
56 }
catch (
const rclcpp::exceptions::InvalidParameterValueException & e) {
57 RCLCPP_WARN(logger_,
"the primary controller must be defined in a namespace:\n"
58 " primary_controller:\n"
59 " plugin: <controller_plugin_name>\n"
60 " ... other parameters ...\n"
61 "Please update your YAML configuration. "
62 "See the migration guide: "
64 "https://docs.nav2.org/migration/Kilted.html#namespace-added-for-primary-controller-parameters-in-rotation-shim-controller"
67 "Failed to get 'primary_controller.plugin' parameter");
69 params_.rotate_to_goal_heading = node->declare_or_get_parameter(plugin_name_ +
70 ".rotate_to_goal_heading",
false);
71 params_.rotate_to_heading_once = node->declare_or_get_parameter(plugin_name_ +
72 ".rotate_to_heading_once",
false);
73 params_.closed_loop = node->declare_or_get_parameter(plugin_name_ +
".closed_loop",
true);
74 params_.use_path_orientations = node->declare_or_get_parameter(plugin_name_ +
75 ".use_path_orientations",
false);
76 double control_frequency = 20.0;
77 node->get_parameter(
"controller_frequency", control_frequency);
78 params_.control_duration = 1.0 / control_frequency;
82 const std::vector<rclcpp::Parameter> & parameters)
84 rcl_interfaces::msg::SetParametersResult result;
85 result.successful =
true;
86 for (
const auto & parameter : parameters) {
87 const auto & param_type = parameter.get_type();
88 const auto & param_name = parameter.get_name();
89 if (param_name.find(plugin_name_ +
".") != 0) {
92 if (param_type == ParameterType::PARAMETER_DOUBLE) {
93 if (param_name == plugin_name_ +
".simulate_ahead_time" &&
94 parameter.as_double() < 0.0)
97 logger_,
"The value of simulate_ahead_time is incorrectly set, "
98 "it should be >=0. Ignoring parameter update.");
99 result.successful =
false;
100 }
else if (parameter.as_double() <= 0.0) {
102 logger_,
"The value of parameter '%s' is incorrectly set to %f, "
103 "it should be >0. Ignoring parameter update.",
104 param_name.c_str(), parameter.as_double());
105 result.successful =
false;
113 const std::vector<rclcpp::Parameter> & parameters)
115 std::lock_guard<std::mutex> lock_reinit(mutex_);
117 for (
const auto & parameter : parameters) {
118 const auto & param_type = parameter.get_type();
119 const auto & param_name = parameter.get_name();
120 if (param_name.find(plugin_name_ +
".") != 0) {
123 if (param_type == ParameterType::PARAMETER_DOUBLE) {
124 if (param_name == plugin_name_ +
".angular_dist_threshold") {
125 params_.angular_dist_threshold = parameter.as_double();
126 }
else if (param_name == plugin_name_ +
".forward_sampling_distance") {
127 params_.forward_sampling_distance = parameter.as_double();
128 }
else if (param_name == plugin_name_ +
".rotate_to_heading_angular_vel") {
129 params_.rotate_to_heading_angular_vel = parameter.as_double();
130 }
else if (param_name == plugin_name_ +
".max_angular_accel") {
131 params_.max_angular_accel = parameter.as_double();
132 }
else if (param_name == plugin_name_ +
".max_cost_threshold") {
133 params_.max_cost_threshold = parameter.as_double();
134 }
else if (param_name == plugin_name_ +
".simulate_ahead_time") {
135 params_.simulate_ahead_time = parameter.as_double();
137 }
else if (param_type == ParameterType::PARAMETER_BOOL) {
138 if (param_name == plugin_name_ +
".rotate_to_goal_heading") {
139 params_.rotate_to_goal_heading = parameter.as_bool();
140 }
else if (param_name == plugin_name_ +
".rotate_to_heading_once") {
141 params_.rotate_to_heading_once = parameter.as_bool();
142 }
else if (param_name == plugin_name_ +
".closed_loop") {
143 params_.closed_loop = parameter.as_bool();
144 }
else if (param_name == plugin_name_ +
".use_path_orientations") {
145 params_.use_path_orientations = parameter.as_bool();
Handles parameters and dynamic parameters for Rotation Shim.
ParameterHandler(const nav2::LifecycleNode::SharedPtr &node, std::string &plugin_name, rclcpp::Logger &logger)
Constructor for nav2_rotation_shim_controller::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...
void updateParametersCallback(const std::vector< rclcpp::Parameter > ¶meters) override
Apply parameter updates after validation This callback is executed when parameters have been successf...