经典文献阅读之--PL-SLAM(点线SLAM)

news2024/11/24 22:06:14

0. 简介

之前作者基本都在围绕着特征点提取的路径在学习,最近看到了最近点云PCL推送的《Structure PLP-SLAM: Efficient Sparse Mapping and Localization using Point, Line and Plane for Monocular, RGB-D and Stereo Cameras》。这个工作是基于OpenVSLAM架构的,但是由于OpenVSLAM被认为侵权,所以作者想从PL-SLAM开始,学习一下点线面SLAM的相关原理以及知识。(因为是基于ORB-SLAM2的)

1. PL-SLAM 文章贡献

PL-SLAM是基于ORB-SLAM2框架和LSD(Line segment Detector)来做的SLAM,主要是结合点线特征,提高SLAM在环境中运行的可靠性。基本框架与ORB-SLAM2一致,但是在代码中并行地添加了点和线的特征。文中使用了LSD去提取线特征,官网上的开源代码,就直接拿来测试了一下:
在这里插入图片描述
提出了PL-SLAM,这是一种立体视觉SLAM系统,它结合了点和线段,能够在更广泛的场景中稳定地工作。PL-SLAM将点和线特征应用在slam全过程。通过线特征的长度和方向的比较,通过剔除异常值来解决特定于线段的跟踪和匹配问题,而对于残差计算,我们用线段的端点坐标表示地图中的线段。因此,通过图像平面上这些端点的投影与与被观测线段相关的无穷多条直线之间的距离来计算被观测线段与其在地图中的对应直线之间的残差。这两种特征也被用于在相机导航期间鲁棒地检测循环闭合,这是一种**新的单词包(BoW)**方法,它结合了使用它们执行位置识别的优点。所以综上来说本文的主要贡献点主要有三点:
1)第一个实时开源的同时使用点和线分割特征深度SLAM系统,并且在弱纹理环境中传统点特征方法失效的情况下拥有较高的运行鲁棒性。
2)一种新的同时处理点和线特征调整关键字位姿。
3)一种扩展BoW方法同时考虑点和线特征分割提高闭环检测

2. 具体算法

图中的算法为PL-SLAM框架的整个示意图。该文提出的PL-SLAM是在ORB-SLAM的框架基础之上,添加了一些与线特征有关的模块,从而构建了一套单目SLAM系统。整个系统的框架如下图所示:

可以看得出来,就是比ORB-SLAM多了线特征的流程,所以,接下来,主要把篇幅放在如何将线特征整合进来:
在这里插入图片描述
在PL-SLAM中,和线特征相关的处理包括了:

  • 检测:使用LSD的方法,时间复杂度是 O ( n ) O(n) O(n) n n n为图片中像素的个数
  • 三角化
  • 匹配:使用了以Line Band Descriptors为基础的方法,通过一个关系图(relational graph)当前的线会和已经在地图中的线进行配对。在获得了初始的map-to-image的线特征对集合后,所有在局部地图中的线都被投影到图像上,进一步寻找匹配对,然后,如果这个图片有足够多的新环境信息,他就会被标记为关键帧,它对应的线会被三角化并添加进地图。
  • 线的剔除:从少于三个视点或少于 25% 的帧中看到的线会被丢弃(剔除)。
  • 优化:线在地图中的位置使用局部BA进行优化。
  • 重定位: 注意,因为对整个地图进行线的匹配的计算量非常大,所以回环检测中只使用点特征

2.1 基于线的重投影误差

