【ARFoundation学习笔记】点云与参考点

在这里插入图片描述


写在前面的话

本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。主要目的是为了加深记忆。其中难免出现纰漏,更多详细内容请阅读原文以及官方文档。

汪老师博客


文章目录

  • 点云
    • 新建点云
  • 参考点
    • 参考点的工作原理
      • 何时使用参考点
      • 使用参考点的注意事项


点云

AR应用的目的是为用户加强对现实环境的体验,为用户带来真实性。因此AR应用需要理解所处的周围环境,知道哪里是垂直平面,哪里是水平平面。

点云是特征点的集合,特征点是指AR Foundation通过VIO检测捕获的摄像头图像中的视觉差异点,这些视觉差异点是从图像中明暗、颜色、灰度差异比较大的点中挑选出来的,AR Foundation会实时更新这些特征点。

在对图像的实时检测中,点云会不断获取特征点,一些特征点被删除,也有一些特征点被加入,通过算法获得那些比较稳定的特征点,这些稳定的特征点就会被机器视觉解析为特定的位置信息,那么只需计算特征点的变化就可以计算出物体在现实中位置的变化。

检测的特征点信息与设备IMU的惯性测量结果结合,不仅可以跟踪用户(手机设备)随着时间推移而相对于周围世界的姿态,还可以大致了解用户周边的环境结构。

在之前平面管理时我们提到,AR Plane上有个public的字段——特征点变化阈值来设定可接受的特征点的置信值。

由众多的特征点,就构成了点云,单个特征点不是Trackable的(但可以通过ID识别),而点云是Trackable的。

每个特征点都具有Vector3的Position信息,ulong类型的id,和float的置信度Confidence value。特征点的位置信息是Session空间中的坐标值,可以通过ARPointCloud.position来获取。id则通过ARPointCloud.identifiers来获取。置信度则表示了机器视觉对特征点识别的确信程度。

点云由AR Point Cloud Manager组件负责管理,该组件负责点云的创建以及特征点的创建、更新、移除。特征点检测的启用和禁用、特征点的显示和隐藏与平面处理方式完全一致。

点云数据可以辅助平面检测,更重要的是点云数据是环境重建的基础,这对AR理解环境非常关键。随着时间的延长,点云数据中的特征点会迅速增长,为了防止特征点过多而影响性能,点云中的总特征点必须要控制在一定的数值范围内,如ARCore将特征点的最大数限制在61 440个。


新建点云

点云的创建也很简单,类比于之前平面的创建流程。此后的一些物体的创建在ARfoundation中也都是类似的:

在这里插入图片描述

  • 首先创建一个AR Default Point Cloud组件

在这里插入图片描述

  • 然后将刚刚的AR Default Point Cloud组件做成预制件,在AR Session Origin上挂载一个AR Point Cloud Manager,根据我们之前的学习,AR Session Origin上处理的是Session空间上的姿态信息,所以要实例化Trackable物体的话,就需要把对应的Manager挂载在AR Session Origin上。
    在这里插入图片描述

  • 编译运行,找一个富纹理物体或表面,左右移动手机,这时AR Foundation会对特征点进行检测,效果如图所示。

本节所演示的点云数据会实时变化,置信值小的点云数据会被移除,新的点云数据会被加入,因此,如果希望保存所有检测到的点云数据,可以将这些数据存储在Dictionary或者List中,这对一些应用,如网格重建、遮挡实现会非常有用。


参考点

AR Foundation中的参考点(Reference Point)与ARCore中的Anchor或ARKit中的ARAnchor其实是同一概念,即锚点。由于跟踪使用的陀螺仪的特性,误差会随着时间积累,因此需要通过图像检测等方式对误差进行修正,如果已存在于空间上的对象不同步进行校正则会出现偏差。锚点的功能就是绑定虚拟物体与AR空间的位置。(类似于UGUI的锚点,以Anchor为中心去固定与其他空间的相对位置)

被赋予Anchor的对象将被视为固定在空间上的特定位置,并自动进行位置校正,因此锚点可以确保物体在空间中保持相同的位置和方向,让虚拟物体在AR场景中看起来待在原地不动。

参考点的工作原理

