当前位置: 首页 > news >正文

【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不会释放具有连接参考点的可跟踪对象,从而造成无谓的性能损失

相关文章:

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

写在前面的话 本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。主要目的是为了加深记忆。其中难免出现纰漏,更多详细内容请阅读原文以及官方文档。 汪老师博客 文章目录 点云新建点云 参考点参考点的工作原理何时使用参考点使用参考点…...

uni-app:js实现数组中的相关处理-数组复制

一、slice方法-浅拷贝 使用分析 创建一个原数组的浅拷贝,对新数组的修改不会影响到原数组slice() 方法创建了一个原数组的浅拷贝,这意味着新数组和原数组中的对象引用是相同的。因此,当你修改新数组中的对象时,原数组中相应位置的…...

8 STM32标准库函数 之 实时时钟(RTC)所有函数的介绍及使用

8 STM32标准库函数 之 实时时钟(RTC)所有函数的介绍及使用 1. 图片有格式2 文字无格式二、RTC库函数固件库函数预览2.1 函数RTC_ITConfig2.2 函数RTC_EnterConfigMode2.3 函数RTC_ExitConfigMode2.4 函数RTC_GetCounter.2.5 函数RTC_SetCounter2.6 函数RTC_SetPrescaler2.7 函…...

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

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

国际腾讯云:云服务器疑似被病毒入侵问题解决方案!!!

云服务器可能由于弱密码、开源组件漏洞的问题被黑客入侵,本文介绍如何判断云服务器是否被病毒入侵,及其解决方法。 问题定位 使用 SSH 方式 或 使用 VNC 方式 登录实例后,通过以下方式进行判断云服务器是否被病毒入侵: rc.loca…...

Perl语言用多线程爬取商品信息并做可视化处理

首先,我们需要使用Perl的LWP::UserAgent模块来发送HTTP请求。然后,我们可以使用HTML::TreeBuilder模块来解析HTML文档。在这个例子中,我们将使用BeautifulSoup模块来解析HTML文档。 #!/usr/bin/perl use strict; use warnings; use LWP::User…...

认识计算机-JavaEE初阶

文章目录 一、计算机的发展史二、冯诺依曼体系(Von Neumann Architecture)三、CPU基本工作流程3.1 算术逻辑单元(ALU)3.2 寄存器(Register)和内存(RAM)3.3 控制单元(CU)3…...

you-get - 使用代码下载视频

文章目录 关于 you-get代码调用报错处理 源码简单分析 关于 you-get github : https://github.com/soimort/you-get you-get 是一个有名的开源视频下载工具包,这里不赘述。 代码调用 you-get 提供了命令行的方式下载视频,这里介绍使用 Python 调用源代…...

【Proteus仿真】【51单片机】汽车尾灯控制设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用按键、LED模块等。 主要功能: 系统运行后,系统运行后,系统开始运行,K1键控制左转向灯;…...

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

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

史上第一款AOSP开发的IDE (支持Java/Kotlin/C++/Jni/Native/Shell/Python)

ASFP Study 史上第一款AOSP开发的IDE (支持Java/Kotlin/C/Jni/Native/Shell/Python) 类似于Android Studio,可用于开发Android系统源码。 Android studio for platform,简称asfp(爱上富婆)。 背景&下载&使用 背景 由…...

GCC + Vscode 搭建 nRF52xxx 开发环境

在 Windows 下使用 GCC Vscode 搭建 nRF52xxx 开发环境 ...... by 矜辰所致前言 最近有遇到项目需求,需要使用到 Nordic 的 nRF52xxx 芯片,还记得当初刚开始写博文的时候的写的 nRF52832 学习笔记,现在看当时笔记毫无逻辑可言&#xff0c…...

Linux应用开发基础知识——Framebuffer 应用编程(四)

前言: 在 Linux 系统中通过 Framebuffer 驱动程序来控制 LCD。Frame 是帧的意 思,buffer 是缓冲的意思,这意味着 Framebuffer 就是一块内存,里面保存着 一帧图像。Framebuffer 中保存着一帧图像的每一个像素颜色值,假设…...

智安网络|数据库入门秘籍:通俗易懂,轻松掌握与实践

在现代信息化时代,数据库已成为我们日常生活和工作中不可或缺的一部分。然而,对于非专业人士来说,数据库这个概念可能很抽象,难以理解。 一、什么是数据库? 简单来说,数据库是一个存储和管理数据的系统。它…...

EXCEL中安装多个vsto插件,插件之间互相影响功能,怎么解决

在 Excel 中安装多个 VSTO 插件,并且这些插件之间存在互相影响的情况下,可以采取以下措施来解决问题: 1. **隔离插件功能:** - 确保每个 VSTO 插件都有清晰的功能和责任范围,避免不同插件之间的功能重叠。这可以通…...

Java枚举

枚举类 概念 Java中的枚举(Enumeration)是一种特殊的数据类型,它是一种包含固定常量的类型。枚举是一种更加类型安全和更易维护的方式来定义常量,它包含了一组命名的值。 enum Weekday {MONDAY, TUESDAY, WEDNESDAY, THURSDAY,…...

基于MATLAB的关节型六轴机械臂轨迹规划仿真

笛卡尔空间下的轨迹规划,分为直线轨迹规划和圆弧轨迹规划,本文为笛卡尔空间下圆弧插值法的matlab仿真分析 目录 1 实验目的 2 实验内容 2.1标准D-H参数法 2.2实验中使用的Matlab函数 3 全部代码 4 仿真结果 1 实验目的 基于机器人学理论知识&…...

双11狂欢最后一天

大家好,本年度双11即将到来,为了答谢大家多年来的支持及更广泛的推广VBA的应用,“VBA语言専功”在此期间推出巨大优惠:此期间打包购买VBA技术资料实行半价优惠。 1:面向对象:学员及非学员 2:打…...

YOLOX: Exceeding YOLO Series in 2021(2021.8)

文章目录 AbstractIntroduction介绍前人的工作提出问题解决 YOLOXYOLOX-DarkNet53Implementation detailsYOLOv3 baselineDecoupled headStrong data augmentationAnchor-freeMulti positivesSimOTAEnd-to-end YOLOOther BackbonesModified CSPNet in YOLOv5Tiny and Nano dete…...

HBuilderX 运行Android App项目至雷电模拟器

一、下载安装HBuilderX HBuildeX官网 安装最新的正式版,或者点击历史版本查看更多版本;【ps:Alpha版本为开发版,功能更多,但是也不稳定,属于测试版本】 直接将压缩包解压,运行HBuildeX即可。 二…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...