Nav2 Navigation Stack - lyrical  lyrical
ROS 2 Navigation Stack
legacy_inflation_layer.hpp
1 /*********************************************************************
2  *
3  * Software License Agreement (BSD License)
4  *
5  * Copyright (c) 2008, 2013, Willow Garage, Inc.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * * Redistributions of source code must retain the above copyright
13  * notice, this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above
15  * copyright notice, this list of conditions and the following
16  * disclaimer in the documentation and/or other materials provided
17  * with the distribution.
18  * * Neither the name of Willow Garage, Inc. nor the names of its
19  * contributors may be used to endorse or promote products derived
20  * from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * POSSIBILITY OF SUCH DAMAGE.
34  *
35  * Author: Eitan Marder-Eppstein
36  * David V. Lu!!
37  *********************************************************************/
38 #ifndef NAV2_COSTMAP_2D__LEGACY_INFLATION_LAYER_HPP_
39 #define NAV2_COSTMAP_2D__LEGACY_INFLATION_LAYER_HPP_
40 
41 #include <map>
42 #include <vector>
43 #include <mutex>
44 #include <memory>
45 #include <string>
46 
47 #include "rclcpp/rclcpp.hpp"
48 #include "nav2_costmap_2d/inflation_layer_interface.hpp"
49 #include "nav2_costmap_2d/layered_costmap.hpp"
50 
51 namespace nav2_costmap_2d
52 {
57 class CellData
58 {
59 public:
68  CellData(unsigned int x, unsigned int y, unsigned int sx, unsigned int sy)
69  : x_(x), y_(y), src_x_(sx), src_y_(sy)
70  {
71  }
72  unsigned int x_, y_;
73  unsigned int src_x_, src_y_;
74 };
75 
82 {
83 public:
88 
93 
97  void onInitialize() override;
98 
109  void updateBounds(
110  double robot_x, double robot_y, double robot_yaw, double * min_x,
111  double * min_y,
112  double * max_x,
113  double * max_y) override;
122  void updateCosts(
123  nav2_costmap_2d::Costmap2D & master_grid,
124  int min_i, int min_j, int max_i, int max_j) override;
125 
129  void matchSize() override;
130 
134  bool isClearable() override {return false;}
135 
139  void reset() override
140  {
141  matchSize();
142  current_ = false;
143  need_reinflation_ = true;
144  }
145 
149  inline unsigned char computeCost(double distance) const override
150  {
151  unsigned char cost = 0;
152  if (distance == 0) {
153  cost = LETHAL_OBSTACLE;
154  } else if (distance * resolution_ <= inscribed_radius_) {
155  cost = INSCRIBED_INFLATED_OBSTACLE;
156  } else {
157  // make sure cost falls off by Euclidean distance
158  double factor =
159  exp(-1.0 * cost_scaling_factor_ * (distance * resolution_ - inscribed_radius_));
160  cost = static_cast<unsigned char>((INSCRIBED_INFLATED_OBSTACLE - 1) * factor);
161  }
162  return cost;
163  }
164 
168  mutex_t * getMutex() override
169  {
170  return access_;
171  }
172 
173  double getCostScalingFactor() override
174  {
175  return cost_scaling_factor_;
176  }
177 
178  double getInflationRadius() override
179  {
180  return inflation_radius_;
181  }
182 
183 protected:
187  void onFootprintChanged() override;
188 
197  inline double distanceLookup(
198  unsigned int mx, unsigned int my, unsigned int src_x,
199  unsigned int src_y)
200  {
201  unsigned int dx = (mx > src_x) ? mx - src_x : src_x - mx;
202  unsigned int dy = (my > src_y) ? my - src_y : src_y - my;
203  return cached_distances_[dx * cache_length_ + dy];
204  }
205 
214  inline unsigned char costLookup(
215  unsigned int mx, unsigned int my, unsigned int src_x,
216  unsigned int src_y)
217  {
218  unsigned int dx = (mx > src_x) ? mx - src_x : src_x - mx;
219  unsigned int dy = (my > src_y) ? my - src_y : src_y - my;
220  return cached_costs_[dx * cache_length_ + dy];
221  }
222 
226  void computeCaches();
227 
232 
236  unsigned int cellDistance(double world_dist)
237  {
238  return layered_costmap_->getCostmap()->cellDistance(world_dist);
239  }
240 
244  inline void enqueue(
245  unsigned int index, unsigned int mx, unsigned int my,
246  unsigned int src_x, unsigned int src_y);
247 
252  rcl_interfaces::msg::SetParametersResult
253  dynamicParametersCallback(std::vector<rclcpp::Parameter> parameters);
254 
255  double inflation_radius_, inscribed_radius_, cost_scaling_factor_;
256  bool inflate_unknown_, inflate_around_unknown_;
257  unsigned int cell_inflation_radius_;
258  unsigned int cached_cell_inflation_radius_;
259  std::vector<std::vector<CellData>> inflation_cells_;
260 
261  double resolution_;
262 
263  std::vector<bool> seen_;
264 
265  std::vector<unsigned char> cached_costs_;
266  std::vector<double> cached_distances_;
267  std::vector<std::vector<int>> distance_matrix_;
268  unsigned int cache_length_;
269  double last_min_x_, last_min_y_, last_max_x_, last_max_y_;
270 
271  // Indicates that the entire costmap should be reinflated next time around.
272  bool need_reinflation_;
273  mutex_t * access_;
274  // Dynamic parameters handler
275  rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr dyn_params_handler_;
276 };
277 
278 } // namespace nav2_costmap_2d
279 
280 #endif // NAV2_COSTMAP_2D__LEGACY_INFLATION_LAYER_HPP_
Storage for cell information used during obstacle inflation.
CellData(unsigned int x, unsigned int y, unsigned int sx, unsigned int sy)
Constructor for a CellData objects.
A 2D costmap provides a mapping between points in the world and their associated "costs".
Definition: costmap_2d.hpp:69
unsigned int cellDistance(double world_dist)
Given distance in the world... convert it to cells.
Definition: costmap_2d.cpp:254
Abstract interface for inflation layers, providing common methods needed by navigation components reg...
Costmap2D * getCostmap()
Get the costmap pointer to the master costmap.
Layer to convolve costmap by robot's radius or footprint to prevent collisions and largely simply col...
void enqueue(unsigned int index, unsigned int mx, unsigned int my, unsigned int src_x, unsigned int src_y)
Enqueue new cells in cache distance update search.
unsigned char computeCost(double distance) const override
Given a distance, compute a cost.
double getInflationRadius() override
Get the inflation radius.
void updateBounds(double robot_x, double robot_y, double robot_yaw, double *min_x, double *min_y, double *max_x, double *max_y) override
Update the bounds of the master costmap by this layer's update dimensions.
void matchSize() override
Match the size of the master costmap.
int generateIntegerDistances()
Compute cached dsitances.
void onInitialize() override
Initialization process of layer on startup.
rcl_interfaces::msg::SetParametersResult dynamicParametersCallback(std::vector< rclcpp::Parameter > parameters)
Callback executed when a parameter change is detected.
void reset() override
Reset this costmap.
void computeCaches()
Compute cached dsitances.
unsigned int cellDistance(double world_dist)
Compute cached dsitances.
bool isClearable() override
If clearing operations should be processed on this layer or not.
void updateCosts(nav2_costmap_2d::Costmap2D &master_grid, int min_i, int min_j, int max_i, int max_j) override
Update the costs in the master costmap in the window.
unsigned char costLookup(unsigned int mx, unsigned int my, unsigned int src_x, unsigned int src_y)
Lookup pre-computed costs.
void onFootprintChanged() override
Process updates on footprint changes to the inflation layer.
double distanceLookup(unsigned int mx, unsigned int my, unsigned int src_x, unsigned int src_y)
Lookup pre-computed distances.
mutex_t * getMutex() override
Get the mutex of the inflation information.
double getCostScalingFactor() override
Get the cost scaling factor.