ROS导航软件包的主要目的是将机器人从初始位置移动到目标位置,在移动的过程中不会与周围环境发生任何碰撞。
ROS导航软件包附带了几种导航相关的算法实现,它们可以帮助我们轻松实现移动机器人的自主导航。
用户只需要提供机器人的目标位置和来自轮子编码器、IMU、GPS等传感器获得的测量数据,激光扫描器的数据流,
以及其他传感器的数据流,例如激光雷达数据或者来自Kinect等传感器的3D点云数据,导航软件包的输出是控制移动的
速度命令,这些命令将控制机器人移动到目标位置。导航软件包集包含了一些标准算法的实现,例如SLAM、A*(star)、
Dijkstra、amcl等,可以直接用于我们的应用程序。
安装ROS导航软件包集使用以下命令安装:
$sudo apt install ros-melodic-navigation
ROS导航硬件的要求
ROS导航软件包集被设计成一个通用的软件包集,机器人需要满足一些基本的硬件要求,如下:
*导航软件包在差速驱动和完整约束(即机器人的总DOF等于机器人可控的DOF)方面表现更好,此外,
应通过以下形式的速度命令控制移动机器人:x:velocity(线速度)、y:velocity(线速度)和theta:velocity(角速度)。
*机器人需要配备视觉(RGB-D)或激光传感器,用来构建周围环境的地图。
*导航软件包集在方形或圆形的移动平台上工作将表现更好,当然它也可以在任意形状的平台上工作,但性能无法得到保证。
如下图是从ROS网站(http://wiki.ros.org/navigation/Tutorials/RobotSetup)上获取的导航软件包集的基本组成框图,我们可以看到
每个功能块的用途以及如何为自定义机器人配置导航软件包集:
导航软件包集的框图
下面对作为导航软件包集输入功能模块的说明:
*里程计数据源(odometry source): 机器人的测距数据给出了机器人相对与起始位置的距离,主要的测试数据源于来自轮子编码器、
IMU、2D/3D相机(视觉测距)。里程计数据需要以nav_msgs/Odometry的消息形式发送到导航软件包集。里程计信息主要用于
控制机器人的位置和移动速度,里程计数据是导航软件包集必须的输入数据。
*传感器数据源:我们必须给导航软件包集提供激光扫描数据或点云数据来扫描机器人周围的环境,这些数据与里程计数据一起构建机器人的全局和局部代价地图。
这里使用的主要传感器是激光雷达或者Kinect3D传感器,数据需要封装成sensor_msgs/LaserScan或者sensor_msgs/PointCloud的形式。
*传感器坐标变换/tf:机器人需要使用ROStf来发布机器人坐标系的变换关系。
*底盘控制器:底盘控制器的主要功能是转换导航软件包集的输出数据,该消息是geometry_msgs/Twist类型的消息,它将会被转换成机器人相应的马达速度。
导航软件包集的可选节点有amcl和地图服务器,它们可以帮助机器人定位以及保存/加载机器人的地图。
使用导航软件包 在使用导航软件包集之前,我们已经讨论了MoveIt!和move_group节点,在导航软件包集中也有一个类似move_group的节点,它被称为move_base节点,
上图中我们清楚地看到move_base节点从传感器、tf和里程计中获得输入数据,这与我们在MoveIt!中看到的move_group节点很类似。
理解move_base节点move_base节点来自名为move_base的软件包,该软件包的主要功能是在其他导航节点的帮助下将机器人从当前位置移动到目标位置。
该软件包中的move_base节点将全局规划和局部规划连接在一起进行路径规划,如果机器人在移动时被某些障碍困住动不了,那么它将
开始调用rotate-recovery软件包,此时需要将全局代价地图和局部代价地图结合起来。
move_base节点基本上实现了SimpleActionServer。它以geometry_msgs/PoseStamped消息的形式发送目标位置信息,
我们可以使用SimpleActionClient节点向此节点发送目标位置信息。
move_base节点从名为move_base_simple/goal的话题订阅目标位置信息,如上图所示,该话题是导航软件包集的一个输入数据。
当此节点接收到一个目标位置后,它将连接到如global_planner、local_planner、recovery_behavior、global_costmap和local_costmap之类的组件,
以生成输出结果(geometry_msgs/Twist类型的速度指令),并将其发送给底盘控制器,从而控制机器人移动到目标位置。
下面是move_base节点连接的所有软件包列表:
*global_planner: 该软件包提供了函数库和节点,用来在地图上从机器人的当前位置到目标位置规划一条最优化路径。
该软件包实现的路径查找算法有A*、Dijkstra等,这些算法用于查找从机器人当前位置到目标位置的最短路径。
*local_planner: 该软件包的主要功能是使用全局规划路径中的部分局部路径为机器人提供导航,局部规划将获取里程计数据、传感器数据、
然后给机器人控制器发送合适的速度命令来完成全局规划路径的一部分,局部规划软件包是轨迹滑出(Trajectory Rollout)算法和动态窗口算法(Dynamic Window Algorithms,DWA)的具体表现。
*rotate-recovery: 该软件包通过执行360度旋转来帮助机器人从本地障碍中恢复。
*clear-costmap-recovery: 该软件包也是用来帮助机器人从本地障碍中恢复,但它是通过将当前导航包集使用的代价地图转换为静态地图后清除代价地图来达到摆脱障碍的目的。
*costmap-2D: 该软件包的主要用途是建立机器人周围环境地图,机器人只能通过地图来规划路径,在ROS中,我们创建2D或3D的栅格地图,用栅格单元表示周围的环境,
每个栅格都有一个概率值,表示该区域是否被占据。costmap-2D软件包可以通过订阅激光扫描或者点云的传感器来建立周围环境的栅格地图,这里的全局代价地图用于全局
路径规划,局部代价地图用于局部路径规划。
下面是与move_base节点交互的其他软件包:
*mao-server: 该软件包保存和加载costmap-2D软件包生成的地图。
*AMCL: AMCL是一种在地图上定位机器人位置的方法,这种方法使用粒子滤波器在概率论的帮助下跟踪机器人相对于地图的位置。
在ROS系统中,AMCL是通过接收sensor_msgs/LaserScan消息来建立地图的。
*gmapping : 该软件包是Fast SLAM算法的一种实现,它使用激光扫描数据和里程计数据构建一个2D占据栅格地图。
使用导航软件包集 我们认识ROS导航软件包集中每个模块的功能,接下来我们来看整个系统是如何工作,机器人需要发布一个合适的里程计数据、tf信息和激光传感器的数据,
并且需要一个底盘控制器和周围环境的地图。
如果所有的需要都满足,我们就可以开始使用导航软件包了。
在地图上定位
机器人将要执行的第一步就是在地图上进行定位,AMCL就是机器人用来在地图上定位的软件包。
发送目标和路径规划
获取了机器人的当前位置后,我们就可以向move_base节点发送一个目标位置,然后move_base节点将此目标位置发送给全局规划器。
该规划器将规划一条从当前机器人位置到目标机器人位置的路径。
这个规划是根据地图服务器提供的全局代价地图进行规划的,全局规划器将此路径发送给局部规划器,
然后局部规划器将执行全局规划的每段路径。
局部规划器从move_base节点获取里程计信息和传感器数据,并为机器人找出一个无碰撞的局部规划,局部规划器从局部代价地图
获取信息,局部代价地图用来监视机器人周围的障碍物。
碰撞恢复行为
全局代价地图和局部代价地图与激光扫描数据关联在一起,如果机器人在某一处卡主了,那么导航软件包
将触发恢复行为节点,,例如通过清除代价地图恢复或者通过原地旋转恢复。
发送速度命令
局部规划器以包含线速度和角速度的twist消息(geometry_msgs/Twist)的形式向机器人底盘控制器发送
生成的控制移动命令,机器人底盘控制器负责将twist消息转换为相应的马达速度。