这是navigation的第一篇文章,主要通过分析ROS代码级实现,了解navigation。本文从move_base入手。
机器人导航主要框架如图:
Navigation Stack主要组成部分:move_base:
用户调用movebase是通过传入带tf参数的构造函数:
move_base::MoveBase move_base( tf );
以下分析move_base的构造函数:
MoveBase::MoveBase(tf::TransformListener& tf):
tf_(tf),
as_(NULL),
planner_costmap_ros_(NULL), controller_costmap_ros_(NULL),
bgp_loader_("nav_core", "nav_core::BaseGlobalPlanner"),
blp_loader_("nav_core", "nav_core::BaseLocalPlanner"),
recovery_loader_("nav_core", "nav_core::RecoveryBehavior"),
planner_plan_(NULL), latest_plan_(NULL), controller_plan_(NULL),
runPlanner_(false), setup_(false), p_freq_change_(false), c_freq_change_(false), new_global_plan_(false) `
这部分是构造函数的初始化列表,可以看到几个重要的参数:
planner_costmap_ros_(NULL), controller_costmap_ros_(NULL),
bgp_loader_("nav_core", "nav_core::BaseGlobalPlanner"),
blp_loader_("nav_core", "nav_core::BaseLocalPlanner"),
recovery_loader_("nav_core", "nav_core::RecoveryBehavior")
planner_costmap_ros_是用于全局导航的地图,controller_costmap_ros_ 是局部导航用的地图,地图类型为经过ROS封装的costmap_2d::Costmap2DROS* 。关于地图类型的分析会在接下来的文章中进行。
bgp_loader_ 是global planner, blp_loader_ 是local planner。二者的声明为:
pluginlib::ClassLoader<nav_core::BaseGlobalPlanner> bgp_loader_;
pluginlib::ClassLoader<nav_core::BaseLocalPlanner> blp_loader_;
是属于一个模板类ClassLoader,实例化为BaseGlobalPlanner或者BaseLocalPlanner。关于pluginlib的分析也有在接下来的文章中进行。
bgp_loader_ 和 blp_loader_ 的作用是为以下类成员提供实例化:
boost::shared_ptr<nav_core::BaseLocalPlanner> tc_;
boost::shared_ptr<n