Cartographer前后端梳理

0. 简介

最近在研究整个SLAM框架的改进处,想着能不能从Cartographer中找到一些亮点可以用于参考。所以这一篇博客希望能够梳理好Cartographer前后端优化,并从中得到一些启发。carto整体是graph-based框架,前端是scan-map匹配,后端是SPA优化。前端又分为CSM+Ceres两个部分,完成匹配后则会进入子图生成维护中。在子图维护以及优化后放入后端优化,完成全局地图优化和回环检测。下图来自cartographer 代码分析

前端优化

前端负责数据的初步处理、局部地图的构建以及与即时定位相关的工作。主要流程包括:

  1. 传感器数据输入:前端接受来自多种传感器的数据输入,包括激光雷达(LiDAR)、惯性测量单元(IMU)、里程计等。
  2. 数据预处理
    • 时间同步:不同传感器的数据时间戳可能不一致,需要进行时间同步。
    • 数据滤波:对 LiDAR 数据等进行滤波,移除异常或噪声数据。
    • 转换坐标系:将数据转换到统一的坐标系中。
  3. 局部地图构建
    • 扫描匹配:将当前帧的 LiDAR 数据与上一帧或者局部地图进行匹配,估计机器人的位置和姿态。
    • 插值和融合:利用 IMU 数据进行插值,融合不同传感器的信息,减少漂移。
  4. 生成子图
    • 前端会在特定时间或距离阈值内生成一个子图(Submap)。这个子图包含一段时间内的传感器数据,用来表示局部地图。
  5. 发送到后端:局部优化完成后,将子图数据传输给后端进行全局优化。

子图流程

子图在前端和后端之间起到重要的连接作用。它的主要流程如下:

  1. 子图生成
    • 前端会在一定时间间隔或移动距离达到阈值后,生成一个新的子图。
    • 子图代表在这个时间段或距离内的局部地图数据,通常包含来自 LiDAR、IMU、相机等传感器的数据。
    • 每个子图在生成时会在局部进行优化,包括与邻近帧的扫描匹配,生成初步的位姿估计。
  2. 子图固定
    • 一旦子图生成并初步优化完成,它就被固定,以便后续优化中使用。
    • 固定的子图包含其位姿估计和点云数据。
  3. 子图插入(下面都是是后端对子图的操作)
    • 前端将生成的子图传递给后端,后端将它插入全局位姿图中。
    • 后端根据前端的初步位姿估计,将新子图与全局图进行连接,确保其在全局地图中的初始位置正确。
  4. 子图连接
    • 子图会在后端进行相邻子图的连接,以确保当前子图与邻近子图保持一致。
    • 这包括回环检测,如果检测到闭环,则会标记两个相关子图之间的连接关系,为后续的全局优化做准备。
  5. 全局优化
    • 子图的位姿经过图优化算法进行全局优化(如 Ceres Solver),从而调整它们在全局地图中的相对位置和方向。
    • 优化完成后,每个子图的位姿在全局地图中得到修正。
  6. 生成全局地图
    • 优化后的子图拼接形成完整的全局地图。
    • 子图的位姿修正确保了全局地图的精度和一致性。

后端优化