在AR应用中,虚拟物体在现实空间的姿态信息每帧都会更新,由于陀螺仪的误差累积,虚拟物体在应用中会出现飘移现象。如果将一个锚点固定在空间中,来计算虚拟物体相对于锚点的姿态信息,就可以避免位置的飘移,这个锚点就是参考点Reference point。然而还需要保证参考点在空间中的姿态能保持不变,也就是需要消除参考点的偏差。消除这个偏差的方法就是视觉校准技术,通过视觉校准来保证参考点在绝对空间中保持不变的位置与方向。

将参考点作为锚点,在绝对空间中的参考点姿态信息不变的前提下,保持参考点上连接的虚拟物体相对于这个锚点的姿态信息,就可以保证在每帧的实时更新中虚拟物体相对于现实世界空间的姿态变化,就像虚拟物体真的固定在了现实空间一样。

何时使用参考点

参考点是一种对资源消耗比较大的可跟踪对象,参考点的跟踪、更新、管理需要大量的计算开销,因此需要谨慎使用并在不需要的时候分离参考点。

作者对使用参考点的时机给出了几点建议:

  1. 一个参考点保持多个虚拟对象的相对位置,这样这些物体之间的位置关系就不会受到其他因素影响。
  2. 保证虚拟物体的独立性。在前文中我们使用射线检测,在触碰到的平面物体上创建了预制体。通常情况下没有问题,但如果因为某些原因导致AR Plane Manager被禁用、平面被销毁或者隐藏,就会影响到以平面为参考的虚拟物体位置的稳定性,导致虚拟物体飘移。如果使用参考点来锚定物体,就能保持物体的独立性而不受到平面的影响。
  3. 提高追踪稳定性。由于参考点需要独立追踪,因此能提高挂载在其上的物体的追踪稳定性。
  4. 保持追踪对象与平面的相对位置稳定。使用AttachReferencePoint()方法可以将一个参考点与平面绑定起来,从而保持挂载在该参考点下的虚拟物体与平面保持关系一致。如在一个垂直平面上使用AttachReferencePoint()方法建立一个参考点(位置关系的传递,虚拟物体锚定平面位置,平面位置锚定参考点),在参考点更新时就会锁定x、z分量值,从而保持参考点与平面位置关系始终一致。

在AR Foundation中,AR Reference Point Manager提供了如表所示方法管理参考点:

方法描述
AddReferencePoint(Pose)用给定的Pose添加一个参考点,Pose为世界空间中的姿态,返回一个新的ARReferencePoint。
AttachReferencePoint(ARPlane, Pose)用给定的Pose创建一个相对于已检测到平面的ARReferencePoint,其中ARPlane是一个已检测到的平面,Pose为世界空间中的姿态。
RemoveReferencePoint(ARReferencePoint)移除一个ARReferencePoint,如果移除成功则返回True,如果返回False通常意味着这个ARReferencePoint已经不在跟踪状态。
referencePointsChanged在ARReferencePoint发生变化是触发的事件,如一个新的ARReferencePoint创建、对一个现存的ARReferencePoint进行更新、移除一个ARReferencePoint。

AddReferencePointAttachReferencePoint都是创建了新的参考点。但是又有所不同,从两个方法的名称不难看出,一个是新增参考点,一个是绑定参考点。新增的参考点位基于指定的Pose信息,并进行独立跟踪,如果Session变化时它可能会随之更新。

AttachReferencePoint方法则是将参考点绑定,附加在某平面上,以平面为锚点保持参考点与平面之间的相对距离。

在添加ARReferencePoint时需要注意的是,添加一个ARReferencePoint需要一到两帧的时间,在添加ARReferencePoint操作执行后到添加成功之前,添加的ARReferencePoint处于“pending”状态,这个“pending”状态值可以通过ARReferencePoint.pending属性进行查询。。同样,移除一个ARReferencePoint也需要一到两帧的时间,如果尝试移除一个还没有添加成功ARReferencePoint,不会有任何效果。同时,一定不要手动使用Destroy()方法去销毁ARReferencePoint,这会引发错误。如前文所述,ARReferencePoint由ARReferencePointManager负责管理,所以务必要使用RemoveReferencePoint(ARReferencePoint)方法移除ARReferencePoint。

