《视觉SLAM十四讲》-- 建图

news2024/9/21 4:21:12

11 建图

11.1 概述

(1)地图的几类用处:

  • 定位:
  • 导航:机器人在地图中进行路径规划;
  • 避障
  • 重建
  • 交互:人与地图之间的互动

(2)几类地图

  • 稀疏地图
  • 稠密地图
  • 语义地图

在这里插入图片描述

11.2 单目稠密重建

11.2.1 立体视觉

(1)稠密重建中,我们需要知道每个像素(或大部分像素)的距离,对此有以下几种方案:

  • 使用单目相机,估计相机运动,并且三角化计算像素的距离;
  • 使用双目相机,利用左右目的视差计算像素的距离;
  • 使用 RGB-D 相机直接获取像素距离。

前两种方式称为立体视觉,在 RGB-D 相机无法很好应用的室外、大型场景中,仍有较好的表现。

11.2.2 极线搜索与块匹配

对于一个单目相机,假设我们观察测到了某个像素 p 1 p_1 p1,显然,还是无法确定它的深度信息,但这个像素对应的空间点应该分布在某条射线上。从另一个视角,这条线的投影也形成了图像平面上的一条线,称为 极线。当知道两个相机之间的运动时,这条极线也是可以确定的。但问题是,极线上的哪个点才是 p 1 p_1 p1 对应的点呢?

在这里插入图片描述

p 1 p_1 p1 周围取 w × w w \times w w×w 大小的像素块,在极线上也取相同大小的块,依次进行比较,直至找到 p 2 p_2 p2,这就是所谓的 块匹配。当然这种方法的前提是 图像块灰度不变性,相较于像素灰度不变性,假设更强了。

p 1 p_1 p1 周围的像素块记为 A ∈ R w × w \boldsymbol{A} \in \mathbb{R}^{w \times w} ARw×w,把极线上的 n n n 个小块记为 B i , i = 1 , 2 , . . . , n \boldsymbol{B}_i,i=1,2,...,n Bii=1,2,...,n,计算二者之间的差异:

  • SAD(Sum of Absolute Difference),两个小块的差的绝对值之和:

S ( A , B ) S A D = ∑ i , j ∣ A ( i , j ) − B ( i , j ) ∣ (11-1) S(\boldsymbol{A},\boldsymbol{B})_{\mathrm{SAD}}=\sum_{i,j}|\boldsymbol{A}(i,j)-\boldsymbol{B}(i,j)| \tag{11-1} S(A,B)SAD=i,jA(i,j)B(i,j)(11-1)

  • SSD(Sum of Squared Distance),即平方和:

S ( A , B ) S S D = ∑ i , j ( A ( i , j ) − B ( i , j ) ) 2 (11-2) S(\boldsymbol{A},\boldsymbol{B})_{\mathrm{SSD}}=\sum_{i,j}(\boldsymbol{A}(i,j)-\boldsymbol{B}(i,j))^2 \tag{11-2} S(A,B)SSD=i,j(A(i,j)B(i,j))2(11-2)

  • NCC(Normalized Cross Correlation),归一化互相关,计算两个小块的相关性:

S ( A , B ) N C C = ∑ i , j A ( i , j ) B ( i , j ) ∑ i , j A ( i , j ) 2 ∑ i , j B ( i , j ) 2 (11-3) S(\boldsymbol{A}, \boldsymbol{B})_{\mathrm{NCC}}=\frac{\sum_{i, j} \boldsymbol{A}(i, j) \boldsymbol{B}(i, j)}{\sqrt{\sum_{i, j} \boldsymbol{A}(i, j)^{2} \sum_{i, j} \boldsymbol{B}(i, j)^{2}}} \tag{11-3} S(A,B)NCC=i,jA(i,j)2i,jB(i,j)2 i,jA(i,j)B(i,j)(11-3)

相关性越接近于 0 表示越不相似,接近 1 表示相似。

现在,我们在极线上计算了 A \boldsymbol{A} A 与每一个 B i \boldsymbol{B}_i Bi 的相似性度量。这里假设使用 NCC 进行度量,那么,将得到一个沿极线的 NCC分布。我们将使用概率分布描述深度值,而非某个单一数值。于是,问题转化为在不断对不同图像进行极线搜索时,我们估计的深度分布将发生怎样的变化———这就是所谓的 深度滤波器

