orca-robotics INTRODUCTION Overview Download and Install Documentation REPOSITORY Interfaces Drivers Libraries Utilities Software Map DEVELOPER Dashboard PEOPLE Contributors Users Project Download Mailing lists
|
astar.h00001 /* 00002 * Orca-Robotics Project: Components for robotics 00003 * http://orca-robotics.sf.net/ 00004 * Copyright (c) 2004-2008 Alex Brooks, Alexei Makarenko, Tobias Kaupp 00005 * 00006 * This copy of Orca is licensed to you under the terms described in 00007 * the LICENSE file included in this distribution. 00008 * 00009 */ 00010 00011 // 00012 // This class was originally written by Pham Ngoc Hai (h dot pham at acfr.usyd.edu.au). 00013 // 00014 00015 #ifndef ORCA2_ASTAR_H 00016 #define ORCA2_ASTAR_H 00017 00018 #include <deque> 00019 00020 namespace hydropathplan 00021 { 00022 00023 namespace astar { 00024 00025 class AStarNode { 00026 public: 00027 AStarNode(int, int, double); // cell's postion (i,j), and weight 00028 ~AStarNode(); 00029 00030 double m_NodeWeight; // The weight value of the cell. This is used to calculate 00031 // the moving cost to move to this cell from its adjacent node 00032 // cost = m_NodeWeight*ASTAR_CELLSIZE (if orthogonal nodes) 00033 // cost = sqrt(2)*m_NodeWeight*ASTAR_CELLSIZE (if diagonal nodes) 00034 00035 00036 double f,g,h; // total cost, cost from start to note, heuristic to goal. 00037 int cell_i, cell_j; // Cell(Node) position (i,j) in the matrix 00038 // Note: In C/C++, the first index starts from 0 00039 // then cell_i = 0,1,... and cell_i = 0,1,... 00040 // In Matlab: the index stars from 1 => need to convert from Matlab 00041 00042 int m_NodeID; // Unique Identification of each node (the index in mattrix) 00043 // the 2x2 MAP(num_rows, num_cols) in C/C++ can be seen as an 1 dimentional 00044 // array with mxn elements, then m_NodeID can be: 00045 // m_NodeID = cell_j * m_iAStarMapRows + cell_i = cell_j*ASTAR_GRIDSIZE_H + cell_i; 00046 00047 int m_NumOfChildren; 00048 00049 AStarNode *m_pParent; 00050 AStarNode *m_pNext; // 00051 AStarNode *m_pChildren[8]; // List of Neighbor around a node (8 neighbors) 00052 00053 }; 00054 00055 //Tobias: my addition 00056 typedef std::deque<AStarNode*> AStarNodeDeque; 00057 00058 class AStar { 00059 public: 00060 AStar(double *map, int map_rows, int map_cols, double map_cellsize, bool map_AllowDiagonal, double map_ObstacleWeight); 00061 ~AStar(); 00062 00063 bool run(); // Run A* to find the shortest path 00064 void RUN_Initialize(); // Run A* -> the 1st step: initialize 00065 int RUN_Step(); // Run A* step by step 00066 00067 //protected: 00068 bool m_bAllowDiagonal; // Permit to go Digonal or not 00069 00070 double m_CellSize; // The size of each cell (-> calculate distance) 00071 double m_ObstacleWeight; // Obstacle's weight -> to check whether or not a cell is obstacle. 00072 00073 double *m_pAStarMAP; //The A* Map stored in 2x2 matrix of doubles 00074 // this map stores the weight of each cell 00075 // e.x weight = 1 if free zone 00076 // weight = ASTAR_OBSTACLE_COST if Obstacle 00077 int m_iAStarMapRows; //Number of Rows of A* Map 00078 int m_iAStarMapCols; //Number of Columns of A* Map 00079 00080 int m_iStartNodeID; // the ID (index of 1-dimention matrix) of the Start Node 00081 int m_iStartNode_i; // the cell_i (index i) of the Start Node (in C/C++ matrix) 00082 int m_iStartNode_j; // the cell_j (index j) of the Start Node (in C/C++ matrix) 00083 00084 int m_iGoalNodeID; // the ID (index of 1-dimention matrix) of the Goal Node 00085 int m_iGoalNode_i; // the cell_i (index i) of the Goal Node (in C/C++ matrix) 00086 int m_iGoalNode_j; // the cell_j (index j) of the Goal Node (in C/C++ matrix) 00087 00088 // Nodes Lists 00089 AStarNode *m_pBestNode; 00090 AStarNode *m_pOpenList; 00091 AStarNode *m_pClosedList; 00092 00093 // Class Methods 00094 void AddToOpenList(AStarNode *); 00095 AStarNode *GetBestNode(); 00096 AStarNode *IsNodeInList(AStarNode *, int); 00097 void ExpandChildNodes(AStarNode *); 00098 void LinkChildNodes(AStarNode *, AStarNode *); 00099 00100 void ClearNodes(); 00101 00102 00103 // Check whether can go from node to neighbor, basing on: 00104 // neighbor may be an Obstacle, 00105 // or neighbor is located out of the limitation of the map 00106 // or permiting Diagonal route from node to neighbor or not. 00107 int Check_ASNodeValid(AStarNode *node, AStarNode *neighbor); 00108 00109 00110 // Calculate the moving cost from node to its adjacent node (1 of 8 adjacent nodes) 00111 double Cost_2AdjacentNodes(AStarNode *node, AStarNode *neighbor); 00112 00113 // Calculate Mahattan heuristic h from node1 to node2 (Orthogonal moving only) 00114 // D is the minimum moving cost between a node and its adjacent (D is changable...) 00115 double ManhattanHeuristic(int node1_i, int node1_j, int node2_i, int node2_j, double D); 00116 00117 // Calculate Diagonal heuristic h from node1 to node2 (Allow Diagonal+Orthogonal moving) 00118 double DiagonalHeuristic(int node1_i, int node1_j, int node2_i, int node2_j, double D); 00119 00120 // Inline functions. 00121 // This function convert the index of 2-dimentions matrix to the index in the coressponding 00122 // 1-dimention matrix in C/C++ (index starts from 0, other than 1 in Matlab) 00123 inline int GetNodeID(int cell_i, int cell_j) { return cell_j * m_iAStarMapRows + cell_i; } 00124 }; 00125 00126 } 00127 00128 } 00129 00130 #endif |
Webmaster: Tobias Kaupp (tobasco at users.sourceforge.net)