滑动窗口优化

这个比较好理解。

实际工程中,我们必须控制后端优化的计算规模

控制计算规模的做法有很多,比如从连续的视频中抽出一部分作为关键帧,仅构造关键帧与路标点之间的BA问题,于是非关键帧只用于定位,对建图则没有贡献。

即便如此随着时间的流逝,关键帧数量会越来越多,地图规模也将不断增长。像BA这样的批量优化方法,计算效率会不断下降。

为了避免这种情况,我们需要用一定手段控制后端BA的规模。这些手段可以是理论上的,也可以是工程上的。

例如,最简单的控制BA规模的思路,是仅保留离当前时刻最近的N个关键帧,去掉时间上更早的关键帧。

于是,我们的BA将被固定在一个时间窗口内,离开这个窗口的则被丢弃。这种方法称为滑动窗口法

当然,取这N个关键帧的具体方法可以有一些改变

例如,不见得必须取时间上最近的,而可以按照某种原则,取时间上靠近,空间上又可以展开的关键帧,从而保证相机即使在停止不动时,BA的结构也不至于缩成一团(这容易导致一些糟糕的退化情况)。

在滑动窗口中,当窗口结构发生改变,这些状态变量应该如何变化?这件事情可以分成两部分讨论:

  • 1、我们需要在窗口中新增一个关键帧,以及它观测到的路标点。
  • 2、我们需要把窗口中一个旧的关键帧删除,也可能删除它观测到的路标点。

新增还好,就直接新增。

删除的话就麻烦一些:

位姿优化

我们可以构建一个只有轨迹的图优化,而位姿节点之间的边,可以由两个关键帧之间通过特征匹配之后得到的运动估计来给定初始值

不同的是,一旦初始估计完成,我们就不再优化那些路标点的位置,而只关心所有的相机位姿之间的联系。

通过这种方式,我们省去了大量的特征点优化的计算,只保留了关键帧的轨迹,从而构建了所谓的位姿图( Pose Graph )

所以这是两种控制计算规模的方法。

位姿图的优化,数学推导可以看书

总之,最后得到了一个目标函数

我们依然可以用高斯牛顿法、列文伯格—马夸尔特方法等求解此问题,除了用李代数表示优化位姿,别的都是相似的。

根据先前的经验,可以用Ceres或g2o进行求解。我们不再讨论优化的详细过程,第9讲已经讲清楚了。

代码实践:

运行程序pose_graph_g2o_SE3.cpp

首先,预先生成了一个仿真位姿图sphere.g2o

我们可以用g2o_viewer打开这个图(如何操作,请参考:如何找到g2o_viewer并使用)

然后运行代码

这个代码需要传入参数,就是那个图sphere.g2o

执行结果

这个程序会对位姿图进行优化(使用列文伯格-马夸尔特方法)

本来有噪声影响,位姿图是这个样子的

优化结果存储在result.g2o中

打开看下,优化好的样子。一个球

运行程序pose_graph_lie_algebra.cpp

这个程序使用李代数表达位姿图,节点和边的方式为自定义

还是传入参数sphere.g2o

执行结果

优化结果存在result_lie.g2o里面

打开看看