在这里插入图片描述

11.2.3 高斯分布的深度滤波器

像素点深度的估计,也是一个状态估计问题,于是有滤波器和非线性优化两种方式。但由于 SLAM 实时性要求和算力的限制,一般在建图时采用计算量较小的滤波器进行优化。

假设深度 d d d 符合 高斯分布(也可能是其他分布):

P ( d ) = N ( μ , σ 2 ) (11-4) P(d)=N(\mu, \sigma^2) \tag{11-4} P(d)=N(μ,σ2)(11-4)

每当新的数据到来,我们都会观测它的深度,假设它也符合高斯分布:

P ( d o b s ) = N ( μ o b s , σ o b s 2 ) (11-5) P(d_{\mathrm{obs}})=N(\mu_{\mathrm{obs}}, \sigma_{\mathrm{obs}}^2) \tag{11-5} P(dobs)=N(μobs,σobs2)(11-5)

根据观测到的数据更新原先 d d d 的分布,也就是两个分布相乘,得到融合后的分布 N ( μ f u s e , σ f u s e 2 ) N(\mu_{\mathrm{fuse}}, \sigma_{\mathrm{fuse}}^2) N(μfuse,σfuse2),即

μ fuse  = σ o b s 2 μ + σ 2 μ o b s σ 2 + σ o b s 2 , σ fuse  2 = σ 2 σ o b s 2 σ 2 + σ o b s 2 (11-6) \mu_{\text {fuse }}=\frac{\sigma_{\mathrm{obs}}^{2} \mu+\sigma^{2} \mu_{\mathrm{obs}}}{\sigma^{2}+\sigma_{\mathrm{obs}}^{2}}, \quad \sigma_{\text {fuse }}^{2}=\frac{\sigma^{2} \sigma_{\mathrm{obs}}^{2}}{\sigma^{2}+\sigma_{\mathrm{obs}}^{2}} \tag{11-6} μfuse =σ2+σobs2σobs2μ+σ2μobs,σfuse 2=σ2+σobs2σ2σobs2(11-6)

现在关键在于计算 μ o b s \mu_{\mathrm{obs}} μobs σ o b s 2 \sigma_{\mathrm{obs}}^2 σobs2。假设我们找到了 p 1 \boldsymbol{p}_1 p1 对应的点 p 2 \boldsymbol{p}_2 p2,从而观测到了 p 1 \boldsymbol{p}_1 p1 的深度,认为 p 1 \boldsymbol{p}_1 p1 对应的三维点为 P \boldsymbol{P} P。记 O 1 P \boldsymbol{O_1P} O1P p \boldsymbol{p} p O 1 O 2 \boldsymbol{O_1 O_2} O1O2 为相机平移 t \boldsymbol{t} t O 2 P \boldsymbol{O_2P} O2P a \boldsymbol{a} a,两个夹角分别为 α \alpha α β \beta β。现在考虑极线 l 2 l_2 l2 上存在一个像素大小的误差,使点 p 2 \boldsymbol{p}_2 p2 变为 p 2 ′ \boldsymbol{p}_2' p2,使 β \beta β 角变为 β ′ \beta ' β。我们要考虑的是,这个像素误差会导致距离 p \boldsymbol{p} p p ′ \boldsymbol{p'} p 产生多大差距。

在这里插入图片描述

根据几何关系,

a = p − t \boldsymbol{a}=\boldsymbol{p}-\boldsymbol{t} a=pt

α = arccos ⁡ ⟨ p , t ⟩ \alpha=\arccos \langle\boldsymbol{p}, \boldsymbol{t}\rangle α=arccosp,t

β = arccos ⁡ ⟨ a , − t ⟩ (11-7) \beta=\arccos \langle\boldsymbol{a}, \boldsymbol{-t}\rangle \tag{11-7} β=arccosa,t(11-7)

p 2 \boldsymbol{p}_2 p2 扰动一个像素,使 β \beta β 变为 β ′ \beta ' β,根据几何关系

β ′ = arccos ⁡ ⟨ O 2 p 2 ′ , − t ⟩ \beta'=\arccos \langle\boldsymbol{O_2p_2'}, \boldsymbol{-t}\rangle β=arccosO2p2,t

γ = π − α − β ′ (11-8) \gamma=\pi-\alpha-\beta' \tag{11-8} γ=παβ(11-8)

