traversability_generator3d
TraversabilityGenerator3d.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <maps/grid/MLSMap.hpp>
4#include <memory>
5#include <cstdint>
6#include <unordered_map>
8#include "TravGenNode.hpp"
9#include "SoilNode.hpp"
10
11#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
12#include <CGAL/Polyhedron_3.h>
13#include <CGAL/convex_hull_3.h>
14#include <CGAL/Polygon_mesh_processing/intersection.h>
15#include <cmath> // for trigonometric functions
16
17typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
18typedef CGAL::Polyhedron_3<K> Polyhedron_3;
19typedef K::Point_3 Point_3;
20
22{
23
25{
26public:
27 // TODO use MLSMapPrecalculated and actually use slope information?
28// typedef maps::grid::MultiLevelGridMap< maps::grid::SurfacePatchBase > MLGrid;
29 typedef maps::grid::MLSMapSloped MLGrid;
30
31protected:
32
33 typedef MLGrid::CellType Cell;
34 typedef MLGrid::View View;
35 typedef View::CellType ViewCell;
36 typedef MLGrid::PatchType Patch;
37
38 Polyhedron_3 generatePolyhedron(const std::vector<Eigen::Vector3d>& points);
39 Polyhedron_3 createPolyhedronFromSurfacePatch(const maps::grid::SurfacePatch<maps::grid::MLSConfig::SLOPE> *p, const Eigen::Vector3d& position);
40 std::shared_ptr<MLGrid > mlsGrid;
42 Eigen::Affine3d initialPatch2Mls;
44
45 std::vector<TravGenNode*> obstacleNodesGrowList;
46
47 maps::grid::TraversabilityMap3d<TravGenNode*> trMap;
48 maps::grid::TraversabilityMap3d<SoilNode*> soilMap;
49
50 int currentNodeId = 0; //used while expanding
51 int currentSoilNodeId = 0; //used while expanding
52
53 std::vector<TravGenNode *> frontierNodesGrowList;
54
56 double computeSlope(const Eigen::Hyperplane< double, int(3) >& plane) const;
57 Eigen::Vector3d computeSlopeDirection(const Eigen::Hyperplane< double, int(3) >& plane) const;
58
61
66 struct BodyHull
67 {
69 Eigen::Vector3d planeNormal;
70 std::vector<Eigen::Vector3d> bottomCorners;
71 Eigen::Vector3d heightOffset;
72 };
73 BodyHull buildBodyPolyhedron(const Eigen::Vector3d& nodePos,
74 const Eigen::Hyperplane<double, 3>& plane, double yaw);
75
78 Eigen::AlignedBox3d rotationSafeSearchBox(const Eigen::Vector3d& nodePos) const;
79
80#ifdef ENABLE_DEBUG_DRAWINGS
84 void drawCollisionDebug(const std::string& tag, int counter, const BodyHull& body,
85 const maps::grid::SurfacePatch<maps::grid::MLSConfig::SLOPE>* p,
86 const Eigen::Vector3d& pos);
87#endif
88
94 {
96 Eigen::Vector2d cellXY;
97 double zMax;
98 const maps::grid::SurfacePatch<maps::grid::MLSConfig::SLOPE>* patch;
99 Eigen::Vector3d pos;
100 };
101
104 std::vector<YawCheckPatch> collectYawCheckPatches(TravGenNode* node);
105
109 bool checkCollisionForYaw(TravGenNode* node, double yaw,
110 const std::vector<YawCheckPatch>& patches);
111
117
120
121 bool checkForFrontier(const TravGenNode* node);
122
125 {
126 Unknown,
128 Obstacle,
130 };
131
137
138
142 {
143 TravGenNode* node = nullptr;
144 };
145
149 PrefitPatch buildPatchNodeAt(const maps::grid::Index& idx, const double curHeight);
150
153 TravGenNode* finishPatchNode(const PrefitPatch& prefit, const maps::grid::Index& idx);
154
157 {
158 maps::grid::Index idx;
161 };
162 typedef std::unordered_map<uint64_t, PrefitEntry> PrefitCache;
163
171
172 enum class NeighborRequest : uint8_t { Ok, Skip, Abort };
173
178 NeighborRequest computeNeighborRequest(const TravGenNode* node, const maps::grid::Index& idxS,
179 maps::grid::Index& outIdx, double& outHeight) const;
180
182
186
187 bool getConnectedPatch(const maps::grid::Index& idx, double height, const Patch*& patch);
188
189 static double interpolate(double x, double x0, double y0, double x1, double y1);
190
191 TravGenNode *createTraversabilityPatchAt(maps::grid::Index idx, const double curHeight);
192 SoilNode *createSoilPatchAt(maps::grid::Index idx, const double curHeight);
193
194 void inflateFrontiers();
195
196 void inflateObstacles();
197
199
201
202 SoilNode* generateStartSoilNode(const Eigen::Vector3d& startPos);
203
204public:
206
208
209 void clearTrMap();
210 void clearSoilMap();
211
212 void setInitialPatch(const Eigen::Affine3d &ground2Mls, double patchRadius);
213
214 void setSoilType(SoilNode * node, SoilType soilType);
215 bool addSoilNode(const SoilSample& sample);
216
217 double gaussian2D(double x, double y, double meanX, double meanY, double sigmaX, double sigmaY);
218
219 virtual TravGenNode *generateStartNode(const Eigen::Vector3d &startPos);
220 TravGenNode *findMatchingTraversabilityPatchAt(maps::grid::Index idx, const double curHeight) const;
221 SoilNode* findMatchingSoilPatchAt(maps::grid::Index idx, const double curHeight) const;
223
225 void expandAll(const std::vector<Eigen::Vector3d>& positions);
226
227 void expandAll(const Eigen::Vector3d &startPos);
228
229
233 void expandAll(const Eigen::Vector3d &startPos, const double expandDist);
234
236
238 void expandAll(TravGenNode *startNode, const double expandDist);
239
240 virtual bool expandNode(TravGenNode *node);
241
242 void setMLSGrid(std::shared_ptr<MLGrid> &grid);
243
245 int getNumNodes() const;
246
247 const maps::grid::TraversabilityMap3d<TravGenNode *> &getTraversabilityMap() const;
248 const maps::grid::TraversabilityMap3d<SoilNode *> &getSoilMap() const;
249 void addConnectedPatches(SoilNode * node);
250
252
253
254};
255
256}
K::Point_3 Point_3
Definition TraversabilityGenerator3d.hpp:19
CGAL::Exact_predicates_inexact_constructions_kernel K
Definition TraversabilityGenerator3d.hpp:17
CGAL::Polyhedron_3< K > Polyhedron_3
Definition TraversabilityGenerator3d.hpp:18
Definition SoilSample.hpp:24
Definition TraversabilityConfig.hpp:17
Definition TraversabilityGenerator3d.hpp:25
void expandAll(const std::vector< Eigen::Vector3d > &positions)
Definition TraversabilityGenerator3d.cpp:1102
bool finalizeNode(TravGenNode *node, NodeClassification classification, PrefitCache *prefits)
Definition TraversabilityGenerator3d.cpp:1659
SoilNode * findMatchingSoilPatchAt(maps::grid::Index idx, const double curHeight) const
Definition TraversabilityGenerator3d.cpp:2078
TraversabilityConfig config
Definition TraversabilityGenerator3d.hpp:198
std::unordered_map< uint64_t, PrefitEntry > PrefitCache
Definition TraversabilityGenerator3d.hpp:162
void clearSoilMap()
Definition TraversabilityGenerator3d.cpp:1581
NodeClassification
Definition TraversabilityGenerator3d.hpp:125
@ PreexistingObstacle
node was already OBSTACLE: seed inflation only
bool computePlaneRansac(TravGenNode &node)
Definition TraversabilityGenerator3d.cpp:209
bool getConnectedPatch(const maps::grid::Index &idx, double height, const Patch *&patch)
MLGrid::PatchType Patch
Definition TraversabilityGenerator3d.hpp:36
void setMLSGrid(std::shared_ptr< MLGrid > &grid)
Definition TraversabilityGenerator3d.cpp:1547
const maps::grid::TraversabilityMap3d< SoilNode * > & getSoilMap() const
Definition TraversabilityGenerator3d.cpp:198
void inflateObstacles()
Definition TraversabilityGenerator3d.cpp:1360
std::vector< TravGenNode * > obstacleNodesGrowList
Definition TraversabilityGenerator3d.hpp:45
std::vector< YawCheckPatch > collectYawCheckPatches(TravGenNode *node)
Definition TraversabilityGenerator3d.cpp:864
SoilNode * generateStartSoilNode(const Eigen::Vector3d &startPos)
Definition TraversabilityGenerator3d.cpp:1627
int currentSoilNodeId
Definition TraversabilityGenerator3d.hpp:51
void setSoilType(SoilNode *node, SoilType soilType)
Definition TraversabilityGenerator3d.cpp:2101
void clearTrMap()
Definition TraversabilityGenerator3d.cpp:1568
void setInitialPatch(const Eigen::Affine3d &ground2Mls, double patchRadius)
Definition TraversabilityGenerator3d.cpp:182
void updateSoilInformation()
Definition TraversabilityGenerator3d.cpp:2015
int getNumNodes() const
Definition TraversabilityGenerator3d.cpp:203
double computeSlope(const Eigen::Hyperplane< double, int(3) > &plane) const
Definition TraversabilityGenerator3d.cpp:456
double patchRadius
Definition TraversabilityGenerator3d.hpp:43
NeighborRequest computeNeighborRequest(const TravGenNode *node, const maps::grid::Index &idxS, maps::grid::Index &outIdx, double &outHeight) const
Definition TraversabilityGenerator3d.cpp:1860
maps::grid::MLSMapSloped MLGrid
Definition TraversabilityGenerator3d.hpp:29
Eigen::Affine3d initialPatch2Mls
Definition TraversabilityGenerator3d.hpp:42
maps::grid::TraversabilityMap3d< TravGenNode * > trMap
Definition TraversabilityGenerator3d.hpp:47
bool checkStepHeightAABB(TravGenNode *node)
Definition TraversabilityGenerator3d.cpp:676
bool checkForFrontier(const TravGenNode *node)
Definition TraversabilityGenerator3d.cpp:476
void addConnectedPatches(TravGenNode *node)
Definition TraversabilityGenerator3d.cpp:1902
SoilNode * createSoilPatchAt(maps::grid::Index idx, const double curHeight)
Definition TraversabilityGenerator3d.cpp:2002
virtual bool expandNode(TravGenNode *node)
Definition TraversabilityGenerator3d.cpp:1654
TravGenNode * finishPatchNode(const PrefitPatch &prefit, const maps::grid::Index &idx)
Definition TraversabilityGenerator3d.cpp:1824
Polyhedron_3 generatePolyhedron(const std::vector< Eigen::Vector3d > &points)
Definition TraversabilityGenerator3d.cpp:152
Polyhedron_3 createPolyhedronFromSurfacePatch(const maps::grid::SurfacePatch< maps::grid::MLSConfig::SLOPE > *p, const Eigen::Vector3d &position)
Definition TraversabilityGenerator3d.cpp:789
bool checkStepHeightOBB(TravGenNode *node)
Definition TraversabilityGenerator3d.cpp:716
virtual ~TraversabilityGenerator3d()
Definition TraversabilityGenerator3d.cpp:176
BodyHull buildBodyPolyhedron(const Eigen::Vector3d &nodePos, const Eigen::Hyperplane< double, 3 > &plane, double yaw)
Definition TraversabilityGenerator3d.cpp:506
bool checkCollisionForYaw(TravGenNode *node, double yaw, const std::vector< YawCheckPatch > &patches)
Definition TraversabilityGenerator3d.cpp:898
maps::grid::TraversabilityMap3d< SoilNode * > soilMap
Definition TraversabilityGenerator3d.hpp:48
PrefitPatch buildPatchNodeAt(const maps::grid::Index &idx, const double curHeight)
Definition TraversabilityGenerator3d.cpp:1744
void inflateFrontiers()
Definition TraversabilityGenerator3d.cpp:1041
MLGrid::View View
Definition TraversabilityGenerator3d.hpp:34
const maps::grid::TraversabilityMap3d< TravGenNode * > & getTraversabilityMap() const
Definition TraversabilityGenerator3d.cpp:193
bool computeSafeOrientations(TravGenNode *node)
Definition TraversabilityGenerator3d.cpp:983
TravGenNode * findMatchingTraversabilityPatchAt(maps::grid::Index idx, const double curHeight) const
Definition TraversabilityGenerator3d.cpp:1838
bool addInitialPatch
Definition TraversabilityGenerator3d.hpp:41
View::CellType ViewCell
Definition TraversabilityGenerator3d.hpp:35
virtual TravGenNode * generateStartNode(const Eigen::Vector3d &startPos)
Definition TraversabilityGenerator3d.cpp:1594
Eigen::Vector3d computeSlopeDirection(const Eigen::Hyperplane< double, int(3) > &plane) const
Definition TraversabilityGenerator3d.cpp:464
std::shared_ptr< MLGrid > mlsGrid
Definition TraversabilityGenerator3d.hpp:40
double gaussian2D(double x, double y, double meanX, double meanY, double sigmaX, double sigmaY)
Definition TraversabilityGenerator3d.cpp:2106
bool computeAllowedOrientations(TravGenNode *node)
Definition TraversabilityGenerator3d.cpp:375
Eigen::AlignedBox3d rotationSafeSearchBox(const Eigen::Vector3d &nodePos) const
Definition TraversabilityGenerator3d.cpp:493
int currentNodeId
Definition TraversabilityGenerator3d.hpp:50
TravGenNode * createTraversabilityPatchAt(maps::grid::Index idx, const double curHeight)
Definition TraversabilityGenerator3d.cpp:1833
NodeClassification classifyNode(TravGenNode *node)
Definition TraversabilityGenerator3d.cpp:1706
NeighborRequest
Definition TraversabilityGenerator3d.hpp:172
std::vector< TravGenNode * > frontierNodesGrowList
Definition TraversabilityGenerator3d.hpp:53
void setConfig(const TraversabilityConfig &config)
Definition TraversabilityGenerator3d.cpp:1077
static double interpolate(double x, double x0, double y0, double x1, double y1)
Definition TraversabilityGenerator3d.cpp:449
bool addSoilNode(const SoilSample &sample)
Definition TraversabilityGenerator3d.cpp:2118
void addInitialPatchToMLS()
Definition TraversabilityGenerator3d.cpp:1492
MLGrid::CellType Cell
Definition TraversabilityGenerator3d.hpp:33
Definition SoilNode.hpp:9
maps::grid::TraversabilityNode< TravGenTrackingData > TravGenNode
Definition TravGenNode.hpp:135
maps::grid::TraversabilityNode< SoilData > SoilNode
Definition SoilNode.hpp:76
SoilType
Definition SoilSample.hpp:9
Definition TraversabilityGenerator3d.hpp:67
Eigen::Vector3d heightOffset
Definition TraversabilityGenerator3d.hpp:71
Eigen::Vector3d planeNormal
Definition TraversabilityGenerator3d.hpp:69
Polyhedron_3 poly
Definition TraversabilityGenerator3d.hpp:68
std::vector< Eigen::Vector3d > bottomCorners
Definition TraversabilityGenerator3d.hpp:70
Definition TraversabilityGenerator3d.hpp:157
PrefitPatch patch
Definition TraversabilityGenerator3d.hpp:160
double requestHeight
Definition TraversabilityGenerator3d.hpp:159
maps::grid::Index idx
Definition TraversabilityGenerator3d.hpp:158
Definition TraversabilityGenerator3d.hpp:142
TravGenNode * node
Definition TraversabilityGenerator3d.hpp:143
Eigen::Vector3d pos
Definition TraversabilityGenerator3d.hpp:99
Polyhedron_3 poly
Definition TraversabilityGenerator3d.hpp:95
const maps::grid::SurfacePatch< maps::grid::MLSConfig::SLOPE > * patch
Definition TraversabilityGenerator3d.hpp:98
Eigen::Vector2d cellXY
Definition TraversabilityGenerator3d.hpp:96
double zMax
Definition TraversabilityGenerator3d.hpp:97