move_base导航配置文件:
<?xml version="1.0"?>
<launch>
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">
<rosparam file="$(find navigation_stage)/nav/params/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find navigation_stage)/nav/params/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find navigation_stage)/nav/params/global_costmap_params.yaml" command="load" />
<rosparam file="$(find navigation_stage)/nav/params/local_costmap_params.yaml" command="load" />
<rosparam file="$(find navigation_stage)/nav/params/base_global_planner_params.yaml" command="load" />
<rosparam file="$(find navigation_stage)/nav/params/teb_local_planner_params.yaml" command="load" />
<rosparam file="$(find navigation_stage)/nav/params/costmap_converter_params.yaml" command="load" />
<param name="base_global_planner" value="global_planner/GlobalPlanner" />
<param name="base_local_planner" value="teb_local_planner/TebLocalPlannerROS" />
</node>
</launch>
这是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。关于plugi