A*算法在ROS中3维空间的实现

代码流程

已知起始点
定义启发式函数(加入Tie Breaker效率可能更高)
将起始点加入openSet,计算f值(f=g+h)
定义id=-1为closeSet,id=1为openSet,初始将所有点的id定义为0
开始规划路径
	▲从openSet中取出f值最小的点CurrentNode,并将CurrentNode从openSet中取出放入closeSet
	▲if CurrentNode与目标点一致,说明找到完整路径,结束路径规划进程
	▲得到CurrentNode的相邻点NeighborNode,分别计算CurrentNode到NeighborNode的cost值
	▲遍历所有的NeighborNode
		if id==0 计算f值,加入openSet,设置父系节点
		if id==1 判断当前f值是否小于已知f值,如果小于则更新f值,重新设置父系节点
		if id==-1 在closeSet中不予考虑
结束路径规划后,从目标点开始溯源,按照标记好的父系节点最终得到一条完整路径

部分代码实现

getHeu函数

double AstarPathFinder::getHeu(GridNodePtr node1, GridNodePtr node2)
{
   
    /* 
    choose possible heuristic function you want
    Manhattan, Euclidean, Diagonal, or 0 (Dijkstra)
    Remember tie_breaker learned in lecture, add it here ?
    *
    *
    *
    STEP 1: finish the AstarPathFinder::getHeu , which is the heuristic function
    please write your code below
    *
    *
    */

   //尝试以欧几里得距离作为启发式函数
   double Heu;
   double x1,y1,z1;
   double x2,y2,z2;
   
   x1 = (double)node1->index[0];
   y1 = (double)node1->index[1];
   z1 = (double)node1->index[2];
   x2 = (double)node2->index[0];
   y2 = (double)node2->index[1];
   z2 = (double)node2->index[2];


   Heu = sqrt(pow(x1-x2, 2) + pow(y1-y2, 2) + pow(z1-z2, 2));
//    Tie Breaker 
   Heu = Heu + Heu*0.001;
//    ROS_INFO("point1(%.2f,%.2f,%.2f),point2(%.2f,%.2f,%.2f),Heu = %.2f",x1,y1,z1,x2,y2,z2,Heu);

   return Heu;
}

AstarGetSucc函数

inline void AstarPathFinder::AstarGetSucc(GridNodePtr currentPtr, vector<GridNodePtr> & neighborPtrSets, vector<double> & edgeCostSets)
{
      
    neighborPtrSets.clear();
    edgeCostSets.clear();
    /*
    *
    STEP 4: finish AstarPathFinder::AstarGetSucc yourself 
    please write your code below
    *
    *
    */
    //将currentPtr所有邻居节点写入vector<GridNodePtr> neighborPtrSets;计算对应的vector<double> edgeCostSets;
    if(currentPtr == nullptr)
        ROS_INFO ("Error: Current pointer is null!");

    Vector3i idx = currentPtr->index;
    int current_x = idx[0];
    int current_y = idx[1];
    int current_z = idx[2];
    for(int i = (current_x-1);i <= (current_x + 1
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值