38 #include "nav2_costmap_2d/costmap_2d.hpp"
44 #include "nav2_costmap_2d/cost_values.hpp"
45 #include "nav2_util/occ_grid_values.hpp"
46 #include "nav2_util/raytrace_line_2d.hpp"
51 unsigned int cells_size_x,
unsigned int cells_size_y,
double resolution,
52 double origin_x,
double origin_y,
unsigned char default_value)
53 : resolution_(resolution), origin_x_(origin_x),
54 origin_y_(origin_y), costmap_(NULL), default_value_(default_value)
56 access_ =
new mutex_t();
59 initMaps(cells_size_x, cells_size_y);
64 : default_value_(FREE_SPACE)
66 access_ =
new mutex_t();
69 size_x_ = map.info.width;
70 size_y_ = map.info.height;
71 resolution_ = map.info.resolution;
72 origin_x_ = map.info.origin.position.x;
73 origin_y_ = map.info.origin.position.y;
76 costmap_ =
new unsigned char[size_x_ * size_y_];
80 for (
unsigned int it = 0; it < size_x_ * size_y_; it++) {
82 if (data == nav2_util::OCC_GRID_UNKNOWN) {
83 costmap_[it] = NO_INFORMATION;
87 costmap_[it] = std::round(
88 static_cast<double>(data) * (LETHAL_OBSTACLE - FREE_SPACE) /
89 (nav2_util::OCC_GRID_OCCUPIED - nav2_util::OCC_GRID_FREE));
97 std::unique_lock<mutex_t> lock(*access_);
104 std::unique_lock<mutex_t> lock(*access_);
108 costmap_ =
new unsigned char[size_x * size_y];
112 unsigned int size_x,
unsigned int size_y,
double resolution,
113 double origin_x,
double origin_y)
115 resolution_ = resolution;
116 origin_x_ = origin_x;
117 origin_y_ = origin_y;
127 std::unique_lock<mutex_t> lock(*access_);
128 memset(costmap_, default_value_, size_x_ * size_y_ *
sizeof(
unsigned char));
137 unsigned int x0,
unsigned int y0,
unsigned int xn,
unsigned int yn,
unsigned char value)
139 std::unique_lock<mutex_t> lock(*(access_));
140 unsigned int len = xn - x0;
141 for (
unsigned int y = y0 * size_x_ + x0; y < yn * size_x_ + x0; y += size_x_) {
142 memset(costmap_ + y, value, len *
sizeof(
unsigned char));
147 const Costmap2D & map,
double win_origin_x,
double win_origin_y,
161 unsigned int lower_left_x, lower_left_y, upper_right_x, upper_right_y;
162 if (!map.
worldToMap(win_origin_x, win_origin_y, lower_left_x, lower_left_y) ||
164 win_origin_x + win_size_x, win_origin_y + win_size_y, upper_right_x,
170 resolution_ = map.resolution_;
171 origin_x_ = win_origin_x;
172 origin_y_ = win_origin_y;
175 initMaps(upper_right_x - lower_left_x, upper_right_y - lower_left_y);
179 map.costmap_, lower_left_x, lower_left_y, map.size_x_, costmap_, 0, 0, size_x_,
187 unsigned int sx0,
unsigned int sy0,
unsigned int sxn,
unsigned int syn,
188 unsigned int dx0,
unsigned int dy0)
190 const unsigned int sz_x = sxn - sx0;
191 const unsigned int sz_y = syn - sy0;
197 if (dx0 + sz_x > size_x_ || dy0 + sz_y > size_y_) {
202 source.costmap_, sx0, sy0, source.size_x_,
203 costmap_, dx0, dy0, size_x_,
218 size_x_ = map.size_x_;
219 size_y_ = map.size_y_;
220 resolution_ = map.resolution_;
221 origin_x_ = map.origin_x_;
222 origin_y_ = map.origin_y_;
223 default_value_ = map.default_value_;
229 memcpy(costmap_, map.costmap_, size_x_ * size_y_ *
sizeof(
unsigned char));
237 access_ =
new mutex_t();
243 : size_x_(0), size_y_(0), resolution_(0.0), origin_x_(0.0), origin_y_(0.0), costmap_(NULL)
245 access_ =
new mutex_t();
256 double cells_dist = std::max(0.0, ceil(world_dist / resolution_));
257 return (
unsigned int)cells_dist;
272 return costmap_[undex];
282 wx = origin_x_ + (mx + 0.5) * resolution_;
283 wy = origin_y_ + (my + 0.5) * resolution_;
288 wx = origin_x_ + (mx + 0.5) * resolution_;
289 wy = origin_y_ + (my + 0.5) * resolution_;
294 if (wx < origin_x_ || wy < origin_y_) {
298 mx =
static_cast<unsigned int>((wx - origin_x_) / resolution_);
299 my =
static_cast<unsigned int>((wy - origin_y_) / resolution_);
301 if (mx < size_x_ && my < size_y_) {
309 if (wx < origin_x_ || wy < origin_y_) {
313 mx =
static_cast<float>((wx - origin_x_) / resolution_);
314 my =
static_cast<float>((wy - origin_y_) / resolution_);
316 if (mx < size_x_ && my < size_y_) {
324 mx =
static_cast<int>((wx - origin_x_) / resolution_);
325 my =
static_cast<int>((wy - origin_y_) / resolution_);
333 if (wx < origin_x_) {
335 }
else if (wx > resolution_ * size_x_ + origin_x_) {
338 mx =
static_cast<int>((wx - origin_x_) / resolution_);
341 if (wy < origin_y_) {
343 }
else if (wy > resolution_ * size_y_ + origin_y_) {
346 my =
static_cast<int>((wy - origin_y_) / resolution_);
353 int cell_ox, cell_oy;
354 cell_ox =
static_cast<int>((new_origin_x - origin_x_) / resolution_);
355 cell_oy =
static_cast<int>((new_origin_y - origin_y_) / resolution_);
359 double new_grid_ox, new_grid_oy;
360 new_grid_ox = origin_x_ + cell_ox * resolution_;
361 new_grid_oy = origin_y_ + cell_oy * resolution_;
364 int size_x = size_x_;
365 int size_y = size_y_;
368 int lower_left_x, lower_left_y, upper_right_x, upper_right_y;
369 lower_left_x = std::min(std::max(cell_ox, 0), size_x);
370 lower_left_y = std::min(std::max(cell_oy, 0), size_y);
371 upper_right_x = std::min(std::max(cell_ox + size_x, 0), size_x);
372 upper_right_y = std::min(std::max(cell_oy + size_y, 0), size_y);
374 unsigned int cell_size_x = upper_right_x - lower_left_x;
375 unsigned int cell_size_y = upper_right_y - lower_left_y;
378 unsigned char * local_map =
new unsigned char[cell_size_x * cell_size_y];
382 costmap_, lower_left_x, lower_left_y, size_x_, local_map, 0, 0, cell_size_x,
390 origin_x_ = new_grid_ox;
391 origin_y_ = new_grid_oy;
394 int start_x = lower_left_x - cell_ox;
395 int start_y = lower_left_y - cell_oy;
399 local_map, 0, 0, cell_size_x, costmap_, start_x, start_y, size_x_, cell_size_x,
407 const std::vector<geometry_msgs::msg::Point> & polygon,
408 unsigned char cost_value)
410 std::vector<MapLocation> polygon_map_region;
411 polygon_map_region.reserve(100);
422 const std::vector<MapLocation> & polygon_map_region,
423 unsigned char new_cost_value)
425 for (
const auto & cell : polygon_map_region) {
426 setCost(cell.x, cell.y, new_cost_value);
431 const std::vector<MapLocation> & polygon_map_region)
433 for (
const auto & cell : polygon_map_region) {
434 setCost(cell.x, cell.y, cell.cost);
439 const std::vector<geometry_msgs::msg::Point> & polygon,
440 std::vector<MapLocation> & polygon_map_region)
444 std::vector<MapLocation> map_polygon;
445 for (
const auto & cell : polygon) {
447 if (!
worldToMap(cell.x, cell.y, loc.x, loc.y)) {
451 map_polygon.push_back(loc);
461 const std::vector<MapLocation> & polygon,
462 std::vector<MapLocation> & polygon_cells)
465 for (
unsigned int i = 0; i < polygon.size() - 1; ++i) {
466 nav2_util::raytraceLine(
467 cell_gatherer, polygon[i].x, polygon[i].y, polygon[i + 1].x, polygon[i + 1].y, size_x_);
469 if (!polygon.empty()) {
470 unsigned int last_index = polygon.size() - 1;
472 nav2_util::raytraceLine(
473 cell_gatherer, polygon[last_index].x, polygon[last_index].y, polygon[0].x,
474 polygon[0].y, size_x_);
479 const std::vector<MapLocation> & polygon,
480 std::vector<MapLocation> & polygon_cells)
483 if (polygon.size() < 3) {
493 while (i < polygon_cells.size() - 1) {
494 if (polygon_cells[i].x > polygon_cells[i + 1].x) {
495 swap = polygon_cells[i];
496 polygon_cells[i] = polygon_cells[i + 1];
497 polygon_cells[i + 1] = swap;
510 unsigned int min_x = polygon_cells[0].x;
511 unsigned int max_x = polygon_cells[polygon_cells.size() - 1].x;
514 for (
unsigned int x = min_x; x <= max_x; ++x) {
515 if (i >= polygon_cells.size() - 1) {
519 if (polygon_cells[i].y < polygon_cells[i + 1].y) {
520 min_pt = polygon_cells[i];
521 max_pt = polygon_cells[i + 1];
523 min_pt = polygon_cells[i + 1];
524 max_pt = polygon_cells[i];
528 while (i < polygon_cells.size() && polygon_cells[i].x == x) {
529 if (polygon_cells[i].y < min_pt.y) {
530 min_pt = polygon_cells[i];
531 }
else if (polygon_cells[i].y > max_pt.y) {
532 max_pt = polygon_cells[i];
539 for (
unsigned int y = min_pt.y; y <= max_pt.y; ++y) {
543 polygon_cells.push_back(pt);
560 return (size_x_ - 1 + 0.5) * resolution_;
565 return (size_y_ - 1 + 0.5) * resolution_;
585 FILE * fp = fopen(file_name.c_str(),
"w");
591 fprintf(fp,
"P2\n%u\n%u\n%u\n", size_x_, size_y_, 0xff);
592 for (
unsigned int iy = 0; iy < size_y_; iy++) {
593 for (
unsigned int ix = 0; ix < size_x_; ix++) {
594 unsigned char cost =
getCost(ix, iy);
595 fprintf(fp,
"%d ", cost);
A 2D costmap provides a mapping between points in the world and their associated "costs".
void mapToWorld(unsigned int mx, unsigned int my, double &wx, double &wy) const
Convert from map coordinates to world coordinates.
void resetMap(unsigned int x0, unsigned int y0, unsigned int xn, unsigned int yn)
Reset the costmap in bounds.
unsigned int getIndex(unsigned int mx, unsigned int my) const
Given two map coordinates... compute the associated index.
void resetMapToValue(unsigned int x0, unsigned int y0, unsigned int xn, unsigned int yn, unsigned char value)
Reset the costmap in bounds to a value.
void resizeMap(unsigned int size_x, unsigned int size_y, double resolution, double origin_x, double origin_y)
Resize the costmap.
unsigned char getCost(unsigned int mx, unsigned int my) const
Get the cost of a cell in the costmap.
virtual ~Costmap2D()
Destructor.
void polygonOutlineCells(const std::vector< MapLocation > &polygon, std::vector< MapLocation > &polygon_cells)
Get the map cells that make up the outline of a polygon.
void mapToWorldNoBounds(int mx, int my, double &wx, double &wy) const
Convert from map coordinates to world coordinates with no bounds checking.
virtual void deleteMaps()
Deletes the costmap, static_map, and markers data structures.
bool saveMap(std::string file_name)
Save the costmap out to a pgm file.
bool copyWindow(const Costmap2D &source, unsigned int sx0, unsigned int sy0, unsigned int sxn, unsigned int syn, unsigned int dx0, unsigned int dy0)
Copies the (x0,y0)..(xn,yn) window from source costmap into a current costmap.
void worldToMapEnforceBounds(double wx, double wy, int &mx, int &my) const
Convert from world coordinates to map coordinates, constraining results to legal bounds.
unsigned char * getCharMap() const
Will return a pointer to the underlying unsigned char array used as the costmap.
bool worldToMap(double wx, double wy, unsigned int &mx, unsigned int &my) const
Convert from world coordinates to map coordinates.
void copyMapRegion(data_type *source_map, unsigned int sm_lower_left_x, unsigned int sm_lower_left_y, unsigned int sm_size_x, data_type *dest_map, unsigned int dm_lower_left_x, unsigned int dm_lower_left_y, unsigned int dm_size_x, unsigned int region_size_x, unsigned int region_size_y)
Copy a region of a source map into a destination map.
void convexFillCells(const std::vector< MapLocation > &polygon, std::vector< MapLocation > &polygon_cells)
Get the map cells that fill a convex polygon.
double getResolution() const
Accessor for the resolution of the costmap.
virtual void updateOrigin(double new_origin_x, double new_origin_y)
Move the origin of the costmap to a new location.... keeping data when it can.
Costmap2D()
Default constructor.
bool setConvexPolygonCost(const std::vector< geometry_msgs::msg::Point > &polygon, unsigned char cost_value)
Sets the cost of a convex polygon to a desired value.
double getSizeInMetersY() const
Accessor for the y size of the costmap in meters.
double getSizeInMetersX() const
Accessor for the x size of the costmap in meters.
void setMapRegionOccupiedByPolygon(const std::vector< MapLocation > &polygon_map_region, unsigned char new_cost_value)
Sets the given map region to desired value.
void restoreMapRegionOccupiedByPolygon(const std::vector< MapLocation > &polygon_map_region)
Restores the corresponding map region using given map region.
void worldToMapNoBounds(double wx, double wy, int &mx, int &my) const
Convert from world coordinates to map coordinates without checking for legal bounds.
bool worldToMapContinuous(double wx, double wy, float &mx, float &my) const
Convert from world coordinates to map coordinates.
virtual void initMaps(unsigned int size_x, unsigned int size_y)
Initializes the costmap, static_map, and markers data structures.
bool getMapRegionOccupiedByPolygon(const std::vector< geometry_msgs::msg::Point > &polygon, std::vector< MapLocation > &polygon_map_region)
Gets the map region occupied by polygon.
bool copyCostmapWindow(const Costmap2D &map, double win_origin_x, double win_origin_y, double win_size_x, double win_size_y)
Turn this costmap into a copy of a window of a costmap passed in.
unsigned int getSizeInCellsX() const
Accessor for the x size of the costmap in cells.
virtual void resetMaps()
Resets the costmap and static_map to be unknown space.
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 setCost(unsigned int mx, unsigned int my, unsigned char cost)
Set the cost of a cell in the costmap.
unsigned int cellDistance(double world_dist)
Given distance in the world... convert it to cells.
Costmap2D & operator=(const Costmap2D &map)
Overloaded assignment operator.