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  struct Vertex
68  {
69  Index index; // row corresponds to y; column corresponds to x
71  };
72 
73  Position toPositionLocal(const Index& index) const;
74  Position toPositionGlobal(const Index& index) const;
75  Vertex toVertex(const Position& globalPosition) const;
76 
77  const Grid& getGrid() const;
78 
79  Grid&
81  {
82  return grid;
83  }
84 
85  bool isInCollision(const Position& p) const;
86 
87  const Parameters& params() const noexcept;
88 
89  // get the scene bounds in the costmap's base frame (aka 'origin')
90  const SceneBounds& getLocalSceneBounds() const noexcept;
91 
92  core::Pose2D
93  centerPose() const
94  {
95  const Eigen::Vector2f costmap_P_center{
96  (getLocalSceneBounds().max.x() - getLocalSceneBounds().min.x()) / 2 +
98  (getLocalSceneBounds().max.y() - getLocalSceneBounds().min.y()) / 2 +
99  getLocalSceneBounds().min.y()};
100 
101  return global_T_costmap * Eigen::Translation2f(costmap_P_center);
102  }
103 
104  struct Optimum
105  {
106  float value;
109  };
110 
111  Optimum optimum() const;
112 
113  void filter(const Filter& filter);
114 
115  bool add(const Costmap& other, float weight = 1.0);
116 
117  enum class AddMode
118  {
119  MIN,
120  MAX
121  };
122 
123  bool add(const Costmap& other, AddMode mode);
124 
125  //! checks whether the cell is masked out
126  bool isValid(const Index& index) const noexcept;
127 
128  const std::optional<Mask>& getMask() const noexcept;
129 
130  std::optional<Costmap::Mask>& getMutableMask() noexcept;
131 
132 
133  std::optional<float> value(const Index& index) const;
134 
135  std::optional<float> value(const Position& position) const;
136 
137  void cutToValidBoundingBox();
138 
139  Costmap mergeInto(const std::vector<Costmap>& costmaps,
140  const std::vector<float>& weights) const;
141 
142  const core::Pose2D&
143  origin() const
144  {
145  return global_T_costmap;
146  }
147 
148  void
149  setOrigin(const core::Pose2D& globalPose)
150  {
151  global_T_costmap = globalPose;
152  }
153 
154  std::size_t numberOfValidElements() const;
155 
156  void excludeUnreachable(const Position& position);
157 
158  std::pair<Index, Index> getValidBoundingBox() const;
159 
160  private:
161  void validateSizes() const;
162 
163  Index findClosestValidIndex(const Index& index);
164 
165  Grid grid;
166  std::optional<Mask> mask;
167 
168  SceneBounds sceneBounds;
169 
170  const Parameters parameters;
171 
172  core::Pose2D global_T_costmap = core::Pose2D::Identity();
173  };
174 
175 
176 } // 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:149
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::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:69
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:107
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:67
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:93
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:104
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:117
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:70
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:143
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:80
armarx::navigation::algorithms::Costmap
Definition: Costmap.h:16
armarx::navigation::algorithms::Costmap::Optimum::position
Position position
Definition: Costmap.h:108
armarx::navigation::algorithms::Costmap::Optimum::value
float value
Definition: Costmap.h:106