ugv_nav4d
EnvironmentXYZTheta.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <sbpl/discrete_space_information/environment.h>
4#undef DEBUG //sbpl defines DEBUG 0 but the word debug is also used in base-logging which is included from TraversabilityGenerator3d
5#include <traversability_generator3d/TraversabilityGenerator3d.hpp>
6#include <maps/grid/TraversabilityMap3d.hpp>
7#include <base/Pose.hpp>
8#include "DiscreteTheta.hpp"
10#include <trajectory_follower/SubTrajectory.hpp>
11
12std::ostream& operator<< (std::ostream& stream, const DiscreteTheta& angle);
13
14namespace ugv_nav4d
15{
16
17 class StateCreationFailed : public std::runtime_error {using std::runtime_error::runtime_error;};
18 class NodeCreationFailed : public std::runtime_error {using std::runtime_error::runtime_error;};
19 class ObstacleCheckFailed : public std::runtime_error {using std::runtime_error::runtime_error;};
20 class OrientationNotAllowed : public std::runtime_error {using std::runtime_error::runtime_error;};
21
22
23class EnvironmentXYZTheta : public DiscreteSpaceInformation
24{
25protected:
26
27 struct EnvironmentXYZThetaException : public SBPL_Exception
28 {
29 EnvironmentXYZThetaException(const std::string& what) :
30 msg("SBPL has encountered a fatal error: " + what){}
31
32 virtual const char* what() const throw()
33 {
34 return msg.c_str();
35 }
36 const std::string msg;
37 };
38
39
41 struct ThetaNode
42 {
43 ThetaNode(const DiscreteTheta &t) :theta(t) {};
44 int id;
46 };
47
50 {
51 PlannerData() : travNode(nullptr) {};
52
54 traversability_generator3d::TravGenNode *travNode;
55
59 std::map<DiscreteTheta, ThetaNode *> thetaToNodes;
60 };
61
63 struct Distance
64 {
65 double distToStart = 0;
66 double distToGoal = 0;
67 Distance(double toStart, double toGoal) : distToStart(toStart), distToGoal(toGoal){}
68 };
69
71 typedef maps::grid::TraversabilityNode<PlannerData> XYZNode;
72
73 //search space without theta
74 maps::grid::TraversabilityMap3d<XYZNode *> searchGrid;
75
85
87 std::vector<Hash> idToHash;
88
91 std::vector<Distance> travNodeIdToDistance;
92 std::shared_ptr<const traversability_generator3d::TravMap3d> travMap;
93
95
97 XYZNode *startXYZNode; //part of the start state
99 XYZNode *goalXYZNode; //part of the goal state
100
102 XYZNode *createNewXYZState(traversability_generator3d::TravGenNode* travNode);
103 ThetaNode *createNewStateFromPose(const std::string& name, const Eigen::Vector3d& pos, double theta, ugv_nav4d::EnvironmentXYZTheta::XYZNode** xyzBackNode);
104
105 bool checkStartGoalNode(const std::string& name, traversability_generator3d::TravGenNode* node, double theta);
106
107public:
108
110 bool obstacleCheck(const maps::grid::Vector3d& pos, double theta,
111 const traversability_generator3d::TraversabilityConfig& travConf,
112 const sbpl_spline_primitives::SplinePrimitivesConfig& splineConf,
113 const std::string& nodeName="node");
114 Eigen::Vector3d robotHalfSize;
115
118 EnvironmentXYZTheta(std::shared_ptr<const traversability_generator3d::TravMap3d > travMap,
119 const traversability_generator3d::TraversabilityConfig &travConf,
120 const sbpl_spline_primitives::SplinePrimitivesConfig &primitiveConfig,
121 const Mobility& mobilityConfig);
122
123 virtual ~EnvironmentXYZTheta();
124
125 void updateMap(std::shared_ptr<const traversability_generator3d::TravMap3d > travMap);
126
127 virtual bool InitializeEnv(const char* sEnvFile);
128 virtual bool InitializeMDPCfg(MDPConfig* MDPCfg);
129
136 std::shared_ptr<trajectory_follower::SubTrajectory> findTrajectoryOutOfObstacle(const Eigen::Vector3d& start, double theta,
137 const Eigen::Affine3d& ground2Body, bool setZToZero);
138
139
143 virtual int GetFromToHeuristic(int FromStateID, int ToStateID);
147 virtual int GetStartHeuristic(int stateID);
152 virtual int GetGoalHeuristic(int stateID);
153
154 virtual void GetPreds(int TargetStateID, std::vector< int >* PredIDV, std::vector< int >* CostV);
155 virtual void GetSuccs(int SourceStateID, std::vector< int >* SuccIDV, std::vector< int >* CostV);
156 virtual void GetSuccs(int SourceStateID, std::vector< int >* SuccIDV, std::vector< int >* CostV, std::vector< size_t >& motionIdV);
157
158 virtual void PrintEnv_Config(FILE* fOut);
159 virtual void PrintState(int stateID, bool bVerbose, FILE* fOut = 0);
160
161 virtual void SetAllActionsandAllOutcomes(CMDPSTATE* state);
162 virtual void SetAllPreds(CMDPSTATE* state);
163 virtual int SizeofCreatedEnv();
164
165 void setStart(const Eigen::Vector3d &startPos, double theta);
166 void setGoal(const Eigen::Vector3d &goalPos, double theta);
167
168 maps::grid::Vector3d getStatePosition(const int stateID) const;
169
170 traversability_generator3d::TravGenNode* findMatchingTraversabilityPatchAt(const Eigen::Vector3d &pos);
171
174 const Motion& getMotion(const int fromStateID, const int toStateID);
175
176 const std::shared_ptr<const traversability_generator3d::TravMap3d> getTraversabilityMap() const;
177
178 std::vector<Motion> getMotions(const std::vector<int> &stateIDPath);
179
180 void getTrajectory(const std::vector<int> &stateIDPath, std::vector<trajectory_follower::SubTrajectory> &result,
181 bool setZToZero, const Eigen::Vector3d &startPos, const Eigen::Vector3d &goalPos, const double& goalHeading, const Eigen::Affine3d &plan2Body = Eigen::Affine3d::Identity());
182
184
186 void clear();
187
188 void setTravConfig(const traversability_generator3d::TraversabilityConfig& cfg);
189
192 void dijkstraComputeCost(const traversability_generator3d::TravGenNode* source, std::vector<double> &outDistances,
193 const double maxDist) const;
194
197 void enablePathStatistics(bool enable);
198
199private:
200
203 traversability_generator3d::TravGenNode* checkTraversableHeuristic(const maps::grid::Index sourceIndex, traversability_generator3d::TravGenNode* sourceNode,
204 const ugv_nav4d::Motion& motion, const maps::grid::TraversabilityMap3d< traversability_generator3d::TravGenNode* >& trMap);
205
209 bool checkOrientationAllowed(const traversability_generator3d::TravGenNode* node,
210 const base::Orientation2D& orientation) const;
211
212
214 void precomputeCost();
215
217 double getAvgSlope(std::vector<const traversability_generator3d::TravGenNode*> path) const;
218
220 double getMaxSlope(std::vector<const traversability_generator3d::TravGenNode*> path) const;
221
222
224 double getHeuristicDistance(const Eigen::Vector3d& a, const Eigen::Vector3d& b) const;
225
230 traversability_generator3d::TravGenNode* movementPossible(traversability_generator3d::TravGenNode* fromTravNode, const maps::grid::Index& fromIdx, const maps::grid::Index& toIdx);
231
235 bool checkExpandTreadSafe(traversability_generator3d::TravGenNode * node);
236
237 bool usePathStatistics;
238
239 traversability_generator3d::TraversabilityConfig travConf;
240 sbpl_spline_primitives::SplinePrimitivesConfig primitiveConfig;
241
242 unsigned int numAngles;
243
244 Mobility mobilityConfig;
245};
246
247}
std::ostream & operator<<(std::ostream &stream, const DiscreteTheta &angle)
Definition DiscreteTheta.cpp:3
Definition DiscreteTheta.hpp:7
Definition EnvironmentXYZTheta.hpp:24
Eigen::Vector3d robotHalfSize
Definition EnvironmentXYZTheta.hpp:114
std::vector< Distance > travNodeIdToDistance
Definition EnvironmentXYZTheta.hpp:91
void setTravConfig(const traversability_generator3d::TraversabilityConfig &cfg)
Definition EnvironmentXYZTheta.cpp:1210
virtual void PrintState(int stateID, bool bVerbose, FILE *fOut=0)
Definition EnvironmentXYZTheta.cpp:897
ThetaNode * startThetaNode
Definition EnvironmentXYZTheta.hpp:96
std::vector< Motion > getMotions(const std::vector< int > &stateIDPath)
Definition EnvironmentXYZTheta.cpp:912
bool obstacleCheck(const maps::grid::Vector3d &pos, double theta, const traversability_generator3d::TraversabilityConfig &travConf, const sbpl_spline_primitives::SplinePrimitivesConfig &splineConf, const std::string &nodeName="node")
Definition EnvironmentXYZTheta.cpp:189
virtual ~EnvironmentXYZTheta()
Definition EnvironmentXYZTheta.cpp:92
virtual bool InitializeEnv(const char *sEnvFile)
Definition EnvironmentXYZTheta.cpp:495
XYZNode * createNewXYZState(traversability_generator3d::TravGenNode *travNode)
Definition EnvironmentXYZTheta.cpp:112
void dijkstraComputeCost(const traversability_generator3d::TravGenNode *source, std::vector< double > &outDistances, const double maxDist) const
void setStart(const Eigen::Vector3d &startPos, double theta)
Definition EnvironmentXYZTheta.cpp:343
virtual int GetStartHeuristic(int stateID)
heuristic estimate from start state to state with stateID
Definition EnvironmentXYZTheta.cpp:479
void updateMap(std::shared_ptr< const traversability_generator3d::TravMap3d > travMap)
Definition EnvironmentXYZTheta.cpp:97
virtual void SetAllPreds(CMDPSTATE *state)
Definition EnvironmentXYZTheta.cpp:367
void clear()
Definition EnvironmentXYZTheta.cpp:57
maps::grid::TraversabilityMap3d< XYZNode * > searchGrid
Definition EnvironmentXYZTheta.hpp:74
virtual int SizeofCreatedEnv()
Definition EnvironmentXYZTheta.cpp:887
virtual void GetSuccs(int SourceStateID, std::vector< int > *SuccIDV, std::vector< int > *CostV)
std::shared_ptr< trajectory_follower::SubTrajectory > findTrajectoryOutOfObstacle(const Eigen::Vector3d &start, double theta, const Eigen::Affine3d &ground2Body, bool setZToZero)
Definition EnvironmentXYZTheta.cpp:1215
virtual void GetPreds(int TargetStateID, std::vector< int > *PredIDV, std::vector< int > *CostV)
Definition EnvironmentXYZTheta.cpp:881
const PreComputedMotions & getAvailableMotions() const
Definition EnvironmentXYZTheta.cpp:1128
maps::grid::TraversabilityNode< PlannerData > XYZNode
Definition EnvironmentXYZTheta.hpp:71
virtual int GetFromToHeuristic(int FromStateID, int ToStateID)
heuristic estimate from state FromStateID to state ToStateID
Definition EnvironmentXYZTheta.cpp:382
bool checkStartGoalNode(const std::string &name, traversability_generator3d::TravGenNode *node, double theta)
Definition EnvironmentXYZTheta.cpp:243
XYZNode * startXYZNode
Definition EnvironmentXYZTheta.hpp:97
virtual void PrintEnv_Config(FILE *fOut)
Definition EnvironmentXYZTheta.cpp:892
virtual void SetAllActionsandAllOutcomes(CMDPSTATE *state)
Definition EnvironmentXYZTheta.cpp:375
void enablePathStatistics(bool enable)
Definition EnvironmentXYZTheta.cpp:475
void getTrajectory(const std::vector< int > &stateIDPath, std::vector< trajectory_follower::SubTrajectory > &result, bool setZToZero, const Eigen::Vector3d &startPos, const Eigen::Vector3d &goalPos, const double &goalHeading, const Eigen::Affine3d &plan2Body=Eigen::Affine3d::Identity())
Definition EnvironmentXYZTheta.cpp:925
const std::shared_ptr< const traversability_generator3d::TravMap3d > getTraversabilityMap() const
Definition EnvironmentXYZTheta.cpp:1123
virtual bool InitializeMDPCfg(MDPConfig *MDPCfg)
Definition EnvironmentXYZTheta.cpp:500
virtual void GetSuccs(int SourceStateID, std::vector< int > *SuccIDV, std::vector< int > *CostV, std::vector< size_t > &motionIdV)
virtual int GetGoalHeuristic(int stateID)
heuristic estimate from state with stateID to goal state
Definition EnvironmentXYZTheta.cpp:428
traversability_generator3d::TravGenNode * findMatchingTraversabilityPatchAt(const Eigen::Vector3d &pos)
Definition EnvironmentXYZTheta.cpp:148
ThetaNode * goalThetaNode
Definition EnvironmentXYZTheta.hpp:98
std::vector< Hash > idToHash
Definition EnvironmentXYZTheta.hpp:87
PreComputedMotions availableMotions
Definition EnvironmentXYZTheta.hpp:94
void setGoal(const Eigen::Vector3d &goalPos, double theta)
Definition EnvironmentXYZTheta.cpp:262
const Motion & getMotion(const int fromStateID, const int toStateID)
Definition EnvironmentXYZTheta.cpp:397
std::shared_ptr< const traversability_generator3d::TravMap3d > travMap
Definition EnvironmentXYZTheta.hpp:92
ThetaNode * createNewStateFromPose(const std::string &name, const Eigen::Vector3d &pos, double theta, ugv_nav4d::EnvironmentXYZTheta::XYZNode **xyzBackNode)
Definition EnvironmentXYZTheta.cpp:121
XYZNode * goalXYZNode
Definition EnvironmentXYZTheta.hpp:99
ThetaNode * createNewState(const DiscreteTheta &curTheta, EnvironmentXYZTheta::XYZNode *curNode)
Definition EnvironmentXYZTheta.cpp:512
maps::grid::Vector3d getStatePosition(const int stateID) const
Definition EnvironmentXYZTheta.cpp:388
Definition PreComputedMotions.hpp:29
Definition EnvironmentXYZTheta.hpp:18
Definition EnvironmentXYZTheta.hpp:19
Definition EnvironmentXYZTheta.hpp:20
Definition PreComputedMotions.hpp:81
Definition EnvironmentXYZTheta.hpp:17
Definition Dijkstra.cpp:8
Definition EnvironmentXYZTheta.hpp:64
Distance(double toStart, double toGoal)
Definition EnvironmentXYZTheta.hpp:67
double distToStart
Definition EnvironmentXYZTheta.hpp:65
double distToGoal
Definition EnvironmentXYZTheta.hpp:66
virtual const char * what() const
Definition EnvironmentXYZTheta.hpp:32
EnvironmentXYZThetaException(const std::string &what)
Definition EnvironmentXYZTheta.hpp:29
const std::string msg
Definition EnvironmentXYZTheta.hpp:36
Definition EnvironmentXYZTheta.hpp:78
Hash(XYZNode *node, ThetaNode *thetaNode)
Definition EnvironmentXYZTheta.hpp:79
XYZNode * node
Definition EnvironmentXYZTheta.hpp:82
ThetaNode * thetaNode
Definition EnvironmentXYZTheta.hpp:83
Definition EnvironmentXYZTheta.hpp:50
traversability_generator3d::TravGenNode * travNode
Definition EnvironmentXYZTheta.hpp:54
PlannerData()
Definition EnvironmentXYZTheta.hpp:51
std::map< DiscreteTheta, ThetaNode * > thetaToNodes
Definition EnvironmentXYZTheta.hpp:59
Definition EnvironmentXYZTheta.hpp:42
DiscreteTheta theta
Definition EnvironmentXYZTheta.hpp:45
ThetaNode(const DiscreteTheta &t)
Definition EnvironmentXYZTheta.hpp:43
int id
Definition EnvironmentXYZTheta.hpp:44
Definition Mobility.hpp:12