Cartographer学习总结

6 篇文章 2 订阅

系列文章目录

前言

研一上学期后半学期开始正式接触Cartographer这个谷歌的开源框架。本文主要记录一下自己学习的过程,以及学习过程中参考的一些资料和别人的笔记,仅当作记录。


提示:以下是本篇文章正文内容,下面案例可供参考

一、资料

官网

1、知乎

cartographer 学习链接
Cartographer论文翻译
cartographer源码详细解读

2、CSDN

泡泡机器人原创专栏-Cartographer】Cartographer理论及实现浅析
上述博客主要介绍了Cartographer大致的框架,我整理了一下该博客中提到的,用思维导图方式呈现一下。

每个模块介绍【slamcode的博客 】cartographer源码分析 - CSDN博客

3、哔站

【Cartographer 专题讲解一】萌妹子带你读Cartoprapher论文
【Cartographer 专题讲解二】Cartographer_ros 代码讲解入门
Cartographer代码详解专题五:算法主线程讲解

4、个人博客

无处不在的小土

二、论文学习

论文:2016年谷歌的 Real-Time Loop Closure in 2D LIDAR SLAM
学习资料:上述1.3中计算机视觉life的【Cartographer 专题讲解一】萌妹子带你读Cartoprapher论文
以及1.1中论文翻译

1、摘要

重点:

  1. 实现了5厘米分辨率的实时建图和闭环检测功能

  2. 为了实现实时闭环,我们使用了一种branch-and-bound分支定界方法来计算scan-to-submap匹配作为约束条件。

算法流程

在这里插入图片描述

  1. input Sensor Data:从上到下依次是激光、里程计、IMU、帧数据
    激光数据经过两个滤波。Voxel Filter(fixed size)体素滤波。Adaptive Filter自适应滤波。这里进行两次滤波的原因是根据配置文件设置不同的options,减少数据量。
    IMU经过ImuTracker:计算重力加速度的方向。再和里程计数据进行融合。
    Odometry经过PoseExtrapolator:保持一段位姿,用于计算线速度和角速度。再进行位姿的差值,去除运动畸变。
  2. Local SLAM(前端部分)重点
    处理后的数据经过Scan Matching(调用ceres库求解),将当前帧的数据插入到submap(子图)中。总结:前端利用CSM方法将激光数据插入子图中。
    3.Global SLAM(后端)
    主要是回环检测。利用分支定界加速。总结:构建回环消除子图间误差。

2、主要工作

匹配方法

传统方法:Scan-to-scan匹配。主要采用ICP和PL-ICP。这两种方式会累积误差。
本文方法:Scan-to-map匹配。CSM(相关匹配),构建似然场模型。
还有Poxel-accurate scan(高精度相机匹配),但是计算量很大。

处理误差方法

粒子滤波和图优化。

3、系统概述

定期运行一个位姿优化pose optimization。当一个子地图完成后,即不再有新的激光扫描被插入其中,它就会参与到闭环的扫描匹配过程中。所有已完成的子地图和扫描都会自动考虑进行闭环loop closure。通过每隔几秒钟完成一次优化,操作员的经验是,当一个位置被重新访问时,会立即发生闭环。这导致了软实时约束soft real-time constraint,即闭环扫描匹配必须比添加新的激光扫描更快地发生,否则它将明显落后。我们通过使用branch-and-bound分支定界法以及每个已完成的子地图中的几个预先计算的栅格来实现这一点。

4、Local 2D SLAM

scan to submap

每一帧激光数据转化到子图中,就是一个旋转量R+平移量t。即将每一帧激光点云从scan坐标系转化到子图坐标系下。
在这里插入图片描述

submaps

在这里插入图片描述由概率栅格地图构图。每个小格子都有一个自己的value。如果value<Pmin,则该点无障碍物。如果value>Pmax,则该点有障碍物。如果Pmin<value<Pmax,该点不确定。
图中被击中的点,进行hit+1操作,原点和击中的点连线,中间的点进行miss+1操作。其他点对其分配一个值。当每组激光数据更新的时候,对栅格地图中每个点进行更新。

CSM

当每次把激光数据插入到子图中时,使用基于ceres的scan matching对位姿进行优化。scan matching负责找到一个位姿,使子图中该扫描点的概率最大。这个问题可以转化为一个最小二乘问题,见下图。
在这里插入图片描述

5、回环检测(重点)

目的:在大场景中构建子图用于减少误差(连续的子图之间误差很小)。但是子图直接需要通过回环检测来消除误差。
这里可以理解为将位姿之间的差值转化为最小二乘进行求解。
在这里插入图片描述这里引出一个稀疏位姿调整(Sparse Pose Adjustment)方法。???
上图中左下角e为残差。右下角为核函数,在实践应用中,应对对称的环境,减小误差匹配带来的问题。???

分支定界

在这里插入图片描述在这里插入图片描述算法一
![在这里插入图片描述](https://img-blog.csdnimg.cn/729ad167261e499fb30458ad1118ee85.png在这里插入图片描述可以看到暴力搜索部分就是很简单的对x,y,seita进行三层for循环,但是计算量太大,因此需要加入分支定界进行加速。
分支定界主要思想:将可能性子集表示为树中的节点,其中跟节点表示所有可能的解决方案。每个节点的字节点构成其富姐点的一个分区,因此它们一起表示相同的可能性集合。通过得分进行判断,为了得到一个具体的算法,我们必须确定选择节点分支上界计算

  1. 节点选择
    在这里插入图片描述由于我们设定的分数阈值一般达不到,因此寄托于一个好的解决方案。图中的DFS深度优先搜索是将搜索过得点标记,往下搜索遇到没有点了就返回继续往右搜索。
  2. 分支
    在这里插入图片描述如果一个分支中一个节点best_score得分高于该分支下其他节点的得分,则剪掉另外的节点
  3. 计算上界
    在这里插入图片描述
    分支定界算法具体不是很理解,需要回顾一些曾书格老师的激光SLAM课程。

三、cartographer_ros

运行后ROS节点图
在这里插入图片描述

Cartographer代码结构图
在这里插入图片描述在这里插入图片描述

总结

位姿推断器 PoseExtrapolator
pose_extrapolator.cc
订阅IMU Odom scan-match
输入一个时间time–》点云的pose(先验)
作用:便于寻找最优位姿,减少计算

**体素滤波 Voxel Filiter
作用:减小数据量

自适应体素滤波 Adaptive Voxel Filter**
作用:根据一些原则 在远近不同的地方保留不同数量的点云。经过自适应体素滤波,原始的激光点云数据分为high_res…和low_res。

Global SLAM 后端
一帧点云–》Addnode()包含点云很多信息

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值