Costmap.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <cstddef>
4 #include <optional>
5 #include <utility>
6 #include <vector>
7 
8 #include <Eigen/Core>
9 
12 
14 {
15 
16  class Costmap
17  {
18  public:
19  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
20 
21  friend class CostmapBuilder;
22  friend class SocialCostmapBuilder;
23 
24  struct Parameters
25  {
26  // if set to false, distance to obstacles will be computed and not only a binary collision check
27  bool binaryGrid{false};
28 
29  /// How big each cell is in the uniform grid.
30  float cellSize = 100.f; // [mm]
31 
32  // the robot radius used to calculate this costmap
33  // e.g. for each cell, the distance to the nearest object is it's value + robotRadius
34  float robotRadius = 0.F;
35 
36  float sceneBoundsMargin = 1000.f; // [mm]
37  };
38 
39  struct Filter
40  {
41  Eigen::MatrixXf matrix;
42  bool useMinimum = false;
43 
44  inline Filter&
46  {
47  useMinimum = value;
48  return *this;
49  }
50 
51  static Filter gaussian(int radius = 2, float sigma = 1.);
52  };
53 
54  using Index = Eigen::Array2i;
55  using Position = Eigen::Vector2f;
56  using Grid = Eigen::MatrixXf;
57 
58  // if 0, the cell is invalid
60 
61  Costmap(const Grid& grid,
62  const Parameters& parameters,
63  const SceneBounds& sceneBounds,
64  const std::optional<Mask>& mask = std::nullopt,
66 
67  /**
68  * @brief Create a costmap with the same dimensions and parameters as the given one. Only the content (grid and mask) are altered.
69  *
70  * @param other The costmap providing the dimensions and parameters
71  * @param grid
72  * @param mask
73  * @return Costmap
74  */
75  static Costmap WithSameDimsAs(const Costmap& other,
76  const Grid& grid,
77  const std::optional<Mask>& mask = std::nullopt);
78 
79  struct Vertex
80  {
81  Index index; // row corresponds to y; column corresponds to x
83  };
84 
85  Position toPositionLocal(const Index& index) const;
86  Position toPositionGlobal(const Index& index) const;
87  Vertex toVertex(const Position& globalPosition) const;
88 
89  const Grid& getGrid() const;
90 
91  Grid&
93  {
94  return grid;
95  }
96 
97  bool isInCollision(const Position& p) const;
98 
99  const Parameters& params() const noexcept;
100 
101  // get the scene bounds in the costmap's base frame (aka 'origin')
102  const SceneBounds& getLocalSceneBounds() const noexcept;
103 
104  core::Pose2D
105  centerPose() const
106  {
107  const Eigen::Vector2f costmap_P_center{
108  (getLocalSceneBounds().max.x() - getLocalSceneBounds().min.x()) / 2 +
109  getLocalSceneBounds().min.x(),
110  (getLocalSceneBounds().max.y() - getLocalSceneBounds().min.y()) / 2 +
111  getLocalSceneBounds().min.y()};
112 
113  return global_T_costmap * Eigen::Translation2f(costmap_P_center);
114  }
115 
116  struct Optimum
117  {
118  float value;
121  };
122 
123  Optimum optimum() const;
124 
125  void filter(const Filter& filter);
126 
127  bool add(const Costmap& other, float weight = 1.0);
128 
129  enum class AddMode
130  {
131  MIN,
132  MAX
133  };
134 
135  bool add(const Costmap& other, AddMode mode);
136 
137  //! checks whether the cell is masked out
138  bool isValid(const Index& index) const noexcept;
139 
140  const std::optional<Mask>& getMask() const noexcept;
141 
142  std::optional<Costmap::Mask>& getMutableMask() noexcept;
143 
144 
145  std::optional<float> value(const Index& index) const;
146 
147  std::optional<float> value(const Position& position) const;
148 
149  void cutToValidBoundingBox();
150 
151  Costmap mergeInto(const std::vector<Costmap>& costmaps,
152  const std::vector<float>& weights) const;
153 
154  const core::Pose2D&
155  origin() const
156  {
157  return global_T_costmap;
158  }
159 
160  void
161  setOrigin(const core::Pose2D& globalPose)
162  {
163  global_T_costmap = globalPose;
164  }
165 
166  std::size_t numberOfValidElements() const;
167 
168  void excludeUnreachable(const Position& position);
169 
170  std::pair<Index, Index> getValidBoundingBox() const;
171 
172  private:
173  void validateSizes() const;
174 
175  Index findClosestValidIndex(const Index& index);
176 
177  Grid grid;
178  std::optional<Mask> mask;
179 
180  SceneBounds sceneBounds;
181 
182  const Parameters parameters;
183 
184  core::Pose2D global_T_costmap = core::Pose2D::Identity();
185  };
186 
187 
188 } // namespace armarx::navigation::algorithms
armarx::navigation::algorithms::Costmap::getMask
const std::optional< Mask > & getMask() const noexcept
Definition: Costmap.cpp:399
armarx::navigation::algorithms::Costmap::setOrigin
void setOrigin(const core::Pose2D &globalPose)
Definition: Costmap.h:161
armarx::navigation::algorithms::Costmap::cutToValidBoundingBox
void cutToValidBoundingBox()
Definition: Costmap.cpp:432
armarx::navigation::algorithms::Costmap::Index
Eigen::Array2i Index
Definition: Costmap.h:54
armarx::navigation::algorithms::Costmap::getMutableMask
std::optional< Costmap::Mask > & getMutableMask() noexcept
Definition: Costmap.cpp:405
armarx::navigation::algorithms::Costmap::AddMode::MAX
@ MAX
index
uint8_t index
Definition: EtherCATFrame.h:59
basic_types.h
armarx::navigation::algorithms::Costmap::Costmap
Costmap(const Grid &grid, const Parameters &parameters, const SceneBounds &sceneBounds, const std::optional< Mask > &mask=std::nullopt, const core::Pose2D &origin=core::Pose2D::Identity())
Definition: Costmap.cpp:30
armarx::navigation::algorithms::Costmap::WithSameDimsAs
static Costmap WithSameDimsAs(const Costmap &other, const Grid &grid, const std::optional< Mask > &mask=std::nullopt)
Create a costmap with the same dimensions and parameters as the given one.
Definition: Costmap.cpp:728
armarx::navigation::algorithms::Costmap::getValidBoundingBox
std::pair< Index, Index > getValidBoundingBox() const
Definition: Costmap.cpp:589
armarx::navigation::algorithms::Costmap::Filter::matrix
Eigen::MatrixXf matrix
Definition: Costmap.h:41
armarx::navigation::algorithms::Costmap::Vertex::index
Index index
Definition: Costmap.h:81
armarx::navigation::algorithms
This file is part of ArmarX.
Definition: aron_conversions.cpp:25
armarx::navigation::algorithms::Costmap::Optimum::index
Index index
Definition: Costmap.h:119
armarx::navigation::algorithms::Costmap::Grid
Eigen::MatrixXf Grid
Definition: Costmap.h:56
armarx::navigation::algorithms::Costmap::Filter::useMinimum
bool useMinimum
Definition: Costmap.h:42
armarx::navigation::algorithms::Costmap::Vertex
Definition: Costmap.h:79
armarx::skills::gui::Parameters
aron::data::DictPtr Parameters
Definition: SkillManagerWrapper.h:21
armarx::navigation::algorithms::Costmap::Filter
Definition: Costmap.h:39
armarx::navigation::algorithms::Costmap::toPositionGlobal
Position toPositionGlobal(const Index &index) const
Definition: Costmap.cpp:69
armarx::navigation::algorithms::Costmap::Mask
Eigen::Matrix< bool, Eigen::Dynamic, Eigen::Dynamic > Mask
Definition: Costmap.h:59
armarx::navigation::algorithms::Costmap::excludeUnreachable
void excludeUnreachable(const Position &position)
Definition: Costmap.cpp:622
armarx::navigation::algorithms::Costmap::getLocalSceneBounds
const SceneBounds & getLocalSceneBounds() const noexcept
Definition: Costmap.cpp:130
armarx::navigation::core::Pose2D
Eigen::Isometry2f Pose2D
Definition: basic_types.h:34
armarx::navigation::algorithms::Costmap::SocialCostmapBuilder
friend class SocialCostmapBuilder
Definition: Costmap.h:22
armarx::navigation::algorithms::Costmap::centerPose
core::Pose2D centerPose() const
Definition: Costmap.h:105
GfxTL::Identity
void Identity(MatrixXX< N, N, T > *a)
Definition: MatrixXX.h:570
armarx::navigation::algorithms::Costmap::Parameters::binaryGrid
bool binaryGrid
Definition: Costmap.h:27
armarx::navigation::algorithms::Costmap::AddMode::MIN
@ MIN
armarx::navigation::algorithms::Costmap::Filter::setUseMinimum
Filter & setUseMinimum(bool value)
Definition: Costmap.h:45
armarx::navigation::algorithms::Costmap::params
const Parameters & params() const noexcept
Definition: Costmap.cpp:237
armarx::navigation::algorithms::Costmap::Optimum
Definition: Costmap.h:116
armarx::navigation::algorithms::Costmap::toPositionLocal
Position toPositionLocal(const Index &index) const
Definition: Costmap.cpp:55
armarx::navigation::algorithms::Costmap::toVertex
Vertex toVertex(const Position &globalPosition) const
Definition: Costmap.cpp:103
armarx::navigation::algorithms::Costmap::getGrid
const Grid & getGrid() const
Definition: Costmap.cpp:243
armarx::navigation::algorithms::Costmap::Position
Eigen::Vector2f Position
Definition: Costmap.h:55
armarx::navigation::algorithms::Costmap::value
std::optional< float > value(const Index &index) const
Definition: Costmap.cpp:411
armarx::navigation::algorithms::SceneBounds
Definition: types.h:29
armarx::navigation::algorithms::Costmap::Parameters::robotRadius
float robotRadius
Definition: Costmap.h:34
armarx::navigation::algorithms::CostmapBuilder
Definition: CostmapBuilder.h:40
armarx::navigation::algorithms::Costmap::mergeInto
Costmap mergeInto(const std::vector< Costmap > &costmaps, const std::vector< float > &weights) const
Merge a list of costmaps into this costmap.
Definition: Costmap.cpp:473
armarx::navigation::algorithms::SceneBounds::min
Eigen::Vector2f min
Definition: types.h:31
armarx::navigation::algorithms::Costmap::filter
void filter(const Filter &filter)
Definition: Costmap.cpp:179
armarx::navigation::algorithms::Costmap::AddMode
AddMode
Definition: Costmap.h:129
std
Definition: Application.h:66
armarx::navigation::algorithms::Costmap::Parameters::cellSize
float cellSize
How big each cell is in the uniform grid.
Definition: Costmap.h:30
armarx::navigation::algorithms::Costmap::Vertex::position
Position position
Definition: Costmap.h:82
armarx::navigation::algorithms::Costmap::Parameters
Definition: Costmap.h:24
armarx::navigation::algorithms::Costmap::optimum
Optimum optimum() const
Definition: Costmap.cpp:136
Eigen::Matrix< bool, Eigen::Dynamic, Eigen::Dynamic >
armarx::navigation::algorithms::Costmap::origin
const core::Pose2D & origin() const
Definition: Costmap.h:155
armarx::navigation::algorithms::Costmap::Parameters::sceneBoundsMargin
float sceneBoundsMargin
Definition: Costmap.h:36
armarx::navigation::algorithms::Costmap::isValid
bool isValid(const Index &index) const noexcept
checks whether the cell is masked out
Definition: Costmap.cpp:76
armarx::navigation::algorithms::Costmap::add
bool add(const Costmap &other, float weight=1.0)
Definition: Costmap.cpp:256
armarx::navigation::algorithms::Costmap::numberOfValidElements
std::size_t numberOfValidElements() const
Definition: Costmap.cpp:545
armarx::navigation::algorithms::Costmap::Filter::gaussian
static Filter gaussian(int radius=2, float sigma=1.)
Definition: Costmap.cpp:528
types.h
armarx::navigation::algorithms::SceneBounds::max
Eigen::Vector2f max
Definition: types.h:32
armarx::navigation::algorithms::Costmap::isInCollision
bool isInCollision(const Position &p) const
Definition: Costmap.cpp:249
armarx::navigation::algorithms::Costmap::getMutableGrid
Grid & getMutableGrid()
Definition: Costmap.h:92
armarx::navigation::algorithms::Costmap
Definition: Costmap.h:16
armarx::navigation::algorithms::Costmap::Optimum::position
Position position
Definition: Costmap.h:120
armarx::navigation::algorithms::Costmap::Optimum::value
float value
Definition: Costmap.h:118