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());
62 rclcpp::get_logger(
"nav2_costmap_2d"),
63 "Cannot match size for layer, master costmap is not initialized yet.");
79 start_x = std::clamp(start_x, 0, size_x);
80 start_y = std::clamp(start_y, 0, size_y);
81 end_x = std::clamp(end_x, 0, size_x);
82 end_y = std::clamp(end_y, 0, size_y);
84 for (
int x = 0; x < size_x; x++) {
85 bool xrange = x > start_x && x < end_x;
87 for (
int y = 0; y < size_y; y++) {
88 if ((xrange && y > start_y && y < end_y) == invert) {
92 if (grid[index] != NO_INFORMATION) {
93 grid[index] = NO_INFORMATION;
101 extra_min_x_ = std::min(mx0, extra_min_x_);
102 extra_max_x_ = std::max(mx1, extra_max_x_);
103 extra_min_y_ = std::min(my0, extra_min_y_);
104 extra_max_y_ = std::max(my1, extra_max_y_);
105 has_extra_bounds_ =
true;
108 void CostmapLayer::useExtraBounds(
double * min_x,
double * min_y,
double * max_x,
double * max_y)
110 if (!has_extra_bounds_) {
114 *min_x = std::min(extra_min_x_, *min_x);
115 *min_y = std::min(extra_min_y_, *min_y);
116 *max_x = std::max(extra_max_x_, *max_x);
117 *max_y = std::max(extra_max_y_, *max_y);
122 has_extra_bounds_ =
false;
125 void CostmapLayer::updateWithMax(
134 unsigned char * master_array = master_grid.
getCharMap();
137 for (
int j = min_j; j < max_j; j++) {
138 unsigned int it = j * span + min_i;
139 for (
int i = min_i; i < max_i; i++) {
140 if (costmap_[it] == NO_INFORMATION) {
145 unsigned char old_cost = master_array[it];
146 if (old_cost == NO_INFORMATION || old_cost < costmap_[it]) {
147 master_array[it] = costmap_[it];
154 void CostmapLayer::updateWithMaxWithoutUnknownOverwrite(
163 unsigned char * master_array = master_grid.
getCharMap();
166 for (
int j = min_j; j < max_j; j++) {
167 unsigned int it = j * span + min_i;
168 for (
int i = min_i; i < max_i; i++) {
169 if (costmap_[it] == NO_INFORMATION) {
174 unsigned char old_cost = master_array[it];
175 if (old_cost != NO_INFORMATION && old_cost < costmap_[it]) {
176 master_array[it] = costmap_[it];
183 void CostmapLayer::updateWithTrueOverwrite(
193 if (costmap_ ==
nullptr) {
194 throw std::runtime_error(
"Can't update costmap layer: It has't been initialized yet!");
197 unsigned char * master = master_grid.
getCharMap();
200 for (
int j = min_j; j < max_j; j++) {
201 unsigned int it = span * j + min_i;
202 for (
int i = min_i; i < max_i; i++) {
203 master[it] = costmap_[it];
209 void CostmapLayer::updateWithOverwrite(
211 int min_i,
int min_j,
int max_i,
int max_j)
216 unsigned char * master = master_grid.
getCharMap();
219 for (
int j = min_j; j < max_j; j++) {
220 unsigned int it = span * j + min_i;
221 for (
int i = min_i; i < max_i; i++) {
222 if (costmap_[it] != NO_INFORMATION) {
223 master[it] = costmap_[it];
230 void CostmapLayer::updateWithAddition(
232 int min_i,
int min_j,
int max_i,
int max_j)
237 unsigned char * master_array = master_grid.
getCharMap();
240 for (
int j = min_j; j < max_j; j++) {
241 unsigned int it = j * span + min_i;
242 for (
int i = min_i; i < max_i; i++) {
243 if (costmap_[it] == NO_INFORMATION) {
248 unsigned char old_cost = master_array[it];
249 if (old_cost == NO_INFORMATION) {
250 master_array[it] = costmap_[it];
252 int sum = old_cost + costmap_[it];
253 if (sum >= nav2_costmap_2d::INSCRIBED_INFLATED_OBSTACLE) {
254 master_array[it] = nav2_costmap_2d::INSCRIBED_INFLATED_OBSTACLE - 1;
256 master_array[it] = sum;
276 "Param combination_method: %i. Possible values are 0 (Overwrite) or 1 (Maximum) or "
277 "2 (Maximum without overwriting the master's NO_INFORMATION values)."
278 "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.
void setCurrent(bool current)
Set whether the data in the layer is up to date.
Costmap2D * getCostmap()
Get the costmap pointer to the master costmap.
@ MaxWithoutUnknownOverwrite