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的匹配残差、位置(平移)残差、角度(旋转)残差。位置、角度两残差顶多就是对匹配位姿的约束,防止点云匹配的结果和初值差太多,真正的扫描匹配的主角是点云匹配残差。

点击Cartographer前后端梳理 - 古月居 (guyuehome.com)可查看全文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/370079.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【笔记】记一次在linux上通过在线安装mysql报错 CentOS 7 的官方镜像已经不再可用的解决方法+mysql配置

报错(恨恨恨恨恨恨恨!!!!!): [rootlocalhost ~]# sudo yum install mysql-server 已加载插件:fastestmirror, langpacks Determining fastest mirrors Could not retrie…

JMeter--定时执行的方法

原文网址:JMeter--定时执行的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍JMeter如何使用定时器定时执行测试任务。 Java技术星球:way2j.com 方法 第一步:新建定时器 右键测试任务> Add > Timer> Constant Timer 如下图所示…

NTP协议格式解析

1. NTP时间戳格式 SNTP使用在RFC 1305 及其以前的版本所描述标准NTP时间戳的格式。与因特网标准标准一致, NTP 数据被指定为整数或定点小数,位以big-endian风格从左边0位或者高位计数。除非不这样指定,全部数量都将设成unsigned的类型&#…

加盖骑缝章软件、可以给PDF软件加盖自己的骑缝章

加盖骑缝章的软件多种多样,尤其是针对PDF文件,有多种软件可以实现给PDF文件加盖自己的骑缝章。以下是一些常用的软件及其特点: 1. Adobe Acrobat Pro DC 特点: 多功能PDF编辑:Adobe Acrobat Pro DC是一款功能强大的…

【Kubernetes】Pod 资源调度之亲和性调度

Pod 资源调度之亲和性调度 1.Node 亲和性调度1.1 Node 硬亲和性1.2 Node 软亲和性 2.Pod 亲和性调度2.1 Pod 硬亲和2.2 Pod 软亲和2.3 Pod 反亲和 Kubernetes 的 默认调度器 以 预选、优选、选定机制 完成将每个新的 Pod 资源绑定至为其选出的目标节点上,不过&#…

记录第一次写脚本

使用csh语言,Linux系统操作的 写和执行csh(C Shell)脚本不需要额外的软件,只需要一个支持csh的终端环境。 1.检查是否安装了C Shell 在终端terminal运行以下命令 which csh 如果返回路径,比如/bin/csh&#xff0c…

HTML【详解】表格 table 标签(table的属性,语义化表格,简易表格,合并单元格)

html 中的表格 <table> 由行 <tr> 组成&#xff0c;每行由单元格 <td> 组成。 所以表格是由行组成&#xff08;行由列组成&#xff09;&#xff0c;而不是由行和列组成。 table 标签 display: table &#xff0c;属于块级元素。 table 的属性 border&#…

如何用Python向PPT中批量插入图片

办公自动化办公中&#xff0c;Python最大的优势是可以批量操作&#xff0c;省去了用户粘贴、复制、插入等繁琐的操作。经常做PPT的朋友都知道&#xff0c;把图片插入到PPT当中的固定位置是一个非常繁琐的操作&#xff0c;往往调整图片时耗费大量的时间和精力。如何能省时省力插…

视频编辑和视频剪辑有什么区别 视频编辑怎么旋转方向 会声会影视频制作教程下载 视频剪辑软件免费下载中文版 视频剪辑用哪个软件

如果你还分不清视频编辑与视频剪辑&#xff0c;请务必仔细阅读本文&#xff0c;了解二者之间的不同。本文还将重点介绍&#xff0c;旋转视频方向的三种常用方法&#xff0c;手把手地教你如何旋转视频方向。有关视频编辑和视频剪辑有什么区别&#xff0c;视频编辑怎么旋转方向的…

CurrentHashMap巧妙利用位运算获取数组指定下标元素

先来了解一下数组对象在堆中的存储形式【数组长度&#xff0c;数组元素类型信息等】 【存放元素对象的空间】 Ma 基础信息实例数据内存填充Mark Word,ClassPointer,数组长度第一个元素第二个元素固定的填充内容 所以我们想要获取某个下标的元素首先要获取这个元素的起始位置…

