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());
73 start_x = std::clamp(start_x, 0, size_x);
74 start_y = std::clamp(start_y, 0, size_y);
75 end_x = std::clamp(end_x, 0, size_x);
76 end_y = std::clamp(end_y, 0, size_y);
78 for (
int x = 0; x < size_x; x++) {
79 bool xrange = x > start_x && x < end_x;
81 for (
int y = 0; y < size_y; y++) {
82 if ((xrange && y > start_y && y < end_y) == invert) {
86 if (grid[index] != NO_INFORMATION) {
87 grid[index] = NO_INFORMATION;
95 extra_min_x_ = std::min(mx0, extra_min_x_);
96 extra_max_x_ = std::max(mx1, extra_max_x_);
97 extra_min_y_ = std::min(my0, extra_min_y_);
98 extra_max_y_ = std::max(my1, extra_max_y_);
99 has_extra_bounds_ =
true;
102 void CostmapLayer::useExtraBounds(
double * min_x,
double * min_y,
double * max_x,
double * max_y)
104 if (!has_extra_bounds_) {
108 *min_x = std::min(extra_min_x_, *min_x);
109 *min_y = std::min(extra_min_y_, *min_y);
110 *max_x = std::max(extra_max_x_, *max_x);
111 *max_y = std::max(extra_max_y_, *max_y);
116 has_extra_bounds_ =
false;
119 void CostmapLayer::updateWithMax(
128 unsigned char * master_array = master_grid.
getCharMap();
131 for (
int j = min_j; j < max_j; j++) {
132 unsigned int it = j * span + min_i;
133 for (
int i = min_i; i < max_i; i++) {
134 if (costmap_[it] == NO_INFORMATION) {
139 unsigned char old_cost = master_array[it];
140 if (old_cost == NO_INFORMATION || old_cost < costmap_[it]) {
141 master_array[it] = costmap_[it];
148 void CostmapLayer::updateWithMaxWithoutUnknownOverwrite(
157 unsigned char * master_array = master_grid.
getCharMap();
160 for (
int j = min_j; j < max_j; j++) {
161 unsigned int it = j * span + min_i;
162 for (
int i = min_i; i < max_i; i++) {
163 if (costmap_[it] == NO_INFORMATION) {
168 unsigned char old_cost = master_array[it];
169 if (old_cost != NO_INFORMATION && old_cost < costmap_[it]) {
170 master_array[it] = costmap_[it];
177 void CostmapLayer::updateWithTrueOverwrite(
187 if (costmap_ ==
nullptr) {
188 throw std::runtime_error(
"Can't update costmap layer: It has't been initialized yet!");
191 unsigned char * master = master_grid.
getCharMap();
194 for (
int j = min_j; j < max_j; j++) {
195 unsigned int it = span * j + min_i;
196 for (
int i = min_i; i < max_i; i++) {
197 master[it] = costmap_[it];
203 void CostmapLayer::updateWithOverwrite(
205 int min_i,
int min_j,
int max_i,
int max_j)
210 unsigned char * master = master_grid.
getCharMap();
213 for (
int j = min_j; j < max_j; j++) {
214 unsigned int it = span * j + min_i;
215 for (
int i = min_i; i < max_i; i++) {
216 if (costmap_[it] != NO_INFORMATION) {
217 master[it] = costmap_[it];
224 void CostmapLayer::updateWithAddition(
226 int min_i,
int min_j,
int max_i,
int max_j)
231 unsigned char * master_array = master_grid.
getCharMap();
234 for (
int j = min_j; j < max_j; j++) {
235 unsigned int it = j * span + min_i;
236 for (
int i = min_i; i < max_i; i++) {
237 if (costmap_[it] == NO_INFORMATION) {
242 unsigned char old_cost = master_array[it];
243 if (old_cost == NO_INFORMATION) {
244 master_array[it] = costmap_[it];
246 int sum = old_cost + costmap_[it];
247 if (sum >= nav2_costmap_2d::INSCRIBED_INFLATED_OBSTACLE) {
248 master_array[it] = nav2_costmap_2d::INSCRIBED_INFLATED_OBSTACLE - 1;
250 master_array[it] = sum;
270 "Param combination_method: %i. Possible values are 0 (Overwrite) or 1 (Maximum) or "
271 "2 (Maximum without overwriting the master's NO_INFORMATION values)."
272 "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