视觉SLAM漫谈(二):图优化理论与g2o的使用

2023-11-10

视觉SLAM漫谈(二):图优化理论与g2o的使用

1    前言以及回顾

 

  各位朋友,自从上一篇《视觉SLAM漫谈》写成以来已经有一段时间了。我收到几位热心读者的邮件。有的希望我介绍一下当前视觉SLAM程序的实用程度,更多的人希望了解一下前文提到的g2o优化库。因此我另写一篇小文章来专门介绍这个新玩意。

 

  在开始本篇文章正文以前,我们先来回顾一下图优化SLAM问题的提法。至于SLAM更基础的内容,例如SLAM是什么东西等等,请参见上一篇文章。我们直接进入较深层次的讨论。首先,关于我们要做的事情,你可以这样想:

 

  l   已知的东西:传感器数据(图像,点云,惯性测量设备等)。我们的传感器主要是一个Kinect,因此数据就是一个视频序列,说的再详细点就是一个RGB位图序列与一个深度图序列。至于惯性测量设备,可以有也可以没有。

 

  l   待求的东西:机器人的运动轨迹,地图的描述。运动轨迹,画出来应该就像是一条路径。而地图的描述,通常是点云的描述。但是点云描述是否可用于导航、规划等后续问题,还有待研究。

 

  这两个点之间还是有挺长的路要走的。如果我们使用图优化,往往会在整个视频序列中,定义若干个关键帧:

 

  这个图着实画的有点丑,请大家不要吐槽……不管怎么说,它表达出我想表达的意思。在这张图中,我们有一个路标点(五角星),并在各个关键帧中都看到了这个点。于是,我们就能用PnP或ICP求解相邻关键点的运动方向。这些在上篇文章都介绍过了,包括特征选择,匹配及计算等等。那么,这个过程中有什么问题呢?

2    为什么要用全局优化

  你一定已经注意到,理想的计算总和实际有差距的。好比说理想的科研就是“看论文——产生想法——做实验——发文章”,那么现实的科研就是“看论文——产生想法——做实验——发现该想法在二十年前就有人做过了”,这样一个过程。实际当中,仅通过帧间运动(ego-motion)来计算机器人轨迹是远远不够的。如下图所示:

  

  

  如果你只用帧间匹配,那么每一帧的误差将对后面所有的运动轨迹都要产生影响。例如第二帧往右偏了0.1,那么后面第三、四、五帧都要往右偏0.1,还要加上它们自己的估算误差。所以结果就是:当程序跑上十几秒之后早就不知道飞到哪儿去了。这是经典的SLAM现象,在EKF实现中,也会发现,当机器人不断运动时,不确定性会不断增长。当然不是我们所希望的结果。

  那么怎么办才好呢?想象你到了一个陌生的城市,安全地走出了火车站,并在附近游荡了一会儿。当你走的越远,看到许多未知的建筑。你就越搞不清楚自己在什么地方。如果是你,你会怎么办?

  通常的做法是认准一个标志性建筑物,在它周围转上几圈,弄清楚附近的环境。然后再一点点儿扩大我们走过的范围。在这个过程中,我们会时常回到之前已经见过的场景,因此对它周围的景象就会很熟悉。

  机器人的情形也差不多,除了大多数时候是人在遥控它行走。因而我们希望,机器人不要仅和它上一个帧进行比较,而是和更多先前的帧比较,找出其中的相似之处。这就是所谓的回环检测(Loop closure detection)。用下面的示意图来说明:

  

  没有回环时,由于误差对后续帧产生影响,机器人路径估计很不稳定。加上一些局部回环,几个相邻帧就多了一些约束,因而误差就减少了。你可以把它看成一个由弹簧连起来的链条(质点-弹簧模型)。当机器人经过若干时间,回到最初地方时,检测出了大回环时,整个环内的结构都会变得稳定很多。我们就可以籍此知道一个房间是方的还是圆的,面前这堵墙对应着以前哪一堵墙,等等。

  相信讲到这里,大家对回环检测都有了一个感性的认识。那么,这件事情具体是怎么建模,怎么计算,怎么编程呢?下面我们就一步步来介绍。

