3D Mapping with an RGB-D Camera(RGBD SLAM V2 )论文笔记

 

这篇文章即是Felix Endres等人12年完成的RGB-D SLAM V2,是最早的为kinect风格传感器设计的SLAM系统之一

没看到有相关的论文解析

在Github上可找到开源代码,工程配置与运行参考http://www.cnblogs.com/voyagee/p/6898278.html

 

系统流程

 

 

 

        系统分为前后端。前端就是视觉里程记。从每一帧的RGB图像提取特征,计算描述符,RANSAC+ICP计算两帧之间的motion estimation,

  并提出了一个EMM(Environment Measurement Model)模型来判断estimate motion是否可接受。后端回环检测,基于g2o优化库的位姿图(pose graph)优化,

      得到优化后的轨迹,用于建立地   图。建图采用八叉树地图octomap的方式。

 

特征提取

在源码中可选择 SIFT \ SURF \ORB 特征,其中SIFT要在GPU上运行,ORB和SURF都在CPU上用Opencv实现

不同特征比较:

 其中,ATE为Absolute Trajectory Error,轨迹的误差,就是系统估计的轨迹和真实轨迹(GroundTruth)之间的欧式距离,RMSE就是均方根

可以看出,有GPU时SIFT综合表现最好。 综合实时性、硬件成本和准确率来看,ORB较好。

 

运动估计

三对特征快速计算RANSAC的初始值,在每一轮迭代中,最小二乘correspondences之间的马氏距离 。

马氏距离与欧式距离的差别:http://www.cnblogs.com/likai198981/p/3167928.html,简单说就是计算距离时考虑到了各项异性,多乘了一个协方差矩阵

 

EMM:Environment Measurement Model

 一个传统的判断motion estimate是否可接受的方法就是看inlier的比例,小于设定阈值就reject motion estimate。

然而,motion blur(运动模糊),缺少纹理信息的环境都很容易出现inlier较少的情况。

并且有一些点,在一帧中可以看到,另一帧可能就被其他点挡住了。  作者提出使用这个EMM来更鲁棒的判断是否reject estimate 

 

先看一个假设:实施transformation之后,空间上对应的深度测量值应该来自于同一个表面位置之下:

after applying transformation estimate,spatially corresponding depth measurement stem from the same underlying surface location.

 

 论文中作者证明了观测yi和yj(不同与下图的yi,yj)之间的差满足高斯分布,方差为表示噪音的协方差矩阵(计算方法由论文 Accuracy and Resolution of Kinect Depth Data给出)

这样,就可以用概率学里的p值检验来判断是否reject estimate,然而,发现p值检验 有点神经衰弱 ,对于微小的误差太过敏感,

因此使用另一种方法

 

将相机A观测到的点投影到相机B,在observed points中找出inlier,outlier,occluded:

 上图中yi和yj应该是同一个点,算作inlier。yk不再A的视场内,所以被忽视,不看作“observed points”。

投影之后的yq在相机B 的市场中被yk挡住,看不到,因此算作occluded。

至于yp,落在了yq和相机A光心的连线上,算作outlier(注意,yp与yk不同,yp在相机A的视场内,但是相机A在这里观测到的是yq的深度)

因此,在上图中,inlier有俩,outlier一个,occluded一个

 


 而在代码中(misc.cpp 913行之后有两个函数,其中一个是用于p值检验方法的),作者是这么计算inlier,outlier,occluded,并判断是否reject的

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

observedPoints=inliers + outliers + occluded

I=inlier数量,O=outlier数量,C=occluded数量,如果I/(I+O+C)<25%,直接reject

否则,对I/(I+O)设一个阈值,小于阈值就reject


   回环检测

  现在的回环检测大多数是基于Bag-of-Words,深度学习兴起后也有用deep learning 的,或者用语义信息

    此文回环是基于 最小生成树 ,随机森林的随机回环

    使用描述符之间的距离(直接相减),生成一棵深度图像(limited depth)的最小生成树,去掉n个时间上最近的(避免重复)

    再随机从树上选k帧(偏向于更早的帧)来找闭环

 

 

图优化

只优化位姿图,不优化三维点。

使用g2o图优化库。g2o的使用http://www.cnblogs.com/gaoxiang12/p/3776107.html

没有被EMM拒绝的motion,将两帧相机位姿作为优化顶点,motion作为约束,加入优化边

检测到的回环,也加入优化顶点和边

