Untitled

Cartographer 可以被视为两个独立但相关的子系统。

第一个是局部SLAM(有时也称为前端或局部轨迹构建器)。它的工作是建立一系列的子图。每个子图都应该是局部一致的,但我们接受局部 SLAM 会随着时间的推移而漂移。大多数局部 SLAM 选项可以在install_isolated/share/cartographer/configuration_files/trajectory_builder_2d.lua(对于 2D)和install_isolated/share/cartographer/configuration_files/trajectory_builder_3d.lua(对于 3D)中找到。(对于本页的其余部分,我们将参考TRAJECTORY_BUILDER_nD的常用选项)。

另一个子系统是全局 SLAM(有时称为后端)。它在后台线程中运行,它的主要工作是找到闭环约束。它通过针对子图的扫描匹配扫描(主要是通过节点Node)来做到这一点。将位姿推移类传感器和前端结果按时间顺序进行串联起来形成一条轨迹,寻找闭环关系,最终采用优化求解获取位姿总体误差最小时的位姿轨迹即submap位姿。在 3D 中,它还试图找到重力的方向。它的大部分选项都可以在install_isolated/share/cartographer/configuration_files/pose_graph.lua 中找到。

更抽象的说,局部SLAM的工作是生成更好的子图,全局SLAM的工作是更好的将子图约束到一起。

1、输入

1.1 激光、相机等测距传感器

测距传感器(例如:激光雷达)提供多个方向的深度信息。然而,一些测量与 SLAM 无关。如果传感器部分被灰尘覆盖,或者如果它指向机器人的一部分,则某些测量距离可以被视为 SLAM 的噪声。另一方面,一些最远的测量也可能来自不希望的来源(反射、传感器噪声),并且与 SLAM 无关。为了解决这些问题,Cartographer 首先应用带通滤波器,并且仅将范围值保持在某个最小和最大范围之间。应根据机器人和传感器的规格选择这些最小值和最大值。

距离是在机器人实际移动的一段时间内测量的。然而,距离是由传感器在大量 ROS 消息中“批量”传递的。Cartographer 可以独立考虑每条消息的时间戳,以考虑机器人运动引起的畸变。Cartographer 获取测量值越频繁,就越能更好地解卷,即可以立即捕获的单个相干扫描。因此,强烈建议通过扫描提供尽可能多的距离数据(ROS 消息)(一组可以与另一次扫描匹配的距离数据)。

距离数据通常是从机器人上的一个点测量的,但是是从多个角度测量的。这意味着靠近的表面(例如道路)反馈的点越多。相反,较远的物体被击中的频率较低并且提供的分数较少。为了减少点处理的计算量,我们通常需要对点云进行二次采样。然而,一个简单的随机抽样会从我们已经有低密度测量的区域中删除点,而高密度区域仍然会有比需要更多的点。为了解决这个密度问题,我们可以使用体素滤波器,将原始点下采样成一个恒定大小的立方体,并且只保留每个立方体的质心。

在应用了固定大小的体素滤波器后,Cartographer 还应用了自适应体素滤波器。此过滤器尝试确定最佳体素大小(在最大长度下)以实现目标点数。在 3D 中,两个自适应体素滤波器用于生成高分辨率和低分辨率点云,它们的用法将在Local SLAM中阐明。

1.2 惯性测量单元

惯性测量单元可以成为 SLAM 的有用信息来源,因为它提供了准确的重力方向(因此是地面),以及全面但有噪声的旋转信息。为了过滤 IMU 噪声,在一定时间内观察重力。如果您使用 2D SLAM,则可以实时处理距离数据,而无需额外的信息源,因此您可以选择是否希望 Cartographer 使用 IMU。使用 3D SLAM,您需要提供 IMU,因为它用作扫描方向的初始猜测,大大降低了扫描匹配的复杂性。

1.3 landmark部分

Cartographer可以将二维码、反光板等作为landmark,也就是当作特征点,这里先不讲,放在后续文档里讲解。

1.4 绝对位置输入

Cartographer可以将GPS当作fixed pose输入,目前没有条件,还没有测试过。