3    图优化的数学模型

  SLAM问题的优化模型可以有几种不同的建模方式。我们挑选其中较简单的一种进行介绍,即FrameSLAM,在2008年提出。它的特点是只用位姿约束而不用特征约束,减少了很多计算量,表达起来也比较直观。下面我们给出一种6自由度的3D SLAM建模方法。

  符号:

  

  注意到这里的建模与前文有所不同,是一个简化版的模型。因为我们假设帧间匹配时得到了相邻帧的变换矩阵,而不是把所有特征也放到优化问题里面来。所以这个模型看上去相对简单。但是它很实用,因为不用引入特征,所以结点和边的数量大大减少,要知道在图像里提特征动辄成百上千的。

4    g2o是什么

  g2o,就是对上述问题的一个求解器。它原理上是一个通用的求解器,并不限定于某些SLAM问题。你可以用它来求SLAM,也可以用ICP, PnP以及其他你能想到的可以用图来表达的优化问题。它的代码很规范,就是有一个缺点:文档太少。唯一的说明文档还有点太装叉(个人感觉)了,有点摆弄作者数学水平的意思,反正那篇文档很难懂就是了。话说程序文档不应该是告诉我怎么用才对么……

  言归正传。如果你想用g2o,请去它的github上面下载:https://github.com/RainerKuemmerle/g2o

  它的API在:http://www.rock-robotics.org/stable/api/slam/g2o/classg2o_1_1HyperGraph.html

4.1     安装

  g2o是一个用cmake管理的C++工程,我是用Linux编译的,所以不要问我怎么在win下面用g2o,因为我也不会……不管怎么说,你下载了它的zip包或者用Git拷下来之后,里面有一个README文件。告诉你它的依赖项。在ubuntu下,直接键入命令:

  sudo apt-get install cmake libeigen3-dev libsuitesparse-dev libqt4-dev qt4-qmake libqglviewer-qt4-dev

  我个人感觉还要 libcsparse-dev和freeglut3这两个库,反正多装了也无所谓。注意libqglviewer-qt4-dev只在ubuntu 12.04库里有,14.04 里换成另一个库了。g2o的可视化工具g2o_viewer是依赖这个库的,所以,如果你在14.04下面编,要么是去把12.04那个deb(以及它的依赖项)找出来装好,要么用ccmake,把build apps一项给去掉,这样就不编译这个工具了。否则编译过不去。

  解开zip后,新建一个build文件夹,然后就是:

  cmake ..

  make

  sudo make install

  这样g2o就装到了你的/usr/local/lib和/usr/local/include下面。你可以到这两个地方去看它的库文件与头文件。

4.2     学习g2o的使用

  因为g2o的文档真的很装叉(不能忍),所以建议你直接看它的源代码,耐心看,应该比文档好懂些。它的example文档夹下有一些示例代码,其中有一个tutorial_slam2d文件夹下有2d slam仿真的一个程序。值得仔细阅读。

  使用g2o来实现图优化还是比较容易的。它帮你把节点和边的类型都定义好了,基本上只需使用它内置的类型而不需自己重新定义。要构造一个图,要做以下几件事:

  l   定义一个SparseOptimizer. 编写方式参见tutorial_slam2d的声明方式。你还要写明它使用的算法。通常是Gauss-Newton或LM算法。个人觉得后者更好一些。

  l   定义你要用到的边、节点的类型。例如我们实现一个3D SLAM。那么就要看它的g2o/types/slam3d下面的头文件。节点头文件都以vertex_开头,而边则以edge_开头。在我们上面的模型中,可以选择vertex_se3作为节点,edge_se3作为边。这两个类型的节点和边的数据都可以直接来自于Eigen::Isometry,即上面讲到过的变换矩阵T。

  l   编写一个帧间匹配程序,通过两张图像算出变换矩阵。这个用OpenCV, pcl都可以做。

  l   把你得到的关键帧作为节点,变换矩阵作为边,加入到optimizer中。同时设定节点的估计值(如果没有惯性测量就设成零)与边的约束(变换矩阵)。此外,每条边还需设定一个信息矩阵(协方差矩阵之逆)作为不确定性的度量。例如你觉得帧间匹配精度在0.1m,那么把信息矩阵设成100的对角阵即可。

  l   在程序运行过程中不断作帧间检测,维护你的图。

  l   程序结束时调用optimizer.optimize( steps )进行优化。优化完毕后读取每个节点的估计值,此时就是优化后的机器人轨迹。

  代码这种东西展开来说会变得像字典一样枯燥,所以具体的东西需要大家自己去看,自己去体会。这里有我自己写的一个程序,可以供大家参考。不过这个程序需要带着数据集才能跑,学习g2o的同学只需参考里面代码的写法即可:https://github.com/gaoxiang12/slam3d_gx

