导航与定位是机器人研究中的重要部分。 一般机器人在陌生的环境下需要使用激光传感器(或者深度传感器转换成激光数据),先进行地图建模,然后在根据建立的地图进行导航、定位。在ROS中也有很多完善的包可以直接使用。 在ROS中,进行导航需要使用到的三个包是: (1) move_base:根据参照的消息进行路径规划,使移动机器人到达指定的位置; (2) gmapping:根据激光数据(或者深度数据模拟的激光数据)建立地图; (3) amcl:根据已经有的地图进行定位。

       参考链接:http://www.ros.org/wiki/navigation/Tutorials/RobotSetup

                         http://www.ros.org/wiki/navigation/Tutorials

       整体导航包的格局如下图所示:

        其中白色框内的是ROS已经为我们准备好的必须使用的组件,灰色框内的是ROS中可选的组件,蓝色的是用户需要提供的机器人平台上的组件

1、sensor transforms

        其中涉及到使用tf进行传感器坐标的转换,因为我们使用的机器人的控制中心不一定是在传感器上,所以要把传感器的数据转换成在控制中心上的坐标信息。如下图所示,传感器获取的数据是在base_laser的坐标系统中的,但是我们控制的时候是以base_link为中心,所以要根据两者的位置关心进行坐标的变换。

        变换的过程不需要我们自己处理,只需要将base_laser和base_link两者之间的位置关系告诉tf,就可以自动转换了。具体的实现可以参见:http://blog.csdn.net/hcx25909/article/details/9255001

2、sensor sources

        这里是机器人导航传感器数据输入,一般只有两种: (1) 激光传感器数据 (2) 点云数据 具体实现见:http://www.ros.org/wiki/navigation/Tutorials/RobotSetup/Sensors

3、odometry source

        机器人的导航需要输入里程计的数据(tf,nav_msgs/Odometry_message),具体实现见: http://www.ros.org/wiki/navigation/Tutorials/RobotSetup/Odom

4、base controller

        在导航过程中,该部分负责将之前得出来的数据转封装成具体的线速度和转向角度信息(Twist),并且发布给硬件平台。

5、map_server

       在导航过程中,地图并不是必须的,此时相当于是在一个无限大的空地上进行导航,并没有任何障碍物。但是考虑到实际情况,在我们使用导航的过程中还是要一个地图的。 具体实现见:http://www.ros.org/wiki/slam_gmapping/Tutorials/MappingFromLoggedData        在ROS的导航中,costmap_2d这个包主要负责根据传感器的信息建立和更新二维或三维的地图。ROS的地图(costmap)采用网格(grid)的形式,每个网格的值从0~255,分为三种状态:占用(有障碍物)、无用(空闲的)、未知。具体状态和值的对应关系如下:

       

        上图共分为五个部分:(下面的红色框图是机器人的轮廓,旁边的黑框是上图的映射位置) (1) Lethal(致命的):机器人的中心与该网格的中心重合,此时机器人必然与障碍物冲突。 (2) Inscribed(内切):网格的外切圆与机器人的轮廓内切,此时机器人也必然与障碍物冲突。 (3) Possibly circumscribed(外切):网格的外切圆与机器人的轮廓外切,此时机器人相当于靠在障碍物附近,所以不一定冲突。 (4) Freespace(自由空间):没有障碍物的空间。 (5) Unknown(未知):未知的空间。 具体可见:http://www.ros.org/wiki/costmap_2d