每日浅读SLAM论文——简析Cartographer

2023-11-05


Cartographer(论文名:Real-Time Loop Closure in 2D LIDAR SLAM)是目前二维激光SLAM中应用最广泛的,尤其在工业界,堪称工业神器。Cartographer由谷歌工程师所写,框架十分复杂,想要详细了解Cartographer框架和代码实现细节,我强烈推荐 无处不在的小土的Blog
这里我只是帮助大家快速理解一下Cartographer的核心,我并不会按照论文顺序来讲,我的blog风格就是 浅显易懂,因此我对 理解框架最为看重。

二维激光SLAM

看这篇文章你至少应该之前就对二维激光SLAM有所了解(默认了解基础概念,前端/后端,滤波器/图优化)。其实二维SLAM一般来说就了解一下四个算法(gmapping,hector,karto,cartographer)。

  • Gmapping是基于粒子滤波的算法,我会拿另一篇文章去讲,Gmapping之前都是基于滤波器的算法(EKF-SLAM,FastSLAM等),但是几乎可以这么说,基于滤波器的后端算法在二维激光SLAM中已经被淘汰了,有人这么说“Gmapping不是最好的SLAM算法,但他是特定时代下最优美的解决方法”,我觉得很有道理。
  • Hector的核心就是使用了scan to map来进行前端的扫描匹配,简单而言就是用当前激光和累计出来的地图进行匹配,通过将激光投影到栅格上进行打分,然后使用高斯牛顿法求最优的位姿。
  • karto主要贡献是引入了后端图优化,使用submap代替全局地图进行匹配和优化,但是表现不如cartographer(好像有人说karto其实效果也很好,只是代码实现不如carto,总是没谁用)。
  • 简而言之,掌握cartographer约等于掌握了二维激光SLAM

简单框架

cartographer论文根本没有给出框架图,你可以这么理解,carto的作者并不认为自己的文章提出了什么新的框架,它只是整合了一些内容。因此,你可以简单地认为carto的框架其实就是前端+后端。前端使用了的基本和hector一样,就是scan to map(submap)。它的主要工作在后端,使用分支定界优化了CSM算法,然后构建了位姿和submap之间的约束图,使用SPA(一种利用图稀疏性来加速优化,这可以说是真正将图优化投入实际使用的算法,学习到一定深度了可以再去学习,总之是一种快速进行图优化的算法)进行优化。

前端

scan matching

就是前端,核心就是优化这个函数, ξ i \xi_i ξi就是当前扫到第i个点的局部坐标, S i ( ξ ) S_i(\xi) Si(ξ)就是把这个点映射到全局坐标系下。 M ( . ) M(.) M(.)就代表地图,如果被占据概率为1,那扫到1-1=0,自然不算残差,我们也就是希望每个激光点都扫到障碍物上。整个算法用高斯牛顿法优化,具体如何求导的可以去看hector,里面有详细写(其实就是图像求导)。
在这里插入图片描述

Submaps构建

就是使用静态二值贝叶斯滤波器进行的地图更新,推导大家可以自己去找(比如看概率机器人),小土写的很好。简单来说就是在得到位姿之后,利用射出去的激光来更新地图。
在这里插入图片描述
当submap中插入数据到一定量时候,这张submap就算完成了,传入后端不再更新,开启一张新的submap开始建图。核心是它当作短期内构建的submap是准确的。

后端

后端核心就是构建一张位姿约图,下面圆代表一个个位姿,上面三角代表一张张submap,每个位姿态可能观测到很多张submap,那么之间就可以构建一个约束。之前前端使用简单的scan matching方法构建的约束精度不够,后端使用csm进行像素级别的匹配。
在这里插入图片描述

分支定界优化csm(CorrelativeScanMatch)

其实csm就是一个暴力搜索,二维位姿其实就是 { x , y , θ } \{x,y,\theta\} {x,y,θ}三个变量,我们在初值附近套三重循环暴力搜索,给每个组合算一个分数,取最高的。csm还可以同时处理回环,某帧激光和很久之前一张submap匹配分数非常高的时候,就是找到回环了,也增加约束。

