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 "ReedsShepp.hpp"
11#include <trajectory_follower/SubTrajectory.hpp>
12#include <unordered_map>
13#include <chrono>
14
15std::ostream& operator<< (std::ostream& stream, const DiscreteTheta& angle);
16
17namespace ugv_nav4d
18{
19
20 class StateCreationFailed : public std::runtime_error {using std::runtime_error::runtime_error;};
21 class NodeCreationFailed : public std::runtime_error {using std::runtime_error::runtime_error;};
22 class ObstacleCheckFailed : public std::runtime_error {using std::runtime_error::runtime_error;};
23 class OrientationNotAllowed : public std::runtime_error {using std::runtime_error::runtime_error;};
24
25
26class EnvironmentXYZTheta : public DiscreteSpaceInformation
27{
28protected:
29
30 struct EnvironmentXYZThetaException : public SBPL_Exception
31 {
32 EnvironmentXYZThetaException(const std::string& what) :
33 msg("SBPL has encountered a fatal error: " + what){}
34
35 virtual const char* what() const throw()
36 {
37 return msg.c_str();
38 }
39 const std::string msg;
40 };
41
42
44 struct ThetaNode
45 {
46 ThetaNode(const DiscreteTheta &t) :theta(t) {};
47 int id;
49 };
50
53 {
54 PlannerData() : travNode(nullptr) {};
55
57 traversability_generator3d::TravGenNode *travNode;
58
62 std::map<DiscreteTheta, ThetaNode *> thetaToNodes;
63 };
64
66 struct Distance
67 {
68 double distToStart = 0;
69 double distToGoal = 0;
70 Distance(double toStart, double toGoal) : distToStart(toStart), distToGoal(toGoal){}
71 };
72
74 typedef maps::grid::TraversabilityNode<PlannerData> XYZNode;
75
76 //search space without theta
77 maps::grid::TraversabilityMap3d<XYZNode *> searchGrid;
78
88
90 std::vector<Hash> idToHash;
91
94 std::vector<Distance> travNodeIdToDistance;
95 std::vector<bool> nodeInCorridor;
97 std::shared_ptr<const traversability_generator3d::TravMap3d> travMap;
98
100
102 XYZNode *startXYZNode; //part of the start state
104 XYZNode *goalXYZNode; //part of the goal state
105
107 XYZNode *createNewXYZState(traversability_generator3d::TravGenNode* travNode);
108 ThetaNode *createNewStateFromPose(const std::string& name, const Eigen::Vector3d& pos, double theta, ugv_nav4d::EnvironmentXYZTheta::XYZNode** xyzBackNode);
109
110 bool checkStartGoalNode(const std::string& name, traversability_generator3d::TravGenNode* node, double theta);
111
112public:
113
115 bool obstacleCheck(const maps::grid::Vector3d& pos, double theta,
116 const traversability_generator3d::TraversabilityConfig& travConf,
117 const sbpl_spline_primitives::SplinePrimitivesConfig& splineConf,
118 const std::string& nodeName="node");
119 Eigen::Vector3d robotHalfSize;
120
123 EnvironmentXYZTheta(std::shared_ptr<const traversability_generator3d::TravMap3d > travMap,
124 const traversability_generator3d::TraversabilityConfig &travConf,
125 const sbpl_spline_primitives::SplinePrimitivesConfig &primitiveConfig,
126 const Mobility& mobilityConfig);
127
128 virtual ~EnvironmentXYZTheta();
129
130 void updateMap(std::shared_ptr<const traversability_generator3d::TravMap3d > travMap);
131
132 void setPlanningTimeout(const std::chrono::steady_clock::time_point& start, double maxTime)
133 {
134 planningStartTime = start;
135 planningMaxTime = maxTime;
136 }
137
138 virtual bool InitializeEnv(const char* sEnvFile);
139 virtual bool InitializeMDPCfg(MDPConfig* MDPCfg);
140
147 std::shared_ptr<trajectory_follower::SubTrajectory> findTrajectoryOutOfObstacle(const Eigen::Vector3d& start, double theta,
148 const Eigen::Affine3d& ground2Body, bool setZToZero);
149
150
154 virtual int GetFromToHeuristic(int FromStateID, int ToStateID);
158 virtual int GetStartHeuristic(int stateID);
163 virtual int GetGoalHeuristic(int stateID);
164
165 virtual void GetPreds(int TargetStateID, std::vector< int >* PredIDV, std::vector< int >* CostV);
166 virtual void GetSuccs(int SourceStateID, std::vector< int >* SuccIDV, std::vector< int >* CostV);
167 virtual void GetSuccs(int SourceStateID, std::vector< int >* SuccIDV, std::vector< int >* CostV, std::vector< size_t >& motionIdV);
168
169 virtual void PrintEnv_Config(FILE* fOut);
170 virtual void PrintState(int stateID, bool bVerbose, FILE* fOut = 0);
171
172 virtual void SetAllActionsandAllOutcomes(CMDPSTATE* state);
173 virtual void SetAllPreds(CMDPSTATE* state);
174 virtual int SizeofCreatedEnv();
175
176 void setStart(const Eigen::Vector3d &startPos, double theta);
177 void setGoal(const Eigen::Vector3d &goalPos, double theta);
178
179 maps::grid::Vector3d getStatePosition(const int stateID) const;
180
181 traversability_generator3d::TravGenNode* findMatchingTraversabilityPatchAt(const Eigen::Vector3d &pos);
182
185 const Motion& getMotion(const int fromStateID, const int toStateID);
186
187 const std::shared_ptr<const traversability_generator3d::TravMap3d> getTraversabilityMap() const;
188
189 std::vector<Motion> getMotions(const std::vector<int> &stateIDPath);
190
191 void getTrajectory(const std::vector<int> &stateIDPath, std::vector<trajectory_follower::SubTrajectory> &result,
192 bool setZToZero, const Eigen::Vector3d &startPos, const Eigen::Vector3d &goalPos, const double& goalHeading, const Eigen::Affine3d &plan2Body = Eigen::Affine3d::Identity());
193
208 void getTrajectoryReedsShepp(const std::vector<int> &stateIDPath, std::vector<trajectory_follower::SubTrajectory> &result,
209 bool setZToZero, const Eigen::Vector3d &startPos, const double& startHeading,
210 const Eigen::Vector3d &goalPos, const double& goalHeading,
211 const Eigen::Affine3d &plan2Body, double stepSize, int maxShortcut = 0);
212
214
216 void clear();
217
218 void setTravConfig(const traversability_generator3d::TraversabilityConfig& cfg);
219
224 void setReedsSheppGoalShot(bool enable, double maxDistance, double stepSize);
225
230 void setReedsSheppMaxCusps(int maxCusps);
231
232 void setCorridorWidth(double width);
233 void setGoalOrientationMargin(double margin);
234 void setGoalDistanceMargin(double margin);
235
238 void dijkstraComputeCost(const traversability_generator3d::TravGenNode* source, std::vector<double> &outDistances,
239 const double maxDist) const;
240
243 void enablePathStatistics(bool enable);
244
245private:
246
249 traversability_generator3d::TravGenNode* checkTraversableHeuristic(const maps::grid::Index sourceIndex, traversability_generator3d::TravGenNode* sourceNode,
250 const ugv_nav4d::Motion& motion, const maps::grid::TraversabilityMap3d< traversability_generator3d::TravGenNode* >& trMap);
251
260 bool validateReedsSheppSegment(traversability_generator3d::TravGenNode* startNode,
261 const std::vector<RSSample>& samples,
262 const traversability_generator3d::TravGenNode* expectedEndNode,
263 std::vector<traversability_generator3d::TravGenNode*>& outNodes);
264
268 bool checkOrientationAllowed(const traversability_generator3d::TravGenNode* node,
269 const base::Orientation2D& orientation) const;
270
271
273 void precomputeCost();
274
276 double getAvgSlope(const std::vector<const traversability_generator3d::TravGenNode*>& path) const;
277
279 double getMaxSlope(const std::vector<const traversability_generator3d::TravGenNode*>& path) const;
280
281
283 double getHeuristicDistance(const Eigen::Vector3d& a, const Eigen::Vector3d& b) const;
284
289 traversability_generator3d::TravGenNode* movementPossible(traversability_generator3d::TravGenNode* fromTravNode, const maps::grid::Index& fromIdx, const maps::grid::Index& toIdx);
290
294 bool checkExpandTreadSafe(traversability_generator3d::TravGenNode * node);
295
296 bool usePathStatistics;
297
298 traversability_generator3d::TraversabilityConfig travConf;
299 sbpl_spline_primitives::SplinePrimitivesConfig primitiveConfig;
300
301 unsigned int numAngles;
302
303 Mobility mobilityConfig;
304 struct CachedTransition {
305 size_t motionId;
306 int cost;
307 };
308 std::unordered_map<uint64_t, CachedTransition> transitionCache;
309 double goalOrientationMargin;
310 double goalDistanceMargin;
311
312 std::chrono::steady_clock::time_point planningStartTime;
313 double planningMaxTime;
314
316 bool useReedsSheppGoalShot = false;
317 double reedsSheppGoalShotMaxDistance = 0.0;
318 double reedsSheppStepSize = 0.0;
320 int reedsSheppMaxCusps = 1;
321};
322
323}
std::ostream & operator<<(std::ostream &stream, const DiscreteTheta &angle)
Definition DiscreteTheta.cpp:3
Definition DiscreteTheta.hpp:7
Definition EnvironmentXYZTheta.hpp:27
Eigen::Vector3d robotHalfSize
Definition EnvironmentXYZTheta.hpp:119
std::vector< Distance > travNodeIdToDistance
Definition EnvironmentXYZTheta.hpp:94
void setTravConfig(const traversability_generator3d::TraversabilityConfig &cfg)
Definition EnvironmentXYZTheta.cpp:2134
virtual void PrintState(int stateID, bool bVerbose, FILE *fOut=0)
Definition EnvironmentXYZTheta.cpp:1186
std::vector< bool > nodeInCorridor
Definition EnvironmentXYZTheta.hpp:95
ThetaNode * startThetaNode
Definition EnvironmentXYZTheta.hpp:101
std::vector< Motion > getMotions(const std::vector< int > &stateIDPath)
Definition EnvironmentXYZTheta.cpp:1201
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:199
virtual ~EnvironmentXYZTheta()
Definition EnvironmentXYZTheta.cpp:107
virtual bool InitializeEnv(const char *sEnvFile)
Definition EnvironmentXYZTheta.cpp:541
XYZNode * createNewXYZState(traversability_generator3d::TravGenNode *travNode)
Definition EnvironmentXYZTheta.cpp:127
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:363
virtual int GetStartHeuristic(int stateID)
heuristic estimate from start state to state with stateID
Definition EnvironmentXYZTheta.cpp:525
void updateMap(std::shared_ptr< const traversability_generator3d::TravMap3d > travMap)
Definition EnvironmentXYZTheta.cpp:112
void setPlanningTimeout(const std::chrono::steady_clock::time_point &start, double maxTime)
Definition EnvironmentXYZTheta.hpp:132
virtual void SetAllPreds(CMDPSTATE *state)
Definition EnvironmentXYZTheta.cpp:401
void clear()
Definition EnvironmentXYZTheta.cpp:70
maps::grid::TraversabilityMap3d< XYZNode * > searchGrid
Definition EnvironmentXYZTheta.hpp:77
virtual int SizeofCreatedEnv()
Definition EnvironmentXYZTheta.cpp:1176
virtual void GetSuccs(int SourceStateID, std::vector< int > *SuccIDV, std::vector< int > *CostV)
void setCorridorWidth(double width)
Definition EnvironmentXYZTheta.cpp:2107
void setReedsSheppGoalShot(bool enable, double maxDistance, double stepSize)
Definition EnvironmentXYZTheta.cpp:2122
std::shared_ptr< trajectory_follower::SubTrajectory > findTrajectoryOutOfObstacle(const Eigen::Vector3d &start, double theta, const Eigen::Affine3d &ground2Body, bool setZToZero)
Definition EnvironmentXYZTheta.cpp:2139
virtual void GetPreds(int TargetStateID, std::vector< int > *PredIDV, std::vector< int > *CostV)
Definition EnvironmentXYZTheta.cpp:1170
const PreComputedMotions & getAvailableMotions() const
Definition EnvironmentXYZTheta.cpp:1858
maps::grid::TraversabilityNode< PlannerData > XYZNode
Definition EnvironmentXYZTheta.hpp:74
void setReedsSheppMaxCusps(int maxCusps)
Definition EnvironmentXYZTheta.cpp:2129
virtual int GetFromToHeuristic(int FromStateID, int ToStateID)
heuristic estimate from state FromStateID to state ToStateID
Definition EnvironmentXYZTheta.cpp:416
bool checkStartGoalNode(const std::string &name, traversability_generator3d::TravGenNode *node, double theta)
Definition EnvironmentXYZTheta.cpp:260
void getTrajectoryReedsShepp(const std::vector< int > &stateIDPath, std::vector< trajectory_follower::SubTrajectory > &result, bool setZToZero, const Eigen::Vector3d &startPos, const double &startHeading, const Eigen::Vector3d &goalPos, const double &goalHeading, const Eigen::Affine3d &plan2Body, double stepSize, int maxShortcut=0)
Definition EnvironmentXYZTheta.cpp:1525
XYZNode * startXYZNode
Definition EnvironmentXYZTheta.hpp:102
virtual void PrintEnv_Config(FILE *fOut)
Definition EnvironmentXYZTheta.cpp:1181
virtual void SetAllActionsandAllOutcomes(CMDPSTATE *state)
Definition EnvironmentXYZTheta.cpp:409
void enablePathStatistics(bool enable)
Definition EnvironmentXYZTheta.cpp:521
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:1214
const std::shared_ptr< const traversability_generator3d::TravMap3d > getTraversabilityMap() const
Definition EnvironmentXYZTheta.cpp:1853
virtual bool InitializeMDPCfg(MDPConfig *MDPCfg)
Definition EnvironmentXYZTheta.cpp:546
void setGoalOrientationMargin(double margin)
Definition EnvironmentXYZTheta.cpp:2112
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:473
traversability_generator3d::TravGenNode * findMatchingTraversabilityPatchAt(const Eigen::Vector3d &pos)
Definition EnvironmentXYZTheta.cpp:163
ThetaNode * goalThetaNode
Definition EnvironmentXYZTheta.hpp:103
std::vector< Hash > idToHash
Definition EnvironmentXYZTheta.hpp:90
PreComputedMotions availableMotions
Definition EnvironmentXYZTheta.hpp:99
double corridorWidth
Definition EnvironmentXYZTheta.hpp:96
void setGoalDistanceMargin(double margin)
Definition EnvironmentXYZTheta.cpp:2117
void setGoal(const Eigen::Vector3d &goalPos, double theta)
Definition EnvironmentXYZTheta.cpp:279
const Motion & getMotion(const int fromStateID, const int toStateID)
Definition EnvironmentXYZTheta.cpp:431
std::shared_ptr< const traversability_generator3d::TravMap3d > travMap
Definition EnvironmentXYZTheta.hpp:97
ThetaNode * createNewStateFromPose(const std::string &name, const Eigen::Vector3d &pos, double theta, ugv_nav4d::EnvironmentXYZTheta::XYZNode **xyzBackNode)
Definition EnvironmentXYZTheta.cpp:136
XYZNode * goalXYZNode
Definition EnvironmentXYZTheta.hpp:104
ThetaNode * createNewState(const DiscreteTheta &curTheta, EnvironmentXYZTheta::XYZNode *curNode)
Definition EnvironmentXYZTheta.cpp:558
maps::grid::Vector3d getStatePosition(const int stateID) const
Definition EnvironmentXYZTheta.cpp:422
Definition PreComputedMotions.hpp:29
Definition EnvironmentXYZTheta.hpp:21
Definition EnvironmentXYZTheta.hpp:22
Definition EnvironmentXYZTheta.hpp:23
Definition PreComputedMotions.hpp:81
Definition EnvironmentXYZTheta.hpp:20
Definition ConfigLoader.hpp:9
Definition EnvironmentXYZTheta.hpp:67
Distance(double toStart, double toGoal)
Definition EnvironmentXYZTheta.hpp:70
double distToStart
Definition EnvironmentXYZTheta.hpp:68
double distToGoal
Definition EnvironmentXYZTheta.hpp:69
virtual const char * what() const
Definition EnvironmentXYZTheta.hpp:35
EnvironmentXYZThetaException(const std::string &what)
Definition EnvironmentXYZTheta.hpp:32
const std::string msg
Definition EnvironmentXYZTheta.hpp:39
Definition EnvironmentXYZTheta.hpp:81
Hash(XYZNode *node, ThetaNode *thetaNode)
Definition EnvironmentXYZTheta.hpp:82
XYZNode * node
Definition EnvironmentXYZTheta.hpp:85
ThetaNode * thetaNode
Definition EnvironmentXYZTheta.hpp:86
Definition EnvironmentXYZTheta.hpp:53
traversability_generator3d::TravGenNode * travNode
Definition EnvironmentXYZTheta.hpp:57
PlannerData()
Definition EnvironmentXYZTheta.hpp:54
std::map< DiscreteTheta, ThetaNode * > thetaToNodes
Definition EnvironmentXYZTheta.hpp:62
Definition EnvironmentXYZTheta.hpp:45
DiscreteTheta theta
Definition EnvironmentXYZTheta.hpp:48
ThetaNode(const DiscreteTheta &t)
Definition EnvironmentXYZTheta.hpp:46
int id
Definition EnvironmentXYZTheta.hpp:47
Definition Mobility.hpp:12