ROS Cartographer–Algorithm
原文:Algorithm walkthrough for tuning
论文地址(Google Search):Real-Time Loop Closure in 2D LIDAR SLAM
ROS Cartographer的完整参考文件:Cartographer ROS Integration
概述
本地SLAM通常由前端和后端两个部分组成,其中前端的任务是建立局部地图,后端的任务是对局部地图进行优化和融合,以得到一个整体的环境地图。在ROS中,常用的本地SLAM方案包括GMapping、Hector SLAM和Cartographer等。
Local SLAM
local SLAM (sometimes also called frontend or local trajectory builder). Its job is to build a succession of submaps. Each submap is meant to be locally consistent but we accept that local SLAM drifts over time.
本地SLAM(有时也称为前端或本地轨迹生成器)的任务是构建一系列子地图。每个子地图旨在在局部上保持一致,但我们接受本地SLAM随时间漂移的情况。
本地SLAM随时间漂移的主要原因是机器人在移动过程中,传感器的测量数据存在噪声和误差,同时环境本身也是动态的,存在随机性,这些因素都会导致机器人在建立地图的过程中出现偏差。此外,机器人的里程计也会因为累积误差而导致位置和姿态的偏差,从而使本地地图的精度下降。
另外,本地SLAM通常是基于滑动窗口技术来实现的,即只保留最近一段时间的数据用于建图,而将之前的数据舍弃。这种方式可以有效地降低计算复杂度和内存占用,但也会导致地图的精度逐渐下降,因为过去的数据被舍弃后,机器人在移动时可能出现位置和姿态的跳跃,从而导致本地地图的漂移。
本地SLAM是一个建立机器人与环境之间的关系的过程,它的目标是不断的根据机器人的传感器信息建立子地图,同时根据之前建立的子地图来矫正之前建立的子地图的错误,提高地图的精度。在构建子地图的过程中,本地SLAM需要实时处理机器人的传感器数据,如激光雷达、相机、IMU等,以及里程计数据,并且需要解决数据不一致性、噪声等问题,以实现高质量的子地图构建。
Global SLAM
global SLAM (sometimes called the backend). It runs in background threads and its main job is to find loop closure constraints. It does that by scan-matching scans (gathered in nodes) against submaps. It also incorporates other sensor data to get a higher level view and identify the most consistent global solution. In 3D, it also tries to find the direction of gravity.
全局SLAM(有时称为后端)是另一个子系统,它在后台线程中运行,其主要任务是查找回环闭合约束。它通过将扫描(在节点中收集)与子地图进行扫描匹配来实现这一点。它还结合其他传感器数据以获得更高级别的视图,并确定最一致的全局解。在3D中,它还试图找到重力方向。
全局SLAM是一种用于建立环境地图的技术。它可以帮助机器人在不知道自己位置的情况下,通过识别环路和特征点等手段,逐步构建出自己所处的环境地图,并实现定位和导航。在全局SLAM中,需要实时处理大量的传感器数据,并对其进行高效的处理和分析,以获得准确和鲁棒的环境地图。
输入
Cartographer starts by applying a bandpass filter and only keeps range values between a certain min and max range
在提取输入时,Cartographer会使用一个带通滤波器,提取预设的区间范围之内(以米为单位)的信息,这个值需要根据实际的机器人以及所用的传感器进行确定。
距离信息(Range data)的获取
距离信息(Range data)通常是从机器人上的一个点在多个角度上进行测量的结果。这意味着靠近的表面(例如道路)经常被测量并提供大量的点。相反,远处的物体往往不太容易被测量,提供的点数较少。为了减少处理点云的计算量,通常需要对点云进行子采样。然而,简单的随机采样会从我们已经有低密度测量的区域中删除点,而高密度区域仍然会有比需要更多的点。为了解决这个密度问题,我们可以使用体素滤波器(voxel filter)将原始点下采样为一个恒定大小的立方体,并仅保留每个立方体的质心。
小的立方体尺寸将导致更密集的数据表示,从而导致更多的计算量。大的立方体尺寸会导致数据损失,但速度会快得多
除了用户自定义大小的体素滤波器,ROS Cartographer也提供了一个自适应的体素滤波器(Adaptive Voxel Filter),该滤波器会根据预设的(由用户指定)目标点(target number)的值,对这个滤波器的大小进行自适应调整,使之可以在保证目标点数量与不超过最大size的前提下完成最小(也可以说是最优)size的选择。
在2D的情况下,可以选择不使用IMU惯性传感器,但是在进行3D建图时,则需要提供IMU的相关信息,借此预计建图时机器人的朝向(扫描方向),降低在扫描匹配(scan matching)时的复杂度。
体素滤波器(Voxel Filter)
体素滤波器(Voxel Filter)是一种点云下采样算法,用于降低点云数据量。它将点云数据划分为立方体(体素)网格,并将每个体素内的点替换为该体素的质心点。这样做可以保留点云数据的结构特征和形状,同时减少点云数据的大小。
体素滤波器的算法流程如下:
- 将点云数据划分为体素网格:根据设定的体素大小,将点云数据划分为一个个立方体网格。
- 对每个体素进行处理:对于每个体素,将其内部的所有点取平均值作为该体素的质心点。
- 将处理后的体素合并:将处理后的体素合并成一个新的点云数据集。
在ROS中,体素滤波器可以通过PCL库中的VoxelGrid
类来实现。用户可以指定体素的大小和点云数据的输入输出。该类还支持在三个坐标轴上设置不同的体素大小,以适应不同的点云数据。
使用体素滤波器可以有效地减少点云数据的大小,同时保留其关键特征,对于一些需要处理大量点云数据的场景,如机器人自主导航和三维重建等应用中,体素滤波器是一个非常有用的工具。
惯性传感器(IMU: Inertial Measurement Unit)
IMU包含多个传感器,例如加速度传感器、陀螺仪、磁力仪等,主要负责提供机器人的运动与方向信息,可以得到机器人的线速度、角速度、加速度等等,甚至可以给出磁场信息。
IMU提供了一个准确的重力方向,重力矢量可以作为标定传感器测量值和估计机器人滚动和俯仰角的参考。此外,IMU 可以提供一个良好的机器人旋转的整体指示,这可以用来提高里程估计的准确性。
扫描匹配(Scan Matching)
在SLAM中,"scan matching"是指将一个局部地图(submap)与另一个包含相邻激光雷达扫描数据的局部地图进行比较并计算它们之间的相对位置和姿态变换(即6DoF的运动估计)。这个过程中,计算机会寻找局部地图中与相邻局部地图的特征匹配的关键点,然后计算它们之间的相对位姿。这种比对方式的目的是将局部地图(submap)相对于其他局部地图(submap)的位姿与机器人在世界坐标系中的位姿进行对齐。因此,在3D SLAM中,IMU提供了机器人姿态的初始猜测,这有助于降低scan matching的计算复杂度。
以下是两种扫描匹配的方法:
- The
CeresScanMatcher
takes the initial guess as prior and finds the best spot where the scan match fits the submap. It does this by interpolating the submap and sub-pixel aligning the scan. This is fast, but cannot fix errors that are significantly larger than the resolution of the submaps. If your sensor setup and timing is reasonable, using only theCeresScanMatcher
is usually the best choice to make. - The
RealTimeCorrelativeScanMatcher
can be enabled if you do not have other sensors or you do not trust them. It uses an approach similar to how scans are matched against submaps in loop closure (described later), but instead it matches against the current submap. The best match is then used as prior for theCeresScanMatcher
. This scan matcher is very expensive and will essentially override any signal from other sensors but the range finder, but it is robust in feature rich environments.
CeresScanMatcher
和RealTimeCorrelativeScanMatcher
都是用来进行扫描匹配的工具,它们都需要一个初始猜测(initial guess)作为先验信息。CeresScanMatcher
会将扫描与子地图进行匹配,并通过子像素对齐来找到最佳位置,匹配速度较快。但是,如果错误显著大于子地图的分辨率,则无法修复。通常情况下,如果您的传感器设置和时序合理,仅使用CeresScanMatcher
是最佳选择。
如果没有其他传感器或您不信任其他传感器,则可以启用RealTimeCorrelativeScanMatcher
。它使用与环路闭合中扫描与子地图匹配类似的方法,但是它是针对当前子地图进行匹配,最佳匹配将被用作CeresScanMatcher
的先验。这种扫描匹配器非常昂贵,并且基本上会覆盖来自除了激光测距仪以外的其他传感器的任何信号,但在复杂环境中具有相当的鲁棒性。