00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef PL_PRM_h
00012 #define PL_PRM_h 1
00013
00014 #pragma warning( disable : 4250 )
00015
00016
00017 #include "Planners\PL_GraphBase.h"
00018
00019
00020 #include <LEDA/node_map.h>
00021 #include <LEDA/edge_map.h>
00022 #include <LEDA/node_list.h>
00023 #include <LEDA/node_pq.h>
00024 #include <LEDA/list.h>
00025
00026
00027
00028
00029
00030 enum PRM_StateMachineType;
00031
00032
00033
00034
00035
00036
00037 class PL_PRM :
00038 public PL_GraphBase
00039 {
00040
00041 public:
00042
00043 virtual ~PL_PRM();
00044
00045
00046 PL_PRM();
00047
00048 virtual bool DrawExplicit () const;
00049
00050 virtual bool Plan ();
00051
00052 virtual void SetStartConfig( const Configuration& config );
00053 virtual void SetGoalConfig ( const Configuration& config );
00054
00055
00056 virtual void SetCollisionDetector (CD_BasicStyle* collisionDetector);
00057
00058 virtual void *GetParameters();
00059 virtual bool SetParameters(const void *param);
00060 virtual bool ValidateParameters();
00061
00062
00063 void SetRadiusTol ( double tol );
00064 double GetRadiusTol ();
00065
00066 void SetPRMMode ( BOOL& isLazy, BOOL& validNodes, BOOL& validEdges );
00067 void GetPRMMode ( BOOL& isLazy, BOOL& validNodes, BOOL& validEdges ) const;
00068
00069 void SetUseMidPts ( BOOL use_them ) { useMidPts = use_them; };
00070 BOOL GetUseMidPts () const { return useMidPts; };
00071
00072 PRM_StateMachineType GetLastPlanningState () const { return lastPlanningState; };
00073
00074 void SetInitQuant ( int quant ) { initQuant = quant; };
00075 int GetInitQuant () const { return initQuant; };
00076
00077 void SetEnhanceQuant ( int quant ) { enhanceQuant = quant; };
00078 int GetEnhanceQuant () const { return enhanceQuant; };
00079
00080 void SetSeedRatio ( double ratio ) { seedRatio = ratio; };
00081 double GetSeedRatio () const { return seedRatio; };
00082
00083
00084 BOOL AddNode();
00085
00086
00087 void CopySettings( PlannerBase* original );
00088
00089 protected:
00090
00091 virtual void ConnectNode( const node& newnode );
00092 virtual void ConnectEdgesFull( const node& n1, const double& radius_squared );
00093 virtual void ConnectEdgesLazy( const node& n1, const double& radius_squared );
00094
00095
00096 SuccessResultType BuildInitRoadMap();
00097 SuccessResultType FindPath();
00098 SuccessResultType VerifyPath();
00099 SuccessResultType EnhanceRoadMap();
00100
00101
00102
00103 virtual bool SaveContents( std::ofstream& outfile ) const;
00104
00105
00106
00107 virtual bool LoadContents( std::ifstream& infile );
00108
00109
00110 void SetGraphMode ( const bool& treeGraph );
00111 bool NodeInConnectionList( const node& n1, const list<int>& connectIDs);
00112
00113
00114
00115
00116
00117 double diagonal_squared;
00118 double radiusTol;
00119
00120 BOOL lazyMode;
00121 BOOL validNodesOnly;
00122 BOOL validEdgesOnly;
00123 BOOL useMidPts;
00124
00125 PRM_StateMachineType lastPlanningState;
00126
00127 int initQuant;
00128 int enhanceQuant;
00129 double seedRatio;
00130
00131 list<Configuration> config_seeds;
00132
00133
00134 protected:
00135
00136
00137
00138 node_map<BOOL> nodeChecked;
00139 edge_map<BOOL> edgeChecked;
00140
00141 node_map<BOOL> uniformlyAdded;
00142
00143
00144 node_map<int>* connectIDp;
00145 int baseConnectID;
00146
00147
00148
00149
00150
00151
00152
00153 node_map<node> pred;
00154 node_map<double> dist;
00155 node_pq<double>* openp;
00156
00157
00158
00159 private:
00160
00161
00162
00163 inline double Astar_f( const node& n, const double& currcost ) const;
00164
00165
00166 };
00167
00168
00169
00170
00171
00172
00173 enum PRM_StateMachineType
00174 {
00175 PRM_DONE = 0,
00176 PRM_START = 1,
00177 PRM_BUILD_INIT_ROADMAP,
00178 PRM_FIND_PATH,
00179 PRM_VERIFY_PATH,
00180 PRM_TRANSLATE_PATH,
00181 PRM_ENHANCE_ROADMAP,
00182 PRM_TIMER_EXPIRED = -1,
00183 PRM_FAILURE = -2
00184 };
00185
00186
00187 #endif