AR开发-空间定位点与SLAM

在基于单目的摄像头的AR技术中,特征点(Feature)是最通用的一项技术手段,通过匹配不同帧图像之间特征点的对应关系,我们才能够准确计算相机的运动,从而恢复环境三维结构。特征点相关算法很多,在移动端,为了提高计算效率,倾向使用ORB和Freak,比如SLAM中我们就使用了ORB特征,Marker Tracking中我们使用了Freak特征;而类似SIFT这种,匹配精度高,但是运算效率低,一般用于SFM这类技术中。使用特征点的好处在于,特征具有良好的尺度不变形、方向不变形和光照不变形等特性,匹配结果较为鲁棒。光流法(Optical Flow)是相对于特征点的另一类跟踪相机运动的方法,它的基本原理是不去计算特征点以及特征描述子,而是直接使用像素块进行匹配,提高了运算效率,而其缺点是光流法只适合匹配相邻的两帧图像来计算运动变化,它要求光强度守恒(Brightness Consistency),所以无法用于重定位等技术实现。

空间定位点

空间定位点表示系统随时间跟踪的世界上的重要点。 每个定位点都有可调整的坐标系统(基于其他定位点或参照系),以确保锚定的全息影像保持位置精确。 在定位点的坐标系统中渲染全息影像可以在任何给定时间为你提供最准确的全息影像定位。 这是以不断对全息影像的位置进行小的调整为代价的,因为系统不断地将其移回到基于现实世界的位置。

ARFoundation中的参考点(Reference Point)与ARCore中的Anchor其实是同一概念,锚点的原意是指不让船舶飘移的固定锚,这里用来指将虚拟物体固定在 AR 空间上的一种技术。由于跟踪使用的陀螺仪传感器的特性,误差会随着时间积累,所以需要通过图像检测等来对误差进行修正,此时,如果已存在于空间上的对象不同步进行校正则会出现偏差,锚点的功能即是绑定虚拟物体与 AR 空间位置。被赋予 Anchor 的对象将被视为固定在空间上的特定位置,并自动进行位置校正,锚点可以 确保物体在空间中看起来保持相同的位置和方向,让虚拟物体在 AR 场景中看起来待在原地不动。

参考点的工作原理如下:AR 应用中,摄像头和虚拟物体在现实世界空间中的位置会在帧与帧之间更新,即虚拟物体在现实世界 空间中的姿态每帧都会更新,由于陀螺仪传感器的误差积累,虚拟物体会出现飘移现象,为解决这个问题, 我们需要使用一个参考点将虚拟对象固定在现实空间中,如前所述,这个参考点姿态信息的偏差必须要能用某种方式消除以确保参考点的姿态不会随着时间而发生变化。消除这个偏差的就是视觉校准技术,通过视觉校准能让参考点保持相同的位置与方向,这样,连接到该参考点的虚拟对象也就不会出现飘移。一个参考点上可以 连接一个或多个虚拟对象,参考点和连接到它上面的物体看起来会待在它们在现实世界中的放置位置,随着参考点姿态在每帧中进行调整以适应现实世界空间更新,参考点也将相应地更新物体的姿态,确保这些物体能 够保持它们的相对位置和方向,即使在参考点姿态调整的情况下也能如此,有了参考点,连接到参考点上的虚拟对象就像是固定在现实世界空间中一样。

SLAM

摄像头成本低且能获取丰富的环境信息,使用摄像头作为传感器的VSLAM技术一直是学术界与工业界的热门研究方向。我们也是众多VSLAM学习者中的一员,从入门到查找各种资料学习的过程中,踩了不少坑,但也有一些心得。考虑到大多数VSLAM的入门学习者会碰到学习曲线陡峭,内容繁杂的问题,我们开源了《smoothly-vslam》教程,并将在组队学习中,陪伴学习者成长。

开源地址:https://github.com/datawhalechina/smoothly-vslam

SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and Localization), 即时定位与地图构建,或并发建图与定位。

Position_Structure

坐标叠加

我们需要把虚拟坐标和现实世界的坐标进行叠加。我们现在接触虚拟信息的方式,无论是电脑、平板还是手机,都是通过屏幕,这样我们感受到的信息其实是2D的。而真实环境的坐标系是3D的,所以,如果我们要让虚拟信息与真实环境无缝融合,首先要做的就是叠加虚拟坐标系与真实坐标系。

几何物理信息交互

真实环境中有高低起伏、有障碍物、有遮挡关系,AR可以让虚拟信息跟这些真实环境中的物理信息进行交互。

语义理解

随着机器学习和深度学习的发展,虚拟信息可以“理解”真实世界,让二者的融合更趋于自然。上面两步是我们目前已经实现了的技术。未来我们要做的,是语义理解。语义理解加上之前的坐标叠加和交互,我们就可以实现科幻电影般的效果。

(265条消息) 一文彻底搞懂SLAM技术_小麦大叔的博客-CSDN博客

平面检测

