BAD SLAM 解析
介绍
当时BA算法被广泛的使用在特征点法的系统中,作者认为这些方法丢弃了图像的大部分信息。并且在稠密重建中,使用完整的BA是做不到实时的。在这篇文章中,作者提出了一种改进BA算法(基于Surfels模型),可以用单个GPU就可以实现实时稠密重建。还有一个贡献就是提出一种基准数据集,在这种数据集下测试,SLAM系统都能有更好的结果。
相关工作
与本文的提出的系统的差异
Frame-to-model tracking
这种方法的相机位姿不再进行后续优化,会导致累积误差。
Map deformation
没有使用所有可用信息。
Pose graph optimization
虽然可以简化优化问题,但也只是近似BA。
Fragment-based optimization
分层优化,虽然可以减少优化的变量,但也只是近似BA。
Indirect (feature-based) BA
这里的ORB-SLAM2和Bundlefusion效果都很好。
Direct BA
同时优化相机位姿和场景参数,但需要大量的计算时间,举了离线系统。
Benchmarking RGB-D SLAM
作者提供了基准数据集,这种数据集是同步全局快门,对比现有的数据集,重建的结果更好。
数据表示
作者使用场景表示是surfels,且只对关键帧进行BA。
关键帧作者没有作严格的筛选,每10帧,选一帧作为关键帧。
作者的surfels是一个圆盘,其包含3D圆心坐标(全局坐标系),表面的法向量,圆盘半径,描述子。 作者选择surfels是因为他们能够通过BA有效的进行融合和更新。
损失函数
遍历所有的关键帧,所有建立好关联的面元,进行几何误差,光度误差优化。
这两个误差项前面都有一个偏置 σ D − 1 \sigma_D^{-1} σD−1和 σ p − 1 \sigma_p^{-1} σp−1 ,对于第一个偏置,作者认为对于一个标定好的相机,不确定性只会出现在深度方向上,所以建立一个模型消除深度上的不确定性。第二个的不确定性在于反射,光照变化。
几何误差
将面元中心3D坐标投影到第K帧关键帧的坐标系,进而投影到第K帧关键帧像素平面,在通过深度图的深度转换到K相机坐标系。点到面的icp。
光度误差
这里I()
不是直接用亮度值,而是用的亮度的梯度图的信息(对亮度变换更加鲁棒) 这里的I()
采用双线性插值进行取亮度值。这里用两个点来做,这两个点是在以面元中心 p s p_s ps为圆心的圆上,而且 s 1 − p s s_1-p_s s1−ps和 s 2 − p s s_2-p_s s2−ps正交。这里亮度值相减,本质上是梯度值,与以往的不同,这里的跨度是半径。
算法流程
创建面元
首先遍历所有关键帧,为每个关键帧创建surfels
,将关键帧分为若干个4*4
大小的网格,将所有面元投影到网格中,每个网格中至少有一个像素与一个面元关联,如果没有,则从深度图中随机选取一个深度创建一个面元s
与之关联。
面元与像素点进行关联
把面元的中心坐标投影到关键帧上,首先投影点要在这个关键帧中,
投影点具有深度测量;
深度测量值和面元的深度足够近似;
深度图的方向和面元的法向量足够近似;
符合上述条件,那么就建立像素到面元的关联。
面元的属性都是由创建它的那个像素计算而成。计算面元的中心 p s p_s ps,法向量 n s n_s ns,半径 r s r_s rs,描述子 d s d_s ds。
外点过滤
像素与面元关联,那么这个像素需要符合一定条件:将这个像素点的3D坐标投影到其它关键帧,记录有多少关键帧可以观测到这个像素点,和没有观测到的次数。如果没观测到的次数比观测到次数多,或者观测到的次数小于一定阈值,则认为这个像素点是外点,则不对这个像素点进行关联一个面元。
面元的法向量更新
平均所有与该面元关联的像素点的法向量,随后进行归一化。
面元的中心位置和描述子优化
在更新完面元的法向量后,对面元的中心位置,描述子通过(1)式进行优化。这里还限制面元的中心的优化方向,只允许沿着面元的法向量方向进行优化,所以优化式子为 p s + t ⋅ n s p_s+t \cdot n_s ps+t⋅ns,只有一个优化量 t t t。
描述子更新方法呢????
面元融合
在BA的第一次迭代,开始融合具有相似属性的面元,比如法向量接近,位置接近。为了更快的找到需要融合的面元,将面元投影到所有的关键帧中,位于同一个4*4
的网格中的面元进行融合。
关键帧的位姿优化
对(1)式进行高斯牛顿法进行优化。
相机内参优化
同样对(1)式进行高斯牛顿法进行优化,不过这次优化的是相机内参,同时,使用深度偏移模型,建立真实深度与偏移的深度联系
面元清理和更新半径
与上面的外点过滤方法类似,将面元投影到每个关键帧,计算这个面元在关键帧集出现的次数。
与法向量更新方法类似,与面元关联的所有像素点,都计算出一个半径,该面元半径更新为最小的半径。
前端
本文的主要贡献是提供了一个后端稠密的BA方法。
预处理
使用双边滤波,对深度图过滤。
里程计
通过上一关键帧,估计当前帧的位姿,使用标准的直接法,其中包括几何误差,光度梯度误差。【参考文献】
回环检测
当创建一个关键帧时(每10帧),执行回环检测。使用基于二进制特征,的词袋模型,找到当前关键帧k
与历史哪个关键帧m
最相似。首先通过特征匹配估计关键帧的初始相对位姿,然后通过直接法对齐。同时也对齐m-1
,m+1
帧,如果这些对齐,都满足一定条件(变换和角度的差异),则接受这次回环。使用刚刚算出的三个相对位姿的平均相对位姿,使用位姿图优化,随后使用作者提出的BA优化。
基准数据集
动因
作者认为,在流行的TUM RGB-D 数据集中,与真实世界都多多少少有偏差,因为采集数据时,RGB图和depth图的时间不同步,深度图畸变,不能准确获得对应像素点的深度,这会导致各种RGB-D SLAM系统的运行结果也会更加不准确。
创建基准数据集
作者创建基准数据集使用两种方法,一种是作者采用同步装置、全局快门相机记录数据集;另一种是在原有数据集重建出3D模型后,通过数据集原始轨迹,重新渲染数据集。作者渲染出四种数据集,卷帘快门和异步的排列组合。基于全局快门同步数据集,卷帘快门数据集是通过估计卷帘快门的时间(第一行和最后一行的时间差)来模拟卷帘快门的效果,对于异步快门数据集,RGB图像的深度对应两张时间连续的深度图像之间深度图像。
BAD SLAM 解析相关推荐
- 计算机视觉学习日记1
1.VIA图像标注工具 解析:VGG Image Annotator [VIA]是一款开源的图像标注工具,由Visual Geometry Group开发.可以在线和离线使用,可标注矩形.圆.椭圆.多 ...
- SLAM架构的两篇顶会论文解析
SLAM架构的两篇顶会论文解析 一.基于superpoint的词袋和图验证的鲁棒闭环检测 标题:Robust Loop Closure Detection Based on Bag of SuperP ...
- 视觉SLAM开源算法ORB-SLAM3 原理与代码解析
来源:深蓝学院,文稿整理者:何常鑫,审核&修改:刘国庆 本文总结于上交感知与导航研究所科研助理--刘国庆关于[视觉SLAM开源算法ORB-SLAM3 原理与代码解析]的公开课. ORB-SLA ...
- 转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势
SLAM(Simultaneous Localization and Mapping)是业界公认视觉领域空间定位技术的前沿方向,中文译名为"同步定位与地图构建",它主要用于解决机器 ...
- 【SLAM】VINS-MONO解析——回环检测和重定位
9. 回环检测与重定位 本部分内容涉及到的代码大部分在pose_graph文件夹下,少部分在vins_estimator里. 原创内容,转载请先与我联系并注明出处,谢谢! 系列内容请点击:[SLAM] ...
- SLAM学习笔记(十九)开源3D激光SLAM总结大全——Cartographer3D,LOAM,Lego-LOAM,LIO-SAM,LVI-SAM,Livox-LOAM的原理解析及区别
本文为我在浙江省北大信研院-智能计算中心-情感智能机器人实验室-科技委员会所做的一个分享汇报,现在我把它搬运到博客中. 由于参与分享汇报的同事有许多是做其他方向的机器人工程师(包括硬件.控制等各方面并 ...
- 【SLAM】LIO-SAM解析——后端优化mapOptimization(5)
系列文章链接: [SLAM]LIO-SAM解析--流程图(1) [SLAM]LIO-SAM解析--数据预处理imageProjection(2) [SLAM]LIO-SAM解析--特征提取featur ...
- Semantic SLAM源码解析
这个语义SLAM建图是基于ROS的 下面上源码解析: 首先从semantic_cloud.py出发,这里接收相机读入的topic, 会得到RGB图和深度图, 同时会起orb_slam2计算位姿,我们这 ...
- 视觉融合里程计SLAM算法SE2Lam解析-论文篇
解析论文名称是:Visual-Odometric Localization and Mapping for Ground Vehicles Using SE(2)-XYZ Constraints 代码 ...
最新文章
- 63万张!旷视发布最大物体检测数据集Objects365 | 技术头条
- python colormap函数_python-使用由x,y位置定义的rgb值创建colormap
- Ranger中对hive添加policy字后,hive登录用户可用,hive密码不管用的问题解决,HiveServer2 Authentication Custom的编写
- Linux下mysql 5.x得到root密码后的另外一种利用方式
- Android之SharedPreferences 存储复杂对象
- 虚电路子网和数据报子网的比较
- 2.2 基本算法之递归和自调用函数 8758 2的幂次方表示 python
- C++笔记-QSslSocket::supportsSsl返回false(windows版的Qt不支持SSL)解决
- Git HEAD detached from XXX (git HEAD 游离) 解决办法
- 编译Windows版本ffmpeg:MingW方式失败
- 数学笔记——导数5(指数函数和对数函数的导数)
- 六十星系之25廉贞天相坐子午
- 【无标题】Vue长列表性能优化常用方案
- 51单片机使用PWM调速
- 学历,工作经验,火焰纹章
- Android开源 -- 开源的基于 Material Design设计的豆瓣的Android客户端“豆芽”
- [emWin]利用内存设备加速GIF图片显示——2021.03
- 我没去BAT,用了8年时间,从乙方变成了甲方
- 计算机毕业学游戏设计师,学游戏设计有前途吗
- BCD工艺、CMOS工艺、BiCMOS工艺
热门文章
- 最新的美国FBI犯罪心理变态测试题
- 如何在插入网线的情况下,使用wifi上网
- Unknown custom element: <HeaderTop> - did you register the component correctly?
- 使用chatGPT开发获取格点天气数据
- html div显示页面中间,使一个div始终显示在页面中间
- (8) PyQt 设计并实现【工厂扫码装箱系统】- Python实现 ZEBRA 斑马条码打印机 自动化打印标签
- eric6-21.11安装
- STM8硬件IIC从机
- Python把数据从Word(.docx)中读出来写入到Excel(.xlsx)中
- 信息安全技术——(十)安全审计与责任认定