最近在看ros的导航规划算法,后面打算一一解析一边,先从global planner的A*算法开始吧。

        ros里面的全局规划用的是global_planner而不是navfn包,修改这种选择也比较简单,只需要将move_base参数的

global_planner替换为global_planner/GlobalPlanner即可。

       然后全局规划函数在global_planner/planner_core.cpp中,我们先去看 GlobalPlanner::initialize函数的一些参数设置

使用Quadratic算法还是Potential算法,我们选择Potential算法

选择A*算法还是Dijkstra算法,我们用A*算法

选择GridPath合适GradientPath,我们用GridPath即栅格地图

初始化里面主要就是设置参数。

     然后我们进入到最重要的路径规划部分

函数是在GlobalPlanner::makePlan函数中,最核心的计算cost的函数就是

由于我们选用的A*算法,所以该函数去到astar.cpp里面去查看

核心函数就在add函数里面,是计算每一个当前点的周围可用点到起始点的potential即cost

该函数的核心就在calculatePotential里面,根据之前的参数选择,该函数应该是使用的PotentialCalculateor,

所以在potential_calculator.h里面

该函数是计算起始点到当前点的potential,选取当前点周围prev_potential最小的值然后加上该点的cost值。

上面的流程就将起始点可到终点的相关点的cost计算完毕,下面就选择cost最小的路径即可。

继续返回GlobalPlanner::makePlan函数中,

 GlobalPlanner::getPlanFromPotential函数中,核心的函数就是

根据之前初始化的选择,我们使用girdPath,在grid_path.cpp中

至此,A*算法就将全局路径计算完毕

更多推荐

ros navigation 解析之A*路径规划