move_base package可以说是整个navigation stack里最重要的部分了。它的功能是给定一个目标点,尝试产生一系列能让机器人到达这个目标点的控制指令。简单来说,就是输入是一个goal(geometry_msgs/PoseStamped),输出是一系列command(geometry_msgs/Twist)。详细一点来说,就是在已知环境地图和机器人在地图中位置的情况下,利用地图和传感器数据处理得到的 global costmap 和 local costmap,调用全局路径规划器得到一条全局路径,调用局部路径规划器使机器人在移动过程中能在大致沿着路径前进并动态规避障碍物,整个行进过程中还要handle一部分异常情况即recovery_behaviors。架构描述如下图。
接下来,分析一下源码(move_base.cpp)
先看构造函数:
sub topic:move_base只sub了一个topic,即"/move_base_simple/goal,类型是"geometry_msgs/PoseStamped"。在rviz中"2D Nav Goal"点击下,可以产生一条这种消息。
goal_sub_ = simple_nh.subscribe<geometry_msgs::PoseStamped>("goal", 1, boost::bind(&MoveBase::goalCB, this, _1));
pub topic:pub了三个消息,/cmd_vel是路径规划出来的控制机器人运动的速度指令;/current_goal是一个中间变量;/goal是actionlib相关的topic。
vel_pub_ = nh.advertise<geometry_msgs::Twist>("cmd_vel", 1);
current_goal_pub_ = private_nh.advertise<geometry_msgs::PoseStamped>("current_goal", 0 );
actio