《视觉SLAM十四讲》-- 建图
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} A∈Rw×w,把极线上的 n n n 个小块记为 B i , i = 1 , 2 , . . . , n \boldsymbol{B}_i,i=1,2,...,n Bi,i=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,j∑∣A(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)2∑i,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=p−t
α = arccos ⟨ p , t ⟩ \alpha=\arccos \langle\boldsymbol{p}, \boldsymbol{t}\rangle α=arccos⟨p,t⟩
β = arccos ⟨ a , − t ⟩ (11-7) \beta=\arccos \langle\boldsymbol{a}, \boldsymbol{-t}\rangle \tag{11-7} β=arccos⟨a,−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 β′=arccos⟨O2p2′,−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′∥=∥t∥sinγsinβ′(11-9)
这样,我们就确定了由单个像素的不确定引起的深度不确定性,如果认为极线搜索的块匹配仅有一个像素的误差,那么可以设
σ o b s = ∥ p ∥ − ∥ p ′ ∥ (11-10) \sigma_{\mathrm{obs}}=\|\boldsymbol{p}\|-\|\boldsymbol{p'}\| \tag{11-10} σobs=∥p∥−∥p′∥(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} y∈R 为概率对数值, 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(1−xx)(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=logit−1(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(n∣z1: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(n∣z1:t+1)=L(n∣z1:t−1)+L(n∣zt)(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(n∣z1:T)=[1+P(n∣zT)1−P(n∣zT)P(n∣z1:T−1)1−P(n∣z1:T−1)1−P(n)P(n)]−1(11-14)
有了对数概率,就可根据 RGB-D 数据更新八叉树地图。假设在 RGB-D 图像中某个像素带有深度 d d d,就说明:在深度值对应的空间点上观察到了一个占据数据,并且,从相机光心出发到这个点的线段上应该是没有物体的(否则被遮挡)。
11.4.2 TSDF 地图和 Fusion 系列
实时三维重建
相关文章:

《视觉SLAM十四讲》-- 建图
11 建图 11.1 概述 (1)地图的几类用处: 定位:导航:机器人在地图中进行路径规划;避障重建交互:人与地图之间的互动 (2)几类地图 稀疏地图稠密地图语义地图 11.2 单目…...

智能配电箱柜管理系统
智能配电箱柜管理系统是一个综合性的管理系统,专门设计用于监控和控制智能配电箱和柜的运行。这个系统集成了先进的技术和智能化功能,以确保配电系统的正常运行并提高其效率。依托电易云-智慧电力物联网,以下是智能配电箱柜管理系统的主要特点…...

聊聊近些年 CPU 在微架构、IO 速率上的演进过程
大家好,我是飞哥! 在上一篇《深入了解 CPU 的型号、代际架构与微架构》 中我们介绍了我手头的一颗 Intel(R) Core(TM) i5 的型号规则,以及它的物理硬件的 Die 图结构。以及它对应的 Skylake 核的微架构实现。 不少同学开始问我其它型号的 CPU…...

PS学习笔记——移动工具
文章目录 介绍文档内移动文档间移动 介绍 移动工具:用于移动图层中的对象,并且同一图层中的所有对象都将一起移动 选中移动工具后,选项栏中会出现“显示变换控件”,勾选后即可看见图层中的对象周围出现边框,可以进行缩…...

信息中心网络提出的背景、研究现状及研究内容
信息中心网络什么时候提出的?未来发展前景?有什么著名实验室在做? 1、提出背景: 互联网产生于上世纪60年代: (1)网络设备数量呈指数性增长 截至2022年底全球范围内预计将有超过280亿台终端设…...

【计算机视觉】24-Object Detection
文章目录 24-Object Detection1. Introduction2. Methods2.1 Sliding Window2.2 R-CNN: Region-Based CNN2.3 Fast R-CNN2.4 Faster R-CNN: Learnable Region Proposals2.5 Results of objects detection 3. SummaryReference 24-Object Detection 1. Introduction Task Defin…...
【mac 解决eclipse意外退出】
打开eclipse时提示报错信息应用程序"Eclipse.app"无法打开(这里忘了截图就不上图了)。 点击 “好” 的按钮后会弹出发送报告的弹窗 终端输入:sudo codesign --force --deep --sign - /Applications/Eclipse.app/ 就可以解决了...
mysql innodb buffer pool缓冲池命中率和命中了哪些表?—— 筑梦之路
环境说明 mysql 5.7及以上 公式 # InnoDB缓冲区缓存的命中率计算公式100 * (1 - (innodb_buffer_pool_reads/innodb_buffer_pool_read_requests ))注意: 对于具有大型缓冲池的系统,既要关注该比率,也要关注OS页面读写速率的变化可以更好地跟踪差异。s…...

牛掰的dd命令,cpi0配合find备份(不会主动备份),od查看
dd if设备1或文件 of设备2或文件 blocknsize countn 还原就是把设备1,2调过来 这里想到dump的还原是命令restore,想起来就写一下,省的总忘记 可以针对整块磁盘进行复制,对于新创建的分区,也不用格式化,可以直接…...

pip list 和 conda list的区别
PS : 网上说conda activate了之后就可以随意pip了 可以conda和pip混用 但是安全起见还是尽量用pip 这样就算activate了,进入base虚拟环境了 conda与pip的区别 来源 Conda和pip通常被认为几乎完全相同。虽然这两个工具的某些功能重叠,但它们设计用于不…...

多目标应用:基于多目标灰狼优化算法MOGWO求解微电网多目标优化调度(MATLAB代码)
一、微网系统运行优化模型 微电网优化模型介绍: 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、多目标灰狼优化算法MOGWO 多目标灰狼优化算法MOGWO简介: 三、多目标灰狼优化算法MOGWO求解微电网多目标优化调度 (1)…...

LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
上一节实现了 LangChain 实现给动物取名字, 实际上每次给不同的动物取名字,还得修改源代码,这周就用模块化template来实现。 1. 添加promptTemplate from langchain.llms import OpenAI # 导入Langchain库中的OpenAI模块 from langchain.p…...
linux nas
挂载到本地 mkdir -p /mnt/mountnasdir mount -t nfs 192.168.62:/cnas_id10086_vol10010_dev/ /mnt/mountnasdir...

控制您的音乐、视频等媒体内容
跨多个 Chrome 标签页播放音乐或声音 在计算机上打开 Chrome 。在标签页中播放音乐、视频或其他任何有声内容。您可以停留在该标签页上,也可以转到别处。要控制声音,请在右上角点击“媒体控件”图标 。您可暂停播放、转到下一首歌曲/下一个视频…...

xlua源码分析(三)C#访问lua的映射
xlua源码分析(三)C#访问lua的映射 上一节我们主要分析了lua call C#的无wrap实现。同时我们在第一节里提到过,C#使用LuaTable类持有lua层的table,以及使用Action委托持有lua层的function。而在xlua的官方文档中,推荐使…...
2023 极术通讯-汽车“新四化”路上,需要一片安全山海
导读:极术社区推出极术通讯,引入行业媒体和技术社区、咨询机构优质内容,定期分享产业技术趋势与市场应用热点。 芯方向 【Armv9】-动态TrustZone技术的介绍 动态 TrustZone 是提供多租户安全媒体 pipeline 的绝佳工具。完全不受操作系统、虚…...
Spring Boot接口设计规范
接口参数处理及统一结果响应 1、接口参数处理 1、普通参数接收 这种参数接收方式是比较常见的,由于是GET请求方式,所以在传参时直接在路径后拼接参数和参数值即可。 例如:localhost:8080/api/product/list?key1value1&key2value2 /…...

美创科技与南京大数据安全技术有限公司达成战略合作
近日,美创科技与南京大数据安全技术有限公司正式签署战略合作协议,优势力量共享、共拓共创共赢。 美创科技CEO柳遵梁、副总裁罗亮亮、副总裁王利强,南京大数据安全技术有限公司总经理潘杰、市场总监刘莉莎、销售总监王皓月、技术总监薛松等出…...
2.4路由日志管理
2.4路由/日志管理 一、静态路由和动态路由 路由器在转发数据时,需要现在路由表中查找相应的路由,有三种途径 (1)直连路由:路由器自动添加和自己直连的路由 (2)静态路由:管理员手动…...

归并排序详解:递归实现+非递归实现(图文详解+代码)
文章目录 归并排序1.递归实现2.非递归实现3.海量数据的排序问题 归并排序 时间复杂度:O ( N * logzN ) 每一层都是N,有log2N层空间复杂度:O(N),每个区间都会申请内存,最后申请的数组大小和array大小相同稳定…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...