这部分基本都是原文的翻译,所以本文主要参考的文章就是论文笔记-PL-SLAM进行学习,并在基础上加入了自己的理解。根据参考文献[30], P , Q P,Q P,Q 是一条线段的两个端点, p d , q d ∈ R 2 p_d, q_d \in \mathbb R^2 pd,qdR2是这两端点在图像平面的2D检测结果, p d h , q d h ∈ R 3 p_d^h, q_d^h \in \mathbb R^3 pdh,qdhR3是对应的齐次坐标,这算是 p d , q d ∈ R 2 p_d, q_d \in \mathbb R^2 pd,qdR2的逆投影到空间中。从齐次坐标,可以得到一个归一化的线系数:
I = p d h × q d h ∣ p d h × q d h ∣     ( 1 ) I= \frac{\textbf{p}_d^h \times \textbf{q}_d^h}{\vert \textbf{p}_d^h \times \textbf{q}_d^h \vert} \space \space \space (1) I=pdh×qdhpdh×qdh   (1)
有了这个系数,下面再来看线的重投影误差,它是点到线距离之和,这里点是指的两端点投影后的结果,线是指的在图像中检测到的线段。具体可以看下面这张图:在这里插入图片描述对于左图:
P , Q P,Q P,Q是三维空间中某一条线段的端点(绿色点),而在图像中也有对应的两个绿点,这个就是由真实的 P , Q P,Q P,Q投影过来的。而在图像中,本身就存在两个拍摄下来的端点 p d , q d ∈ R 2 p_d, q_d \in \mathbb R^2 pd,qdR2(对应于 P , Q P,Q P,Q的观测值),观测值对应三维空间的端点 P d , Q d ∈ R 3 P_d, Q_d \in \mathbb R^3 Pd,QdR3. I I I是检测到的线系数,而 I ~ \widetilde{I} I 则是指的投影的线系数,对应的公式在上方。
对于右图:
图中表示了检测到的线段和投影的线段在平面上的关系,如果存在夹角,则 d 1 , d 2 d_1, d_2 d1,d2​就是我们要的线重投影误差,而 d 1 ′ , d 2 ′ d_1^{'}, d_2^{'} d1,d2是检测到的线重投影误差(检测到的2D线段(蓝色)和对应的投影的3D线段(绿色)之间的误差)。

线重投影误差的公式就为:
E l i n e ( P , Q , I , θ , K ) = E p l 2 ( P , I , θ , K ) + E p l 2 ( Q , I , θ , K )     ( 2 ) E_{line}(P,Q,I,θ,K)=E^2_{pl}(P,I,θ,K)+E^2_{pl}(Q,I,θ,K) \space \space \space(2) Eline(P,Q,I,θ,K)=Epl2(P,I,θ,K)+Epl2(Q,I,θ,K)   (2)

E p l ( P , I , θ , K ) = I T π ( P , θ , K )     ( 3 ) E_{pl}(P,I,θ,K)=I^T \pi(P,θ,K) \space \space \space(3) Epl(P,I,θ,K)=ITπ(P,θ,K)   (3)
I I I是检测到的线系数, π ( P , θ , K ) \pi(P,θ,K) π(P,θ,K)是端点P在图像上的投影,K是内参矩阵,相机参数 θ = { R , t } \theta = \{R,t\} θ={R,t}

注意!在实际中,由于线的遮挡和误检测,图像中检测到的线段端点 p d , q d p_d, q_d pd,qd往往不能和 P , Q P,Q P,Q匹配,所以这里才又定义了个检测到的线投影误差。
检测到的线重投影误差的公式就为:
E l i n e , d ( p d , q d , I ) = E p l , d 2 ( p d , I ) + E p l , d 2 ( q d , I )     ( 4 ) E_{line,d}(p_d, q_d,I)=E^2_{pl,d}(p_d,I)+E^2_{pl,d}(q_d, I) \space \space \space(4) Eline,d(pd,qd,I)=Epl,d2(pd,I)+Epl,d2(qd,I)   (4)

E p l , d ( p d , I ) = I T p d E_{pl,d}(p_d,I)=I^T p_d Epl,d(pd,I)=ITpd
对于“检测到的线重投影误差”会有递归操作,一边优化相机位姿,一边把 E l i n e , d E_{line,d} Eline,d近似到到方程(2)中定义的 E l i n e E_{line} Eline

2.2 使用点和线的BA

相机位姿参数 θ = R , t θ={R,t} θ=R,t在每一帧都用BA进行优化, θ θ θ约束在SE(3)李群中。
下面就是对BA要优化的cost function的定义(包括点和线两种特征):
X j ∈ R 3 X_j \in \mathbb R^3 XjR3是地图中的第 j j j个点,对于第 i i i个关键帧,这个点可以被投影到图像平面上,这部分内容是由公式(3)和公示(4)转变过来,从而得到 x ~ i , j \widetilde{x}_{i,j} x i,j的等式:

x ~ i , j = π ( X j , θ i , K )     ( 5 ) \widetilde{x}_{i,j} = \pi (X_j, \theta_i, K) \space \space \space(5) x i,j=π(Xj,θi,K)   (5)

θ i \theta_i θi就是第 i i i个关键帧的位姿。又知道这个点的观测量 x i , j x_{i,j} xi,j,那么3D误差就为:

e i , j = x i , j − x ~ i , j     ( 6 ) e_{i,j} = x_{i,j} - \widetilde{x}_{i,j} \space \space \space(6) ei,j=xi,jx i,j   (6)

类似的, P j , Q j P_j, Q_j Pj,Qj表示地图上第j个线特征的端点。对应的投影到相同的关键帧上的图像投影点(表示为齐次坐标,这里的 h h h表示齐次坐标)可以写为:

p ~ i , j h = π ( P j , θ i , K )     ( 7 ) q ~ i , j h = π ( Q j , θ i , K )     ( 8 ) \widetilde{p}^h_{i,j} = \pi (P_j, \theta_i, K) \space \space \space(7) \\ \widetilde{q}^h_{i,j} = \pi (Q_j, \theta_i, K) \space \space \space(8) p i,jh=π(Pj,θi,K)   (7)q i,jh=π(Qj,θi,K)   (8)

已知在图像上的第 j j j条线段两个端点的观测值 p i , j p_{i,j} pi,j q i , j q_{i,j} qi,j,可以使用公式(1)来估计观测到的线系数 I ~ i , j \widetilde{I}_{i,j} I i,j​。所以,定义线的误差向量为(点到线的误差), 其中 K − 1 K^{-1} K1代表了二维点通过内参计算出三维点的反向投影形式。然后计算三维点层面上误差距离。

