39 #include <nav2_costmap_2d/costmap_layer.hpp>
47 double x,
double y,
double * min_x,
double * min_y,
double * max_x,
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);
58 std::lock_guard<Costmap2D::mutex_t> guard(*getMutex());
70 bool xrange = x > start_x && x < end_x;
73 if ((xrange && y > start_y && y < end_y) == invert) {
77 if (grid[index] != NO_INFORMATION) {
78 grid[index] = NO_INFORMATION;
86 extra_min_x_ = std::min(mx0, extra_min_x_);
87 extra_max_x_ = std::max(mx1, extra_max_x_);
88 extra_min_y_ = std::min(my0, extra_min_y_);
89 extra_max_y_ = std::max(my1, extra_max_y_);
90 has_extra_bounds_ =
true;
93 void CostmapLayer::useExtraBounds(
double * min_x,
double * min_y,
double * max_x,
double * max_y)
95 if (!has_extra_bounds_) {
99 *min_x = std::min(extra_min_x_, *min_x);
100 *min_y = std::min(extra_min_y_, *min_y);
101 *max_x = std::max(extra_max_x_, *max_x);
102 *max_y = std::max(extra_max_y_, *max_y);
107 has_extra_bounds_ =
false;
110 void CostmapLayer::updateWithMax(
119 unsigned char * master_array = master_grid.
getCharMap();
122 for (
int j = min_j; j < max_j; j++) {
123 unsigned int it = j * span + min_i;
124 for (
int i = min_i; i < max_i; i++) {
125 if (costmap_[it] == NO_INFORMATION) {
130 unsigned char old_cost = master_array[it];
131 if (old_cost == NO_INFORMATION || old_cost < costmap_[it]) {
132 master_array[it] = costmap_[it];
139 void CostmapLayer::updateWithMaxWithoutUnknownOverwrite(
148 unsigned char * master_array = master_grid.
getCharMap();
151 for (
int j = min_j; j < max_j; j++) {
152 unsigned int it = j * span + min_i;
153 for (
int i = min_i; i < max_i; i++) {
154 if (costmap_[it] == NO_INFORMATION) {
159 unsigned char old_cost = master_array[it];
160 if (old_cost != NO_INFORMATION && old_cost < costmap_[it]) {
161 master_array[it] = costmap_[it];
168 void CostmapLayer::updateWithTrueOverwrite(
178 if (costmap_ ==
nullptr) {
179 throw std::runtime_error(
"Can't update costmap layer: It has't been initialized yet!");
182 unsigned char * master = master_grid.
getCharMap();
185 for (
int j = min_j; j < max_j; j++) {
186 unsigned int it = span * j + min_i;
187 for (
int i = min_i; i < max_i; i++) {
188 master[it] = costmap_[it];
194 void CostmapLayer::updateWithOverwrite(
196 int min_i,
int min_j,
int max_i,
int max_j)
201 unsigned char * master = master_grid.
getCharMap();
204 for (
int j = min_j; j < max_j; j++) {
205 unsigned int it = span * j + min_i;
206 for (
int i = min_i; i < max_i; i++) {
207 if (costmap_[it] != NO_INFORMATION) {
208 master[it] = costmap_[it];
215 void CostmapLayer::updateWithAddition(
217 int min_i,
int min_j,
int max_i,
int max_j)
222 unsigned char * master_array = master_grid.
getCharMap();
225 for (
int j = min_j; j < max_j; j++) {
226 unsigned int it = j * span + min_i;
227 for (
int i = min_i; i < max_i; i++) {
228 if (costmap_[it] == NO_INFORMATION) {
233 unsigned char old_cost = master_array[it];
234 if (old_cost == NO_INFORMATION) {
235 master_array[it] = costmap_[it];
237 int sum = old_cost + costmap_[it];
238 if (sum >= nav2_costmap_2d::INSCRIBED_INFLATED_OBSTACLE) {
239 master_array[it] = nav2_costmap_2d::INSCRIBED_INFLATED_OBSTACLE - 1;
241 master_array[it] = sum;
261 "Param combination_method: %i. Possible values are 0 (Overwrite) or 1 (Maximum) or "
262 "2 (Maximum without overwriting the master's NO_INFORMATION values)."
263 "The default value 1 will be used", value);
A 2D costmap provides a mapping between points in the world and their associated "costs".
unsigned int getIndex(unsigned int mx, unsigned int my) const
Given two map coordinates... compute the associated index.
void resizeMap(unsigned int size_x, unsigned int size_y, double resolution, double origin_x, double origin_y)
Resize the costmap.
unsigned char * getCharMap() const
Will return a pointer to the underlying unsigned char array used as the costmap.
double getResolution() const
Accessor for the resolution of the costmap.
unsigned int getSizeInCellsX() const
Accessor for the x size of the costmap in cells.
double getOriginY() const
Accessor for the y origin of the costmap.
unsigned int getSizeInCellsY() const
Accessor for the y size of the costmap in cells.
double getOriginX() const
Accessor for the x origin of the costmap.
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.
@ MaxWithoutUnknownOverwrite