SLAM学习笔记-------------(10)后端2相关推荐

  1. SLAM学习笔记(十九)开源3D激光SLAM总结大全——Cartographer3D,LOAM,Lego-LOAM,LIO-SAM,LVI-SAM,Livox-LOAM的原理解析及区别

    本文为我在浙江省北大信研院-智能计算中心-情感智能机器人实验室-科技委员会所做的一个分享汇报,现在我把它搬运到博客中. 由于参与分享汇报的同事有许多是做其他方向的机器人工程师(包括硬件.控制等各方面并 ...

  2. 视觉slam学习笔记以及课后习题《第三讲李群李代数》

    前言 这篇博客主要记录了我在深蓝学院视觉slam课程中的课后习题,因为是为了统计知识点来方便自己以后查阅,所以有部分知识可能不太严谨,如果给大家造成了困扰请见谅,大家发现了问题也可以私信或者评论给我及 ...

  3. SLAM学习笔记(二十)LIO-SAM流程及代码详解(最全)

    写在前面 关于安装配置,博客LIO_SAM实测运行,论文学习及代码注释[附对应google driver数据] 我觉得已经写的比较完善了.但是我觉得在注释方面,这位博主写的还不够完善,因此在学习以后, ...

  4. JavaWeb黑马旅游网-学习笔记10【项目代码】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  5. Slam学习笔记——ROS踩坑记录

    Slam学习笔记--ROS踩坑记录 1. 安装 2. ROS文件系统 2.1 工作区 2.2 包package 2.2.1 包的操作 2.2.2 描述文件package.xml 2.3 节点node ...

  6. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  7. SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传

    SpringMVC:学习笔记(10)--整合Ckeditor且实现图片上传 配置CKEDITOR 精简文件 解压之后可以看到ckeditor/lang下面有很多语言的js,如果不需要那么多种语言的,可 ...

  8. springmvc学习笔记(10)-springmvc注解开发之商品改动功能

    springmvc学习笔记(10)-springmvc注解开发之商品改动功能 springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmv ...

  9. Hadoop学习笔记—10.Shuffle过程那点事儿

    Hadoop学习笔记-10.Shuffle过程那点事儿 一.回顾Reduce阶段三大步骤 在第四篇博文<初识MapReduce>中,我们认识了MapReduce的八大步骤,其中在Reduc ...

  10. Linux学习笔记10

    Linux学习笔记10 Linux学习笔记10 正则表达式 源码包约定目录 Shell脚本约定目录 Shell脚本的创建与执行 date命令 同步时间 Shell脚本预设变量 与用户交互 数学计算 S ...

最新文章

  1. 页面滚动事件和利用JS实现回到顶部效果
  2. jQuery源码学习
  3. 获得TADIR-OBJECT全部的entry list
  4. python属性访问权限_python 面向对象-访问权限修饰符
  5. c/c++笔试面试题(4)
  6. php实现播放直播_PHP直播技术分享(一:实现直播)
  7. java api 第一个类是_JAVA常用API:String 类的常用方法
  8. 内蒙古联通与锡盟行政公署签大数据合作协议
  9. java getpathinfo_request.getServletPath()和request.getPathInfo()用法
  10. 移动硬盘插上电脑卡住_担心移动硬盘一摔资料就没了,试试这个三防户外硬盘盒...
  11. html meta标签作用
  12. django运行错误:wrong number of arguments for ‘set‘ command
  13. 世界杯花样营销:争夺32亿人眼球中看到三大趋势
  14. 用Python控制Kinect相机
  15. 零基础怎么学好3D建模?只需要了解下面几点
  16. office安装下载
  17. laravel中guard是什么
  18. java linest_Java运行环境搭建的图文教程
  19. java 浏览器 qq_Qq浏览器通用版移动QQ浏览器v2.1Java通用版下载
  20. dc005电源插座三脚封装尺寸_DC-005电源插座有三个引脚分别要怎么接?

热门文章

  1. 《Cisco安全防火墙服务模块(FWSM)解决方案》——2.6 硬件架构
  2. 关于autoconf
  3. java中的构造函数
  4. AJAX, JSON.js,Newtonsoft.Json.dll,nunit.framework.dll 源代码
  5. 企业项目运行管理体系的实现
  6. Error running ‘x‘: Command line is too long. Shorten command line for x or also for Application
  7. idea 版本控制 忽略要提交的文件
  8. mysql 出现ERROR 2002 (HY000): ....错误通用解决方法
  9. [Vue CLI 3] 环境变量和模式配置实践与源码分析
  10. 深入解读HBase2.0新功能之高可用读Region Replica