g2o优化边的误差函数:

 

   

      这里的xi,xj为优化变量(顶点位姿的estimate),Zij是约束,也就是xi和xj之间的变换。e()是how well xi and xj satisfy the constraint ,

     中间的Ω是约束(优化边)的信息矩阵(协方差矩阵的逆), 表示对边的精度的估计。在代码中,是这么计算的:

 

odom_edge.informationMatrix = Eigen::Matrix<double,6,6>::Identity() / time_delta_sec;//e-9;

 

    单位矩阵除以两帧之间的时间间隔

 

    

     看到这里,依然没有明白这个误差究竟咋算的~

      查看g2o::SE3edge.cpp, 这个e其实是这么算的:

    

  

 

_inverseMeasurement * from->estimate().inverse() * to->estimate()

 

解释一下这个误差函数:

我们认为 帧2( from)的位姿态 Tj 是帧1(to)的位姿 Ti 经过 Tij 得到的 ,也就是

Ti * Tij = Tj   

  也就是

Tij = Ti -1 *   Tj

即一个位姿的逆乘另一个位姿可以表示两个位姿之间的变化,那么,我们想表达边的measurement与Tij之间的差距,也可以这么玩儿

 

delta :        Δ = measurement-1  * Ti-1 * Tj  , 

 

这就得到g2o代码里的式子了, 后面的toVectorMQT是啥我也不清楚。。应该就是矩阵转化为向量

 

注意,Ti其实完整写法是Twi,  w代表世界坐标系

这里看不懂的可以参考高翔大大《视觉SLAM十四讲》11.1.2

 

这个样子的回环检测,难免会出现错误的回环,这种回环约束加入到图优化中去,势必会把地图拉的扭曲

所以,在图优化第一次收敛之后,作者就把错误回环对应的优化边  从图中删除。

怎么判断回环是错误的呢? -----  给上面说的误差函数设一个阈值(又又又又是阈值。。) ,误差大于这个阈值的就是错误的

 

octoMap:

http://www.cnblogs.com/gaoxiang12/p/5041142.html

把一个立方体平均分成八个小立方体,小立方体又可以再分,子子孙孙无穷尽也

每个小立方体对应八叉树的一个节点,因此成为八叉树地图

每个小立方体存储 被占据的概率的logist回归,被观测到占据次数越多,概率越大,而如果没有一次观测到被占据,则不用展开该节点

 

OctoMap的优点: 利于导航 ; 易于更新 ;存储方式比较省空间


 

 

欢迎交流,欢迎补充,欢迎纠错

转载于:https://www.cnblogs.com/voyagee/p/7027076.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql内连接

假设&#xff41;表和&#xff42;表的数据是这样的。 a表 id name   1  a 2 b 3 c b表 id stock  1 15 2 50   select * from …

这两天的问题

最天调用COM接口实现了脚本执行的功能,可是不好的是要运行一次,提供的.EXE,我用CreateProcess打开后但不想让它显示出来,但只有控制台下的才行.难!还有OLE在对话框中的运用,一直出现内存溢出,再想办法! 转载于:https://www.cnblogs.com/dyx1024/archive/2007/11/29/2556857.htm…

制作新网络框架快速自动生成消息结构体的编辑器

这两天制作了一个自动生成代码脚本的窗体编辑器 目前还没有做过第一行可以选择生成的脚本类型&#xff0c;分请求消息和回应消息两种结构体脚本 第二行可以手动输入命名空间&#xff0c;第三行手动输入文件的名称&#xff0c;类名与文件名称相同 后面两个ID是消息的ID 下面的Po…

left join和left outer join的区别

left join是left outer join的缩写&#xff0c;所以作用是一样的。 另外在SQL里没有区分大小写&#xff0c;也就是left join和LEFT JOIN都是可以的。 left join: 包含左表的所有行&#xff0c;对应的右表行可能为空。 right join: 包含右表的所有行&#xff0c;对应的左表…

随心所欲的Web页面打印技术

一.概述 对基于B/S架构的应用程序而言&#xff0c;客户端的页面打印一直是比较头疼的问题&#xff0c;简单的做法是&#xff1a;1.使用IE的打印功能&#xff1b;2.使用水晶报表。但以上两种办法&#xff0c;都有很大的局限性&#xff0c;很难实现特殊要求的排版和精确的定位&…

OAuth2.0学习(2-1)Spring Security OAuth2.0 开发指南

