makePlan
1 | bool GlobalPlanner::makePlan(const geometry_msgs::PoseStamped& start, |
在planService中计算导航路径用到makePlan函数,但planner_是boost::shared_ptr<nav_core::BaseGlobalPlanner>,也就是抽象类,实际调用的函数是派生类的override函数bool GlobalPlanner::makePlan(start, goal, plan),内容相当复杂。
实际调用是重载函数makePlan(start, goal, default_tolerance_, plan);, 参数defaulttolerance在GlobalPlanner::initialize中由参数服务器的参数default_tolerance决定. 但是GlobalPlanner::makePlan实际没有处理default_tolerance参数,是Navfn::makePlan处理了。也就是说终点不合适时,GlobalPlanner不会改变全局路径终点
GlobalPlanner::makePlan 重载函数如下:1
2
3
4
5
6
7boost::mutex::scoped_lock lock(mutex_);
if (!initialized_) {
ROS_ERROR( "This planner has not been initialized yet, but it is being used,
please call initialize() before use");
return false;
}
plan.clear();initialized_在GlobalPlanner::initialize赋值true, frame_id_实际是GlobalPlanner::initialize函数中的costmap_ros->getGlobalFrameID()

| 最重要的函数是 calculatePotentials 和 getPlanFromPotential |
calculatePotentials
计算所有的可行点1
2
3bool found_legal = planner_->calculatePotentials(costmap_->getCharMap(),
start_x, start_y, goal_x, goal_y,
nx*ny*2, potential_array_ );
实现方法显然是DijkstraExpansion::calculatePotentials 和 QuadraticCalculator::calculatePotential
getPlanFromPotential 和 getPath
getPlanFromPotential涉及到Traceback::virtual bool getPath,这是一个纯虚函数,实现有两种: class GradientPath : public Traceback(梯度路径), class GridPath : public Traceback(栅格路径)
GradientPath::getPath // 从可行点中计算路径path
OrientationFilter
核心是processPath函数,可以理解为给生成的 path 顺毛,因为A*算法规划的path只能保证路线的连续性,还要保证拐弯的角度别变得太快。 但是setMode设定模式只有在GlobalPlanner::reconfigureCB里使用
参考:
为ROS navigation功能包添加自定义的全局路径规划器
官方wiki教程-使用自己的路径规划算法
ROS插件机制
