【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.mfbz.cn/a/128795.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【高等数学】导数的应用

导数的应用 1、洛必达法则1.1、引例1.2、内容1.3、证明1.4、洛必达的应用总结 1.5、注意 2、泰勒公式2.1、解决的问题2.2、引例2.3、内容2.3.1、带Peano余项的泰勒公式2.3.2、带Lagrange余项的泰勒公式2.3.3、麦克劳林公式2.3.4、几个初等函数的麦克劳林公式 2.4、证明2.5、泰勒…

SpringBoot 监控

概述 SpringBoot自带监控功能Actuator&#xff0c;可以帮助实现对程序内部运行情况监控&#xff0c;比如监控状况、Bean加载情况、配置属性、日志信息等。 使用步骤 导入依赖坐标 <dependency><groupId>org.springframework.boot</groupId><artifactI…

Vuex模块概念

一、核心概念 - module 1.目标 掌握核心概念 module 模块的创建 2.问题 由于使用单一状态树&#xff0c;应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时&#xff0c;store 对象就有可能变得相当臃肿。 这句话的意思是&#xff0c;如果把所有的状态都放在s…

智慧城市建设解决方案分享【完整】

文章目录 第1章 前言第2章 智慧城市建设的背景2.1 智慧城市的发展现状2.2 智慧城市的发展趋势 第3章 智慧城市“十二五”规划要点3.1 国民经济和社会发展“十二五”规划要点3.2 “十二五”信息化发展规划要点 第4章 大数据&#xff1a;智慧城市的智慧引擎4.1 大数据技术—智慧城…

公司如何实现多套环境的自动化测试?

实战练习 分别准备两套测试环境&#xff0c;都对其发起 get 请求&#xff0c;传入参数 name&#xff0c;对应值为 hogwarts&#xff0c;并断言其响应值。 测试环境1&#xff1a;http://httpbin.org/get 测试环境2&#xff1a;https://httpbin.ceshiren.com/get <strong>…

浙大恩特客户资源管理系统任意文件上传漏洞复现

0x01 产品简介 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源&#xff0c;提升销售和市场营销的效果。 0x02 漏洞概述 浙大恩特客户资源管理系统中fileupload.jsp接口处存在文件上传漏洞&#xff0c;未经身份认…

Postman小白安装和注册入门教程

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 一&#xff09;安装 访问官网https://www.getpostman.com/downloads/&#xff0c;直接下载安装。 二&#xff09;注册和登录…

基本数据类型小题两道

根据公式计算A地区教师任教年薪&#xff0c;统计键盘输入的字符串中数字个数&#xff0c;按字典序输出。 (笔记模板由python脚本于2023年11月10日 18:05:18创建&#xff0c;本篇笔记适合熟悉python列表、元、字符串等基本数据类型的coder翻阅) 【学习的细节是欢悦的历程】 Pyth…

Hololens开发笔记

1、关闭阴影 2、将相机渲染改为后向。因为默认是Forward&#xff0c;当在场景里面想使用点光源时&#xff0c;运行起来三角面会翻倍&#xff0c;影响软件运行流畅度。 3、第三人称同步相关。开启Host/Sever/Client前&#xff0c;需要将所有挂有NetworkObject/NetworkTransfor…

C语言之文件操作(详解版)

不知不觉我们已经学到C语言的文件操作部分了&#xff0c;这部分内容其实很有意思&#xff0c;因为它可以直接把我们代码中的数据写入硬盘&#xff0c;而不是我们关掉这个程序&#xff0c;代码就没有了&#xff0c;让我们开始学习吧&#xff01; 目录 1.为什么使用文件 2.什么…

7个学习自动化测试小技巧希望能帮助到你

一、编程语言 当我开始担任手动测试人员时&#xff0c;我不喜欢编码。但是&#xff0c;当我逐渐进入自动化领域时&#xff0c;对我来说很清楚&#xff0c;如果没有对编程语言的一些基本了解&#xff0c;就无法编写逻辑自动化测试脚本。 对编程有一点了解&#xff0c;不仅可以…

创建Vue3工程

一、使用Vue-cil创建工程 先全局安装Vue脚手架&#xff1a; npm install -g vue/cli 安装完成后输入如下命令就可以查看到Vue的版本&#xff1a; vue -V 版本尽量在4.5及以上 。 输入如下指定常见Vue项目&#xff1a; vue create 项目名称 注意&#xff1a;项目名中不要有大写…

OpenCV校准棋盘集合

棋盘格可以与相机校准工具一起使用&#xff0c;例如ROS的camera_calibration包。您可以通过单击下面的任何链接免费下载 PDF 格式的各种棋盘&#xff0c;没有水印或广告。此外&#xff0c;还添加了基于 JavaScript 的棋盘生成器&#xff0c;允许您生成自定义尺寸。 提示&#…

Python接口自动化之unittest单元测试

以下主要介绍unittest特性、运行流程及实际案例。 一、单元测试三连问 1、什么是单元测试&#xff1f; 按照阶段来分&#xff0c;一般就是单元测试&#xff0c;集成测试&#xff0c;系统测试&#xff0c;验收测试。单元测试是对单个模块、单个类或者单个函数进行测试。 将…

字形变换-头歌

将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行Z字形排列。之后&#xff0c;你的输出需要从左往右逐行读取&#xff0c;产生出一个新的字符串 示例 : 输入: s "QAZWSXEDCRFVTG"&#xff0c;numRows 4 输出:"QETAXDVGZSCFWR&…

在软件测试过程中如何有效的开展接口自动化测试!

一.简介 接口自动化测试是指使用自动化测试工具和脚本对软件系统中的接口进行测试的过程。其目的是在软件开发过程中&#xff0c;通过对接口的自动化测试来提高测试效率和测试质量&#xff0c;减少人工测试的工作量和测试成本&#xff0c;并且能够快速发现和修复接口错误&…

IT项目管理必备软件,这10款精心整理的项目管理工具请收好!

在快节奏的办公环境下&#xff0c;拥有一支高效的团队是成功的关键。每个团队成员需要能够迅速地沟通&#xff0c;共享信息&#xff0c;跟踪项目进度&#xff0c;并协调工作流程。而为了达到这样的效率&#xff0c;我们需要用到各种强大而实用的项目协作工具。 团队协作工具有…

k8s的安装部署,详细过程展示(保姆级安装教程)

k8s应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xff1a;不能为应用程序定义资源使用…

ARMday04(开发版简介、LED点灯)

开发版简介 开发板为stm32MP157AAA,附加一个拓展版 硬件相关基础知识 PCB PCB&#xff08; Printed Circuit Board&#xff09;&#xff0c;中文名称为印制电路板&#xff0c;又称印刷线路板&#xff0c;是重要的电子部件&#xff0c;是电子元器件的支撑体&#xff0c;是电子…

【EI会议征稿】第三届智能系统、通信与计算机网络国际学术会议(ISCCN 2024)

第三届智能系统、通信与计算机网络国际学术会议&#xff08;ISCCN 2024&#xff09; 2024 3rd International Conference on Intelligent Systems, Communications and Computer Networks 第三届智能系统、通信与计算机网络国际学术会议&#xff08;ISCCN 2024&#xff09;将…