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插件机制