5    效果

  最近我跑了几个公开数据集(http://vision.in.tum.de/data/datasets/rgbd-dataset)上的例子(fr1_desk, fr2_slam)(,感觉效果还不错。有些数据集还是挺难的。最后一张图是g2o_viewer,可以看到那些关键路径点与边的样子。

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

视觉SLAM漫谈(二):图优化理论与g2o的使用 的相关文章

  • 坐标变换与基变换到底哪个左乘,哪个右乘??

    Version Date By Change Cost A 2020 3 18 AYZP First Version 三小时 前言 学习目的 1 坐标变换与基变换到底哪个左乘 哪个右乘 答案 根本就是由基和坐标的维数决定其到底左乘还是右乘
  • No rule to make target

    No rule to make target 引言 解决方法 引言 报错 No rule to make target Thirdparty g2o lib libg2o so needed by lib libygz SLAM so 停止
  • SLAM入门

    SLAM定义 SLAM Simultaneous localization and mapping 同时定位 我在哪里 与建图 我周围有什么 当某种移动设备 汽车 扫地机 手机 无人机 机器人 从一个未知环境的未知地点出发 在运动过程中 通
  • ubuntu系统下配置vscode编译cmake

    文章目录 一 配置vs code运行c 代码 三个关键文件介绍 1 tasks json run helloworld cpp 1 1 打开cpp文件 使其成为活动文件 1 2 按编辑器右上角的播放按钮 1 3生成task文件 1 4 此时
  • 正交矩阵的保范性:正交变换不改变向量的长度(范数)

    在推导使用SVD分解解方程时 用到了正交矩阵的保范性这一性质 1 正交矩阵定义 A mathbf A intercal A A A A
  • 激光SLAM直接线性方法里程计运动模型及标定

    原创作者 W Tortoise 原创作者文章 https blog csdn net learning tortosie article details 107763626 1 里程计运动模型 1 1 两轮差分底盘的运动模型 1 2 三轮全
  • 【大一立项】如何亲手搭建ROS小车:硬件和软件介绍

    本次博客将详细介绍上篇博客中提到的ROS小车的硬件和软件部分 由于十一实验室不开门 所以部分代码还没有上传到Github 下位机 下位机使用Arduino 因为大一上刚学完用Arduino做循迹小车 其实Arduino作为ROS小车的下位机
  • 视觉SLAM漫谈(二):图优化理论与g2o的使用

    视觉SLAM漫谈 二 图优化理论与g2o的使用 1 前言以及回顾 各位朋友 自从上一篇 视觉SLAM漫谈 写成以来已经有一段时间了 我收到几位热心读者的邮件 有的希望我介绍一下当前视觉SLAM程序的实用程度 更多的人希望了解一下前文提到的g
  • 单目视觉里程记代码

    在Github上发现了一个简单的单目vo 有接近500星 链接如下 https github com avisingh599 mono vo 这个单目里程计主要依靠opencv实现 提取fast角点并进行光流跟踪 然后求取本质矩阵并恢复两帧
  • vscode配置eigen3

    目录 1 头文件包含 2 c cpp properties json 3 CMakeList txt 4 完整代码 1 头文件包含 Eigen 核心部分 include
  • 动态场景下基于实例分割的SLAM(毕业设计开题及语义分割部分)

    动态场景下基于实例分割的SLAM 毕业论文设计思路及流水 前言 今年选了个比较难的毕设题目 这里记录一下自己思路和流程 为之后的学弟学妹 划掉 铺个方向 会按日期不定期的更新 一 开题 2019 12 24 考研前选择课题是 利用深度学习对
  • PnP 问题

    欢迎访问我的博客首页 PnP 问题 1 DLT 2 P3P 3 G2O 求解 PnP 3 1 单目 3 2 双目 4 自定义顶点与边优化内参 4 1 二元边 4 2 三元边 4 3 总结 5 参考 PnP Perspective n Poi
  • SLAM-hector_slam 简介与使用

    hector slam功能包使用高斯牛顿方法 不需要里程计数据 只根据激光信息便可构建地图 所以他的总体框架如下 hector slam功能包 hector slam的核心节点是hector mapping 它订阅 scan 话题以获取SL
  • 1-如何安装ROS

    如何安装ROS 大家好 我是如何 今天尝试在Ubantu下安装ROS Robot Operating System 测试环境 虚拟机VMware Ubantu20 04 准备步骤 添加ROS软件源 sudo sh c echo deb ht
  • docker dbus-x11

    本来想用terminator启动nvidia docker 显示出图形界面的 结果发现启动的时候出问题了 terminator 1 dbind WARNING 07 31 53 725 Couldn t connect to accessi
  • 二.全局定位--开源定位框架livox-relocalization实录数据集测试

    相关博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 基于固态雷达的全局
  • Ubuntu18.04安装pcl(过程/坑记录式教程)

    Ubuntu18 04安装pcl 1 下载pcl 2 安装依赖项 3 编译 4 安装 5 网上教程说要安装QT5和VTK 但按照本文的 本文记录了安装时出现的问题 出错的安装命令也记录了 建议浏览一遍再参考 不要错用了错误的指令 1 下载p
  • ORB_SLAM2运行官方数据集/自己数据集

    官方数据集运行结果 WeChat 20230210194425 可以正常运行 自己数据集运行结果 自己的数据集 主要是用手机摄像头采集的实验室进行了一下简单的运行 可以成功运行 但是由于查看的相关程序的是死循环不能像运行官方数据集那样完整保
  • 什么是深度学习的无监督学习与有监督学习

    无监督学习 深度学习中的无监督学习方法是一种训练算法 它在没有标注输出的情况下从输入数据中学习模式和特征 这种方法的核心是探索和理解数据的内在结构和分布 而不是通过已知的输出来指导学习过程 无监督学习在深度学习领域有许多不同的形式和应用 以
  • 高翔博士Faster-LIO论文和算法解析

    说明 题目 Faster LIO 快速激光IMU里程计 参考链接 Faster LIO 快速激光IMU里程计 iVox Faster Lio 智行者高博团队开源的增量式稀疏体素结构 Faster Lio是高翔博士在Fast系列的新作 对标基

随机推荐

  • 简单易懂,终于搞明白怎么用nginx在vue开发环境中跨域了,详细

    先说一下vue自己的proxy跨域 毕竟作为前端这个很简单 也更方便 vue cli3 x中 vue cli2 0版本在config文件夹index js中设置 proxyTable 设置方法一样 在新建的vue cofig js里 dev
  • 算法设计与分析——分治法

    归并排序 算法流程 归并排序 分解数组 递归求解 合并排序 步骤 1 首先将待排序的数组不断两两分解直至每一组只有一个元素 2 构建有序数组 两两合并 伪代码 递归式求解 递归树法 代入法 主定理法 最大子数组问题 快速排序 步骤 划分 选
  • vue项目中swipe自定义pagination,navigationButton,鼠标滑过暂停播放

    最近在vue项目中使用了swipe 为了修改样式踩了不少坑记录一下 先上最终成果图 项目要求自定义分页器 前后按钮 以及鼠标滑过时暂停轮播 下载安装 npm install swiper 5 x vue awesome swiper 注意一
  • p值校正,FDR(BH法)的实现过程

    原理 我们要看下最常用的BH法的论文 做m次无效假设作物的数量 那么 被错误地拒绝了的无效假设的比例Q V V S V R 所谓的FDR值就是Q的期望值 E Q E V R 如果无效假设是正确的 s 0且v r FDR值就和FWER fam
  • 【小白初学者】项目中遇到步进电机,别慌,照着改

    目录 前言 实物 共阴接法 程序做法 电源模块设置 问题 源代码 前言 首先面试时 当项目涉及了步进电机这一块 我们需要知道 并不需要往底层等深钻 只需要懂基本原理 怎么配置引脚 开发中遇到一些问题及如何解决 可以大胆说出项目中用步进电机遇
  • Linux中wget命令后面的网址如何获取,照做就行

    大家好 今天我们来分享Linux中wget命令后面的网址如何获取 我们在运维工作当中 经常要在服务器上下载各类软件的安装包 这就会使用到wget命令 就由此引出了一个问题 就是 wget后面具体的下载地址如何获取的 做个示范 我们要在Lin
  • 因为计算机丢失vcruntime140.dll如何修复,教你如何快速修复

    前几天 我在使用电脑时遇到了一个棘手的问题 我的电脑上的一个程序 软件名称 突然无法运行 提示我缺少vcruntime140 dll文件 这让我感到非常烦恼 因为我并不清楚如何解决这个问题 在经过一番尝试和搜索后 我终于找到了解决方法 并成
  • 已适配互联网上90%网站的油猴脚本,只能说非常好用

    相信很多朋友都担心上网时需要频繁点击下一页 不仅需要移动鼠标还浪费加载时间 如果能把这类网站的翻页方式全部变成瀑布 只需滑动鼠标滚轮就能自动切换页面岂不是很好 安排 今儿这个油猴脚本能让你深感神奇 其实Morley上个月在一个软件集锦里把这
  • 日常生活57种排毒食物大盘点

    日常生活57种排毒食物大盘点 食品添加剂 高脂肪食物 杀虫剂 空气中的有毒排放物 越来越多的毒素充斥着我们的生活 痤疮 口臭 便秘 头疼 水肿 肥胖 这些都是体内毒素积聚的信号 于是偶跟风搜集了很多排毒的方法 食物 注意事项 拿出来与大家分
  • mysql常见的存储引擎有哪些?

    MySQL中常用的四种存储引擎分别是 MyISAM InnoDB MEMORY ARCHIVE MySQL 5 5版本后默认的存储引擎为InnoDB InnoDB存储引擎 InnoDB是MySQL默认的事务型存储引擎 使用最广泛 基于聚簇索
  • uni-app小白【h5,vue,小程序的区别】

    uni app 传统的h5只有一端 就是浏览器 但是uni app可以横跨7端 虽然它还是前端 但与传统的h5有明显的区别 网络模型的变化 以前的网络大多都是b s 服务端代码混合在页面里 现在是C S前后端分离 通过js api 类似aj
  • ChatGPT时代,如何训练大脑,以后不会被人工智能取代

    nbsp 当有一天 你的小孩子问我将来会不会被AI代替的时候 为人父母的我们应该怎么回答小孩子的问题呢 不知各位是否刷到一位名为浅爸谈英语的博主爸爸分享与他女儿关于AI对话的视频 这段对话很有启发性 父亲的回答也很中肯 可以通过这段对话探讨
  • 元宇宙背后,你应该了解的人工智能核心技术

    原创 王稳钺 资料来源 单博 一 真假元宇宙 最近元宇宙这个概念非常火 网上的资料也是铺天盖地 但个人认为元宇宙这个概念里蹭热点的人非常的多 元宇宙还是处于概念为主的阶段 很多人说自己在做元宇宙 但其实都是真假难辨的状态 在元宇宙这个词出现
  • 商标45类分类表明细表_2019版注册商标分类表,商标注册45类范围明细

    注册商标的时候都是要确定具体的产品或服务的 目前我国商标分类是用 类似商品和服务区分表 基于尼斯分类第十一版 2019年版这本分类书 这本分类表也是全球通用的分类表 商标分类总共有45个类别 1 34类是产品类 35 45类是服务类 这45
  • [SecureCRT]Public Key Authentication Failed

    取消勾选PublicKey
  • ABB工业机器人程序编写与实战

    任务 实现物件从一个位置移动到另一个位置 1 补充的知识点 1 1ABB工业机器人编程语言PAPID 任务 程序模块 系统模块 例行程序 PP指针 机器人运动指令 MoveJ ToPoint Speed Zone Tool Wobj Mov
  • 经验误差与过拟合

    一 经验误差 一般在分类问题中 我们把分类错误的样本数占样本总数的比例称作 错误率 即如果在m个样本中有a个样本分类错误 则错误率为E a m 则相对的 1 E称为精度 即精度 1 错误率 更一般的 我们把学习器的实际预测输出与样本的真实输
  • 微信小程序实战项目

    基于微信小程序的在线商城点单系统 前言 闲来无事 想以后自己开一个小超市或者小吃店 能够支持线上下单 既方便客户也方便自己 系统采用C 语言作为后端实现与小程序的交互 给用来学习或者想自己开个小店的朋友当个参考 文末获取源码联系 精彩专栏持
  • 一文弄懂Numpy中ndarray的维度(dimension)/轴数(axis/axes)问题

    Numpy库的核心是ndarray 实际上就是N维数组 N dimensional array 关于这个数据对象的详细介绍 参考官方文档最为合适 有一点要注意的是 ndarray的内置方法只有30多个 常用的如求平均值可以写a mean 但
  • 视觉SLAM漫谈(二):图优化理论与g2o的使用

    视觉SLAM漫谈 二 图优化理论与g2o的使用 1 前言以及回顾 各位朋友 自从上一篇 视觉SLAM漫谈 写成以来已经有一段时间了 我收到几位热心读者的邮件 有的希望我介绍一下当前视觉SLAM程序的实用程度 更多的人希望了解一下前文提到的g