SLAM学习笔记-------------(12)建图
我们之前的讨论,基本集中于“稀疏路标地图”部分,还没有探讨稠密地图。
稀疏地图只建模感兴趣的部分,也就是前面说了很久的特征点(路标点)。而稠密地图是指建模所有看到过的部分。
对于同一张桌子,稀疏地图可能只建模了桌子的四个角,而稠密地图则会建模整个桌面。虽然从定位角度看,只有四个角的地图也可以用于对相机进行定位,但由于我们无法从四个角推断这几个点之间的空间结构,所以无法仅用四个角完成导航、避障等需要稠密地图才能完成的工作。
所以这一章主要讲如何建立稠密地图。
主要有三个方案:
- 1.使用单目相机,估计相机运动,并且三角化计算像素的距离。
- 2.使用双目相机,利用左右目的视差计算像素的距离(多目原理相同)。
- 3.使用RGB-D相机直接获得像素距离。
前两种方法,使用单目或者多目——计算量巨大,最后得到一些不怎么可靠的深度估计。
当然,RGB-D也有一些量程、应用范围和光照的限制,不过相比于单目和双目的结果,使用RGB-D进行稠密重建往往是更常见的选择。
而单目、双目的好处是,在目前RGB-D还无法被很好地应用的室外、大场景场合中,仍能通过立体视觉估计深度信息。
emmm,虽然单目建图不咋地,但是呢,我们还是建一遍,感受一下。
单目稠密重建
主要用到的方法是:极线搜索和块匹配
极线呢,是极平面O1O2P 与两个成像平面I1 I2的交线。(我用红色箭头指的)
知道相机的运动后,就知道了极线
我们可能沿着第二幅图像中的极线的某一头走到另一头,逐个比较每个像素与p1的相似程度。
哪个比较像,就找到p2。这就叫极线搜索。
然后呢,我们前边学了也知道,比较一个像素不可靠,有很多像素都差不多的,所以我们划定一个范围,比较像素块。这就叫块匹配。
说到块匹配,还要介绍一个东西。如何比较两个小块之间的相似程度?有如下三个方法:
这里以NCC为例,我们为了比较小块与小块之间的相似度,将得到一个沿着极线的NCC分布。这个分布的形状取决于图像数据,
在搜索距离较长的情况下,通常会得到一个非凸函数。这个分布存在许多峰值,然而真实的对应点必定只有一个。在这种情况下,我们会倾向于使用概率分布描述深度值,而非用某个单一的数值来描述深度。于是,我们的问题就转到了在不断对不同图像进行极线搜索时,我们估计的深度分布将发生怎样的变化——这就是所谓的深度滤波器。
关于深度滤波器的具体推导内容,看书就好了。
这里放出结论:
代码实践:单目稠密深度重建
先去下载数据集:250多M
下好了复制到这一章节文件夹下
http://rpg.ifi.uzh.ch/datasets/remode_test_data.zip
编译的时候,报错,说找不到octomap这个包。
所以先需要安装这个库,地址如下
git clone https://github.com/OctoMap/octomap.git
再编译程序,又报错了
他说surfel_mapping.app里有一个错误
surfel_mapping.cpp:31:9: error: ‘class pcl::MovingLeastSquares<pcl::PointXYZRGB, pcl::PointXYZRGBNormal>’ has no member named ‘setPolynomialFit’; did you mean ‘setPolynomialOrder’?
说这个函数不是pcl的成员,但是她就是pcl的成员,那就还是说明这个东西没安装好
后来发现我太傻了,书上都说了怎么安装
sudo apt-get install liboctomap-dev octovis
然后试了好多方法都不行,最后我放弃了
我先不跑这个surfel_mapping.app代码了,先跑别的。所以把报错的那一句注释了
执行这个代码,传入参数就是我们刚才下载的数据
但是要注意: 需要写 ../../test_data 因为编译出来的文件和测试数据隔了两层
运行结果:迭代了几次之后,虚拟机直接卡死了(可能是我电脑太老了)
关机前的遗照,有四个图像显示出来,截图就截了两个 迭代68次
SLAM学习笔记-------------(12)建图相关推荐
- SLAM学习:Gmapping建图下地图变形更新速度慢问题
一.问题描述 首先,我在用Gmapping建图的时候发现扫描出来的地图更新速度很慢然后还有就是地图的完整性不高容易变形扭曲,我们在一般在路径规划前需要用适当的建图算法把地图创建出来然后保存方可进行全局 ...
- 激光slam学习笔记——基于图优化的激光slam方法
激光slam学习笔记--基于图优化的激光slam方法 1.slam基础 整体来说,在激光slam中,滤波器的误差要小于图优化的误差. 图优化通俗点说就是里程计计算的位姿与观测到的位姿之间会形成一个误差 ...
- SLAM学习笔记(十九)开源3D激光SLAM总结大全——Cartographer3D,LOAM,Lego-LOAM,LIO-SAM,LVI-SAM,Livox-LOAM的原理解析及区别
本文为我在浙江省北大信研院-智能计算中心-情感智能机器人实验室-科技委员会所做的一个分享汇报,现在我把它搬运到博客中. 由于参与分享汇报的同事有许多是做其他方向的机器人工程师(包括硬件.控制等各方面并 ...
- 视觉slam学习笔记以及课后习题《第五讲特征点法视觉里程计》
这篇博客主要记录了我在深蓝学院视觉slam课程中的课后习题,因为是为了统计知识点来方便自己以后查阅,所以有部分知识可能不太严谨,如果给大家造成了困扰请见谅,大家发现了问题也可以私信或者评论给我及时改正 ...
- SLAM学习笔记(二十)LIO-SAM流程及代码详解(最全)
写在前面 关于安装配置,博客LIO_SAM实测运行,论文学习及代码注释[附对应google driver数据] 我觉得已经写的比较完善了.但是我觉得在注释方面,这位博主写的还不够完善,因此在学习以后, ...
- Slam学习笔记——ROS踩坑记录
Slam学习笔记--ROS踩坑记录 1. 安装 2. ROS文件系统 2.1 工作区 2.2 包package 2.2.1 包的操作 2.2.2 描述文件package.xml 2.3 节点node ...
- Go学习笔记06-内建容器
Go学习笔记06-内建容器 Go语言 数组 *切片(Slice) #F44336 Slice的操作 Map map示例 字符处理 数组 定义数组: //这样定义数组编译器自动初始化每个元素为0 var ...
- 当使用视觉SLAM对一个环境建图之后,如何让机器人能够“理解”地图并导航呢? - 知乎
当使用视觉SLAM对一个环境建图之后,如何让机器人能够"理解"地图并导航呢? - 知乎
- Linux学习笔记12——配置ftp、squid、Tomcat、Samba、MySQL主从
Linux学习笔记12 Linux学习笔记12 配置FTP服务 配置pure-ftpd 开机启动 上传下载文件 配置vsftpd CentOS 70安装配置Vsftp服务器 搭好vsftp之后出现55 ...
- golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题
golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...
最新文章
- MySQL日期函数的用法几则
- 使用c++ 实现定时触发键盘事件_基于定时器捕获测量脉宽的应用示例
- jQuery时间轴特效
- 买理财撤单显示服务器忙,银行理财产品撤单后资金几时到账
- canvas 圆角矩形填充_Canvas:随机长方形生成和色块填充
- Servlet-Access denied for user 'root'@'localhost' (using password: YES
- 自己实现spring核心功能 一
- PMCAFF | 产品经理挑战赛,等你来战
- uva1624knots
- Linux Kickstart无人值守安装(上)
- 快速突破面试算法之链表篇
- 图形验证码知识点整理 Object.prototype.toString.call()等
- 词法分析器java_java词法分析器简单实现
- GBase 8a集群运行报错BLK_TEMP: return NULL in alloc
- 百趣代谢组学资讯:@熬夜的年轻人代谢紊乱急救包-喝普洱茶!
- 微信小程序多音频场景处理 - 背景音频
- failed to push some refs to 'git@github.com怎么办
- 爬虫(豆瓣电影Top250数据分析)学习笔记
- python翻译成中文_Python调用有道智云文本翻译API接口实现“智能”伪原创
- matlab中(),[],与{}的使用区别