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

news2024/9/20 18:41:30

在这里插入图片描述


写在前面的话

本系列笔记旨在记录作者在学习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.coloradmin.cn/o/1193892.html

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

相关文章

骨传导耳机哪个好?盘点五款好用的骨传导耳机分享

随着手机成为日常生活不可分割的一部分,耳机也逐渐成为了许多人的日常。相较于有线耳机,有越来越多的人愿意去选择无线耳机,而无线耳机也分不同的款式,有入耳式、头戴式、耳夹式、还有耳挂式,入耳式和头戴式由于佩戴时…

地理数据常用处理

自助式绘图工具kepler UTM坐标转WGS84 首先根据UTM对应表找到目标地区的编号,中国东部地区属于UTM Zone 50N 再查找UTM 50N 的EPSG标准 https://epsg.io/?qUTMzone50N 得到 EPSG:32650 Transform coordinates geohash编码与解码 import transbigdata as tbd …

AIP171 AIP591 控制进入运行设备或机器的大门

AIP171 AIP591 控制进入运行设备或机器的大门 AutomationDirect在其安全产品系列中增加了Dold trapped key系统。被困钥匙系统使用一系列机械锁和钥匙来控制进入运行设备或机器的大门,确保安全进入这些机器。Dold被困钥匙系统门集提供了一个完整的被困钥匙安全系统…

mac的可清除空间(时间机器)

看到这个可用82GB(458.3MB可清除) 顿时感觉清爽,之前的还是可用82GB(65GB可清除),安装个xcode都安装不上,费解半天,怎么都解决不了这个问题,就是买磁盘情理软件也解决不了…

如何快速落地LLM应用?通过Langchain接入千帆SDK

百度智能云千帆大模型平台再次史诗级升级!在原有API基础上,百度智能云正式上线Python SDK(下文均简称千帆 SDK)版本并全面开源,企业和开发者可免费下载使用!千帆SDK全面覆盖从数据集管理,模型训…

家纺服装行业出口管理ERP解决方案

我国是世界上最大的纺织品生产出口国,有着悠久的家纺服装贸易历史。今年前8个月,我国家纺出口市场经历了震荡波动,8月单月家纺出口增速,结束连续3个月的下降趋势,由负转正。后续家纺出口市场预计将缓慢修复&#xff0c…

LINUX入门篇【5】----程序的翻译过程解析

前言: 在C语言阶段我们已经讲过程序的翻译过程,我们知道程序是由预处理,编译,汇编,链接四部分组成的,但是,当时受到C语言编译器的限制,我们没法去深刻体会这个过程,所以…

使用Navicat导出ER图详细教程

文章目录 打开Navicat,点击模型点击新建模型选择物理模型点击文件,选择从数据库导入选择要导入的数据库点击文件,选择导出的格式成品 打开Navicat,点击模型 点击新建模型 选择物理模型 点击文件,选择从数据库导入 选择…

springcloud图书借阅管理系统源码

开发说明: jdk1.8,mysql5.7,nodejs,idea,nodejs,vscode springcloud springboot mybatis vue elementui 功能介绍: 用户端: 登录注册 首页显示搜索图书,轮播图&…

windows安装linux双系统启动盘的制作与恢复

下载镜像 Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 制作启动盘 准备一个U盘,注意备份,启动盘的制作过程中是将ISO烧录到U盘中,会将U盘中的原内容覆盖掉在网上下载Win32DiskImager软件包烧录ISO…

Linux服务器配置信息查询命令

Linux服务器配置信息查询命令 一、查看CPU信息 查询系统的CPU的详细信息,包括每个处理器的型号、频率、缓存等级以及每个核心的数量。cat /proc/cpuinfo二、查看内存信息 查询系统的内存信息,包括可用内存、已用内存和缓存等。cat /proc/meminfo三、查…

第六章 :Spring Boot web开发常用注解(一)

第六章 :Spring Boot web开发常用注解(一) 前言 本章节知识重点:作者结合自身开发经验,以及觉察到的一个现象:Springboot注解全面理解和掌握的并不多,对注解进行了全面总结,共分两个…

力扣21:合并两个有序链表

力扣21:合并两个有序链表 **题目描述:**将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2&…

项目管理之如何出道(下)

前言 是谁用烛火照亮整个中国?是一伙伙行走在高压线上的电力工人; 是谁用水枪保护千家万户?是一组组穿梭于大街小巷的消防队伍; 是谁用身体捍卫国防边境?是一队队跋涉在高山深林的可爱战士。 那么作为IT业界的我们&…

Leetcode_3:Pow(x,n)

题目描述: 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数。 示例 1: 输入:x 2.00000, n 10 输出:1024.00000示例 2: 输入:x 2.10000, n 3 输出:9.26100示例 3: 输入&…

阿里云99元的主机到底怎么样?

我是卢松松,点点上面的头像,欢迎关注我哦! 在云栖大会上,阿里云推出了一款绝对超级超值的99元云服务器,并号称是11月销量王。什么?云栖大会11月2号结束的,你就号称11月销量王,这是未卜先知啊。…

【MySQL进阶之路丨第十七篇(完结)】一文带你精通MySQL运算符

引言 在上一篇中我们介绍了MySQL函数;在开发中,对MySQL运算符的运用是十分重要的。这一篇我们使用命令行方式来帮助读者掌握MySQL中运算符的操作。 上一篇链接:【MySQL进阶之路丨第十六篇】一文带你精通MySQL函数 MySQL运算符 MySQL中的运…

Embedding技术与应用(3):Embeddings技术的实践应用

编者按: IDP开启Embedding系列专栏,力图详细介绍Embedding的发展史、主要技术和应用。 本文是《Embedding技术与应用系列》的第三篇,重点介绍 嵌入技术在生产环境中的应用效果到底如何。 文章作者认为,嵌入技术可以有效地表示用户…

Lua更多语法与使用

文章目录 目的错误处理元表和元方法垃圾回收协程模块面向对象总结 目的 在前一篇文章: 《Lua入门使用与基础语法》 中介绍了一些基础的内容。这里将继续介绍Lua一些更多的内容。 同样的本文参考自官方手册: https://www.lua.org/manual/ 错误处理 下…

Python开源项目CodeFormer——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

无论是自己、家人或是朋友、客户的照片,免不了有些是黑白的、被污损的、模糊的,总想着修复一下。作为一个程序员 或者 程序员的家属,当然都有责任满足他们的需求、实现他们的想法。除了这个,学习了本文的成果,或许你还…