全局路径规划(二) makePlan

makePlan

1
2
3
bool GlobalPlanner::makePlan(const geometry_msgs::PoseStamped& start,
const geometry_msgs::PoseStamped& goal,
std::vector<geometry_msgs::PoseStamped>& plan)

planService中计算导航路径用到makePlan函数,但planner_boost::shared_ptr<nav_core::BaseGlobalPlanner>,也就是抽象类,实际调用的函数是派生类的override函数bool GlobalPlanner::makePlan(start, goal, plan),内容相当复杂。

实际调用是重载函数makePlan(start, goal, default_tolerance_, plan);, 参数defaulttoleranceGlobalPlanner::initialize中由参数服务器的参数default_tolerance决定. 但是GlobalPlanner::makePlan实际没有处理default_tolerance参数,是Navfn::makePlan处理了。也就是说终点不合适时,GlobalPlanner不会改变全局路径终点

GlobalPlanner::makePlan 重载函数如下:

1
2
3
4
5
6
7
boost::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()

继承关系 2.png

最重要的函数是 calculatePotentials 和 getPlanFromPotential

calculatePotentials

计算所有的可行点

1
2
3
bool found_legal = planner_->calculatePotentials(costmap_->getCharMap(), 
start_x, start_y, goal_x, goal_y,
nx*ny*2, potential_array_ );

实现方法显然是DijkstraExpansion::calculatePotentialsQuadraticCalculator::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插件机制