ROS-SLAM
基本概念
SLAM 即 Simultaneous Localization and Mapping,中文名为同时定位与地图构建,是机器人、自动驾驶、增强现实等领域中的关键技术。
在未知环境中,搭载特定传感器的主体(如机器人、无人机等)在运动过程中,需要实时确定自身在环境中的位置,同时构建出周围环境的地图,这一过程就是 SLAM 要解决的问题。例如,扫地机器人在清扫房间时,它并不知道房间的布局,需要一边移动一边搞清楚自己在哪里,同时把房间的地图绘制出来。
ROS - SLAM 中 SLAM 基本知识点
1. 核心问题
- 定位(Localization):确定机器人在环境中的位置和姿态。机器人需要根据自身携带的传感器数据,如激光雷达的距离信息、摄像头的图像信息等,结合已有的先验地图(如果存在)来估计自己当前所处的位置和朝向。
- 建图(Mapping):根据机器人在运动过程中获取的传感器数据,构建出周围环境的地图。地图的形式可以多种多样,常见的有栅格地图(将环境划分为一个个小格子,每个格子表示该区域是否被占据)、点云地图(由大量的三维点组成,描述环境中物体的表面信息)等。
2. 关键要素
- 传感器
- 激光雷达(LiDAR):通过发射激光束并测量反射光的时间来获取周围环境的距离信息,能提供高精度的二维或三维距离数据,是许多 SLAM 算法常用的传感器。
- 摄像头:包括单目相机、双目相机和 RGB - D 相机等。单目相机成本低,但缺乏深度信息;双目相机可以通过视差计算得到深度信息;RGB - D 相机则可以直接输出彩色图像和深度图像。
- 里程计(Odometry):通常用于提供机器人的运动信息,如轮子的旋转角度、角速度等,可用于估计机器人的相对位移和姿态变化。
- 数据关联:在 SLAM 过程中,需要将不同时刻传感器观测到的特征或数据与地图中的元素进行匹配,确定它们之间的对应关系。例如,在激光雷达数据中,要判断当前扫描到的特征点是否与之前地图中的某个特征点是同一个。
- 闭环检测:当机器人回到之前访问过的区域时,能够识别出来并利用这一信息对地图和自身位姿进行修正,以减少累积误差。
常用 SLAM 算法及节点通讯、订阅发布关系
1. Gmapping
- 算法原理:基于 Rao - Blackwellized 粒子滤波(有时间了会讲解一下,大致理解即可)的方法,将机器人的位姿和地图的估计问题分离开来。通过粒子滤波来估计机器人的位姿,每个粒子对应一个可能的机器人轨迹,同时在每个粒子上维护一个地图。随着机器人的运动,不断更新粒子的权重和地图信息。
- 节点通讯与订阅发布关系
- 订阅话题
/scan
:订阅激光雷达的扫描数据,通常为sensor_msgs/LaserScan
类型,包含了激光雷达在各个角度上的测量距离信息。/odom
:订阅里程计数据,类型为nav_msgs/Odometry
,用于获取机器人的运动信息,辅助估计机器人的位姿。
- 发布话题
/map
:发布构建好的栅格地图,类型为nav_msgs/OccupancyGrid
,地图中的每个格子用一个数值表示该区域被占据的概率,常见的情况就是-1代表未知,0代表没有障碍物,1代表有障碍物/map_metadata
:发布地图的元数据,如地图的分辨率、原点位置等,类型为nav_msgs/MapMetaData
。/slam_gmapping/entropy
:发布粒子滤波的熵值,反映了粒子的分散程度。
- 订阅话题
2. Hector SLAM
- 算法原理:基于高斯牛顿优化方法,利用激光雷达数据进行地图构建和机器人定位。该算法不依赖于里程计信息,通过对激光雷达扫描数据进行匹配和优化,直接估计机器人的位姿和地图。它采用多分辨率地图来提高匹配的效率和精度。
- 节点通讯与订阅发布关系
- 订阅话题
/scan
:订阅激光雷达的扫描数据,同 Gmapping 一样,为sensor_msgs/LaserScan
类型。
- 发布话题
/map
:发布构建好的栅格地图,类型为nav_msgs/OccupancyGrid
。/map_metadata
:发布地图的元数据,类型为nav_msgs/MapMetaData
。/tf
:发布机器人的位姿变换信息,通过 TF(Transform)树来表示机器人在地图坐标系中的位置和姿态。
- 订阅话题
3. Cartographer
- 算法原理:基于图优化的方法,将 SLAM 问题转化为一个图优化问题。在机器人运动过程中,将不同时刻的位姿和传感器数据作为图中的节点,节点之间的约束关系(如激光雷达数据的匹配结果)作为边。通过最小化图中所有约束的误差平方和来优化节点的位置,从而得到最优的地图和机器人位姿估计。
- 节点通讯与订阅发布关系
- 订阅话题
/scan
:订阅激光雷达的扫描数据,类型为sensor_msgs/LaserScan
。/imu
:订阅惯性测量单元(IMU)的数据,类型为sensor_msgs/Imu
,用于提供机器人的姿态信息,辅助定位和建图。/odom
:订阅里程计数据,类型为nav_msgs/Odometry
。
- 发布话题
/map
:发布构建好的地图,通常为栅格地图或子地图的集合。/submap_list
:发布子地图的列表信息,包含了每个子地图的元数据和状态信息。/trajectory_node_list
:发布机器人的轨迹节点信息,记录了机器人在不同时刻的位姿。
- 订阅话题
在当下的实际应用中,cartographer 的应用范围和流行度呈上升趋势,尤其是在对建图精度和场景规模要求较高的工业和自动驾驶领域。gmapping 由于其简单性和易实现性,在教学和一些对精度要求不是极高的室内小规模场景中仍然有一定的应用。hector_slam 则在特定的无里程计场景中发挥着不可替代的作用。