Nav2 Navigation Stack - jazzy  jazzy
ROS 2 Navigation Stack
costmap_layer.cpp
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 
39 #include <nav2_costmap_2d/costmap_layer.hpp>
40 #include <stdexcept>
41 #include <algorithm>
42 
43 namespace nav2_costmap_2d
44 {
45 
47  double x, double y, double * min_x, double * min_y, double * max_x,
48  double * max_y)
49 {
50  *min_x = std::min(x, *min_x);
51  *min_y = std::min(y, *min_y);
52  *max_x = std::max(x, *max_x);
53  *max_y = std::max(y, *max_y);
54 }
55 
57 {
58  std::lock_guard<Costmap2D::mutex_t> guard(*getMutex());
59  Costmap2D * master = layered_costmap_->getCostmap();
60  if (!master) {
61  RCLCPP_WARN(
62  rclcpp::get_logger("nav2_costmap_2d"),
63  "Cannot match size for layer, master costmap is not initialized yet.");
64  return;
65  }
66  resizeMap(
67  master->getSizeInCellsX(), master->getSizeInCellsY(), master->getResolution(),
68  master->getOriginX(), master->getOriginY());
69 }
70 
71 void CostmapLayer::clearArea(int start_x, int start_y, int end_x, int end_y, bool invert)
72 {
73  current_ = false;
74  unsigned char * grid = getCharMap();
75  for (int x = 0; x < static_cast<int>(getSizeInCellsX()); x++) {
76  bool xrange = x > start_x && x < end_x;
77 
78  for (int y = 0; y < static_cast<int>(getSizeInCellsY()); y++) {
79  if ((xrange && y > start_y && y < end_y) == invert) {
80  continue;
81  }
82  int index = getIndex(x, y);
83  if (grid[index] != NO_INFORMATION) {
84  grid[index] = NO_INFORMATION;
85  }
86  }
87  }
88 }
89 
90 void CostmapLayer::addExtraBounds(double mx0, double my0, double mx1, double my1)
91 {
92  extra_min_x_ = std::min(mx0, extra_min_x_);
93  extra_max_x_ = std::max(mx1, extra_max_x_);
94  extra_min_y_ = std::min(my0, extra_min_y_);
95  extra_max_y_ = std::max(my1, extra_max_y_);
96  has_extra_bounds_ = true;
97 }
98 
99 void CostmapLayer::useExtraBounds(double * min_x, double * min_y, double * max_x, double * max_y)
100 {
101  if (!has_extra_bounds_) {
102  return;
103  }
104 
105  *min_x = std::min(extra_min_x_, *min_x);
106  *min_y = std::min(extra_min_y_, *min_y);
107  *max_x = std::max(extra_max_x_, *max_x);
108  *max_y = std::max(extra_max_y_, *max_y);
109  extra_min_x_ = 1e6;
110  extra_min_y_ = 1e6;
111  extra_max_x_ = -1e6;
112  extra_max_y_ = -1e6;
113  has_extra_bounds_ = false;
114 }
115 
116 void CostmapLayer::updateWithMax(
117  nav2_costmap_2d::Costmap2D & master_grid, int min_i, int min_j,
118  int max_i,
119  int max_j)
120 {
121  if (!enabled_) {
122  return;
123  }
124 
125  unsigned char * master_array = master_grid.getCharMap();
126  unsigned int span = master_grid.getSizeInCellsX();
127 
128  for (int j = min_j; j < max_j; j++) {
129  unsigned int it = j * span + min_i;
130  for (int i = min_i; i < max_i; i++) {
131  if (costmap_[it] == NO_INFORMATION) {
132  it++;
133  continue;
134  }
135 
136  unsigned char old_cost = master_array[it];
137  if (old_cost == NO_INFORMATION || old_cost < costmap_[it]) {
138  master_array[it] = costmap_[it];
139  }
140  it++;
141  }
142  }
143 }
144 
145 void CostmapLayer::updateWithMaxWithoutUnknownOverwrite(
146  nav2_costmap_2d::Costmap2D & master_grid, int min_i, int min_j,
147  int max_i,
148  int max_j)
149 {
150  if (!enabled_) {
151  return;
152  }
153 
154  unsigned char * master_array = master_grid.getCharMap();
155  unsigned int span = master_grid.getSizeInCellsX();
156 
157  for (int j = min_j; j < max_j; j++) {
158  unsigned int it = j * span + min_i;
159  for (int i = min_i; i < max_i; i++) {
160  if (costmap_[it] == NO_INFORMATION) {
161  it++;
162  continue;
163  }
164 
165  unsigned char old_cost = master_array[it];
166  if (old_cost != NO_INFORMATION && old_cost < costmap_[it]) {
167  master_array[it] = costmap_[it];
168  }
169  it++;
170  }
171  }
172 }
173 
174 void CostmapLayer::updateWithTrueOverwrite(
175  nav2_costmap_2d::Costmap2D & master_grid, int min_i,
176  int min_j,
177  int max_i,
178  int max_j)
179 {
180  if (!enabled_) {
181  return;
182  }
183 
184  if (costmap_ == nullptr) {
185  throw std::runtime_error("Can't update costmap layer: It has't been initialized yet!");
186  }
187 
188  unsigned char * master = master_grid.getCharMap();
189  unsigned int span = master_grid.getSizeInCellsX();
190 
191  for (int j = min_j; j < max_j; j++) {
192  unsigned int it = span * j + min_i;
193  for (int i = min_i; i < max_i; i++) {
194  master[it] = costmap_[it];
195  it++;
196  }
197  }
198 }
199 
200 void CostmapLayer::updateWithOverwrite(
201  nav2_costmap_2d::Costmap2D & master_grid,
202  int min_i, int min_j, int max_i, int max_j)
203 {
204  if (!enabled_) {
205  return;
206  }
207  unsigned char * master = master_grid.getCharMap();
208  unsigned int span = master_grid.getSizeInCellsX();
209 
210  for (int j = min_j; j < max_j; j++) {
211  unsigned int it = span * j + min_i;
212  for (int i = min_i; i < max_i; i++) {
213  if (costmap_[it] != NO_INFORMATION) {
214  master[it] = costmap_[it];
215  }
216  it++;
217  }
218  }
219 }
220 
221 void CostmapLayer::updateWithAddition(
222  nav2_costmap_2d::Costmap2D & master_grid,
223  int min_i, int min_j, int max_i, int max_j)
224 {
225  if (!enabled_) {
226  return;
227  }
228  unsigned char * master_array = master_grid.getCharMap();
229  unsigned int span = master_grid.getSizeInCellsX();
230 
231  for (int j = min_j; j < max_j; j++) {
232  unsigned int it = j * span + min_i;
233  for (int i = min_i; i < max_i; i++) {
234  if (costmap_[it] == NO_INFORMATION) {
235  it++;
236  continue;
237  }
238 
239  unsigned char old_cost = master_array[it];
240  if (old_cost == NO_INFORMATION) {
241  master_array[it] = costmap_[it];
242  } else {
243  int sum = old_cost + costmap_[it];
244  if (sum >= nav2_costmap_2d::INSCRIBED_INFLATED_OBSTACLE) {
245  master_array[it] = nav2_costmap_2d::INSCRIBED_INFLATED_OBSTACLE - 1;
246  } else {
247  master_array[it] = sum;
248  }
249  }
250  it++;
251  }
252  }
253 }
254 
256 {
257  switch (value) {
258  case 0:
260  case 1:
261  return CombinationMethod::Max;
262  case 2:
264  default:
265  RCLCPP_WARN(
266  logger_,
267  "Param combination_method: %i. Possible values are 0 (Overwrite) or 1 (Maximum) or "
268  "2 (Maximum without overwriting the master's NO_INFORMATION values)."
269  "The default value 1 will be used", value);
270  return CombinationMethod::Max;
271  }
272 }
273 } // namespace nav2_costmap_2d
A 2D costmap provides a mapping between points in the world and their associated "costs".
Definition: costmap_2d.hpp:68
unsigned int getIndex(unsigned int mx, unsigned int my) const
Given two map coordinates... compute the associated index.
Definition: costmap_2d.hpp:221
void resizeMap(unsigned int size_x, unsigned int size_y, double resolution, double origin_x, double origin_y)
Resize the costmap.
Definition: costmap_2d.cpp:110
unsigned char * getCharMap() const
Will return a pointer to the underlying unsigned char array used as the costmap.
Definition: costmap_2d.cpp:259
double getResolution() const
Accessor for the resolution of the costmap.
Definition: costmap_2d.cpp:544
unsigned int getSizeInCellsX() const
Accessor for the x size of the costmap in cells.
Definition: costmap_2d.cpp:514
double getOriginY() const
Accessor for the y origin of the costmap.
Definition: costmap_2d.cpp:539
unsigned int getSizeInCellsY() const
Accessor for the y size of the costmap in cells.
Definition: costmap_2d.cpp:519
double getOriginX() const
Accessor for the x origin of the costmap.
Definition: costmap_2d.cpp:534
void addExtraBounds(double mx0, double my0, double mx1, double my1)
void touch(double x, double y, double *min_x, double *min_y, double *max_x, double *max_y)
virtual void clearArea(int start_x, int start_y, int end_x, int end_y, bool invert)
Clear an are in the costmap with the given dimension if invert, then clear everything except these di...
virtual void matchSize()
Match the size of the master costmap.
CombinationMethod combination_method_from_int(const int value)
Converts an integer to a CombinationMethod enum and logs on failure.
Costmap2D * getCostmap()
Get the costmap pointer to the master costmap.