由正弦定理

∥ p ′ ∥ = ∥ t ∥ sin ⁡ β ′ sin ⁡ γ (11-9) \|\boldsymbol{p'}\|=\|\boldsymbol{t}\| \frac{\sin\beta'}{\sin \gamma} \tag{11-9} p=tsinγsinβ(11-9)

这样,我们就确定了由单个像素的不确定引起的深度不确定性,如果认为极线搜索的块匹配仅有一个像素的误差,那么可以设

σ o b s = ∥ p ∥ − ∥ p ′ ∥ (11-10) \sigma_{\mathrm{obs}}=\|\boldsymbol{p}\|-\|\boldsymbol{p'}\| \tag{11-10} σobs=pp(11-10)

当极线搜索的不确定性大于一个像素时,可按此推导放大这个不确定性。当不确定性小于某个阈值时,就可认为深度数据收敛。

因此,估计稠密深度的完整过程为:

① 假设所有的像素深度都满足某个初始的高斯分布;
② 当新数据产生时,通过极线搜索和块匹配确定投影点的位置;
③ 根据几何关系计算三角化后的深度及不确定性;
④ 将当前观测融合进上一次估计中,若收敛则停止,否则返回第二步。

需要注意的是,这里的深度是指 O 1 P O_1P O1P 的长度,而针孔相机的深度是指像素的 z z z 值。

11.3 实践:单目稠密重建

11.4 RGB-D 稠密建图

(1)点云:直接由 RGB-D 图像生成,不需要额外处理。

(2)网格/面片

(3)八叉树地图

(4)TSDF

11.4.1 八叉树地图

点云有几个明显的缺点:一是规模太大,有很多无效信息,占据大量空间;二是无法处理运动的物体。因此提出了一种灵活的、可压缩的、能随时更新的地图形式:八叉树地图(Octo-tree)。

在这里插入图片描述

左图显示了一个大立方体不断被均分成八块,直到变为最小的块为止。于是,可以将整个大方块看做根节点,最小的块看做叶子结点,当由下一层节点往上走一层时,地图体积就扩大八倍。当某个方块的所有子节点都被占据或都不被占据时,就没必要展开这个节点,例如地图开始为空白,就只需要一个根节点,而不需要完整的树,所以说八叉树比点云更节省空间。

用概率的形式来表达节点是否被占据,比如初始值为 0.5,如果不断观测到它被占据,则值不断增大;如果不断观测到它是空白,则不断减小。当然,如果这个值不断增大或减小,就可能超出 [ 0 , 1 ] [0,1] [0,1] 之外,因此,我们采用 概率对数值 来描述。设 y ∈ R y\in \mathbb{R} yR 为概率对数值, x x x 为 0~1 的概率,定义

y = l o g i t ( x ) = log ⁡ ( x 1 − x ) (11-11) y=\mathrm{logit}(x)=\log(\frac{x}{1-x}) \tag{11-11} y=logit(x)=log(1xx)(11-11)

其反变换为:

x = l o g i t − 1 ( y ) = exp ⁡ ( y ) exp ⁡ ( y ) + 1 (11-12) x=\mathrm{logit}^{-1}(y)=\frac{\exp(y)}{\exp(y)+1} \tag{11-12} x=logit1(y)=exp(y)+1exp(y)(11-12)

可以看出,当 y y y − ∞ -\infty + ∞ +\infty + 时, x x x 范围为 0~1,当 y y y 取 0 时, x x x 取 0.5。因此,不妨用 y y y 来表达节点是否被占据,再将其转换为概率 x x x 即可。假设某节点 n n n,观测数据为 z z z,那么从开始到 t t t 时刻该节点的概率对数值为 L ( n ∣ z 1 : t ) L(n|z_{1:t}) L(nz1:t) t + 1 t+1 t+1 时刻为

L ( n ∣ z 1 : t + 1 ) = L ( n ∣ z 1 : t − 1 ) + L ( n ∣ z t ) (11-13) L(n|z_{1:t+1})=L(n|z_{1:t-1})+L(n|z_{t}) \tag{11-13} L(nz1:t+1)=L(nz1:t1)+L(nzt)(11-13)

将其写成概率形式(也就是 x x x),

P ( n ∣ z 1 : T ) = [ 1 + 1 − P ( n ∣ z T ) P ( n ∣ z T ) 1 − P ( n ∣ z 1 : T − 1 ) P ( n ∣ z 1 : T − 1 ) P ( n ) 1 − P ( n ) ] − 1 (11-14) P\left(n \mid z_{1: T}\right)=\left[1+\frac{1-P\left(n \mid z_{T}\right)}{P\left(n \mid z_{T}\right)} \frac{1-P\left(n \mid z_{1: T-1}\right)}{P\left(n \mid z_{1: T-1}\right)} \frac{P(n)}{1-P(n)}\right]^{-1} \tag{11-14} P(nz1:T)=[1+P(nzT)1P(nzT)P(nz1:T1)1P(nz1:T1)1P(n)P(n)]1(11-14)

有了对数概率,就可根据 RGB-D 数据更新八叉树地图。假设在 RGB-D 图像中某个像素带有深度 d d d,就说明:在深度值对应的空间点上观察到了一个占据数据,并且,从相机光心出发到这个点的线段上应该是没有物体的(否则被遮挡)

11.4.2 TSDF 地图和 Fusion 系列

实时三维重建

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

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

相关文章

java学习part06数组

62-数组-数组的概述_哔哩哔哩_bilibili 这篇 Java 基础,我吹不动了 - 掘金 (juejin.cn) 1.数组概念 重点 2.数组声明和初始化 new的时候要么给出静态初始化的数据{a,b,c},要么给出动态初始化指定长度 [4]。 否则报错,初始化必须确定长度…

Positive Technologies 利用 PT Cloud Application Firewall 保护中小型企业的网络资源

云产品按月订购,无需购买硬件资源 PT Cloud Application Firewall 是 Positive Technologies 推出的首个用于保护网络应用程序的商用云产品。Web 应用层防火墙 (web application firewall, WAF) 现在可以通过 技术合作伙伴——授权服务商和云提供商以订购方式提供1…

获取阿里云Docker镜像加速器

1、阿里云官网(www.aliyun.com)注册账号 2、打开“控制台首页” 控制台首页地址:https://home.console.aliyun.com/home/dashboard/ProductAndService 3、点击“概览->容器镜像服务 ACR” 4、打开“镜像工具->镜像加速器”页面&#x…

FPGA实现双向电平转换

网上搜了一圈,好像没看到的类似的中文资料,不过MicroSemi有个文档AC349上给出了完整的解决方案,还有参考代码。 话不多说,看图: 欲知详情的朋友,请参考 AC349

vue过渡,vue3组合式API详细介绍

7.过渡效果 vue提供了两个内置组件,可以帮助你制作基于状态变化的过渡和动画 Transition会在一个元素或组件进入和离开DOM时应用动画TransitionGroup会在一个v-for列表中的元素或组件被插入,移动,或移除时应用动画 7-1过渡效果 过渡模式 <Transition mode"out-in&q…

测试用例的设计方法(全):正交实验设计方法|功能图分析方法|场景设计方发

正交实验设计方法 一.方法简介 利用因果图来设计测试用例时, 作为输入条件的原因与输出结果之间的因果关系,有时很难从软件需求规格说明中得到。往往因果关系非常庞大,以至于据此因果图而得到的测试用例数目多的惊人&#xff0c;给软件测试带来沉重的负担&#xff0c;为了有效…

YOLO目标检测——无人机航拍输电线路绝缘瓷瓶数据集下载分享【对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;电力系统运维、状态监测与故障诊断、智能电网建设等领域数据集说明&#xff1a;无人机航拍输电线路绝缘瓷瓶数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量…

云计算赛项容器云2023搭建

部署容器云平台[5 分] 使 用 OpenStack 私 有 云 平 台 创 建 两 台 云 主 机 &#xff0c; 云 主 机 类 型 使 用 4vCPU/12G/100G 类型&#xff0c;分别作为 Kubernetes 集群的 Master 节点和 node 节点&#xff0c; 然后完成 Kubernetes 集群的部署&#xff0c;并完成 Istio …

Linux文件目录以及文件类型

文章目录 Home根目录 //bin/sbin/etc/root/lib/dev/proc/sys/tmp/boot/mnt/media/usr 文件类型 Home 当尝试使用gedit等编辑器保存文件时&#xff0c;系统默认通常会先打开个人用户的“家”&#xff08;home&#xff09;目录&#xff0c; 建议在通常情况下个人相关的内容也是保…

Unity中Shader法线贴图(下)理论篇

文章目录 前言一、采样出错的原因二、切线空间是什么&#xff1f;切线空间图解&#xff1a; 三、计算方式1、统一变换到切线空间下进行计算2、统一变换到世界空间下进行计算 四、一般统一变换到世界空间下的坐标进行计算1、求M^-1^2、求出n~w~ 前言 这篇文章&#xff0c;主要解…

使用 VPN ,一定要知道的几个真相!

你们好&#xff0c;我的网工朋友。 今天想和你聊聊VPN。在VPN出现之前&#xff0c;企业分支之间的数据传输只能依靠现有物理网络&#xff08;例如Internet&#xff09;。 但由于Internet中存在多种不安全因素&#xff0c;报文容易被网络中的黑客窃取或篡改&#xff0c;最终造…

whisper使用方法

看这个 github https://github.com/Purfview/whisper-standalone-win/tags下载 视频提取音频 ffmpeg -i 222.mp4 -vn -b:a 128k -c:a mp3 output.mp3截取4秒后的音频 ffmpeg -i output.mp3 -ss 4 -c copy output2.mp3使用 whisper-faster.exe 生成字幕 whisper-faster.exe …

网工内推 | 国企、港企网工,年底双薪,NA以上认证即可

01 中航期货有限公司 招聘岗位&#xff1a;信息技术部-网络工程师 职责描述&#xff1a; 1、负责总部、分支机构、外联单位网络的日常运维、故障和应急处置&#xff0c;特别是定期监测设备的运行状态&#xff0c;对存在隐患的地方及时发现改正&#xff0c;保持网络稳定通畅&am…

OSG文字-显示汉字 (1)

OSG文字 适当的文字信息对于显示场景信息是非常重要的。在 OSG中&#xff0c;osgText 提供了向场景中添加文字的强大功能&#xff0c;由于有第三方插件 FreeType 的支持&#xff0c;它完全支持TrueType字体。 读者可能对 FreeType和TrueType还不太了解&#xff0c;下面进行具体…

【C++ STL】string类-----迭代器(什么是迭代器?迭代器分哪几类?迭代器的接口如何使用?)

目录 一、前言 二、什么是迭代器 三、迭代器的分类与接口 &#x1f4a6;迭代器的分类 &#x1f4a6;迭代器的接口 &#x1f4a6;迭代器与接口之间的关联 四、string类中迭代器的应用 &#x1f4a6; 定义string类----迭代器 &#x1f4a6;string类中迭代器进行遍历 ✨be…

最强英文开源模型Llama2架构与技术细节探秘

prerequisite: 最强英文开源模型LLaMA架构探秘&#xff0c;从原理到源码 Llama2 Meta AI于2023年7月19日宣布开源LLaMA模型的二代版本Llama2&#xff0c;并在原来基础上允许免费用于研究和商用。 作为LLaMA的延续和升级&#xff0c;Llama2的训练数据扩充了40%&#xff0c;达到…

浅析ChatGPT中涉及到的几种技术点

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

C语言前瞻

文章目录 C语言基础简介编译方式分布编译示例流程一步编译 代码运行运行结果展示实际代码 C语言基础简介 关于C语言的书籍&#xff0c;文章有很多。C的历史我不赘述&#xff0c;只讲C语言的基础语法和使用&#xff0c;帮助大家入门&#xff0c;同时也是自己学习过程的一个回顾。…

Iceberg学习笔记(1)—— 基础知识

Iceberg是一个面向海量数据分析场景的开放表格式&#xff08;Table Format&#xff09;&#xff0c;其设计的目的是解决数据存储和计算引擎之间的适配的问题 表格式&#xff08;Table Format&#xff09;可以理解为元数据以及数据文件的一种组织方式&#xff0c;处于计算框架&…

开发者生态:共享知识,携手共进,共创技术辉煌

开发者生态&#xff1a;共享知识&#xff0c;携手共进&#xff0c;共创技术辉煌 在数字化时代&#xff0c;开发者是推动技术进步和创新的重要力量。他们创造着改变世界的软件和应用&#xff0c;推动着技术的边界不断向前。而在这个快速发展的时代&#xff0c;建立一个健康、活跃…