Nav2 Navigation Stack - lyrical  lyrical
ROS 2 Navigation Stack
kinematic_parameters.hpp
1 /*
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2017, Locus Robotics
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above
14  * copyright notice, this list of conditions and the following
15  * disclaimer in the documentation and/or other materials provided
16  * with the distribution.
17  * * Neither the name of the copyright holder nor the names of its
18  * contributors may be used to endorse or promote products derived
19  * from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  */
34 
35 #ifndef DWB_PLUGINS__KINEMATIC_PARAMETERS_HPP_
36 #define DWB_PLUGINS__KINEMATIC_PARAMETERS_HPP_
37 
38 #include <limits>
39 #include <memory>
40 #include <string>
41 #include <vector>
42 #include <stdexcept>
43 #include "nav2_ros_common/lifecycle_node.hpp"
44 #include "rclcpp/logger.hpp"
45 #include "rclcpp/node_interfaces/node_parameters_interface.hpp"
46 #include "rclcpp/parameter.hpp"
47 
48 namespace dwb_plugins
49 {
50 
56 {
57  friend class KinematicsHandler;
58 
59  inline double getMinX() {return min_vel_x_;}
60  inline double getMaxX() {return max_vel_x_;}
61  inline double getAccX() {return acc_lim_x_;}
62  inline double getDecelX() {return decel_lim_x_;}
63 
64  inline double getMinY() {return min_vel_y_;}
65  inline double getMaxY() {return max_vel_y_;}
66  inline double getAccY() {return acc_lim_y_;}
67  inline double getDecelY() {return decel_lim_y_;}
68 
69  inline double getMinSpeedXY() {return min_speed_xy_;}
70  inline double getMaxSpeedXY() {return max_speed_xy_;}
71 
72  inline double getMinTheta() {return -max_vel_theta_;}
73  inline double getMaxTheta() {return max_vel_theta_;}
74  inline double getAccTheta() {return acc_lim_theta_;}
75  inline double getDecelTheta() {return decel_lim_theta_;}
76  inline double getMinSpeedTheta() {return min_speed_theta_;}
77 
78  inline double getMinSpeedXY_SQ() {return min_speed_xy_sq_;}
79  inline double getMaxSpeedXY_SQ() {return max_speed_xy_sq_;}
80 
92  inline bool isValidSpeed(double x, double y, double theta)
93  {
94  double vmag_sq = x * x + y * y;
95  if (max_speed_xy_ >= 0.0 &&
96  vmag_sq > max_speed_xy_sq_ + std::numeric_limits<float>::epsilon())
97  {
98  return false;
99  }
100  if (
101  min_speed_xy_ >= 0.0 && vmag_sq + std::numeric_limits<float>::epsilon() < min_speed_xy_sq_ &&
102  min_speed_theta_ >= 0.0 &&
103  fabs(theta) + std::numeric_limits<float>::epsilon() < min_speed_theta_)
104  {
105  return false;
106  }
107  if (vmag_sq == 0.0 && theta == 0.0) {return false;}
108  return true;
109  }
110 
111 protected:
112  // For parameter descriptions, see cfg/KinematicParams.cfg
113  double min_vel_x_{0};
114  double min_vel_y_{0};
115  double max_vel_x_{0};
116  double max_vel_y_{0};
117  double base_max_vel_x_{0};
118  double base_max_vel_y_{0};
119  double max_vel_theta_{0};
120  double base_max_vel_theta_{0};
121  double min_speed_xy_{0};
122  double max_speed_xy_{0};
123  double base_max_speed_xy_{0};
124  double min_speed_theta_{0};
125  double acc_lim_x_{0};
126  double acc_lim_y_{0};
127  double acc_lim_theta_{0};
128  double decel_lim_x_{0};
129  double decel_lim_y_{0};
130  double decel_lim_theta_{0};
131 
132  // Cached square values of min_speed_xy and max_speed_xy
133  double min_speed_xy_sq_{0};
134  double max_speed_xy_sq_{0};
135 };
136 
142 {
143 public:
146  void initialize(const nav2::LifecycleNode::SharedPtr & nh, const std::string & plugin_name);
147  void activate();
148  void deactivate();
149 
150  inline KinematicParameters getKinematics()
151  {
152  KinematicParameters * ptr = kinematics_.load();
153  if (ptr == nullptr) {
154  throw std::runtime_error("Can't call KinematicsHandler::getKinematics().");
155  }
156  return *ptr;
157  }
158 
159  void setSpeedLimit(const double & speed_limit, const bool & percentage);
160 
161  using Ptr = std::shared_ptr<KinematicsHandler>;
162 
163 protected:
164  nav2::LifecycleNode::WeakPtr node_;
165  rclcpp::Logger logger_{rclcpp::get_logger("DWBController")};
166  std::atomic<KinematicParameters *> kinematics_;
167 
168  // Dynamic parameters handler
169  rclcpp::node_interfaces::PostSetParametersCallbackHandle::SharedPtr post_set_params_handler_;
170  rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr on_set_params_handler_;
179  rcl_interfaces::msg::SetParametersResult validateParameterUpdatesCallback(
180  const std::vector<rclcpp::Parameter> & parameters);
181 
188  void updateParametersCallback(const std::vector<rclcpp::Parameter> & parameters);
189  void update_kinematics(KinematicParameters kinematics);
190  std::string plugin_name_;
191 };
192 
193 } // namespace dwb_plugins
194 
195 #endif // DWB_PLUGINS__KINEMATIC_PARAMETERS_HPP_
A class managing the representation of the robot's kinematics.
void updateParametersCallback(const std::vector< rclcpp::Parameter > &parameters)
Apply parameter updates after validation This callback is executed when parameters have been successf...
rcl_interfaces::msg::SetParametersResult validateParameterUpdatesCallback(const std::vector< rclcpp::Parameter > &parameters)
Validate incoming parameter updates before applying them. This callback is triggered when one or more...
A struct containing one representation of the robot's kinematics.
bool isValidSpeed(double x, double y, double theta)
Check to see whether the combined x/y/theta velocities are valid.