使用参考点的注意事项

  1. 尽可能复用参考点,由于每个参考点都独立追踪,且追踪参考点较为消耗性能,因此在使用参考点时尽量让多个相互靠近的物体使用同一个参考点,而不是为每一个物体都创建参考点。
  2. 保持物体靠近参考点。锚定物体时,最好让需要连接的虚拟对象尽量靠近参考点,避免将物体放置在离参考点几米远的地方,以免由于AR Foundation更新现实世界空间坐标而产生意外的旋转运动。如果确实需要将物体放置在离现有参考点几米远的地方,应该创建一个更靠近此位置的新参考点,并将物体连接到新参考点。
  3. 分离未使用的参考点。为提升应用的性能,通常需要将不再使用的参考点分离。因为对于每个可跟踪对象都会产生一定的CPU开销,AR Foundation不会释放具有连接参考点的可跟踪对象,从而造成无谓的性能损失

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Ubuntu 23.10部署KVM并创建虚拟机?

正文共:1114 字 21 图,预估阅读时间:2 分钟 我们之前对OpenStack醉过一次简单介绍(什么是OpenStack?),OpenStack本身是一个云管理平台,它本身并不提供虚拟化功能,而是依赖…

⑧【MySQL】数据库查询:内连接、外连接、自连接、子查询、多表查询

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 内连接、外连接、自连接、子查询、多表查询 ⑧…

03-学成在线内容管理模块之课程查询

课程查询 需求分析 教学机构人员点击课程管理按钮进入课程查询界面,在课程列表页面输入查询条件查询课程的信息 当不输入查询条件时默认会全部课程信息,输入查询条件会查询符合条件的课程信息,约束条件是本教学机构查询本机构的课程信息 数据模型(model工程) 课程查询功能…

Kibana:使用 “链接” 面板简化 Kibana 仪表板导航 - Links panel

作者:Teresa Alvarez Soler 我们很高兴地宣布 Kibana 仪表板的最新功能版本:链接面板(Links panel),这是在仪表板之间组织和导航的简单方法。 此功能在 Kibana 8.11 的技术预览版中提供。 有时你可能希望创建多个主题…

深入探讨Linux中的文本文件查看命令

目录 前言1 cat命令2 less命令3 more命令4 head命令5 tail命令6 总结 前言 在Linux系统中,文本文件是日常工作中不可或缺的一部分,无论是配置文件、日志文件还是代码文件,都需要用到文本文件查看命令。在本文中,我们将深入研究一…

SLF4J: Class path contains multiple SLF4J bindings.

问题截图 问题原因 这里就是由于hbase 安装路径下的一个文件和hadoop安装路径下的文件起冲突了 解决办法 我的路径: 这个一定要看自己电脑上的路径 /usr/local/hbase/lib/client-facing-thirdparty/ slf4j-log4j12-1.7.25.jar更名为: /usr/local/hb…

智能供应链中的预测算法:理论与实践

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 引言 智能供应链已经成…

如何安装WampServer并结合内网穿透工具实现公网访问内网服务

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、Cpolar杂谈 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. WampServer下载安装二. WampServer启动三. 安装cpolar内网穿透3.1 注册账号…

【Git企业开发】第七节.多人协作开发

文章目录 前言 一、多人协作开发 1.1 多人协作一 1.2 多人协作二 1.3 远程分支删除后,本地 git branch -a 依然能看到的解决办法 总结 前言 一、多人协作开发 1.1 多人协作一 目前,我们所完成的工作如下: 基本完成Git的所有本地库的相关操作&#xff0…

python读取txt格式的点云文件,可视化显示,保存ply格式

在计算机视觉和三维几何处理中,点云是一种重要的数据表示形式。点云由许多离散的点组成,每个点都有三维坐标,通常还包括其他信息。 空格形式的点云文件 import open3d as o3ddef read_txt_space(txt_file):# 读取点云数据pcd o3d.io.read_p…

哪些方面的应用适合博捷芯双轴半自动划片机?

博捷芯BJX3666系列双轴半自动划片机可以应用于以下领域: 1. 集成电路制造:在集成电路制造中,划片机可以用来将芯片从晶圆上切割下来,以便进行封装和测试。此外,还可以用来对芯片进行划片分离加工,以得到所需…

AJAX入门Day01笔记

Day01_Ajax入门 知识点自测 如下对象取值的方式哪个正确? let obj {name: 黑马 }A: obj.a B: obj()a 答案 A选项正确 哪个赋值会让浏览器解析成标签显示? let ul document.querySelector(#ul) let str <span>我是span标签</span>A: ul.innerText str B: ul…