zoukankan      html  css  js  c++  java
  • 十四课 slam&gmapping

    gmapping

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

    SLAM

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

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

    主题1下的消息类型,有map_load_time:用来保存地图载入的时间;resolution:地图的分辨率,地图的宽,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

  • 相关阅读:
    Java ClassLoader机制
    Spring JMS
    MySQL权限分配
    Java参数传递机制
    JVM装载过程
    PowerDesigner15使用时的十五个问题
    修改当前行 传值
    WebSphere MQ
    Hibernate Search牛刀小试 (转)
    关于hibernate的缓存使用
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6769610.html
Copyright © 2011-2022 走看看