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);
69 bool xrange = x > start_x && x < end_x;
72 if ((xrange && y > start_y && y < end_y) == invert) {
76 if (grid[index] != NO_INFORMATION) {
77 grid[index] = NO_INFORMATION;
85 extra_min_x_ = std::min(mx0, extra_min_x_);
86 extra_max_x_ = std::max(mx1, extra_max_x_);
87 extra_min_y_ = std::min(my0, extra_min_y_);
88 extra_max_y_ = std::max(my1, extra_max_y_);
89 has_extra_bounds_ =
true;
92 void CostmapLayer::useExtraBounds(
double * min_x,
double * min_y,
double * max_x,
double * max_y)
94 if (!has_extra_bounds_) {
98 *min_x = std::min(extra_min_x_, *min_x);
99 *min_y = std::min(extra_min_y_, *min_y);
100 *max_x = std::max(extra_max_x_, *max_x);
101 *max_y = std::max(extra_max_y_, *max_y);
106 has_extra_bounds_ =
false;
109 void CostmapLayer::updateWithMax(
118 unsigned char * master_array = master_grid.
getCharMap();
121 for (
int j = min_j; j < max_j; j++) {
122 unsigned int it = j * span + min_i;
123 for (
int i = min_i; i < max_i; i++) {
124 if (costmap_[it] == NO_INFORMATION) {
129 unsigned char old_cost = master_array[it];
130 if (old_cost == NO_INFORMATION || old_cost < costmap_[it]) {
131 master_array[it] = costmap_[it];
138 void CostmapLayer::updateWithTrueOverwrite(
148 if (costmap_ ==
nullptr) {
149 throw std::runtime_error(
"Can't update costmap layer: It has't been initialized yet!");
152 unsigned char * master = master_grid.
getCharMap();
155 for (
int j = min_j; j < max_j; j++) {
156 unsigned int it = span * j + min_i;
157 for (
int i = min_i; i < max_i; i++) {
158 master[it] = costmap_[it];
164 void CostmapLayer::updateWithOverwrite(
166 int min_i,
int min_j,
int max_i,
int max_j)
171 unsigned char * master = master_grid.
getCharMap();
174 for (
int j = min_j; j < max_j; j++) {
175 unsigned int it = span * j + min_i;
176 for (
int i = min_i; i < max_i; i++) {
177 if (costmap_[it] != NO_INFORMATION) {
178 master[it] = costmap_[it];
185 void CostmapLayer::updateWithAddition(
187 int min_i,
int min_j,
int max_i,
int max_j)
192 unsigned char * master_array = master_grid.
getCharMap();
195 for (
int j = min_j; j < max_j; j++) {
196 unsigned int it = j * span + min_i;
197 for (
int i = min_i; i < max_i; i++) {
198 if (costmap_[it] == NO_INFORMATION) {
203 unsigned char old_cost = master_array[it];
204 if (old_cost == NO_INFORMATION) {
205 master_array[it] = costmap_[it];
207 int sum = old_cost + costmap_[it];
208 if (sum >= nav2_costmap_2d::INSCRIBED_INFLATED_OBSTACLE) {
209 master_array[it] = nav2_costmap_2d::INSCRIBED_INFLATED_OBSTACLE - 1;
211 master_array[it] = sum;
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.
Costmap2D * getCostmap()
Get the costmap pointer to the master costmap.