显然,这种算法复杂度很高。其实我们很容易想到一种简单的算法(我瞎想的,便于理解),假设一开始x搜索范围之[-10,10],步长为1,搜一百次,取分数最高的10次,这10次分数都在[-1,1]之间,那我改步长为0.1搜索新的区间。这样肯定比[-10,10]直接以0.1为步长搜索快。

在这个问题中,作者使用了不同分辨率的地图进行匹配(其实和我瞎想的是一个意思),并证明了粗分辨率找到的最优得分是细节分辨率的上界。因为有了这个条件,我们可以使用分枝定界来优化搜索过程,其实就是剪枝的思想,你在粗分辨率的情况下找到的位姿还不如之前细分辨率得到的结果,那没必要在这个位姿下搜索更细的分辨率了。
在这里插入图片描述

代码实现框架

众所周知,SLAM论文只包含了全部内容的20%,剩下80%要在代码中找到答案。下面这张图才是算法在实现时候的真实框架。

首先最左边是输入,Range Data(激光数据),Odometry(里程计),IMU(惯导),Fixed Frame Pose(GPS一类全局定位)。
Range Data首先会经过Voxel filter(体素滤波,用于点云降采样),而IMU和Odom会先经过一个PoseExtraplator(主要用于IMU位姿解算,推导很复杂,PoseExtraplator同时接受Scan Matching的数据,因为传感器是增量式的,应该在之前更新完的位姿上再跟新目前位姿)。过完滤波的Range Data利用PoseEstimate(传感器估计的位姿) 作为初值计算和上一帧相对运动。后面不产生运动的匹配被drop了,可以理解为关键帧吧。一段连续帧被构建成submap,当这个submap完成后被送入后端,即Global SLAM。

后端就是使用分支定界优化的csm计算位姿和submaps之间的约束关系(包含回环,因为位姿和之前的submap很近的时候也会被拿去扫描匹配),构建约束图,然后如果有全局传感器也加入约束图,一起使用SPA优化,最后得到准确的位姿和图。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每日浅读SLAM论文——简析Cartographer 的相关文章

