【视觉SLAM入门】9.1 建图1---SLAM任务,稠密地图构建,立体视觉,RGBD,八叉树,点云地图等各种不同地图

news2024/11/24 18:45:34

"讷为君子,寡为吉人 ”

  • 1. 立体稠密地图
    • 1.1 地图构建
    • 1.2 分析立体相机稠密建图效果
  • 2. RGB-D稠密地图
    • 2.1 地图对比
      • 2.1.1 八叉树地图
  • 3. 建图?定位?孰轻孰重
    • 3.1 鬼影问题
    • 3.2 三维重建
  • 4. 总结

SLAM的功能: 直到现在我们可以知道SLAM包含:定位,导航,避障,重建,交互。

  • 在不同的功能下也有不同的地图。

在这里插入图片描述
之前的都是稠密地图,不同功能要不同地图,本节看稠密地图构建。

1. 立体稠密地图

构建地图必须要知道每个像素点到照片的距离。
立体视觉 : 单目和双目的统称,单目做三角化,双目做时差;
另一种:用RGB-D直接获得距离。

1.1 地图构建

稠密地图,无法将每个像素都当做特征点。寻找新的匹配算法。

  • 极线搜索块匹配:负责匹配,确定A图中的点出现在B图中的位置;
  • 深度滤波器:确定匹配到的深度,用多次三角测量使其收敛。

极线搜索示意图

在这里插入图片描述
描述的是:不同视觉下观察同一个点,相机1中的 p 1 p_1 p1 点,实际的点一定在 d d d 这条线上,在相机2中观察这个点就在极线 l 2 l_2 l2 上,在这条线上搜索和 p 1 p_1 p1 比较相近的点。这就是极线搜索

块匹配

  • 上边极线搜索,在线上如何搜索到与 p 1 p_1 p1 相近的点,方法很多,比如直接比像素(直接法,误差大),块匹配等。
  • 这里介绍块匹配,一条线上相似亮度的像素很多,那就取图像块,在 p 1 p_1 p1 周围取一个大小为 w ⋅ w w\cdot w ww 的图像块,在极线上也这么取同样大小的小块比较,提高区分性。(比较两个小块方法有 SAD,SSD, NCC,还有改进的为了去掉光照影响,去每个小块均值的SAD,SSD等等)。

深度滤波器

在搜索距离比较长的情况下,真实的对应点尽管只有一个,但在搜索极线时会有很多峰值,如下,
在这里插入图片描述
非凸性,对一个点我们不会用单一数值去表示深度,而是用高斯概率 P ( d ) = N ( μ , δ 2 ) P(d) = N(\mu, \delta ^2) P(d)=N(μ,δ2),新的数据到来,都会观测它的深度,两个高斯分布进行融合。

分析这样做的误差(集合不确定性,这里以一个像素误差为例)

在这里插入图片描述
当最后的 δ \delta δ 收缩到一定小,认为深度数据已经收敛。

估计稠密像素深度的完整过程:
在这里插入图片描述

结果:大部分是正确的,但是没有得到预期效果。

1.2 分析立体相机稠密建图效果

  1. 像素梯度和块匹配的影响:像素梯度沿着块变化明显则效果好,像素梯度沿着块变化不明显则效果不好,如果图像仅仅是一片黑,一片白,没有有效信息,则不好匹配;(对物体纹理的依赖)
  2. 假设了深度符合高斯分布,实际中他的距离会从0到无穷,这个时候逆深度是高斯中比较有效的,有更好的数值稳定性,现在比较通用,就是在推导中深度的倒数;
  3. 如果相机明显旋转时,下黑上白的图像块可能会下白上黑,导致相关性为负,永远不可能匹配到了,尽管还是同一个。
    • 解决:在匹配之前要做图像间的变换,根据两幅图像的相机位姿考虑进来,对图像做仿射变换后,再进行匹配。
  1. 稠密估计一般GPU
  2. 在边缘区域深度变化可能很大,给深度估计加正则化,使相邻的深度变化不会太大;
  3. 没有考虑外点(没有匹配的点)

总之太过于依赖环境纹理和光照,不可靠

2. RGB-D稠密地图

RGB-D的结构光和飞时原理,保证了深度数据对纹理的无关性。只要能反射光就能估计深度;

2.1 地图对比

  1. 点云地图 ,可以含有 x , y , z , r , g , b x,y,z,r,g,b x,y,z,r,g,b 信息,有相机位姿则点云加和就是全局点云。但是点云地图比较初级:不满足定位,基本满足导航和避障,可视化不符合人类习惯,是一类初级地图
    • 细节:去掉深度太大或者无效的点;统计滤波器去掉孤立点;体素滤波器:降采样节省空间;
  1. 但是:适合导航的占据网格地图(Occupancy Grid) 是从点云出发的,SFM中的泊松重建,或者Surfel通过基本点云地图构建了漂亮的可视化地图。(其他地图详见PCL库)。

