简介
global_planner负责全局规划,主要利用了A*算法和Dijkstra算法。提供了makeplan接口做全局规划。可以发布geometry_msgs::PoseStamped类型的信息。
============================================================
定义接口规范的类
Expander类:
作为核心全局规划算法的基类,定义了例如A*、Dijstras算法应该有的接口:calculatePotentials:计算Potentials,potential是一个nx * ny大小的数组(大小和costmap一致),其中的元素代表从起点走至该点的花费。
Traceback类
规定了getpath接口,根据建立的potential,从目标点回溯到起点,把路径保存在std::vector<std::pair<float, float> >& path中。
===========================================================
真正干活的类
AStarExpansion类
继承了Expander类,利用A*算法实现了calculatePotentials接口,这个Astar算法利用了heap堆(一种完全二叉树,底层用vector实现)的特性,根节点始终是总代价最小的路径点。然后在周围计算potential,直至找到目标点。很符合扩张(expander)这个名字。
DijkstraExpansion类
A*算法比这个算法好,先不看。
GridPath类
继承了Traceback类,实现了getpath接口,根据potential,按照九个格子一步步的往回找,回溯到起点。
GradientPath类
继承了Traceback类,实现了getpath接口,具体是按照梯度的方法,目前没仔细看。
GlobalPlanner类
继承了nav_core::BaseGlobalPlanner类,实现了makeplan接口。
makeplan中,调用了expander的实现接口calculatePotentials,然后调用函数getPlanFromPotential(里面调用了Traceback类的getpath接口实现)将路径找出来,最后保存为std::vector<geometry_msgs::PoseStamped>& plan的形式。
OrientationFilter类
makeplan后生成的std::vector<geometry_msgs::PoseStamped>& plan仅包含位置信息,此类生成一系列位姿。processPath函数将根据用户需求生成一系列位姿(始终沿着轨迹、或者起点目标点间的位姿插值)。