随机推荐

  • 有序链表转换成二叉树

    1 问题描述 给定一个单链表 其中的元素按升序排序 将其转换为高度平衡的二叉搜索树 本题中 一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 示例 给定的有序链表 10 3 0 5 9 一个可能的答案是 0
  • typora安卓_经验

    同一个系统生态数据共享很简单 可若是安卓 windows ios三个系统呢 配上BGM阅读体验更佳 由于我的设备是安卓手机 windows电脑 以及ipad 三个不同的系统之间 有时信息和数据的交流并不是特别方便 所以需要一个工作流 借助一
  • 深度学习模型部署的步骤和相关注意事项

    文章目录 深度学习模型部署的步骤和相关注意事项 什么是模型部署 步骤1 选择合适的部署环境 步骤2 选择合适的部署框架 步骤3 将模型转换为部署格式 步骤4 创建API接口 步骤5 部署模型 总结 深度学习模型部署的步骤和相关注意事项 什么
  • SQLi-LABS Less-11&&Less-12

    Less 11题目 使用bp抓包进行观察 得知这是POST注入 进行测试 猜字段数 获显示位 查数据库名 查表名 查列名 查列里面的内容 Less 12题目 Less 12具体做法和Less 11一样只不过闭合的姿势不一样而已 由bp抓包得
  • 解决Windows下的mysql Access denied for user ‘root‘@‘localhost‘ 和 远程连接数据库问题

    问题 Access denied for user root localhost using password YES 这是root帐户默认不开放远程访问权限 所以需要修改一下相关权限 解决方案 打开MySQL目录下的my ini文件 在文
  • linux swap shayisi,临时邮箱,10分钟邮箱域名收集(持续更新)

    临时邮箱 10分钟邮箱域名收集 持续更新 如果你的网站开通了邮箱注册功能 那么你肯定不喜欢注册的人是 临时 的 希望下面收集到的临时邮箱 10分钟邮箱 域名能帮助到你 9em org quickemail info wmail2 com s
  • 软件架构详解(附图)

    软件架构 software architecture 软件架构 software architecture 是一系列相关的抽象模式 用于指导大型软件系统各个方面的设计 软件架构是一个系统的草图 软件架构描述的对象是直接构成系统的抽象组件 各
  • springboot2.0入门(三)----定义编程风格+jackjson使用+postMan测试

    一 RESTFul风格API 1 优点 看Url就知道要什么资源 看http method就知道针对资源干什么 看http status code就知道结果如何 HTTP方法体现对资源的操作 GET 获取资源 POST 添加资源 PUT 修
  • python姿态检测实现多人多姿态识别python行为识别openpose行为骨骼框架检测动作识别动作检测行为动作分类

    效果演示 视频演示 python行为识别行为骨骼框架检测动作识别动作检测行为动作分类 项目下载链接 https download csdn net download babyai996 87552750 0环境项目配置教程 https do
  • PyTorch 2.0 实操:为 HuggingFace 和 TIMM 模型提速!

    PyTorch 2 0 通过简单一行 torch compile 就可以使模型训练速度提高 30 200 本教程将演示如何真实复现这种提速 torch compile 可以轻松地尝试不同的编译器后端 进而加速 PyTorch 代码的运行 它
  • 资深人士对大数据的解析

    在银行做了两年的数据分析和挖掘工作 较少接触互联网的应用场景 因此 一直都在思考一个问题 互联网和金融 在数据挖掘上 究竟存在什么样的区别 在对这个问题的摸索和理解过程中 发现数据挖掘本身包含很多层次 并且模型本身也是存在传统和时髦之分的
  • VS code更新后不在原来位置

    1 大家可能遇到这样一种情况 安装好VS Code后 直接把安装好的目录拷贝到D盘 但是一旦更新 就会重新安装到C Users Users AppData Local Programs 目录下 2 正确处理方式 修改注册表 位置 计算机 H
  • python计算一个三位数个位数之和

    1 输入一个三位数 n input 请输入一个三位数 n int n 将 字符串类型 转成 数值 456 2 得到百位b100 b100 n 100 3 得到十位b10 456 gt 45 gt 5 b10 n 10 10 4 得到个位b1
  • anaconda常用命令及常见错误与解决方法

    一 常用命令 用pip安装依赖包时 默认是从国外下载 可以指定国内源 速度飞快 pip install i 国内镜像地址 包名 例如 pip install i https mirrors aliyun com pypi simple nu
  • 怎么修改服务器的代码,怎么修改云服务器上的源代码

    怎么修改云服务器上的源代码 内容精选 换一换 本节操作介绍购买云耀云服务器的操作步骤 购买时 为减少您配置参数的时间 部分参数由系统自动分配 以下参数配置供你了解系统的默认配置 购买云耀云服务器仅支持 包年 包月 的计费方式 请您在购买前确
  • js通过URL下载服务器文件(可行方法)

    本文讲述已知文件在服务器的地址 如何下载至本地 其他博客分享的一般是这两种 1 通过window open window open https 1 1 1 1 test txt 2 通过get表单请求 var form
  • 深度医疗(3) - 基于深度学习肺部病变诊断识别

    深度医疗是笔者基于深度学习的医学项目应用开发实践 经过整理输出了文档和本系列课程 希望通过分享可以和大家共同讨论 相互学习 探索更好的解决方案 笔者是一名普通的大数据和人工智能领域从业者 过程中如有错误和理解不到位的地方请广大同仁不吝赐教
  • Oil Deposits(BFS)

    The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits GeoSurvComp works with one
  • 如何查询list对象嵌套list

    很简单 就比如说咱们查询一个一对多的表 比如有个学生表 和关联家长表 学生表有个字段是家长信息 每个学生的家长信息用集合来存储 这样就构造了一个场景 student表 id 主键 varchar name varchar parentlis
  • 每日浅读SLAM论文——简析Cartographer

    文章目录 二维激光SLAM 简单框架 前端 scan matching Submaps构建 后端 分支定界优化csm CorrelativeScanMatch 代码实现框架 Cartographer 论文名 Real Time Loop C