十四课 slam&gmapping

gmapping

根据激光数据(或者深度数据模拟的激光数据)建立地图,在turtlebot里面应用的就是深度数据模拟的激光数据.如果没有激光雷达的话可以使用Kinect.

SLAM

机器人在未知环境中从一个未知位置开始移动,在移动的过程中根据位置估计和地图进行自身定位,同时在自身定位的基础上建造增量式地图.

这里面有两个主题和一个服务

主题1下的消息类型,有map_load_time:用来保存地图载入的时间;resolution:地图的分辨率,width:地图的宽,height:地图的高.origin:包含地图的原点位置信息

主题2是map主题,该消息类型下有一个header,一个info包含地图的相关信息,data,以及地图的数据.

服务dynamic_map 服务类型为nav_msgs/GetMap.srv其类型为nav_msgs/Occupancy/Grid用来获得占据网格地图.

slam_gmapping:它是在一个完整平台上使用的一个包,它通常需要里程计信息.而hector_mapping它不需要包含里程计信息,手拿着就可以实现gmapping的过程.这节课主要讲hector_mapping,在讲完导航之后讲slam_gmapping.二者是差不多的,熟悉了其一,对另外一个就也熟悉了.

slam_gmapping:需要订阅一个激光雷达的scan主题的数据,这是必须的,还包括一个tf主题,它要求监听来自odometry的tf变换;需要发布的主题有地图的相关信息map_metadata以及地图数据map主题;服务dynamic_map用来获得地图;要求的tf变换,一个是base_laser->base_link,它通常用的是transform static publisher,前面讲过如何使用它来广播两个固定坐标系之间的变换.以及base_link->odom;提供的tf变换是map->odom;其优点在于定位准确;缺点:需要完整硬件平台支持.

 

hector_mapping:需要订阅一个激光雷达的scan主题的数据,这是必须的,由于它不需要odometry的相关信息,故就不需要tf.需要发布的主题有地图的相关信息map_metadata以及地图数据map主题;除此之外还有两个要发布的主题slam_out_pose估计位置信息,但不包含协方差,以及poseupdate包含了正在分布估计,因为它没有里程计信息,故用上面上个主题来估计自己的位置. 服务dynamic_map用来获得地图;base_laser->到base_frame也是两个固定坐标系的变换;提供的tf变换是map->odom;定位不够准确;手持激光雷达即可实现.

实现gmapping

硬件要求

B配置实现gmapping

首先下载hector_slam的包

包含roplidar的启动文件

<include file="$(find rplidar_ros)/launch/rplidar.launch"/>
要求的tf变换

<node pkg="tf" type="static_transform_publisher" name="map_to_odom" args="0.0 0.0 0.0 0 0 0.0 /odom /base_link 10"/>

第一个从static_transform_publisher到map_to_odom的变换可以不指定.

第二个从/base_link 到/laser的变换是必须指定的

<node pkg="tf" type="static_transform_publisher" name="base_frame_laser" args="0 0 0 0 0 0 /base_link /laser 10"/>
参数全是0,说明他们刚开始是在一起的,后面的10代表发布的频率.

下面包含一个gmapping 的默认文件

<include file="$(find hector_mapping)/launch/mapping_default.launch"/>
下面是rviz的配置文件

<node pkg="rviz" type="rviz" name="rviz" args="-d rviz_cfg.rviz"/>

上面完整的形式

下面来看一下gmapping默认的launch文件

tf_map_scanmatch_transform_frame_name它的默认值是/scanmatcher_frame,tf_map_scanmatch_transform它的默认值为true,它要求提供从map到scanmatch的tf变换,如果没有它tf会出现问题.

base_frame默认的是base_link,以及odom_frame默认的也是base_link,因为它没有里程计信息,pub_map_odom_transform设置为true,就是发布map_odom_transform的变换,scan_subscriber_queue_size的默认值为5,即队列的长度为5,指定激光雷达发布的主题为scan_topic为scan.地图的大小map_size为2048,下面是相关的配置文件,启动的节点是hector_mapping,下面是坐标系的名字,再下面是tf的使用;下面是地图的大小,地图参数的更新,广播的配置.

修改rplidar驱动文件(没有该驱动文件!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)

修改的原因在于这样我们才可以从scan的header中获得它的坐标系,

下面切换到真是的机器上来实现导航

sudo chmod 777 /dev/tty/USB0

roslaunch hector_slam_launch demo.launch

 

posted on 2017-04-26 17:16  gary_123  阅读(1010)  评论(0编辑  收藏  举报

导航