在关于move base 的配置文章中,关于planner部分的分析有一句:
对于global planner,可以采用以下三种实现之一:
"navfn/NavfnROS","global_planner/GlobalPlanner","carrot_planner/CarrotPlanner"
本文分析其中的一种实现"global_planner/GlobalPlanner"
:
首先,move base是通过plugin调用它的:
文件bgp_plugin.xml
<library path="lib/libglobal_planner">
<class name="global_planner/GlobalPlanner" type="global_planner::GlobalPlanner" base_class_type="nav_core::BaseGlobalPlanner">
<description>
A implementation of a grid based planner using Dijkstras or A*
</description>
</class>
</library>
然后在package.xml的配置中,加入如下行:
<export>
<nav_core plugin="${prefix}/bgp_plugin.xml" />
</export>
planner 部分的入口:
int main(int argc, char** argv) {
ros::init(argc, argv, "global_planner");
tf::TransformListener tf(ros::Duration(10));
costmap_2d::Costmap2DROS lcr("costmap", tf);
//需要一个costmap,传递给planner初始化
global_planner::PlannerWithCostmap pppp("planner", &lcr);
ros::spin();
return 0;
}
在class PlannerWithCostmap
的构造函数中:
PlannerWithCostmap::PlannerWithCostmap(string name, Costmap2DROS* cmap) :GlobalPlanner(name, cmap->getCostmap(), cmap->getGlobalFrameID())
{
ros::NodeHandle private_nh("~");
cmap_ = cmap;
make_plan_service_ = private_nh.advertiseService("make_plan", &PlannerWithCostmap::makePlanService, this);
pose_sub_ = private_nh.