后端负责全局的地图优化、回环检测和地图更新。主要流程包括:

  1. 子图数据接收
    • 后端接收来自前端的子图数据,包括子图的初始位姿、点云和其他传感器信息。
    • 每个子图在前端进行过初步的局部优化,后端会根据它们之间的相对位姿进行进一步优化。
  2. 构建位姿图
    • 后端为每个子图建立位姿节点,将其作为位姿图(Pose Graph)中的一个节点。
    • 位姿图中的边表示相邻子图或检测到回环的子图之间的相对位姿关系。
  3. 检测回环
    • 回环检测是后端优化的重要步骤,可以提高全局地图的一致性。
    • 利用特征匹配或扫描匹配的方法,后端搜索当前子图与先前已处理过的子图之间的相似性,以检测是否存在回环。
    • 如果检测到回环,将在位姿图中添加边,表示当前子图与历史子图之间的关系。
  4. 添加其他约束
    • 根据惯性测量单元(IMU)、GPS、里程计等其他传感器数据,后端可以为位姿图中的节点和边添加更多的约束。
    • 这些约束有助于在优化时保持全局一致性和准确性。
  5. 全局图优化
    • 在构建了完整的位姿图并添加各种约束后,利用图优化算法(如Ceres Solver)对整个位姿图进行全局优化。
    • 通过最小化每个节点和边的残差误差,优化算法计算出全局一致的子图位姿。
  6. 子图位置调整
    • 全局优化后,每个子图的位置和方向将得到调整,使它们在全局地图中准确对齐。
    • 这有助于在拼接各个子图时确保地图的整体一致性。
  7. 地图更新
    • 子图的优化位姿用于重新生成最终的全局地图。
    • 所有子图拼接后,生成的高分辨率地图将更准确地反映整个环境。
  8. 反馈给前端
    • 优化后的位姿图可以反馈给前端,帮助前端进行更准确的局部定位。
    • 同时,地图的优化也将进一步指导后端未来的优化方向。



1. 前端优化

Carto先用了CSM做粗匹配,然后用Ceres做精匹配,并使用了分支定界的方法来加速。

1.1 CSM优化

由于Ceres scan matcher这是一个实时的局部优化,需要一个好的初始位姿估计。所以需要real time CSM把位姿估计器传来的预测值更新为一个好的初值,如果没有real time CSM,就还用位姿估计器传来的预测值作初值。Ceres Scan Matcher以初值作为先验,并找到最佳的点,该点就是通过scan match获得的在子地图中的位置,实现方式是 interpolating the submap and sub-pixel aligning the scan. 前端的两个scan matcher其实都是 scan to map 问题,让当前观测和已知环境最匹配。


CSM说白了就是穷举。我先对scan在map中的pose做个大致估计(例如通过里程计来预测),然后在这个pose周围穷举所有的pose,找到匹配最好的那个。

详细可以参考:前端 3. Real Time Correlative Scan Matcher。相关代码可以参考CSM快速匹配与多分辨率匹配代码实现

在这里插入图片描述

1.2 Ceres

在通过real time CSM或者位姿估计器传来的预测值作为初值后,然后需要通过 ceres scan matcher 优化才能插入到子图中。前端的两个scan matcher其实都是 scan to map 问题,让当前观测和已知环境最匹配。ceres匹配对初值要求相当高,匹配后的结果会考虑其与初始位置偏差进行权重化,说明 cartographer认为其匹配后的值应该与初值相差不大。 Ceres扫描匹配器优化包含了三个残差项:点云与grid的匹配残差、位置(平移)残差、角度(旋转)残差。位置、角度两残差顶多就是对匹配位姿的约束,防止点云匹配的结果和初值差太多,真正的扫描匹配的主角是点云匹配残差。

详细可以参考:前端 4. Ceres scan matcher,代码可以参考cartographer代码学习笔记-CeresScanMatcher2D

…详情请参照古月居