CSS实现图片裁剪居中(只截取剪裁图片中间部分,图片不变形)

1.第一种方式&#xff1a;&#xff08;直接给图片设置&#xff1a;object-fit:cover;&#xff09; .imgbox{width: 100%;height:200px;overflow: hidden;position: relative;img{width: 100%;height: 100%; //图片要设置高度display: block;position: absolute;left: 0;right…

QT TCP网络通信编程

学习目标&#xff1a; TCP网络通信编程 前置环境 运行环境:qt creator 4.12 学习内容 一、TCP 协议基础知识: TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 拥塞控制算法包括慢启动、拥塞避免、快速重传和快速恢复。TCP 通信需要建立连接,Qt 提供 QTcp…

云原生之容器编排实践-OpenEuler23.09在线安装Kubernetes与KubeSphere

背景 前几篇文章中介绍了如何将 ruoyi-cloud 项目部署到 Kubernetes 集群中&#xff0c;包括网关服务、认证服务和系统服务并且对全部服务采用 YAML 文件的方式来进行部署&#xff0c;这虽然有助于理解 K8S 组织管理资源的风格与底层机制&#xff0c;但是对于团队中不太熟悉命…

Lunaproxy与711Proxy的对比与优劣分析

今天我们来深入对比两款在市场上备受关注的代理IP服务&#xff1a;Lunaproxy和711Proxy。接下来&#xff0c;我们将从多个角度对这两款服务进行详细分析&#xff0c;帮助大家做出明智的选择。 优势分析 711Proxy的优势 1. 性价比高&#xff1a;711Proxy提供多种灵活的套餐选…

【JavaWeb程序设计】JSP编程II

目录 一、输入并运行下面的import_test.jsp页面 1.1 代码运行结果 1.2 修改编码之后的运行结果 二、errorPage属性和isErrorPage属性的使用 2.1 下面的hello.jsp页面执行时将抛出一个异常&#xff0c;它指定了错误处理页面为errorHandler.jsp。 2.1.2 运行截图 2.2 下面…

VBA初学:零件成本统计之一(任务汇总)

经过前期一年多对金蝶K3生产任务流程和操作的改造和优化&#xff0c;现在总算可以将零件加工各个环节的成本进行归集了。 原本想写存储过程&#xff0c;通过直接SQL报表做到K3中去的&#xff0c;但财务原本就是用EXCEL&#xff0c;可以方便调整和保存&#xff0c;加上还有一部分…

mybatis-plus参数绑定异常

前言 最近要搞个发票保存的需求&#xff0c;当发票数据有id时说明是发票已经保存只需更新发票数据即可&#xff0c;没有id时说明没有发票数据需要新增发票&#xff1b;于是将原有的发票提交接口改造了下&#xff0c;将调用mybatis-plus的save方法改为saveOrUpdate方法&#xff…

芯片基识 | 掰开揉碎讲 FIFO(同步FIFO和异步FIFO)

文章目录 一、什么是FIFO二、为什么要用FIFO三、什么时候用FIFO四、FIFO分类五、同步FIFO1. 同步FIFO电路框图2. 同步FIFO空满判断3. 同步FIFO设计代码4. 同步FIFO仿真结果 六、异步FIFO1、异步FIFO的电路框图2 、亚稳态3、打两拍4、格雷码5、如何判断异步FIFO的空满&#xff0…

Spring boot 更改启动LOGO

在resources目录下创建banner.txt文件&#xff0c;然后编辑对应的图案即可 注释工具 Spring Boot Version: ${spring-boot.version},-.___,---.__ /|\ __,---,___,- \ -.____,- | -.____,- // -., | ~\ /~ | …

Go语言--工程管理、临时/永久设置GOPATH、main函数以及init函数

工作区 Go 代码必须放在工作区中。工作区其实就是一个对应于特定工程的目录&#xff0c;它应包含3个子目录:src 目录、pkg目录和bin 目录。 src 目录:用于以代码包的形式组织并保存 Go源码文件。(比如:.go.chs等)pkg 目录:用于存放经由 go install 命令构建安装后的代码包(包…