开发指南&#xff1a;http://www.cnblogs.com/xingxueliao/p/5911292.htmlSpring OAuth2.0 提供者实现原理&#xff1a;Spring OAuth2.0提供者实际上分为&#xff1a;授权服务 Authorization Service.资源服务 Resource Service.虽然这两个提供者有时候可能存在同一个应用程序中…

SQL的连接分为三种:内连接、外连接、交叉连接

建了两张表&#xff0c;学生表student 课程表 class 一、内连接&#xff1a; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;有两种&#xff0c;显式的和隐式的&#xff0c;返回连接表中符合连接条件和查询条件的数据行。&#xff08;所谓的链接表就是数据库在做查询形…

js 实时监听input中值变化

摘自&#xff1a;http://blog.csdn.net/spy19881201/article/details/25537225 示例&#xff1a; <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <title>RunJS<…

[导入]FreeTextBox 1.6.3 中文版使用说明

阅读全文 类别&#xff1a;asp.netsqlc#||oracle 查看评论文章来源:http://hi.baidu.com/huqing7002/blog/item/c038a810c90ee502203f2ea9.html转载于:https://www.cnblogs.com/huqing7002/archive/2007/12/06/1007052.html

jion连接总结

1:内连接 2:左外连接 3:右外连接 4:左外连接 where判断 5:右外连接 where 6:全外连接 7:全外连接 where

福禄克网络电缆测试仪LinkIQ网络电缆测试仪的使用方法

作为福禄克官方授权经销商—明辰智航将给你一个完整的LinkIQ有线网络测试仪概述。首先&#xff0c;让我们来看看基本工具包里的内容。 我们有&#xff1a; LinkIQ本身 福禄克随身携带便捷包 快速参考指南说明书 CAT6a接线 远程ID 1用于完整的导线图测试 RJ45-to-RJ45模块…

三、spring boot 1.5.4 web容器定制(端口号等修改)

spring boot 默认采用tomcat作为嵌入的web容器 定制方式有三种 1. 2.如下 Component public class CustomizationBean implements EmbeddedServletContainerCustomizer{/*** 定制方法一&#xff1a;实现EmbeddedServletContainerCustomizer* param container*/Overridepublic v…

Linux下怎么改分辨率和刷新率?

北南南北02-05-02, 19:11调整显示屏幕偏移&#xff0c;的频率太低&#xff0c;显示器闪的厉害的解决办法1]在控制台下运行#xvidtune2]会有一个设置显示器的图形工具&#xff0c;用left和right按钮调好屏幕位置,test一下&#xff0c;调到显示位于最中间为准&#xff0c;再show一…

步步为营-77-Ajax简介

AJax:异步JavaScript和XML.Asynchronous JavaScript and XML 优点:无刷新 1 JavaScript下的Ajax 1.1 XMLHttpRequest对象  使用ajax有一个很重要的对象XMLHttpRequest,而该对象的创建方式 var xhr new XMLHttpRequest();//常用 var xhr new ActiveXObject("Microsoft…

福禄克Link IQ功能:PoE负载测试及故障排除

自从最初的IEEE 802.3af 1型以太网供电&#xff08;PoE&#xff09;标准于2003年首次推出以来&#xff0c;该技术已经发展到包括2型&#xff08;高达30瓦&#xff09;、3型&#xff08;高达60瓦&#xff09;和4型&#xff08;高达90瓦&#xff09;。这意味着PoE电压现在支持从手…

深山红叶PE工具箱嫦娥一号纪念版 V30[1115]

深山红叶PE工具箱嫦娥一号纪念版 V30[1115] <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />软件大小 172.72 MB软件类别 国产软件/操作系统 运行环境 Win2003, WinXp, Win2000, Nt, WinMe, Win9x 授权方式 免费版软件语言 简…

H5之前端操作文件

js是否能够操作文件? js在HTML5以前浏览器端是无法操作文件的&#xff0c;但HTML5中给a标签增加了一个download属性&#xff0c;只要有这个属性&#xff0c;点击这个链接时浏览器就不在打开链接指向的文件&#xff0c;而是改为下载&#xff08;目前只有chrome、firefox和opera…

一个有趣的问题,讨论讨论

昨天和一位同事讨论项目过程的一个问题&#xff0c;他提出一个有趣的案例&#xff1a; 假设制作一批茶壶&#xff0c;预定时间是10号&#xff0c;综合考虑10号之前肯定完成&#xff0c;于是定了10号的船&#xff0c;结果制作厂商5号就完成了&#xff0c;表面看起来提前完成是一…