35 #include "dwb_plugins/kinematic_parameters.hpp"
41 #include "nav_2d_utils/parameters.hpp"
42 #include "nav2_util/node_utils.hpp"
43 #include "nav2_costmap_2d/costmap_filters/filter_values.hpp"
45 using nav2_util::declare_parameter_if_not_declared;
46 using rcl_interfaces::msg::ParameterType;
47 using std::placeholders::_1;
52 KinematicsHandler::KinematicsHandler()
54 kinematics_.store(
new KinematicParameters);
57 KinematicsHandler::~KinematicsHandler()
59 delete kinematics_.load();
62 void KinematicsHandler::initialize(
63 const nav2_util::LifecycleNode::SharedPtr & nh,
64 const std::string & plugin_name)
66 plugin_name_ = plugin_name;
68 declare_parameter_if_not_declared(nh, plugin_name +
".min_vel_x", rclcpp::ParameterValue(0.0));
69 declare_parameter_if_not_declared(nh, plugin_name +
".min_vel_y", rclcpp::ParameterValue(0.0));
70 declare_parameter_if_not_declared(nh, plugin_name +
".max_vel_x", rclcpp::ParameterValue(0.0));
71 declare_parameter_if_not_declared(nh, plugin_name +
".max_vel_y", rclcpp::ParameterValue(0.0));
72 declare_parameter_if_not_declared(
73 nh, plugin_name +
".max_vel_theta",
74 rclcpp::ParameterValue(0.0));
75 declare_parameter_if_not_declared(
76 nh, plugin_name +
".min_speed_xy",
77 rclcpp::ParameterValue(0.0));
78 declare_parameter_if_not_declared(
79 nh, plugin_name +
".max_speed_xy",
80 rclcpp::ParameterValue(0.0));
81 declare_parameter_if_not_declared(
82 nh, plugin_name +
".min_speed_theta",
83 rclcpp::ParameterValue(0.0));
84 declare_parameter_if_not_declared(nh, plugin_name +
".acc_lim_x", rclcpp::ParameterValue(0.0));
85 declare_parameter_if_not_declared(nh, plugin_name +
".acc_lim_y", rclcpp::ParameterValue(0.0));
86 declare_parameter_if_not_declared(
87 nh, plugin_name +
".acc_lim_theta",
88 rclcpp::ParameterValue(0.0));
89 declare_parameter_if_not_declared(nh, plugin_name +
".decel_lim_x", rclcpp::ParameterValue(0.0));
90 declare_parameter_if_not_declared(nh, plugin_name +
".decel_lim_y", rclcpp::ParameterValue(0.0));
91 declare_parameter_if_not_declared(
92 nh, plugin_name +
".decel_lim_theta",
93 rclcpp::ParameterValue(0.0));
95 KinematicParameters kinematics;
97 nh->get_parameter(plugin_name +
".min_vel_x", kinematics.min_vel_x_);
98 nh->get_parameter(plugin_name +
".min_vel_y", kinematics.min_vel_y_);
99 nh->get_parameter(plugin_name +
".max_vel_x", kinematics.max_vel_x_);
100 nh->get_parameter(plugin_name +
".max_vel_y", kinematics.max_vel_y_);
101 nh->get_parameter(plugin_name +
".max_vel_theta", kinematics.max_vel_theta_);
102 nh->get_parameter(plugin_name +
".min_speed_xy", kinematics.min_speed_xy_);
103 nh->get_parameter(plugin_name +
".max_speed_xy", kinematics.max_speed_xy_);
104 nh->get_parameter(plugin_name +
".min_speed_theta", kinematics.min_speed_theta_);
105 nh->get_parameter(plugin_name +
".acc_lim_x", kinematics.acc_lim_x_);
106 nh->get_parameter(plugin_name +
".acc_lim_y", kinematics.acc_lim_y_);
107 nh->get_parameter(plugin_name +
".acc_lim_theta", kinematics.acc_lim_theta_);
108 nh->get_parameter(plugin_name +
".decel_lim_x", kinematics.decel_lim_x_);
109 nh->get_parameter(plugin_name +
".decel_lim_y", kinematics.decel_lim_y_);
110 nh->get_parameter(plugin_name +
".decel_lim_theta", kinematics.decel_lim_theta_);
112 kinematics.base_max_vel_x_ = kinematics.max_vel_x_;
113 kinematics.base_max_vel_y_ = kinematics.max_vel_y_;
114 kinematics.base_max_speed_xy_ = kinematics.max_speed_xy_;
115 kinematics.base_max_vel_theta_ = kinematics.max_vel_theta_;
118 dyn_params_handler_ = nh->add_on_set_parameters_callback(
121 kinematics.min_speed_xy_sq_ = kinematics.min_speed_xy_ * kinematics.min_speed_xy_;
122 kinematics.max_speed_xy_sq_ = kinematics.max_speed_xy_ * kinematics.max_speed_xy_;
124 update_kinematics(kinematics);
127 void KinematicsHandler::setSpeedLimit(
128 const double & speed_limit,
const bool & percentage)
130 KinematicParameters kinematics(*kinematics_.load());
132 if (speed_limit == nav2_costmap_2d::NO_SPEED_LIMIT) {
134 kinematics.max_speed_xy_ = kinematics.base_max_speed_xy_;
135 kinematics.max_vel_x_ = kinematics.base_max_vel_x_;
136 kinematics.max_vel_y_ = kinematics.base_max_vel_y_;
137 kinematics.max_vel_theta_ = kinematics.base_max_vel_theta_;
141 kinematics.max_speed_xy_ = kinematics.base_max_speed_xy_ * speed_limit / 100.0;
142 kinematics.max_vel_x_ = kinematics.base_max_vel_x_ * speed_limit / 100.0;
143 kinematics.max_vel_y_ = kinematics.base_max_vel_y_ * speed_limit / 100.0;
144 kinematics.max_vel_theta_ = kinematics.base_max_vel_theta_ * speed_limit / 100.0;
147 if (speed_limit < kinematics.base_max_speed_xy_) {
148 kinematics.max_speed_xy_ = speed_limit;
153 const double ratio = speed_limit / kinematics.base_max_speed_xy_;
154 kinematics.max_vel_x_ = kinematics.base_max_vel_x_ * ratio;
155 kinematics.max_vel_y_ = kinematics.base_max_vel_y_ * ratio;
156 kinematics.max_vel_theta_ = kinematics.base_max_vel_theta_ * ratio;
162 kinematics.max_speed_xy_sq_ = kinematics.max_speed_xy_ * kinematics.max_speed_xy_;
164 update_kinematics(kinematics);
167 rcl_interfaces::msg::SetParametersResult
170 rcl_interfaces::msg::SetParametersResult result;
173 for (
auto parameter : parameters) {
174 const auto & type = parameter.get_type();
175 const auto & name = parameter.get_name();
177 if (type == ParameterType::PARAMETER_DOUBLE) {
178 if (name == plugin_name_ +
".min_vel_x") {
179 kinematics.min_vel_x_ = parameter.as_double();
180 }
else if (name == plugin_name_ +
".min_vel_y") {
181 kinematics.min_vel_y_ = parameter.as_double();
182 }
else if (name == plugin_name_ +
".max_vel_x") {
183 kinematics.max_vel_x_ = parameter.as_double();
184 kinematics.base_max_vel_x_ = kinematics.max_vel_x_;
185 }
else if (name == plugin_name_ +
".max_vel_y") {
186 kinematics.max_vel_y_ = parameter.as_double();
187 kinematics.base_max_vel_y_ = kinematics.max_vel_y_;
188 }
else if (name == plugin_name_ +
".max_vel_theta") {
189 kinematics.max_vel_theta_ = parameter.as_double();
190 kinematics.base_max_vel_theta_ = kinematics.max_vel_theta_;
191 }
else if (name == plugin_name_ +
".min_speed_xy") {
192 kinematics.min_speed_xy_ = parameter.as_double();
193 kinematics.min_speed_xy_sq_ = kinematics.min_speed_xy_ * kinematics.min_speed_xy_;
194 }
else if (name == plugin_name_ +
".max_speed_xy") {
195 kinematics.max_speed_xy_ = parameter.as_double();
196 kinematics.base_max_speed_xy_ = kinematics.max_speed_xy_;
197 }
else if (name == plugin_name_ +
".min_speed_theta") {
198 kinematics.min_speed_theta_ = parameter.as_double();
199 kinematics.max_speed_xy_sq_ = kinematics.max_speed_xy_ * kinematics.max_speed_xy_;
200 }
else if (name == plugin_name_ +
".acc_lim_x") {
201 kinematics.acc_lim_x_ = parameter.as_double();
202 }
else if (name == plugin_name_ +
".acc_lim_y") {
203 kinematics.acc_lim_y_ = parameter.as_double();
204 }
else if (name == plugin_name_ +
".acc_lim_theta") {
205 kinematics.acc_lim_theta_ = parameter.as_double();
206 }
else if (name == plugin_name_ +
".decel_lim_x") {
207 kinematics.decel_lim_x_ = parameter.as_double();
208 }
else if (name == plugin_name_ +
".decel_lim_y") {
209 kinematics.decel_lim_y_ = parameter.as_double();
210 }
else if (name == plugin_name_ +
".decel_lim_theta") {
211 kinematics.decel_lim_theta_ = parameter.as_double();
215 update_kinematics(kinematics);
216 result.successful =
true;
222 delete kinematics_.load();
rcl_interfaces::msg::SetParametersResult dynamicParametersCallback(std::vector< rclcpp::Parameter > parameters)
Callback executed when a paramter change is detected.
A struct containing one representation of the robot's kinematics.