ROS学习笔记(6):ROS激光SLAM
发布日期:2021-10-03 22:59:05 浏览次数:37 分类:技术文章

本文共 3106 字,大约阅读时间需要 10 分钟。

目录


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上,一般为mapnav_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 wint8[] 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等算法。

具体的比较如下表所示:

 

gmapping

Karto

Hector

所需sensor

激光雷达

里程计

激光雷达

里程计

激光雷达(需要高频率的雷达)

输入topic

  • /tf 以及 /tf_static : 坐标变换,tf/tfMessage 或 tf2_msgs/TFMessage。一定得提供的有两个tf,一个是 base_frame 与laser_frame 之间的tf,即机器人底盘和激光雷达之间的变换;一个是 base_frame 与 odom_frame 之间的tf,即底盘和里程计原点之间的坐标变换。 odom_frame 可以理解为里程计原点所在的坐标系。
  • /scan :激光雷达数据,类型为sensor_msgs/LaserScan
  • /tf 以及 /tf_static : 坐标变换,tf/tfMessage 或 tf2_msgs/TFMessage。一定得提供的有两个tf,一个是 base_frame 与laser_frame 之间的tf,即机器人底盘和激光雷达之间的变换;一个是 base_frame 与 odom_frame 之间的tf,即底盘和里程计原点之间的坐标变换。 odom_frame 可以理解为里程计原点所在的坐标系。
  • /scan :激光雷达数据,类型为sensor_msgs/LaserScan
  • /tf 以及 /tf_static : 坐标变换,tf/tfMessage 或 tf2_msgs/TFMessage。一定得提供的有两个tf,一个是 base_frame 与laser_frame 之间的tf,即机器人底盘和激光雷达之间的变换;一个是 base_frame 与 odom_frame 之间的tf,即底盘和里程计原点之间的坐标变换。 odom_frame 可以理解为里程计原点所在的坐标系。
  • /scan :激光雷达数据,类型为sensor_msgs/LaserScan
  • /syscommand:接收到 reset 消息时,地图和机器人的位置都会初始化到最初位置。

输出topic

  • /tf :主要是输出 map_frame 和 odom_frame 之间的变换
  • /slam_gmapping/entropy : std_msgs/Float64 类型,反映了机器人位姿估计的分散程度
  • /map : slam_gmapping 建立的地图
  • /map_metadata : 地图的相关信息
  • /tf :主要是输出 map_frame 和 odom_frame 之间的变换
  • /map : slam_gmapping 建立的地图
  • /map_metadata : 地图的相关信息
  • /tf :主要是输出 map_frame 和 odom_frame 之间的变换
  • /map : slam_gmapping 建立的地图
  • /map_metadata : 地图的相关信息
  • /poseupdate :具有协方差的机器人位姿估计
  • /slam_out_pose:没有协方差的位姿估计。

提供的service

/dynamic_map : 类型为nav_msgs/GetMap,用于获取当前的地图。

/dynamic_map :类型为nav_msgs/GetMap,用于获取当前的地图

/dynamic_map :类型为nav_msgs/GetMap,用于获取当前的地图

技术实现

粒子滤波

基于图优化的方法

scan-matching(Gaussian-Newton equation)

效果

成熟,可靠,效果稳定,许多基于ROS的机器人都跑gmapping_slam

与gmapping类似,更适合在大地图环境下

效果不如Gmapping、Karto,因为它仅用到激光雷达信息

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

      (2)

      (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计算图

 

转载地址:https://blog.csdn.net/lclfans1983/article/details/105399567 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ROS学习笔记(7):Navigation 导航
下一篇:ROS学习笔记(5): TF(Transform)坐标转换和原理分析

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月01日 19时37分30秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章