SLAM构建出了3D点云地图,并估计出了Camera Pose,然而对于AR应用,还无法确定3D模型的摆放位置。比如我们需要在桌面上摆放一个花瓶,我们还需要知道在3D点云地图中,桌面对应的位置,这就需要上面流程图里提到的平面检测。
转换为一个数学问题描述:在空间中我们有一系列的点P,并给出一个方向向量 D ,求一个法向量平行于D 的平面并使得所有的点距离该平面的距离之和最小。
这是一个非常典型的最小二乘估计问题,因此可以利用已有的数学工具求解,如高斯牛顿,LM算法,SVD分解等等。如果是检测水平面,其中D 是根据重力传感器得到的竖直方向,即平面的法向量方向得以确定;

Marker+SLAM

SLAM初始化建立的点云世界坐标系是随机的,对于单目SLAM,scale信息是无法确定的,即无法确定点云世界坐标和真实尺寸的比例。在某些情况下,AR应用希望能够和真实的尺寸一一对应,在这种情况下我们提出了利用Marker作为SLAM的初始地图的方法。通过一个事先确定的Marker,建立一个已知scale信息的世界坐标系,在此坐标系的基础上通过SLAM跟踪并扩张地图,那么在叠加3D模型时就可以安装其真实尺寸展示。算法上的区别就在于SLAM首先要去识别Marker,而不是自己去初始化地图,识别Marker的方法也可以借鉴Marker Tracking的相关技术。

SLAM+AR 技术与应用的一些思考-阿里云开发者社区 (aliyun.com)

EasyAR

运动跟踪的工作原理

运动跟踪通过视觉惯性同步定位和建图(VISLAM)技术,计算设备相对于真实空间的位姿关系。在设备移动过程中,通过识别相机图像中显著特征点并跟踪其位置变化,结合设备的IMU数据信息,实时计算当前设备相对于真实世界的位置和姿态。

  • 真实尺度

    利用设备的惯导传感器和相机图像数据融合,恢复真实物理尺度,位置的单位是米。

  • 鲁棒准确的运动跟踪

    VISLAM算法相比纯视觉SLAM能极大降低长时间跟踪的漂移,且对于光照变化、弱纹理区域和动态物体等更鲁棒。

  • 快速初始化

    只需要相机对着应用场景横移1-2次即可实现初始化。初始化完成时的位置定义为世界坐标系的原点,根据重力方向和屏幕朝向,将初始化姿态朝向屏幕。初始化完成后自动开启位姿跟踪。

  • 快速重定位

    在设备跟踪丢失后/跟踪不佳后快速准确地恢复设备相对于世界坐标系的位姿,重定位前后世界坐标系原点不变,保证跟踪的持续性和准确性。在初始化区域附近具有位姿校正能力从而消除长距离运动产生的累计误差。

  • 点击碰撞

    支持点击当前视野内的点云或者水平面。

  • 锚点

    当放置虚拟物体时,可以使用锚点确保虚拟物体锚定在特定的区域内,使设备移动中也能保持虚拟物体的稳定。这意味着,即便位姿出现了偏差,虚拟物体也会看起来位于原始放置的位置。你可以调用接口hitTestAgainstPointCloud实现Anchor的创建,每次调用接口hitTestAgainstPointCloud就会自动创建一个Anchor。当Anchors太多而超出内存限制就会自动把老的Anchors释放掉。 你也可以在调用hitTestAgainstHorizontalPlane后调用hitTestAgainstPointCloud为平面创建Anchor.

EasyAR 稀疏空间地图

功能简介

EasyAR 稀疏空间地图( [Sparse Spatial Map](https://help.easyar.cn/EasyAR Sense/v4_1/ApiReference/SparseSpatialMap.html) )用于扫描用户周围环境,生成环境的三维视觉地图,并提供视觉定位跟踪功能。

建立的视觉地图可以 [保存](https://help.easyar.cn/EasyAR Sense/v4_1/ApiReference/SparseSpatialMap.html#savemap) 或多个设备间实时共享。当其他设备加载相应地图,并在加载地图中通过 [定位](https://help.easyar.cn/EasyAR Sense/v4_1/ApiReference/SparseSpatialMap.html#startlocalization) 确定设备相对于地图的位置和姿态,适用于开发持久化AR应用或多人互动AR应用。

EasyAR 稀疏空间地图支持 [加载](https://help.easyar.cn/EasyAR Sense/v4_1/ApiReference/SparseSpatialMap.html#loadmap) 多个地图,在多个地图中定位并返回对应地图的ID和设备相对于该地图的位置和姿态。

稀疏空间地图目前需要稳定的运动跟踪系统(例如EasyAR Motion Tracking / ARCore / ARKit)提供六自由度的位置和姿态用于建图以及定位成功后的持续跟踪。在建图过程中,稀疏空间地图利用相机图像和对应位姿构建环境1:1的视觉地图。定位过程中,当视觉定位成功后,设备相对地图的位姿通过运动跟踪系统持续更新。

稀疏空间地图建图通过扫描环境并构建三维环境点云,每一个三维点都记录周围的局部视觉信息。定位过程通过将当前相机图像和地图的三维点进行视觉匹配并尝试计算对应位姿来恢复相应的位姿

怎么往稀疏空间添加物体?

在ImageTarget下生成物体后,再新建一个物体,赋值这个物体的坐标和欧拉角度,设置父节点为SpatialMap的对象