2.1.1 八叉树地图

  1. 八叉树地图:导航常用,压缩性能较好,可随时更新。(对标点云的规模大,无法处理运动物体)
    图源视觉SLAM14讲
  • 八叉树地图如上:假设房间是1块立方体,上前右分别切一刀,这样做一次,就被分成8个,对应八叉树第一层,对分开的小方块再如此做,这样深度越深,可储存容量越大;
  • 节省空间:某个方块的所有子节点都被占据或者不占据时,这个节点便没必要展开,0表空白,1表占据,由于噪声,我们用概率来储存;
  • 具体的储存方法:给定一个初始值,比如0.1,如果不断观测到它被占据,就一直累加,反之一直减小;为了防止它超界,用对数即可。

当有一个深度 d d d 的像素出现:证明深度值对应的空间点观察到一个占据数据,且从光心到这个点的线段没有障碍。

一个八叉树地图如下:

在这里插入图片描述

3. 建图?定位?孰轻孰重

3.1 鬼影问题

前边为了使用,我们以定位为主题进行了建图,这样的建图有问题

  1. 地图的构建只能在关键帧层面,由于算力原因;

  2. 没有优化地图,只是拼接叠加,假如两帧出现同一个物体,这种叠加往往不够准确,会有两个重影—鬼影。

总而言之,地图构建的不够精确

3.2 三维重建

这里将重建准确地图作为主题,定位次之,基于GPU加速。且研究方向正在往大规模,大型动态场景的重建方向发展。

RGBD实时重建方法也很多,TSDF地图等等。

4. 总结

单目或双目可以构建;但是RGB-D容易点,更稳定,没有讨论拓扑地图,只讨论了度量地图。

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

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

相关文章

嵌入式:驱动开发 Day7

作业&#xff1a;基于GPIO子系统&#xff0c;编写LED的驱动程序和应用程序 驱动程序&#xff1a;myled.c #include <linux/init.h> #include <linux/module.h> #include <linux/cdev.h> #include <linux/fs.h> #include <linux/device.h> #inc…

Python入门-pack和unpack的用法

struct.calcsize(format) 返回与格式字符串format相对应的结构体的大小&#xff08;以及由 生成的字节对象的大小 &#xff09; 使用大端顺序打包和解包三种不同大小的整数&#xff1a; from struct import *pack(">bhl", 1, 2, 3)unpack(>bhl, b\x01\x00\x…

聚焦企业开放OpenAPI痛难点,华为云API Explorer助力伙伴构建API门户

当前&#xff0c;IT研发的主流架构已从单体架构向微服务架构转型&#xff0c;带动了产品迭代速度和项目交付速度不断加快&#xff0c;随着整个IT产业规模的不断扩大&#xff0c;API数量也随之呈爆发式增长。据不完全统计&#xff0c;目前业界有70%到90%的业务是通过开源代码和第…

数据可视化 -- ECharts 入门

文章目录 引言1. ECharts的基本使用1.1 ECharts的快速上手1.2 相关配置讲解 2. ECharts常用图表2.1 图表1 柱状图2.1.1 柱状图的实现步骤2.1.2 柱状图的常见效果2.1.3 柱状图特点2.1.4 通用配置 2.2 图表2 折线图2.2.1 折线图的实现步骤2.2.2 折线图的常见效果2.2.3 折线图的特…

Java的Socket通信的断网重连的正确写法

Java的Socket通信的断网重连的正确写法 Socket通信的断网重连介绍客户端与服务端源码演示截图本地演示服务器演示演示截图 总结 Socket通信的断网重连介绍 针对于已经建立通信的客户端与服务器&#xff0c;当客户端与服务器因为网络问题导致网络不通而断开连接了或者由于服务器…

ET数据无效值处理(仅代表个人观点)

1将无效值去除查看&#xff0c;查看有效值 有效值范围为1830~9472 2.计算有效范围最大值最小值 如果计算四分数据得将栅格属性表导出execl进行计算 2根据该片文章进行替换 如何处理MODIS蒸散数据(ET)中的填充值&#xff08;仅作参考&#xff09;_Z_W_H_的博客-CSDN博客

大数据学习1.1-Centos8虚拟机安装

1.创建新的虚拟机 2.选择稍后安装OS 3.选择Linux的CentOS8 4.选择安装路径 5.分配20g存储空间 6.自定义硬件 7.分配2g内存 8.分配2核处理器 9.选择镜像位置 10.开启虚拟机安装 推荐密码设置为root

