traversability_generator3d
TraversabilityGenerator3d.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <maps/grid/MLSMap.hpp>
4#include <memory>
6#include "TravGenNode.hpp"
7#include "SoilNode.hpp"
8
9#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
10#include <CGAL/Polyhedron_3.h>
11#include <CGAL/Surface_mesh.h>
12#include <CGAL/convex_hull_3.h>
13#include <CGAL/Polygon_mesh_processing/intersection.h>
14#include <CGAL/Homogeneous.h>
15#include <CGAL/Aff_transformation_3.h>
16#include <cmath> // for trigonometric functions
17
18#ifdef CGAL_USE_GMP
19#include <CGAL/Gmpz.h>
20typedef CGAL::Gmpz RT;
21#else
22#include <CGAL/MP_Float.h>
23typedef CGAL::MP_Float RT;
24#endif
25
26typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
27typedef CGAL::Polyhedron_3<K> Polyhedron_3;
28typedef K::Point_3 Point_3;
29typedef CGAL::Surface_mesh<Point_3> Surface_mesh;
30typedef Polyhedron_3::Vertex_const_iterator Vertex_const_iterator;
31typedef CGAL::Homogeneous<RT>::Segment_3 Segment_3;
32typedef CGAL::Aff_transformation_3<K> Transformation;
33typedef K::Vector_3 Vector_3;
34
36{
37
39{
40public:
41 // TODO use MLSMapPrecalculated and actually use slope information?
42// typedef maps::grid::MultiLevelGridMap< maps::grid::SurfacePatchBase > MLGrid;
43 typedef maps::grid::MLSMapSloped MLGrid;
44
45protected:
46
47 typedef MLGrid::CellType Cell;
48 typedef MLGrid::View View;
49 typedef View::CellType ViewCell;
50 typedef MLGrid::PatchType Patch;
51
52 std::vector<Eigen::Vector3d> robotEdges;
54
55 std::vector<Eigen::Vector3d> patchEdges;
58
59 Polyhedron_3 generatePolyhedron(const std::vector<Eigen::Vector3d>& points);
61 Transformation generateTransform(const Eigen::Vector3d& normal, const Eigen::Vector3d& translation);
62 Polyhedron_3 createPolyhedronFromSurfacePatch(const maps::grid::SurfacePatch<maps::grid::MLSConfig::SLOPE> *p, const Eigen::Vector3d& position);
63 void drawWireFrameBox(const Eigen::Vector3d& normal, const Eigen::Vector3d& position, const Eigen::Vector3d& size, const Eigen::Vector4d& colorRGBA);
64 std::shared_ptr<MLGrid > mlsGrid;
66 Eigen::Affine3d initialPatch2Mls;
68
69 std::vector<TravGenNode*> obstacleNodesGrowList;
70
71 maps::grid::TraversabilityMap3d<TravGenNode*> trMap;
72 maps::grid::TraversabilityMap3d<SoilNode*> soilMap;
73
74 int currentNodeId = 0; //used while expanding
75 int currentSoilNodeId = 0; //used while expanding
76
77 std::vector<TravGenNode *> frontierNodesGrowList;
78
80 double computeSlope(const Eigen::Hyperplane< double, int(3) >& plane) const;
81 Eigen::Vector3d computeSlopeDirection(const Eigen::Hyperplane< double, int(3) >& plane) const;
82
85
88
89 static bool checkForFrontier(const TravGenNode* node);
90
92
93 bool getConnectedPatch(const maps::grid::Index& idx, double height, const Patch*& patch);
94
95 static double interpolate(double x, double x0, double y0, double x1, double y1);
96
98 TravGenNode *createTraversabilityPatchAt(maps::grid::Index idx, const double curHeight);
99 SoilNode *createSoilPatchAt(maps::grid::Index idx, const double curHeight);
100
101 void inflateFrontiers();
102
103 void inflateObstacles();
104
106
108
110
111 SoilNode* generateStartSoilNode(const Eigen::Vector3d& startPos);
112
113public:
115
117
118 void clearTrMap();
119 void clearSoilMap();
120
121 void setInitialPatch(const Eigen::Affine3d &ground2Mls, double patchRadius);
122
123 void setSoilType(SoilNode * node, SoilType soilType);
124 bool addSoilNode(const SoilSample& sample);
125
126 double gaussian2D(double x, double y, double meanX, double meanY, double sigmaX, double sigmaY);
127
128 virtual TravGenNode *generateStartNode(const Eigen::Vector3d &startPos);
129 TravGenNode *findMatchingTraversabilityPatchAt(maps::grid::Index idx, const double curHeight) const;
130 SoilNode* findMatchingSoilPatchAt(maps::grid::Index idx, const double curHeight) const;
132
134 void expandAll(const std::vector<Eigen::Vector3d>& positions);
135
136 void expandAll(const Eigen::Vector3d &startPos);
137
138
142 void expandAll(const Eigen::Vector3d &startPos, const double expandDist);
143
145
147 void expandAll(TravGenNode *startNode, const double expandDist);
148
149 virtual bool expandNode(TravGenNode *node);
150
151 void setMLSGrid(std::shared_ptr<MLGrid> &grid);
152
154 int getNumNodes() const;
155
156 const maps::grid::TraversabilityMap3d<TravGenNode *> &getTraversabilityMap() const;
157 const maps::grid::TraversabilityMap3d<SoilNode *> &getSoilMap() const;
159
161
162
163};
164
165}
CGAL::Homogeneous< RT >::Segment_3 Segment_3
Definition TraversabilityGenerator3d.hpp:31
K::Point_3 Point_3
Definition TraversabilityGenerator3d.hpp:28
CGAL::Aff_transformation_3< K > Transformation
Definition TraversabilityGenerator3d.hpp:32
CGAL::MP_Float RT
Definition TraversabilityGenerator3d.hpp:23
CGAL::Exact_predicates_inexact_constructions_kernel K
Definition TraversabilityGenerator3d.hpp:26
CGAL::Surface_mesh< Point_3 > Surface_mesh
Definition TraversabilityGenerator3d.hpp:29
Polyhedron_3::Vertex_const_iterator Vertex_const_iterator
Definition TraversabilityGenerator3d.hpp:30
K::Vector_3 Vector_3
Definition TraversabilityGenerator3d.hpp:33
CGAL::Polyhedron_3< K > Polyhedron_3
Definition TraversabilityGenerator3d.hpp:27
Definition SoilSample.hpp:24
Definition TraversabilityConfig.hpp:17
Definition TraversabilityGenerator3d.hpp:39
bool isNodeFreeOfObstacles(const traversability_generator3d::TravGenNode *node) const
Definition TraversabilityGenerator3d.cpp:1000
void expandAll(const std::vector< Eigen::Vector3d > &positions)
Definition TraversabilityGenerator3d.cpp:658
SoilNode * findMatchingSoilPatchAt(maps::grid::Index idx, const double curHeight) const
Definition TraversabilityGenerator3d.cpp:1326
TraversabilityConfig config
Definition TraversabilityGenerator3d.hpp:105
void clearSoilMap()
Definition TraversabilityGenerator3d.cpp:856
bool computePlaneRansac(TravGenNode &node)
Definition TraversabilityGenerator3d.cpp:126
bool getConnectedPatch(const maps::grid::Index &idx, double height, const Patch *&patch)
MLGrid::PatchType Patch
Definition TraversabilityGenerator3d.hpp:50
void setMLSGrid(std::shared_ptr< MLGrid > &grid)
Definition TraversabilityGenerator3d.cpp:822
const maps::grid::TraversabilityMap3d< SoilNode * > & getSoilMap() const
Definition TraversabilityGenerator3d.cpp:115
void inflateObstacles()
Definition TraversabilityGenerator3d.cpp:734
std::vector< TravGenNode * > obstacleNodesGrowList
Definition TraversabilityGenerator3d.hpp:69
void drawWireFrameBox(const Eigen::Vector3d &normal, const Eigen::Vector3d &position, const Eigen::Vector3d &size, const Eigen::Vector4d &colorRGBA)
Definition TraversabilityGenerator3d.cpp:383
SoilNode * generateStartSoilNode(const Eigen::Vector3d &startPos)
Definition TraversabilityGenerator3d.cpp:902
int currentSoilNodeId
Definition TraversabilityGenerator3d.hpp:75
Transformation generateTransform(const Eigen::Vector3d &normal, const Eigen::Vector3d &translation)
Definition TraversabilityGenerator3d.cpp:74
void setSoilType(SoilNode *node, SoilType soilType)
Definition TraversabilityGenerator3d.cpp:1349
void clearTrMap()
Definition TraversabilityGenerator3d.cpp:843
void setInitialPatch(const Eigen::Affine3d &ground2Mls, double patchRadius)
Definition TraversabilityGenerator3d.cpp:99
void updateSoilInformation()
Definition TraversabilityGenerator3d.cpp:1271
int getNumNodes() const
Definition TraversabilityGenerator3d.cpp:120
double computeSlope(const Eigen::Hyperplane< double, int(3) > &plane) const
Definition TraversabilityGenerator3d.cpp:345
double patchRadius
Definition TraversabilityGenerator3d.hpp:67
maps::grid::MLSMapSloped MLGrid
Definition TraversabilityGenerator3d.hpp:43
Eigen::Affine3d initialPatch2Mls
Definition TraversabilityGenerator3d.hpp:66
maps::grid::TraversabilityMap3d< TravGenNode * > trMap
Definition TraversabilityGenerator3d.hpp:71
void transformPolyhedron(Polyhedron_3 &polyhedron, const Transformation &transform)
Definition TraversabilityGenerator3d.cpp:69
bool checkStepHeightAABB(TravGenNode *node)
Definition TraversabilityGenerator3d.cpp:402
static bool checkForFrontier(const TravGenNode *node)
Definition TraversabilityGenerator3d.cpp:366
void addConnectedPatches(TravGenNode *node)
Definition TraversabilityGenerator3d.cpp:1131
Polyhedron_3 patchPolyhedron
Definition TraversabilityGenerator3d.hpp:56
SoilNode * createSoilPatchAt(maps::grid::Index idx, const double curHeight)
Definition TraversabilityGenerator3d.cpp:1258
virtual bool expandNode(TravGenNode *node)
Definition TraversabilityGenerator3d.cpp:929
Polyhedron_3 generatePolyhedron(const std::vector< Eigen::Vector3d > &points)
Definition TraversabilityGenerator3d.cpp:56
Polyhedron_3 createPolyhedronFromSurfacePatch(const maps::grid::SurfacePatch< maps::grid::MLSConfig::SLOPE > *p, const Eigen::Vector3d &position)
Definition TraversabilityGenerator3d.cpp:602
bool checkStepHeightOBB(TravGenNode *node)
Definition TraversabilityGenerator3d.cpp:487
virtual ~TraversabilityGenerator3d()
Definition TraversabilityGenerator3d.cpp:93
maps::grid::TraversabilityMap3d< SoilNode * > soilMap
Definition TraversabilityGenerator3d.hpp:72
void inflateFrontiers()
Definition TraversabilityGenerator3d.cpp:614
MLGrid::View View
Definition TraversabilityGenerator3d.hpp:48
const maps::grid::TraversabilityMap3d< TravGenNode * > & getTraversabilityMap() const
Definition TraversabilityGenerator3d.cpp:110
std::vector< Eigen::Vector3d > robotEdges
Definition TraversabilityGenerator3d.hpp:52
TravGenNode * findMatchingTraversabilityPatchAt(maps::grid::Index idx, const double curHeight) const
Definition TraversabilityGenerator3d.cpp:1109
bool addInitialPatch
Definition TraversabilityGenerator3d.hpp:65
View::CellType ViewCell
Definition TraversabilityGenerator3d.hpp:49
virtual TravGenNode * generateStartNode(const Eigen::Vector3d &startPos)
Definition TraversabilityGenerator3d.cpp:869
double patchHeight
Definition TraversabilityGenerator3d.hpp:57
Eigen::Vector3d computeSlopeDirection(const Eigen::Hyperplane< double, int(3) > &plane) const
Definition TraversabilityGenerator3d.cpp:353
std::shared_ptr< MLGrid > mlsGrid
Definition TraversabilityGenerator3d.hpp:64
double gaussian2D(double x, double y, double meanX, double meanY, double sigmaX, double sigmaY)
Definition TraversabilityGenerator3d.cpp:1354
bool computeAllowedOrientations(TravGenNode *node)
Definition TraversabilityGenerator3d.cpp:264
Polyhedron_3 robotPolyhedron
Definition TraversabilityGenerator3d.hpp:53
int currentNodeId
Definition TraversabilityGenerator3d.hpp:74
TravGenNode * createTraversabilityPatchAt(maps::grid::Index idx, const double curHeight)
Definition TraversabilityGenerator3d.cpp:1030
std::vector< TravGenNode * > frontierNodesGrowList
Definition TraversabilityGenerator3d.hpp:77
void setConfig(const TraversabilityConfig &config)
Definition TraversabilityGenerator3d.cpp:646
std::vector< Eigen::Vector3d > patchEdges
Definition TraversabilityGenerator3d.hpp:55
static double interpolate(double x, double x0, double y0, double x1, double y1)
Definition TraversabilityGenerator3d.cpp:338
bool addSoilNode(const SoilSample &sample)
Definition TraversabilityGenerator3d.cpp:1366
void addInitialPatchToMLS()
Definition TraversabilityGenerator3d.cpp:767
MLGrid::CellType Cell
Definition TraversabilityGenerator3d.hpp:47
Definition SoilNode.hpp:9
maps::grid::TraversabilityNode< TravGenTrackingData > TravGenNode
Definition TravGenNode.hpp:108
maps::grid::TraversabilityNode< SoilData > SoilNode
Definition SoilNode.hpp:76
SoilType
Definition SoilSample.hpp:9