### 回答1: 作为地图绘制程序Cartographer后端开发,优化是非常重要的。在软件开发过程中,优化可以提高程序的性能和效率,使其能够更加高效地运行。特别是在Cartographer这样需要大量数据处理和计算的应用中,优化是不可或缺的。以下是Cartographer后端优化的几个方面: 一、算法优化Cartographer需要进行大量的地图数据处理和建模,对于算法优化尤为重要。例如,采用更快的搜索算法优化地图建模算法等,可以显著提高程序的性能,使地图生成速度更快。 二、缓存优化:在Cartographer后端开发中,缓存是一个非常重要的性能优化手段。对于已经计算过的数据或结果进行缓存,可以避免重复计算,节约系统资源,提高性能。 三、并发优化Cartographer需要同时处理多个数据集和任务,因此并行计算也是一项重要的优化手段。采用合适的多线程和进程技术,可以优化程序的并发性能,在处理大量并发任务时提高性能和效率。 四、资源管理优化Cartographer对于硬件资源的要求较高,对于内存和磁盘空间的管理也需要做出优化。例如,采用内存共享技术,合理利用内存资源,或者使用更高效的磁盘文件存储方式,可以优化程序的内存和磁盘使用效率。 总之,Cartographer后端优化是一个综合性的任务,需要从算法、缓存、并发、资源管理等多个方面入手,不断改进和优化,才能提高程序的性能和效率,在处理大量数据时更加稳定可靠。 ### 回答2: 在地图应用的开发中,cartographer是一种用于绘制和渲染地图的开源库。为了提高地图绘制的速度和性能,需要对cartographer后端进行优化。下面是几种常见的cartographer后端优化技巧。 1. 减少重复绘制 在构建地图时,有可能会存在相同的图层或图形重复绘制。这会降低地图的绘制速度和性能。为了避免这种情况,可以使用缓存技术,将重复的图层或图形存储到缓存中并直接渲染。这样可以减少不必要的绘制,提高地图绘制速度。 2. 分离渲染和逻辑 在某些情况下,地图逻辑的计算和渲染会同时进行,这可能会导致渲染时间过长,反应迟缓。为了避免这种情况,可以将渲染和逻辑分离开来,采用多线程处理。例如,将地图上的图层分成多个单独的线程进行处理,这可以提高并发处理能力,从而加快渲染速度。 3. 使用可视化层级 在地图应用中,可视化层级是一个重要的优化技巧。通过设置不同的可视化层级,可以让地图应用在不同的地图范围和缩放等级下呈现出不同的效果。这可以减少不必要的渲染和绘制,提高地图绘制速度和性能。 4. 优化数据传输 在绘制地图时,数据传输也是一个重要的环节。尽管网络传输速度正在不断提高,但是过多的数据传输仍会影响地图的绘制速度。为了避免这种情况,可以采用数据压缩和数据分段等技术,将数据传输量降至最小。 总之,cartographer后端优化需要综合考虑多个方面,包括缓存技术、多线程处理、可视化层级等多个因素。只有综合运用这些技术才能实现地图绘制的高速、高效和高质量。 ### 回答3: 在cartographer后端优化方面,有几个关键点需要注意: 1. 增加硬件配置:在高负载的情况下,即使是最流行的后端也会遇到瓶颈,因此增加服务器的硬件配置可以极大地改善cartographer的性能表现,包括增加CPU核心数、提升内存容量等。 2. 数据库优化:数据库是cartographer后端最重要的组件之一,因为它存储了所有地图数据和相关信息。为了提升数据库性能,我们可以采取以下几个措施: - 数据库服务器硬件升级:升级硬件配置,例如增加内存容量或者使用更快的硬盘,可以改善cartographer的响应速度和吞吐量; - 数据库索引优化:增加合适的索引可以加速数据检索的速度,提高对数据库的操作效率; - 数据库分区:将数据库拆分为多个分区,每个分区处理一部分请求,可以极大地提升并发处理能力。 3. 代码优化cartographer后端的代码也需要不断进行优化、重构,以提高代码的质量和可维护性,同时也可以提高程序的性能和稳定性。可以通过以下几个方面进行优化: - 合理使用缓存:将一些常用的计算结果、数据存储到缓存中,减少数据库的访问次数,可以提高系统的响应速度; - 使用异步编程模型:在处理IO密集型任务时,采用异步编程模型可以有效减少线程阻塞,提高系统的并发处理能力; - 采用负载均衡器:在多台服务器上运行cartographer后端时,采用负载均衡器分配任务可以充分利用服务器资源,提高系统的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敢敢のwings

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值