global_planner源码学习

简介

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函数将根据用户需求生成一系列位姿(始终沿着轨迹、或者起点目标点间的位姿插值)。

猜你喜欢

转载自blog.csdn.net/qq_41986495/article/details/86013587