TS开发环境搭建

一、安装Node.js 官网&#xff1a;Node.js (nodejs.org) 可以去看别的大佬安装Node.js的文章&#xff0c;因为大部分人都安装了Node环境&#xff0c;这里我就不做说明 二、使用npm全局安装typescript 在终端中输入如下命令&#xff1a; npm i -g typescript 安装完成会有如…

程序开发:在线报名线下活动小程序源码功能解析

针对线下活动在线报名场景的小程序&#xff0c;支持在线支付费用以及线下核销。 可以应多大多数的线下报名&#xff0c;线上报名客服表单可以定制订单&#xff0c;支持导出报名&#xff0c;支持审核&#xff0c;支持分享&#xff0c;支持分销拓客以及线下核销。 WEB小程序双端…

2023年日经225指数研究报告

第一章 指数概况 1.1 概述 日经225指数&#xff0c;又被称为日经平均股票价格或日经225平均指数&#xff0c;通常被称为日经或日经指数&#xff0c;是东京证券交易所的一个重要股价指数。该指数自1950年起由日本经济新闻&#xff08;The Nikkei&#xff09;日报计算&#xff…

Chrome浏览器崩溃“STATUS_INVALID_IMAGE_HASH”的解决方法

原文地址&#xff1a;Chrome浏览器崩溃"STATUS_INVALID_IMAGE_HASH"的解决方法 | JUNES BLOG | 六月博客 今天无意间&#xff0c;发现Chrome浏览器多了个“ 由贵单位管理 ”的提示&#xff0c;出于安全的考虑&#xff0c;想立马把它搞掉&#xff0c;百度了一堆方法&a…

【编程实践】在VS studio中配置Eigen库

1 介绍 Eigen库是C标准模板库&#xff0c;能够进行向量运算、矩阵运算、矢量运算、数值分析等操作&#xff0c;并且包含相应的运算算法。 Eigen官方地址: 地址 可在官网下载指定版本的压缩包&#xff0c;将压缩包解压至后面配置的“附件包含目录”中。 2 配置 2.1 VS studi…

基于SSM的校园车辆管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

如何借助上线初期运维管理守住项目建设最后一公里

随着运营商技术升级、业务发展&#xff0c;以及服务能力要求提升&#xff0c;当下新建项目的交付或系统大版本升级大多数都需要历经千辛万苦才达到上线的彼岸。然而&#xff0c;项目上线并不意味着项目结束&#xff0c;“上线”也并不意味着终点&#xff0c;而是一个新的管理模…

Linux服务器初始化、yum安装java、redis、mysql

目录 前言 一、yum安装java二、yum安装redis三、yum安装mysql 前言 本文使用yum命令安装部署可能会用到的相关应用 安装软件包之前&#xff0c;我们需要先更新系统&#xff0c;以确保安装的软件包是最新的版本。执行以下命令&#xff1a; sudo yum update一、yum安装java 1、…

【阿里国际笔试】编程13

1.小红拿到了一个01串&#xff0c;她有以下两种操作: 1.选择一个字符取反&#xff0c;代价为x。 2.选择两个相邻的字符同时取反&#xff0c;代价为y。 小红想知道&#xff0c;自己将字符串变成全0”的最小代价是多少? 字符取反&#xff0c;指的是1变成0’"0变成1 样例 3 …

更新GitLab上的项目

更新GitLab上的项目 如有需要&#xff0c;请参考这篇&#xff1a;上传项目到gitlab上 1.打开终端&#xff0c;进入到本地项目的根目录。 2.如果你还没有将远程GitLab仓库添加到本地项目&#xff0c;你可以使用以下命令&#xff1a; 比如&#xff1a; git remote add origin …

响应式网页设计(Responsive Web Design)的核心原理

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 响应式网页设计的核心原理⭐ 优点和缺点优点缺点 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚…

JUC第三讲:Java 并发-线程基础

JUC第三讲&#xff1a;Java 并发-线程基础 本文是JUC第三讲&#xff0c;主要概要性的介绍线程的基础&#xff0c;为后面的章节深入介绍Java并发的知识提供基础。 文章目录 JUC第三讲&#xff1a;Java 并发-线程基础1、带着BAT大厂的面试问题去理解2、线程状态转换2.1、新建(New…

Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册

Unity 开发人员的城堡游戏引擎概述 一、简介2. Unity相当于什么GameObject&#xff1f;3. 如何设计一个由多种资产、生物等组成的关卡&#xff1f;4. 在哪里放置特定角色的代码&#xff08;例如生物、物品&#xff09;&#xff1f;Unity 中“向 GameObject 添加 MonoBehaviour”…