ORBSLAM-Altas:多地图SLAM

这篇博客

 最近ORB-SLAM3横空出世,马上跑去GitHub膜拜。然后在项目的相关工作中看到了ORB-SLAM3使用了一个多地图方法。这个方法对应的论文介绍的就是ORBSLAM-Atlas系统的。为了之后更好地理解ORB-SLAM3和代码,抓紧跑去把这个多地图的论文给看一遍,再默默地记下笔记。
【转载声明】本篇文字均为原创,如转载请注明出处

ORBSLAM-Altas

这个系统

 系统摘要:
 ORBSLAM-Atlas系统是ORB-SLAM向多地图领域的一个扩展研究,它在机器跟踪丢失时不会直接停止地图更新(ORB-SLAM会停止更新地图,然后等着机器回来以后进行重定位),而是马上重新构建一个新的子地图,之前的地图先保存起来。
 如果当前在使用的地图与之前的保存的地图存在闭环,则将两个地图进行融合。之后使用融合后的地图继续进行跟踪操作。

系统方法

 图1是ORBSLAM-Atlas系统的结构框图。

 可以看出,系统框图和ORB-SLAM的框图十分相似。区别明显的地方有有:
1、系统中有两类子地图:Active map和Non-active map;
2、跟踪线程要判断是否需要构建新的地图以供跟踪;
3、检测的闭环可以是在同一个子地图中,也可以在不同子地图中。
 下面就针对上述内容进行介绍。

两类子地图

 ORBSLAM-Atlas系统会保留两类子地图:Active map和Non-active map。其中Active map是当前跟踪线程所使用的地图(Active Map >=Local Map),Non-active则是之前跟踪丢失后保留下来的所有地图。如果Active map与Non-active map存在闭环,那么就会将两个存在闭环的地图融合起来,然后系统使用融合后的地图作为新的Active map使用。
 每个子地图都是独立的,它们的第一参考帧也都是独立的。系统使用一个能够适应于所有子地图的DBoW2词袋来描述每一个子地图,以便完成地图融合操作。

 这种做法的好处有:
1、在跟踪丢失后系统通过创建新的地图来继续工作;
2、构建多个子地图可以降低误差的累积;
3、所有子地图融合后获得完整地图。这个融合后的地图相比于ORB-SLAM构建的一整个地图,在精度方面会有所提高(有部分原因是剔除了一些精度较低或是跟踪丢失的轨迹)。

新地图的构建

 ORBSLAM-Atlas系统的跟踪线程需要判断是否跟踪丢失,再决定是否构建新的地图。新地图构建和初始化的过程相同,最重要的是何时构建新地图。论文阐述了两个条件来判断跟踪是否丢失:

1、当前帧跟踪到的地图点数目:设 N N N为当前帧跟踪到的局部地图中的地图点数量。如果 N N N大于给定阈值,则认为跟踪良好,否则跟踪丢失。
2、相机位姿的可观测性:如果 N N N中的地图点的几何条件较差,则认为当前帧的位姿估计值精度较低,认为跟踪丢失。

 第一条很好理解,第二条则是论文提出的一种新的判断丢失的标准(更加严格)。第二条可以通过下图来理解:
在这里插入图片描述
 从图中可以看到,当前帧跟踪到的地图点数量 N N N很多,肯定能满足第一条标准。但是跟踪到的点大多距离相机很远(远在天边~)。太远的地图点会降低在平移运动上的估计值的精度(如:走一两步几乎不会影响远点在当前图像上的成像)。所以最后的估计的位姿精度较差,如果保留这些较差的估计值,那么就会直接影响到之后图优化的精度。
 所以系统将这些较差的位姿剔除,从这时开始构建一个新的子地图。这样就将那些误差较大的轨迹排除在外了。下图就是这种作法的一个例子。

 图中的P1是一部分精度较差的位姿估计值,P2、P3则是一个闭环。图b因为保留了P1,以至于影响到了最后闭环优化的精度。而下面的图则直接剔除了P1部分,保证了最终轨迹的一个估计精度。论文也给了“相机位姿可观测性”的具体判断公式:

相机位姿的可观测性

通过相机位姿的误差协方差来估计其位姿的观测性。首先假设 Active map 中的地图点都是精确的,然后用 Ω i , j \Omega _{i,j} Ωi,j表示地图点观测 x i , j x_{i,j} xi,j的不确定性,其中 x i , j x_{i,j} xi,j表示的是地图点 j j j 在第 i i i 个相机上的观测值。
 定义 T ^ i , w ϵ S E ( 3 ) \hat{T}_{i,w} \epsilon SE(3) T^i,wϵSE(3)是当前相机的位姿估计值,用 ε i \varepsilon _{i} εi表示估计值的不确定性( ε i \varepsilon _{i} εi是六维向量且服从均值为0的高斯分布)。然后有以下式子:
在这里插入图片描述
其中 C i C_{i} Ci表示估计位姿的精度, J i , j J_{i,j} Ji,j是第 i 个相机的位姿估计值关于第 j 个地图点的雅可比矩阵。然后通过 公式 (1) 就能判断相机的可观测性了:
在这里插入图片描述

