目录

7 ROS激光SLAM

7.1 Map(地图)

7.2 常用的激光SLAM算法比较

7.2.1 Gmapping SLAM计算图

7.2.2 Karto SLAM计算图

7.2.3 Hector SLAM计算图


7 ROS激光SLAM

机器人导航的主要问题可以分为建图(Mapping)、定位(Localization)和路径规划(Path Planning)三部分。同步定位与建图(SLAM)问题位于定位和建图的交集部分。SLAM需要机器人在未知的环境中逐步建立起地图,然后根据地图确定自身位置,从而进一步定位。

SLAM可以分为激光,视觉,激光+视觉 三类。本章主要研究激光SLAM算法。

7.1 Map(地图)

ROS中的地图就是一张普通的灰度图像,通常为pgm格式。这张图像上的黑色像素表示障碍物,白色像素表示可行区域,灰色是未探索的区域。如下图所示:

地图在ROS中是以Topic的形式维护和呈现的,这个Topic名称是 /map ,它的消息类型是 nav_msgs/OccupancyGrid

可以通过 rosmsg show nav_msgs/OccupancyGrid 来查看消息格式:

std_msgs/Header header #消息的报头
    uint32 seq
    time stamp
    string frame_id #地图消息绑定在TF的哪个frame上,一般为map
nav_msgs/MapMetaData info #地图相关信息
    time map_load_time #加载时间
    float32 resolution #分辨率 单位:m/pixel
    uint32 width #宽 单位:pixel
    uint32 height #高 单位:pixel
    geometry_msgs/Pose origin #原点
    geometry_msgs/Point position
        float64 x
        float64 y
        float64 z
    geometry_msgs/Quaternion orientation
        float64 x
        float64 y
        float64 z
        float64 w
int8[] data #地图具体信息

以上定义了/map话题的数据结构,包含了三个主要的部分:header, info和data。header是消息的报头,保存了序号、时间戳、frame等通用信息,info是地图的配置信息,它反映了地图的属性,data是真正存储这张地图数据的部分,它是一个可变长数组, int8 后面加了 [] ,可以理解为一个类似于vector的容器,它存储的内容有width*height个int8型的数据,也就是这张地图上每个像素。

对于未知区域的地图,可以是机器人在运动中使用SLAM算法动态构建。

对于已知区域的地图,可以首先启动SLAM算法node,移动机器人使其扫描周围环境并建图,然后使用map_server($ rosrun map_server map_saver -f map) 保存地图。 在以后的导航中使用已保存的地图即可。

7.2 常用的激光SLAM算法比较

ROS中常用的激光SLAM算法有Gmapping、Karto、Hector等算法。

具体的比较如下表所示:

    (1)里程计包括车轮上的光电码盘、惯性导航单元(IMU)、视觉里程计,可以只用其中的一个作odom,也可以选择多个进行数据融合,融合结果作为odom。

      (2)https://blog.csdn.net/dddxxxx/article/details/78460636

      (3)Refer to《An evaluation of 2D SLAM techniques available in robot operating system》

7.2.1 Gmapping SLAM计算图

7.2.2 Karto SLAM计算图

7.2.3 Hector SLAM计算图