Voxel Map for Visual SLAM(ICRA2020)

2023-11-02 12:20
文章标签 slam visual map voxel icra2020

本文主要是介绍Voxel Map for Visual SLAM(ICRA2020),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文中提到,使用slam中传统的关键帧技术有时候并不是最优的,比如纹理少、没有结构信息, 特别是有遮挡的情况等等。。。
A. Voxel hashing data structure
存储地图点使用的是hash表,首先将地图分割成voxel,然后每个voxel中都存放很多的3dpoint,同时3dpoint中携带feature信息(descritor or 2d detector)
结合体素表示和hash方法,我们可以在恒定时间内得到给定区域(如摄像机视锥)内的点,而不必考虑地图大小。
hash function(就是一个hash映射函数,输入是xyz坐标输出是对应的point3d的列表):
注!!!!这里所说的结构化指的就是体素表达地图
注!!!蓝色的就是camera看到的3d 点
使用voxel需要注意:
1. Voxel size
    voxel的大小很影响性能,极端情况只有一个voxel或者voxel的大小等于point的大小,则voxel就没有用了
2.Resolving collisions
    使用buckets 解决冲突问题
B. SLAM map management with voxels
通常,SLAM中的地图存储三维几何对象,如点和线,新的帧可以根据这些对象进行局部化。地图会随着时间的推移而更新(例如,添加/删除点,更新现有点的信息),并且应该在跟踪过程中支持高效的查询(例如,新图像中可能匹配的点是什么?)。下面,我们将描述体素映射中的相应功能。请注意,我们不会完全丢弃关键帧,因为基于关键帧的BA对于优化贴图仍然是必要的。我们的体素地图是一个更有效的三维点组织,以促进数据关联。
Insert point:
首先使用hash函数找到bucket,然后分为三种情况:1. Voxel存在,point3d不存在,则直接插入。2.voxel存在;point3d存在(比如相近point3d 1cm有点),则更新feature。 3. voxel不存在,则插入新的voxel
Delete point:
和inert 近似
Query map :
和inser近似,直接通过hash找到相邻的所有的point3d
C. Point query with raycasting
在slam中一个重要的function是在tracking的时候得到当前帧可能观测到的所有的3d点,因此我们可以使用观测fov对voxel进行采样,快速获得3d点(因为是tracking,因此是有pose先验的)
1.  我们首先从图像平面上的规则网格中采样像素。然后我们将这些采样像素投影到三维空间中的方向向量上,得到r射线{Ri}Ri=1。这些光线基本上对摄像机视场进行采样。请注意,光线是在摄影机帧中表示的。
2. 然后均匀的在射线上进行采样
3. 根据tracking或者imu先验,可以将上述采样点转换到世界坐标系下,最后使用hash得到所有观测的3d点
优点:1. 使用体素的方法替代关键帧的方法进行tracking的时候的关联,避免了遮挡造成的干扰
2. query时间恒定

这篇关于Voxel Map for Visual SLAM(ICRA2020)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/330548

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

Map

Map 是 Java 中用于存储键值对的集合接口。以下是对 Map 的详细介绍: 特点 键值对存储:每个元素包含一个键和一个值。 键唯一:键不能重复,但值可以重复。 无序/有序:根据具体实现,键值对的顺序可能无序(如 HashMap)或有序(如 TreeMap、LinkedHashMap)。 主要实现类 HashMap 基于哈希表,无序存储。 允许一个 null 键和多个 null 值。

Java中集合类Set、List和Map的区别

Java中的集合包括三大类,它们是Set、List和Map,它们都处于java.util包中,Set、List和Map都是接口,它们有各自的实现类。Set的实现类主要有HashSet和TreeSet,List的实现类主要有ArrayList,Map的实现类主要有HashMap和TreeMap。那么它们有什么区别呢? Set中的对象不按特定方式排序,并且没有重复对象。但它的有些实现类能对集合中的对

C++数据结构重要知识点(5)(哈希表、unordered_map和unordered_set封装)

1.哈希思想和哈希表 (1)哈希思想和哈希表的区别 哈希(散列、hash)是一种映射思想,本质上是值和值建立映射关系,key-value就使用了这种思想。哈希表(散列表,数据结构),主要功能是值和存储位置建立映射关系,它通过key-value模型中的key来定位数组的下标,将value存进该位置。 哈希思想和哈希表数据结构这两个概念要分清,哈希是哈希表的核心思想。 (2)unordered

【Visual Studio 报错】未加载 wntdll.pdb(一种可行的解决办法)

调试程序时,会出现下面这个报错 分析原因: 出现未加载 wntdll.pdb 报错大概率是你的指针使用错误 ,比如使用野指针、越界访问、或者堆区空间释放方式错误等。 这里以 堆区空间释放方式错误 为例子 1、堆区开辟的数组空间使用 delete 释放 // 堆区开辟的数组空间使用 delete 释放int* p = new int[10];delete p; 正

【C++STL(十四)】一个哈希桶简单模拟实现unordered_map/set

目录 前言 一、改造哈希桶 改造结点类 改造主体  模板参数改造  迭代器(重点) 改造完整哈希桶 unordered_map模拟实现 unordered_set模拟实现 前言 前面的文章都有说unordered_map/set的底层结构就是哈希表,严格来说是哈希桶,那么接下来我们就尝试使用同一个哈希桶来模拟实现一下。整体的逻辑和一棵红黑树封装map/set类似,所以

Java中Map取值转String Null值处理

Map<String, Object> 直接取值转String String value = (String)map.get("key") 当map.get(“key”)为Null值时会报错。 使用String类的valueOf静态方法可以解决这个问题 String value = String.valueOf(map.get("key"))

Creating OpenAI Gym Environment from Map Data

题意:从地图数据创建 OpenAI Gym 环境 问题背景: I am just starting out with reinforcement learning and trying to create a custom environment with OpenAI gym. However, I am stumped with trying to create an enviro