EasyNav Plugins
Loading...
Searching...
No Matches
costmap_2d.hpp
Go to the documentation of this file.
1/*********************************************************************
2 *
3 * Software License Agreement (BSD License)
4 *
5 * Copyright (c) 2008, 2013, Willow Garage, Inc.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * * Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * * Redistributions in binary form must reproduce the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer in the documentation and/or other materials provided
17 * with the distribution.
18 * * Neither the name of Willow Garage, Inc. nor the names of its
19 * contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
34 *
35 * Author: Eitan Marder-Eppstein
36 * David V. Lu!!
37 *********************************************************************/
38#ifndef EASYNAV_COSTMAP_COMMON__COSTMAP_2D_HPP_
39#define EASYNAV_COSTMAP_COMMON__COSTMAP_2D_HPP_
40
41#include <cstring>
42#include <algorithm>
43#include <cmath>
44#include <climits>
45#include <vector>
46#include <mutex>
47#include "geometry_msgs/msg/point.hpp"
48#include "nav_msgs/msg/occupancy_grid.hpp"
49
50namespace easynav
51{
52
53// convenient for storing x/y point pairs
55{
56 unsigned int x;
57 unsigned int y;
58 unsigned char cost;
59};
60
66{
67 friend class CostmapTester; // Need this for gtest to work correctly
68
69public:
80 unsigned int cells_size_x, unsigned int cells_size_y, double resolution,
81 double origin_x, double origin_y, unsigned char default_value = 0);
82
87 Costmap2D(const Costmap2D & map);
88
93 explicit Costmap2D(const nav_msgs::msg::OccupancyGrid & map);
94
100 Costmap2D & operator=(const Costmap2D & map);
101
108 bool inBounds(unsigned int x, unsigned int y) const;
109
119 const Costmap2D & map, double win_origin_x, double win_origin_y,
120 double win_size_x,
121 double win_size_y);
122
131 void toOccupancyGridMsg(nav_msgs::msg::OccupancyGrid & msg) const;
132
144 bool copyWindow(
145 const Costmap2D & source,
146 unsigned int sx0, unsigned int sy0, unsigned int sxn, unsigned int syn,
147 unsigned int dx0, unsigned int dy0);
148
152 Costmap2D();
153
157 virtual ~Costmap2D();
158
165 unsigned char getCost(unsigned int mx, unsigned int my) const;
166
172 unsigned char getCost(unsigned int index) const;
173
180 void setCost(unsigned int mx, unsigned int my, unsigned char cost);
181
189 void mapToWorld(unsigned int mx, unsigned int my, double & wx, double & wy) const;
190
198 void mapToWorldNoBounds(int mx, int my, double & wx, double & wy) const;
199
208 bool worldToMap(double wx, double wy, unsigned int & mx, unsigned int & my) const;
209
218 bool worldToMapContinuous(double wx, double wy, float & mx, float & my) const;
219
228 void worldToMapNoBounds(double wx, double wy, int & mx, int & my) const;
229
238 void worldToMapEnforceBounds(double wx, double wy, int & mx, int & my) const;
239
246 inline unsigned int getIndex(unsigned int mx, unsigned int my) const
247 {
248 return my * size_x_ + mx;
249 }
250
257 inline void indexToCells(unsigned int index, unsigned int & mx, unsigned int & my) const
258 {
259 my = index / size_x_;
260 mx = index - (my * size_x_);
261 }
262
267 unsigned char * getCharMap() const;
268
273 unsigned int getSizeInCellsX() const;
274
279 unsigned int getSizeInCellsY() const;
280
285 double getSizeInMetersX() const;
286
291 double getSizeInMetersY() const;
292
297 double getOriginX() const;
298
303 double getOriginY() const;
304
309 double getResolution() const;
310
315 void setDefaultValue(unsigned char c)
316 {
317 default_value_ = c;
318 }
319
324 unsigned char getDefaultValue()
325 {
326 return default_value_;
327 }
328
336 const std::vector<geometry_msgs::msg::Point> & polygon,
337 unsigned char cost_value);
338
346 const std::vector<geometry_msgs::msg::Point> & polygon,
347 std::vector<MapLocation> & polygon_map_region);
348
355 const std::vector<MapLocation> & polygon_map_region,
356 unsigned char new_cost_value);
357
363 const std::vector<MapLocation> & polygon_map_region);
364
371 const std::vector<MapLocation> & polygon,
372 std::vector<MapLocation> & polygon_cells);
373
379 void convexFillCells(
380 const std::vector<MapLocation> & polygon,
381 std::vector<MapLocation> & polygon_cells);
382
388 virtual void updateOrigin(double new_origin_x, double new_origin_y);
389
393 void resizeMap(
394 unsigned int size_x, unsigned int size_y, double resolution, double origin_x,
395 double origin_y);
396
400 void resetMap(unsigned int x0, unsigned int y0, unsigned int xn, unsigned int yn);
401
405 void resetMapToValue(
406 unsigned int x0, unsigned int y0, unsigned int xn, unsigned int yn, unsigned char value);
407
413 unsigned int cellDistance(double world_dist);
414
415 // Provide a typedef to ease future code maintenance
416 typedef std::recursive_mutex mutex_t;
418 {
419 return access_;
420 }
421
422protected:
436 template<typename data_type>
438 data_type * source_map, unsigned int sm_lower_left_x,
439 unsigned int sm_lower_left_y,
440 unsigned int sm_size_x, data_type * dest_map, unsigned int dm_lower_left_x,
441 unsigned int dm_lower_left_y, unsigned int dm_size_x, unsigned int region_size_x,
442 unsigned int region_size_y)
443 {
444 // we'll first need to compute the starting points for each map
445 data_type * sm_index = source_map + (sm_lower_left_y * sm_size_x + sm_lower_left_x);
446 data_type * dm_index = dest_map + (dm_lower_left_y * dm_size_x + dm_lower_left_x);
447
448 // now, we'll copy the source map into the destination map
449 for (unsigned int i = 0; i < region_size_y; ++i) {
450 memcpy(dm_index, sm_index, region_size_x * sizeof(data_type));
451 sm_index += sm_size_x;
452 dm_index += dm_size_x;
453 }
454 }
455
459 virtual void deleteMaps();
460
464 virtual void resetMaps();
465
471 virtual void initMaps(unsigned int size_x, unsigned int size_y);
472
484 template<class ActionType>
485 inline void raytraceLine(
486 ActionType at, unsigned int x0, unsigned int y0, unsigned int x1,
487 unsigned int y1,
488 unsigned int max_length = UINT_MAX, unsigned int min_length = 0)
489 {
490 int dx_full = x1 - x0;
491 int dy_full = y1 - y0;
492
493 // we need to chose how much to scale our dominant dimension,
494 // based on the maximum length of the line
495 double dist = std::hypot(dx_full, dy_full);
496 if (dist < min_length) {
497 return;
498 }
499
500 unsigned int min_x0, min_y0;
501 if (dist > 0.0) {
502 // Adjust starting point and offset to start from min_length distance
503 min_x0 = (unsigned int)(x0 + dx_full / dist * min_length);
504 min_y0 = (unsigned int)(y0 + dy_full / dist * min_length);
505 } else {
506 // dist can be 0 if [x0, y0]==[x1, y1].
507 // In this case only this cell should be processed.
508 min_x0 = x0;
509 min_y0 = y0;
510 }
511 unsigned int offset = min_y0 * size_x_ + min_x0;
512
513 int dx = x1 - min_x0;
514 int dy = y1 - min_y0;
515
516 unsigned int abs_dx = abs(dx);
517 unsigned int abs_dy = abs(dy);
518
519 int offset_dx = sign(dx);
520 int offset_dy = sign(dy) * size_x_;
521
522 double scale = (dist == 0.0) ? 1.0 : std::min(1.0, max_length / dist);
523 // if x is dominant
524 if (abs_dx >= abs_dy) {
525 int error_y = abs_dx / 2;
526
527 bresenham2D(
528 at, abs_dx, abs_dy, error_y, offset_dx, offset_dy, offset, (unsigned int)(scale * abs_dx));
529 return;
530 }
531
532 // otherwise y is dominant
533 int error_x = abs_dy / 2;
534
535 bresenham2D(
536 at, abs_dy, abs_dx, error_x, offset_dy, offset_dx, offset, (unsigned int)(scale * abs_dy));
537 }
538
539private:
544 template<class ActionType>
545 inline void bresenham2D(
546 ActionType at, unsigned int abs_da, unsigned int abs_db, int error_b,
547 int offset_a,
548 int offset_b, unsigned int offset,
549 unsigned int max_length)
550 {
551 unsigned int end = std::min(max_length, abs_da);
552 for (unsigned int i = 0; i < end; ++i) {
553 at(offset);
554 offset += offset_a;
555 error_b += abs_db;
556 if ((unsigned int)error_b >= abs_da) {
557 offset += offset_b;
558 error_b -= abs_da;
559 }
560 }
561 at(offset);
562 }
563
567 inline int sign(int x)
568 {
569 return x > 0 ? 1.0 : -1.0;
570 }
571
572 mutex_t * access_;
573
574protected:
575 unsigned int size_x_;
576 unsigned int size_y_;
578 double origin_x_;
579 double origin_y_;
580 unsigned char * costmap_;
581 unsigned char default_value_;
582
583 // *INDENT-OFF* Uncrustify doesn't handle indented public/private labels
585 {
586 public:
587 MarkCell(unsigned char * costmap, unsigned char value)
588 : costmap_(costmap), value_(value)
589 {
590 }
591 inline void operator()(unsigned int offset)
592 {
593 costmap_[offset] = value_;
594 }
595
596 private:
597 unsigned char * costmap_;
598 unsigned char value_;
599 };
600
602 {
603 public:
605 const Costmap2D & costmap, const unsigned char * /*char_map*/,
606 std::vector<MapLocation> & cells)
607 : costmap_(costmap), cells_(cells)
608 {
609 }
610
611 // just push the relevant cells back onto the list
612 inline void operator()(unsigned int offset)
613 {
614 MapLocation loc;
615 costmap_.indexToCells(offset, loc.x, loc.y);
616 loc.cost = costmap_.getCost(loc.x, loc.y);
617 cells_.push_back(loc);
618 }
619
620 private:
621 const Costmap2D & costmap_;
622 std::vector<MapLocation> & cells_;
623 };
624 // *INDENT-ON*
625};
626} // namespace easynav
627
628#endif // EASYNAV_COSTMAP_COMMON__COSTMAP_2D_HPP_
MarkCell(unsigned char *costmap, unsigned char value)
Definition costmap_2d.hpp:587
PolygonOutlineCells(const Costmap2D &costmap, const unsigned char *, std::vector< MapLocation > &cells)
Definition costmap_2d.hpp:604
Costmap2D(unsigned int cells_size_x, unsigned int cells_size_y, double resolution, double origin_x, double origin_y, unsigned char default_value=0)
Constructor for a costmap.
Definition costmap_2d.cpp:50
MarkCell(unsigned char *costmap, unsigned char value)
Definition costmap_2d.hpp:587
void operator()(unsigned int offset)
Definition costmap_2d.hpp:591
PolygonOutlineCells(const Costmap2D &costmap, const unsigned char *, std::vector< MapLocation > &cells)
Definition costmap_2d.hpp:604
void operator()(unsigned int offset)
Definition costmap_2d.hpp:612
Costmap2D()
Default constructor.
Definition costmap_2d.cpp:268
void polygonOutlineCells(const std::vector< MapLocation > &polygon, std::vector< MapLocation > &polygon_cells)
Get the map cells that make up the outline of a polygon.
Definition costmap_2d.cpp:491
unsigned char * getCharMap() const
Will return a pointer to the underlying unsigned char array used as the costmap.
Definition costmap_2d.cpp:291
bool inBounds(unsigned int x, unsigned int y) const
Checks whether a given cell coordinate is within the bounds of the costmap.
Definition costmap_2d.cpp:280
double getResolution() const
Accessor for the resolution of the costmap.
Definition costmap_2d.cpp:608
void setDefaultValue(unsigned char c)
Set the default background value of the costmap.
Definition costmap_2d.hpp:315
unsigned int size_x_
Definition costmap_2d.hpp:575
Costmap2D & operator=(const Costmap2D &map)
Overloaded assignment operator.
Definition costmap_2d.cpp:234
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.
Definition costmap_2d.cpp:185
void mapToWorldNoBounds(int mx, int my, double &wx, double &wy) const
Convert from map coordinates to world coordinates with no bounds checking.
Definition costmap_2d.cpp:317
void indexToCells(unsigned int index, unsigned int &mx, unsigned int &my) const
Given an index... compute the associated map coordinates.
Definition costmap_2d.hpp:257
double getSizeInMetersY() const
Accessor for the y size of the costmap in meters.
Definition costmap_2d.cpp:593
unsigned int cellDistance(double world_dist)
Given distance in the world... convert it to cells.
Definition costmap_2d.cpp:285
virtual void initMaps(unsigned int size_x, unsigned int size_y)
Initializes the costmap, static_map, and markers data structures.
Definition costmap_2d.cpp:102
Costmap2D(unsigned int cells_size_x, unsigned int cells_size_y, double resolution, double origin_x, double origin_y, unsigned char default_value=0)
Constructor for a costmap.
Definition costmap_2d.cpp:50
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.
Definition costmap_2d.cpp:146
virtual void deleteMaps()
Deletes the costmap, static_map, and markers data structures.
Definition costmap_2d.cpp:94
void restoreMapRegionOccupiedByPolygon(const std::vector< MapLocation > &polygon_map_region)
Restores the corresponding map region using given map region.
Definition costmap_2d.cpp:461
unsigned int getSizeInCellsX() const
Accessor for the x size of the costmap in cells.
Definition costmap_2d.cpp:578
double getOriginX() const
Accessor for the x origin of the costmap.
Definition costmap_2d.cpp:598
double resolution_
Definition costmap_2d.hpp:577
void setCost(unsigned int mx, unsigned int my, unsigned char cost)
Set the cost of a cell in the costmap.
Definition costmap_2d.cpp:306
void worldToMapEnforceBounds(double wx, double wy, int &mx, int &my) const
Convert from world coordinates to map coordinates, constraining results to legal bounds.
Definition costmap_2d.cpp:359
virtual void resetMaps()
Resets the costmap and static_map to be unknown space.
Definition costmap_2d.cpp:125
void raytraceLine(ActionType at, unsigned int x0, unsigned int y0, unsigned int x1, unsigned int y1, unsigned int max_length=UINT_MAX, unsigned int min_length=0)
Raytrace a line and apply some action at each step.
Definition costmap_2d.hpp:485
bool worldToMapContinuous(double wx, double wy, float &mx, float &my) const
Convert from world coordinates to map coordinates.
Definition costmap_2d.cpp:338
virtual void updateOrigin(double new_origin_x, double new_origin_y)
Move the origin of the costmap to a new location....
Definition costmap_2d.cpp:381
bool getMapRegionOccupiedByPolygon(const std::vector< geometry_msgs::msg::Point > &polygon, std::vector< MapLocation > &polygon_map_region)
Gets the map region occupied by polygon.
Definition costmap_2d.cpp:469
bool worldToMap(double wx, double wy, unsigned int &mx, unsigned int &my) const
Convert from world coordinates to map coordinates.
Definition costmap_2d.cpp:323
unsigned int getSizeInCellsY() const
Accessor for the y size of the costmap in cells.
Definition costmap_2d.cpp:583
unsigned int getIndex(unsigned int mx, unsigned int my) const
Given two map coordinates... compute the associated index.
Definition costmap_2d.hpp:246
unsigned char * costmap_
Definition costmap_2d.hpp:580
friend class CostmapTester
Definition costmap_2d.hpp:67
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.
Definition costmap_2d.hpp:437
unsigned char getDefaultValue()
Get the default background value of the costmap.
Definition costmap_2d.hpp:324
void worldToMapNoBounds(double wx, double wy, int &mx, int &my) const
Convert from world coordinates to map coordinates without checking for legal bounds.
Definition costmap_2d.cpp:353
unsigned char getCost(unsigned int mx, unsigned int my) const
Get the cost of a cell in the costmap.
Definition costmap_2d.cpp:296
void resizeMap(unsigned int size_x, unsigned int size_y, double resolution, double origin_x, double origin_y)
Resize the costmap.
Definition costmap_2d.cpp:111
void toOccupancyGridMsg(nav_msgs::msg::OccupancyGrid &msg) const
Converts the current costmap into a nav_msgs::msg::OccupancyGrid message.
Definition costmap_2d.cpp:209
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.
Definition costmap_2d.cpp:136
std::recursive_mutex mutex_t
Definition costmap_2d.hpp:416
unsigned int size_y_
Definition costmap_2d.hpp:576
void setMapRegionOccupiedByPolygon(const std::vector< MapLocation > &polygon_map_region, unsigned char new_cost_value)
Sets the given map region to desired value.
Definition costmap_2d.cpp:452
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.
Definition costmap_2d.cpp:437
double origin_y_
Definition costmap_2d.hpp:579
double getOriginY() const
Accessor for the y origin of the costmap.
Definition costmap_2d.cpp:603
void mapToWorld(unsigned int mx, unsigned int my, double &wx, double &wy) const
Convert from map coordinates to world coordinates.
Definition costmap_2d.cpp:311
virtual ~Costmap2D()
Destructor.
Definition costmap_2d.cpp:274
mutex_t * getMutex()
Definition costmap_2d.hpp:417
void resetMap(unsigned int x0, unsigned int y0, unsigned int xn, unsigned int yn)
Reset the costmap in bounds.
Definition costmap_2d.cpp:131
double origin_x_
Definition costmap_2d.hpp:578
unsigned char default_value_
Definition costmap_2d.hpp:581
double getSizeInMetersX() const
Accessor for the x size of the costmap in meters.
Definition costmap_2d.cpp:588
void convexFillCells(const std::vector< MapLocation > &polygon, std::vector< MapLocation > &polygon_cells)
Get the map cells that fill a convex polygon.
Definition costmap_2d.cpp:508
Provides a mapping for often used cost values.
Definition cost_values.hpp:41
Definition costmap_2d.hpp:55
unsigned char cost
Definition costmap_2d.hpp:58
unsigned int x
Definition costmap_2d.hpp:56
unsigned int y
Definition costmap_2d.hpp:57