e i , j ′ = ( I ~ i , j ) T ( K − 1 p i , j h )     ( 9 ) e i , j ′ ′ = ( I ~ i , j ) T ( K − 1 q i , j h )     ( 10 ) e_{i,j}^{'} = (\widetilde{I}_{i,j})^T(K^{-1}p_{i,j}^h) \space \space \space(9)\\ e_{i,j}^{''} = (\widetilde{I}_{i,j})^T(K^{-1}q_{i,j}^h) \space \space \space(10) ei,j=(I i,j)T(K1pi,jh)   (9)ei,j=(I i,j)T(K1qi,jh)   (10)

误差(9)(10)实际上是点到线的距离误差(3)。按照文献[30]中解释的,这个误差值在端点 P j , Q j P_j, Q_j Pj,Qj沿着3D线发生偏移的时候也会发生变化,作为隐式正则化,允许我们在 BA 中使用这种非最小线参数化。

然后,就把两种误差统一到一个cost function中:

C = ∑ i , j ρ ( e i , j T Ω i , j − 1 e i . j + e i , j ′ T Ω i , j ′ − 1 e i , j ′ + e i , j ′ ′ T Ω i , j ′ ′ − 1 e i , j ′ ′ ) C = \sum_{i,j} \rho (e_{i,j}^T \Omega_{i,j}^{-1}e_{i.j} +{e_{i,j}^{'}}^{T}{\Omega_{i,j}^{'}}^{-1}e_{i,j}^{'} + {e_{i,j}^{''}}^{T}{\Omega_{i,j}^{''}}^{-1}e_{i,j}^{''} ) C=i,jρ(ei,jTΩi,j1ei.j+ei,jTΩi,j1ei,j+ei,jTΩi,j1ei,j)

这里的 ρ \rho ρ是Huber核函数,三个 Ω \Omega Ω是分别与检测到关键点和线端点的尺度相关的协方差矩阵。

2.3.全局重定位

当相机的追踪失效时,就要进行重定位,一种典型的解决方式就是PnP算法,它可以利用匹配好的之前关键帧的3D地图点来估计当前帧(lost)的位姿。在PnP之上,还用RANSAC来去除外点匹配。

ORB-SLAM中使用的是EPnP,但它只能使用点来作为输入;所以为了解决线特征的重定位,使用了EPnPL,它可以最小化“检测到的线重投影误差”,即公式(4)。

EPnPL的优点: 对线遮挡和误检测的情况有鲁棒性
为什么EPnPL鲁棒呢,具体是怎么做的呢?
因为这个方法分为两个步骤
1)先最小化检测到的线重投影误差,并估计线的端点 p d , q d p_d, q_d pd,qd
2)再沿着线移动观测到的端点,以便于能匹配到三维空间端点P,Q的投影 p ~ d , q ~ d \widetilde{p}_d, \widetilde{q}_d p d,q d​.只要这些匹配建立了,相机的位姿就可以被可靠的估计出来。

3. 线特征初始化地图

…详情请参照古月居

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

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

相关文章

测评 | 基于AM5708开发板——AM5708 SOC使用uboot更新uboot

本次测评板卡是创龙科技旗下的TL570x-EVM,它是一款基于TI Sitara系列AM5708ARM Cortex-A15+浮点DSPC66x处理器设计的异构多核SOC评估板,由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。 评估板接口资源丰富,引出…

学苑教育杂志学苑教育杂志社学苑教育编辑部2022年第32期目录

前沿 学苑简讯《学苑教育》投稿:cn7kantougao163.com 4-6 专题研究 把握有效生成 焕发课堂魅力——小学语文课堂有效动态生成策略探析 任云青; 7-811 教育管理 新课程理念下高中契约式班级管理研究 孙磊; 9-11 小学班级管理中文明礼仪教育实施策略的…

Ubuntu 20.04 上学习Open vSwitch :VxLAN

参考 OpenvSwitch完全使用手册 云计算底层技术-使用openvswitch Open vSwitch 概述;OVS支持的功能;ovs的模块介绍(ovs-vswitchd、ovsdb-server等等 学习环境 学习 OpenStack 2 个 Hyper-V 虚拟机 Ubuntu 20.04 203.0.113.101 /24 ( 网关&a…

Git——入门介绍

目录1.Git概述1.1.版本控制1.2.版本控制工具1.2.1集中式版本控制工具1.2.2分布式版本控制工具1.3.Git 工作机制1.4.Git 和代码托管中心2.Git下载安装2.1.Git下载2.2.Git安装3.Git常用命令3.1.设置用户签名3.2.初始化本地库3.3.查看本地库状态3.4.添加暂存区3.5.提交本地库3.6.修…

6、python的高级特性(生成式、生成器、闭包、装饰器)

文章目录生成式列表生成式字典生成式集合生成式生成器生成器的实现方式将生成式改写成生成器。将[ ] 改成 ( )使用yield关键字闭包装饰器生成式 列表生成式 在“先有一个空列表,然后通过循环依次将元素添加到列表中”的场景,可以使用列表生成式。 列表…

核心解读 - 2022版智慧城市数字孪生标准化白皮书

核心解读 - 2022版智慧城市数字孪生标准化白皮书前言:城市数字孪生基本概念一、城市数字孪生概述1、城市数字孪生内涵及概念模型2、城市数字孪生典型特征3、城市数字孪生相关方4、城市数字孪生技术参考架构5、城市数字孪生关键技术二、智慧城市数字孪生发展现状1、政…

JMeter下载及安装配置教程

参考:入门部署教程 – Jmeter中文网 本文是在win10环境下安装使用jmeter,jmeter可以运行在多平台上Windows和Linux。 环境准备: java 8 jmeter 5.1.1 jmeter环境 jmeter环境依赖JAVA环境,需安装JDK1.8环境,JDK下载地…

基于若依springboot二次开发WMS带移动端管理系统vue源码

系统是前后端分离的架构,前端使用Vue2,后端使用SpringBoot2。搭建部署的方式也是挺简单的,还带有uniapp开发的多端移动端扫码入库功能 技术架构 技术框架:SpringBoot2.0.0 Mybatis1.3.2 Shiro swagger-ui jpa lombok Vue2 …

轻薄笔记本能不能带起来高刷的显示器??

先说结论,新款集显也可以,用TYPC或者DP线连,使用时关闭主屏,只显示外屏。 这个问题,已经困扰了很久~~~ 软件上,windows以主屏作为主刷新率,除非笔记本自身是高刷屏,否则请只使用外…

单应性矩阵在标定中的应用

1.单应性矩阵是什么? 言简意赅定义:定义在两个不同视角中对同一平面范围内的特征点的射影变换(projective transformation)即: x1 H*x2 //x1、x2为匹配点 上图中x,x‘为一对匹配点,通过单应矩…

Pytest自动化框架运行全局配置文件pytest.ini

前言 还记得在之前的篇章中有讲到Pytest是目前主要流行的自动化框架之一,他有基础的脚本编码规则以及两种运行方式。 pytest的基础编码规则是可以进行修改,这就是今日文章重点。 看到这大家心中是否提出了两个问题:pytest的基础编码规则在…

Array_JavaScript

Array 学习路线:JavaScript基础语法(输出语句)->JavaScript基础语法(变量)->JavaScript基础语法(数据类型)->JavaScript基础语法(运算符)->JavaScript基础语…

python数据容器——列表

目录 一.数据容器 二.数据容器——列表 基本语法 注意 三.列表的下标(索引) 嵌套列表的下标(索引) 四.列表的常用操作(方法) 1.查询元素下标 2.插入元素 3.删除元素 4.统计元素 说明 一.数据容器 1&a…

使用react-sizeme解决react-grid-layout中侧栏(抽屉)展开或隐藏时不会自适应容器大小的问题

文章目录使用react-sizeme解决react-grid-layout中侧栏(抽屉)展开或隐藏时不会自适应容器大小的问题前提概要问题代码解决代码参考使用react-sizeme解决react-grid-layout中侧栏(抽屉)展开或隐藏时不会自适应容器大小的问题 前提概要 在上一篇博文中,我们讲到了使…

postgres源码解析38 表创建执行全流程梳理--2

本小节主要讲解查询执行模块,有机地调用存储、索引、事务、并发等模块,按照执行计划中的计划节点(操作执行接口)完成数据的读取或者修改。知识回顾:postgres源码解析37 表创建执行全流程梳理–1 关键数据结构 总图&a…

八、【React-Router5】路由组件传参

文章目录1、实现效果2、向路由组件传递参数总览3、修改上一节代码3.1、项目结构变更如下3.2、CODE(params传参)3.2.1、Messages.jsx3.2.2、Detail.jsx3.2.3、Result3.3、CODE(search传参)3.3.1、Messages.jsx3.3.2、Detail.jsx3.3…

【强化学习论文】小样本策略泛化的提示决策转换器

文献题目:Prompting Decision Transformer for Few-Shot Policy Generalization 摘要 人类可以利用先前的经验并从少量演示中学习新任务。与旨在通过更好的算法设计实现快速适应的离线元强化学习相比,我们研究了架构归纳偏差对少样本学习能力的影响。我…

RationalDMIS2022车削件(轴类)测量:回转体检测

1.坐标系知识 在三坐标测量机的使用中,坐标系的建立是最为关键的一步,是工件测量的基本依据。设备在组装本身中有着XYZ三个互相垂直的坐标轴,因此坐标系的建立便是通过以工件上的特征作为依据建立XYZ三个互相垂直的坐标轴与设备的坐标轴进行对应,从而使程序得以运行。 物…

虚拟机安装

虚拟机安装 能看到这里说明你的电脑中已经安装的有虚拟机了,如果没有虚拟机可以先下载安装一些虚拟机。 有了虚拟机后首先要准备的就是镜像,我用的是CentOS-7。如果没有的也可以百度或者去阿里云下载即可。 选择下载以ISO结尾的文件,可选类型…

SLAM学习笔记(二)

5.相机与图像 相机将三维世界中的坐标点(单位米)映射到二维图像平面(单位为像素)的过程中能够用一个几何模型进行描述。 单目相机(Mono)的成像过程: 1、世界坐标系下有个固定的点P,世界坐标为 2、由于相…