系列文章目录

文章目录

  • 系列文章目录
  • 前言
  • 一、资料
    • 1、知乎
    • 2、CSDN
    • 3、哔站
    • 4、个人博客
  • 二、论文学习
    • 1、摘要
    • 算法流程
    • 2、主要工作
      • 匹配方法
      • 处理误差方法
    • 3、系统概述
    • 4、Local 2D SLAM
      • scan to submap
      • submaps
      • CSM
    • 5、回环检测(重点)
      • 分支定界
  • 三、cartographer_ros
  • 总结

前言

研一上学期后半学期开始正式接触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()包含点云很多信息

Cartographer学习总结相关推荐

  1. cartographer学习笔记--如何保存cartagrapher_ros建好的地图

    今天开始跟着网友大佬学习cartographer. 1. 如何保存cartographer的地图数据 在运行cartographer过程中可以随时保存建好的地图,步骤如下: 首先是重新打开一个term ...

  2. Cartographer学习笔记

    正在逐步添加内容-- 文件关系 代码框架 1. common: 定义了基本数据结构和一些工具的使用接口.例如,四舍五入取整的函数.时间转化相关的一些函数.数值计算的函数.互斥锁工具等.详见Common ...

  3. TX2 -cartographer安装

    保存为ROS中move_base_Package所需的pgm格式的地图 cartographer 用自己的机器人建图.保存地图 install cartograher 谷歌Cartographer学习 ...

  4. 【Cartographer参数详解,调参,降低计算量调优笔记记录】

    Cartographer学习记录 文章目录 Cartographer学习记录 前言 一.cartographer参数详解 二..lua文件参数详解 1.rs16_2d_outdoor.lua 2.tr ...

  5. cartographer源码解析(二)node_main.cc文件详解

    描述 cartographer学习笔记(二) 这一篇主要分析node_main.cc的代码 主函数main() 主函数 int main(int argc, char** argv) {google: ...

  6. 极速安装cartographer

    极速安装cartographer 适合对象:第一次安装cartographer的且需要快速安装cartographer的,或者之前安装没有编译错误的朋友 不适合对象:因编译错误又再次重新安装的,我这里 ...

  7. 用自己的机器人实现cartographer建图测试与地图保存应该这样做

    用自己的机器人实现cartographer建图测试与地图保存应该这样做 1.安装 2.测试 3.保存地图 亲测可行.(该教程使用github的代码地址,速度相对慢了一点,极速安装,请看这里: 极速安装 ...

  8. [ERROR] ubuntu18.04 install ceres

    谷歌Cartographer学习(1)-快速安装测试 error: '<anonymous>.ceres::internal::SchurEliminator<2, 2, 2> ...

  9. Kinect on ubuntu

    http://www.cnblogs.com/hitcm/p/5118196.html hitcm 博客园  ::   首页  ::    ::   联系  ::     ::   管理 posts ...

最新文章

  1. php要怎么使用imagettftext_延长防腐木使用要怎么做呢?
  2. 国产半导体路在何方,瓦森纳与光刻机你了解多少
  3. CSDN好多原创翻译的文章
  4. Nginx的Gzip模块配置指令(一)
  5. 浏览器对F5的微观处理
  6. java encode in ansi_Java应用中的编码问题
  7. Python守护进程和脚本单例运行
  8. sphinx数据文件简析
  9. 《C++ Primer》7.2节练习
  10. 人脸识别门禁系统在2019年会加快应用
  11. Accelerated C++ 习题答案
  12. 拉登游戏开发--分布式计算服务机客户机程序设计
  13. java底层 文件操作,java底层是怎样对文件操作的
  14. Mujoco 2D hopper
  15. Coverity代码静态检测工具介绍
  16. 棋盘覆盖问题 (分治)
  17. python小工具—图片转为字符txt
  18. 从架构到算法到赋能业务,关于国际化电商技术链路的最完整分享【Lazada技术开放日】
  19. Flutter滑动体验对齐原生-滑动曲线篇
  20. Python+Vue计算机毕业设计宁夏葡萄酒销售系统g80g5(源码+程序+LW+部署)

热门文章

  1. 今年Android面试有新要求,资深面试官口述了这几个点,android蓝牙开发教程
  2. 手把手教echarts中gexf关系图的构造和使用
  3. 全球最大同性交友平台的“黑历史”
  4. 外企IT需要掌握的英语词汇,持续更新中...
  5. 软键盘输入设计(C语言)
  6. 同样line-height下ios和Android显示不一致的问题
  7. 腾讯游戏人脸识别验证是否会保存用户信息
  8. 系统主数据管理之物料(Item)五 Item 的制造商部件号(MPN)
  9. 新赛题上线!2021 CCF大数据与计算智能大赛全面开赛!
  10. Rebound库使用分享