子地图融合

 如果在两个地图之间检测到了闭环,那么就要进行地图融合。然后用融合后的地图替换掉那两个地图。下面介绍具体的融合方法,以及融合后的优化操作。以下用 a , s , m a , s , m asm 下标分别标记:Active map,Non-active map和融合后地图(用 a 地图 a地图 a地图表示Active map, s 地图 s地图 s地图表示Non-active map, m 地图 m地图 m地图表示融合后的地图)。

 1、检测到Active 和Non-active 两地图间的闭环,产生两个匹配的 K F s : K a , K s KFs:Ka,Ks KFsKaKs,以及两个地图间匹配的地图点集合 M a , M s Ma,Ms MaMs
 2、估计两个地图之间的对齐变换矩阵。对齐变换矩阵(在双目情况下属于 S E 3 SE3 SE3,单目则是 S i m 3 Sim3 Sim3)用来完成 s 地图 s地图 s地图中地图和关键帧到 a 地图 a地图 a地图坐标系的转换。具体分为两步:
  1)通过 M a Ma Ma M s Ms Ms这些匹配的地图点来进行初始估计,并用 RANSAC 算法提高估计值精度。
  2)再根据 M a Ma Ma K s Ks Ks 上的匹配点,构建重投影误差。最后由非线性优化来优化重投影误
  差,以获得最终的位姿估计值。
 3、融合子地图:完成地图对齐后,将两个地图中重叠的地图点进行融合、更新,获得精度更高的地图点。两个子地图的可视图也保留在融合后的 m 地图 m地图 m地图中。
 4、在子地图的闭环部分进行局部 BA 优化。在融合后的 m 地图 m地图 m地图中,找到 K a Ka Ka K s Ks Ks。根据 a 地图 a地图 a地图原有的可视图,确定 a 地图 a地图 a地图中哪些 K F s KFs KFs是固定的(不再 Local Map 中)。这些固定的 K F s KFs KFs m 地图 m地图 m地图中仍然固定。然后对 m 地图 m地图 m地图中剩余的 K F s KFs KFs进行 BA 优化。
 5、对 m 地图 m地图 m地图 进行完整的位姿图优化。

 如果是在Active map中检测到闭环,那么就和ORB-SLAM中的操作一样,只对Active map进行闭环操作。

系统线程

 论文还提到了各线程之间的一些关系。地图融合会在一个单独的线程中进行。在融合开始前,会将Local Mapping线程暂停,以防止新的 K F KF KF产生。在地图融合的过程中,跟踪线程会继续使用 Active map 来达到实时工作的目的。当融合结束后,跟踪线程会将融合后的地图作为新的 Active map 来使用。

结尾

 至此,这篇博客的主要内容就结束了。ORBSLAM-Atlas系统主要提供一种多地图SLAM的思路。它能够提高系统的鲁棒性和精度。但看完论文后我产生了一下几个疑问:
1、这个系统会剔除掉那些由第二条丢失判断标准找出的 K F s KFs KFs。这会使最后的地图出现一个缺口,降低地图的完整性。
2、如果有些子地图没有机会进行融合,那最后该怎么处理?是否会被直接抛弃?
 先把这些问题记在小本本上,等学的更加深入后,也许就会有解决疑问的灵感了。

Unity Atlas(Unity图集)是一种将多个小图像合并成一个大图像的技术,以减少内存和渲染开销。使用Unity Atlas可以将多个Sprite(精灵)打包到一个图像中,并通过一个脚本来管理和使用这些精灵。 在Unity中,可以使用Sprite Packer工具将多个精灵打包到一个图集中。首先,我们需要为我们的asset文件创建一个脚本,该脚本需要继承自ScriptableObject,并使用[Serializable]将其转化为资源文件,以实现序列化和反序列化。然后,我们可以创建一个UGUISpriteAsset,继承自ScriptableObject,用于存储图像资源和其他Sprite信息。该包含一个Texture型的变量用于存储图像资源,以及一个SpriteAssetInfor型的列表用于存储具体的Sprite信息。 接下来,我们需要设置输出尺寸和图像深度。根据选择的字符数量确定输出尺寸,一般常用中文字体加一块大概四千左右的大小的图片即可完全容纳。设置图像深度为32比特,因为我们需要用到Alpha通道。在Presets选项下选择带有Alpha通道的输出设置,可以选择白色或黑色作为字体颜色,然后将Textures设置为PNG格式。 最后,我们可以编写一个测试脚本ChangeUGUISprite,在Update函数中不停地切换图片。这个脚本可以通过索引或名称来获取Sprite,并将其赋值给Image组件的sprite属性。 总结起来,Unity Atlas是一种将多个Sprite打包到一个图集中的技术,在Unity中可以通过使用ScriptableObject和Serializable来实现序列化和反序列化,并通过Sprite Packer工具进行打包和管理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Unity 图集Atlas功能需求实现](https://blog.csdn.net/qq_45506643/article/details/107505454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [NGUI系列教程四(自定义Atlas,Font)](https://blog.csdn.net/jbjwpzyl3611421/article/details/10593567)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值