//###################################################
// 2D A*
//###################################################
float aStar(Node2D& start,
Node2D& goal,
Node2D* nodes2D,
int width,
int height,
CollisionDetection& configurationSpace,
Visualize& visualization) {
// PREDECESSOR AND SUCCESSOR INDEX
int iPred, iSucc;
float newG;
// reset the open and closed list
for (int i = 0; i < width * height; ++i) {
nodes2D[i].reset();
}
// VISUALIZATION DELAY
ros::Duration d(0.001);
boost::heap::binomial_heap<Node2D*,
boost::heap::compare<CompareNodes>> O;
// update h value
start.updateH(goal);
// mark start as open
start.open();
// push on priority queue
O.push(&start);
iPred = start.setIdx(width);
nodes2D[iPred] = start;
// NODE POINTER
Node2D* nPred;
Node2D* nSucc;
// continue until O empty
while (!O.empty()) {
// pop node with lowest cost from priority queue
nPred = O.top();
// set index
iPred = nPred->setIdx(width);
// _____________________________
// LAZY DELETION of rewired node
// if there exists a pointer this node has already been expanded
if (nodes2D[iPred].isClosed()) {
// pop node from the open list and start with a fresh node
O.pop();
continue;
}
// _________________
// EXPANSION OF NODE
else if (nodes2D[iPred].isOpen()) {
// add node to closed list
nodes2D[iPred].close();
nodes2D[iPred].discover();
// RViz visualization
if (Constants::visualization2D) {
visualization.publishNode2DPoses(*nPred);
visualization.publishNode2DPose(*nPred);
// d.sleep();
}
// remove node from open list
O.pop();
// _________
// GOAL TEST
if (*nPred == goal) {
return nPred->getG();
}
// ____________________
// CONTINUE WITH SEARCH
else {
// _______________________________
// CREATE POSSIBLE SUCCESSOR NODES
for (int i = 0; i < Node2D::dir; i++) {
// create possible successor
nSucc = nPred->createSuccessor(i);
// set index of the successor
iSucc = nSucc->setIdx(width);
// ensure successor is on grid ROW MAJOR
// ensure successor is not blocked by obstacle
// ensure successor is not on closed list
if (nSucc->isOnGrid(width, height) && configurationSpace.isTraversable(nSucc) && !nodes2D[iSucc].isClosed()) {
// calculate new G value
nSucc->updateG();
newG = nSucc->getG();
// if successor not on open list or g value lower than before put it on open list
if (!nodes2D[iSucc].isOpen() || newG < nodes2D[iSucc].getG()) {
// calculate the H value
nSucc->updateH(goal);
// put successor on open list
nSucc->open();
nodes2D[iSucc] = *nSucc;
O.push(&nodes2D[iSucc]);
delete nSucc;
} else {
delete nSucc; }
} else {
delete nSucc; }
}
}
}
}
// return large number to guide search away
return 1000;
}
2D A*代码
猜你喜欢
转载自blog.csdn.net/qq_35358125/article/details/106754042
今日推荐
周排行