基于OpenXR,Collabora推开源VI-SLAM AR/VR定位系统

news2024/10/5 16:26:35

XR最关键的难题之一就是定位,为了定位XR头显在现实世界中的位置和角度,厂商们采用了多种方案,比如机械传感器、惯性传感器、磁传感器、声学传感器等等。这些定位方式有一个共同的问题,那就是传感器不够完善,且会产生噪音。

拿IMU为例,它通过访问陀螺仪来测量角速度,访问加速计来测量线性加速度,也可能会用上磁力计。理论上讲,如果IMU的测量结果是完美的,那么它应该能提供定位AR/VR头显空间姿态的完整数据。然而,IMU的测量误差通常可达数百米,并不理想。为了抵消它的不准确性,AR/VR头显会结合多个传感器,利用智能融合算法来推算出准确性更高的姿态。

开源VI-SLAM方案

近年来,基于摄像头和IMU单元的视觉惯性定位(VI)在XR中得到广泛应用,比如WMR头显就采用两个或更多定位摄像头,而Quest等VR一体机通常采用四颗或更多摄像头,Index等PC VR也配备多颗摄像头。VI定位方案通过光学来捕捉周围的场景,以实现设备定位,其优势是将传感器集成在头显中,不需要外部基站,设置起来更加方便。

然而,光学6DoF定位通常是XR头显专有的,不同的厂商需要独立开发光学定位算法,没有现成的光学6DoF定位方案可直接使用。一些初创的XR厂商如果没有获得特殊许可,很难获得光学6DoF算法和开发经验。

于是,Collabora顾问软件工程师Mateo de Mayo便开发了一种开源的Vi-SLAM光学定位方案:Monado,该方案特点是基于OpenXR的开源XR运行时,可在移动端、PC端运行AR/VR应用,或是通过AR/VR头显的摄像头实现Inside-Out 6DoF定位。

据悉,Vi-SLAM是视觉惯性方案与SLAM的结合,使用了快速的IMU样本(200Hz)和慢速的相机图像捕捉(20Hz),其中IMU主要用于测量头显的内部运动,而相机则用于捕捉环境变化,以校正IMU测量数据。而SLAM则负责从初始姿态扫描场景,并实时创建地图,进行定位。通常,VI-SLAM地图由场景中的地标组成,通过三角测量法来定位。

视觉惯性定位好处是比纯SLAM方案速度更快,虽然准确性有所牺牲,但随着过去几十年技术发展,其性能、稳定性、准确性、应用场景、易用性都在提升,几乎每年都会出现新迭代的版本。

Monado驱动程序此前仅兼容RealSense和WMR定位方案,在结合上述SLAM/VIO方案后,可兼容更多头显定位系统,包括North Star、Valve Index、WMR、PS VR、HTC Vive Pro等等,还兼容Intel实感相机定位。

https://v.qq.com/txp/iframe/player.html?vid=g33704781k6

除了Inside-Out定位外,Monado还可以为AR/VR头显带来VST透视功能,以及手势识别功能。

原理方面,Monado结合AR/VR头显的摄像头和IMU数据来实现6DoF定位,此外它还结合了三种开源的SLAM/VIO解决方案:Kimera-VIO、ORB-SLAM3和Basalt。利用这三种SLAM/VIO方案,摄像头驱动的支持。

Monado和OpenXR

Monado项目获得了Collabora支持,基于OpenXR标准,可为常见AR/VR硬件提供多种用于追踪定位的工具和驱动,后来在去年5月,在Collabora实习的Mateo de Mayo将Monado与SLAM/VIO方案集成,实现了视觉惯性定位功能。

de Mayo曾测试三种SLAM/VIO系统,其中Kimera-VIO兼容配备单摄或双摄定位、IMU的头显,而ORB-SLAM3几乎兼容任何传感器方案,不管是无IMU的纯单目SLAM,还是全立体IMU-LSMA,不过该方案依赖于预先记录的数据。相比之下,第三个系统Basalt是其中速度最快的,可以更好的满足AR/VR对于实时定位的需求。此外,Basalt的源代码整体比较适合软件开发流程,有大量文档支持。

多亏了Basalt模块,现在Monado可以在Linux上的一个完全开源的软件堆栈上跟踪OpenXR应用程序。

设备集成

为了将SLAM/VIO与Monado集成,开发者需要创建足够灵活的SLAM定位接口,目的是允许每个SDK将输入和输出管道开放给Monado进行定位。

Monado中的中央SLAM定位器可读取AR/VR头显的摄像头、IMU数据,同时也兼容RealSense D455深度感知相机模组。RealSense D455特点是支持3D传感,可测量场景深度,可以很好的定位。Sense D455不仅打在了RGB摄像头,也搭载了IMU来改善移动时深度感知效果。

此外,de Mayo还与WMR驱动程序开发者合作,为其扩展对SLAM定位的支持。现阶段,WMR定位效果不如RealSense驱动好,而且Monado还是一个开源方案,未来经过更多迭代后,可能会更好的商品化。参考:Collabora

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

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

相关文章

uniapp的父传子,子传父,子组件与父组件数据同步(.sync)的理解

父传子&#xff1a; 父调用 绑定的子组件中state然后 mystate1赋值false 给子组件中的state。并在子组件中显示父中传来的值。 注意要在子组件中设置 props【属性】不然父中的值无法传过去。 <view >开启{{mystate1}}</view> --调用子组件mypop&#xff0c;并传值…

学习记录673@项目管理之进度管理案例

本文主要是进度管理之关键链路法的案例。 案例 Perfect 项目的建设方要求必须按合同规定的期限交付系统&#xff0c;承建方项目经理李某决定严格执行项目进度管理&#xff0c;以保证项目按期完成。他决定使用关键路径法来编制项目进度网络图。在对工作分解结构进行认真分析后&…

05 二叉树前序/中序/后序线索化和找前驱、后继

1. 线索化代码 线索化需要先序/中序/后续遍历的过程&#xff0c;多了访问到节点时指针指向的问题 二叉树形状和运行结果 主函数 #include "func.h"// 二叉树线索化(便于找前驱和后继节点) // 1. 二叉树先序线索化 // 2. 二叉树中序线索化 // 3. 二叉树后序线索化//…

《MySQL》MySQL简单操作

最近开始了新的学习进度 进入MySQL数据库的学习 目录 一、MySQL启动方法 1.使用MySQL启动 2.使用cmd启动 二、数据库的简单操作命令 显示当前服务器上有哪些数据库 创建新的数据库 删除数据库 选中数据库 三、数据表的操作 数据类型 四、表的简单操作 查看数据库中的…

Java多线程-线程的生命周期

Java多线程-线程的生命周期 线程的状态 New 表示线程已创建&#xff0c;没启动的状态此时已经做了一些准备工作&#xff0c;还没有执行run方法中代码 Runnable 调用start方法之后的状态&#xff0c;表示可运行状态(不一定正在运行&#xff0c;因为调用start方法之后不一定立…

分享148个ASP源码,总有一款适合您

ASP源码 分享148个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 148个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1e2PvBmXxZA8C3IelkP8ZtQ?pwdj7lp 提取码&#x…

node.js 安装步骤

1、下载安装包 Node.js 官方网站下载&#xff1a;Node.js 选择操作系统对应的包&#xff1a; 下载完成&#xff0c;安装包如下&#xff1a; 2、安装Node 打开安装&#xff0c;傻瓜式下一步即可&#xff1a; 选择安装位置&#xff0c;我这里装在D盘下&#xff1a; 安装成功&…

图和树基础算法笔记

图的大部分知识在《离散数学》中都已经学习了&#xff0c;所以我主要放一些不知道的知识 常用概念 有很少边或弧&#xff08;如 e < n log n&#xff0c;e指边数&#xff0c;n指顶点数&#xff09;的图称为稀疏图&#xff0c;反之称为稠密图。完全图&#xff1a;每个顶点的…

[引擎开发] 现代图形API - dx12篇

本文将从性能优化的角度去阐述像dx12这样的现代图形API的一些设计理念。 当我们深入优化渲染管线的时候&#xff0c;我们会发现存在的几个瓶颈主要是这样的&#xff1a; ① 线程存在不合理的等待 ② CPU向GPU编码传输数据非常耗时 ③ CPU频繁地切换渲染上下文非常耗时 因此有时…

Python---库的使用

专栏&#xff1a;python 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些python的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 库前言标准库使用import导入模块例1例2例3 文件…

老司机经验分享:生产级中间件系统架构设计实践

目录 1、Master-Slave架构2、异步日志持久化机制3、检查点机制&#xff1a;定时持久化全量数据4、引入检查点节点5、总结 & 思考 这篇文章&#xff0c;给大家来聊一个生产级的中间件系统的架构设计实践&#xff0c;希望给对中间件系统感兴趣的同学一点启发。 1、Master-S…

【Java|golang】1663. 具有给定数值的最小字符串---int32切片类型转化string

小写字符 的 数值 是它在字母表中的位置&#xff08;从 1 开始&#xff09;&#xff0c;因此 a 的数值为 1 &#xff0c;b 的数值为 2 &#xff0c;c 的数值为 3 &#xff0c;以此类推。 字符串由若干小写字符组成&#xff0c;字符串的数值 为各字符的数值之和。例如&#xff…

修改VS2015的文件编码格式为utf8,解决在Ubuntu下中文输出为乱码的问题

开发环境&#xff1a; Windows系统&#xff1a;Windows 10 家庭版&#xff0c;VS2015社区版 Linux系统&#xff1a;Ubuntu 22.04 LTS Server版&#xff0c;gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04) 今天编写跨平台的代码&#xff0c;在Windows下用VS2015编写&a…

C++ AVL树

前言 众所周知红黑树是由AVL树改进得来的&#xff0c;想要深入学习哈希表的底层存储那么AVL的学习就相当有必要了。 本来想将AVL的插入删除都能实现&#xff0c;但是在写删除功能时碰到了难题和Bug&#xff0c;所以暂时先给出插入的实现过程&#xff0c;和删除功能的实现思路 …

【日常系列】LeetCode《29·动态规划4》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 字符串/数组dp问题 动态规划中的双状态问题 lc 139【top100】&#xff1a;单词拆分 https://leetcode.cn/problems/word-break/ 提示&#xff1a; 1 <…

Qt扫盲-QHttpPart类理论总结

QHttpPart类理论总结一、概述二、使用1. 设置头2. 设置内容一、概述 QHttpPart类保存一个主体部分&#xff0c;用于HTTP multipart MIME消息中(由QHttpMultiPart类表示)。 QHttpPart由一个头块和一个数据块组成&#xff0c;它们由两个连续的新行相互分隔。一个部分的例子是: …

智能合约开发——Sui/Move vs. Solana/Rust

1. 引言 前序博客有&#xff1a; zkMove——针对Move合约生态的zkVM 定位为高性能L1的Aptos和Sui&#xff0c;均采用Move合约编程语言。Solana也定位为高性能L1&#xff0c;但其采用Rust合约编程语言。本文重点对比Sui/Move和Solana/Rust合约编程语言。【Aptos/Move为不同的M…

三、Java框架之SpringMVC1_MVC基础

文章目录1. SpringMVC简介1.1 回顾Servlet技术1.2 SpringMVC入门案例步骤1&#xff1a;创建javaweb项目&#xff0c;并导入jar包步骤2&#xff1a;创建Controller步骤3&#xff1a;创建SpringMVC的配置文件步骤4&#xff1a;使用配置类替换web.xml步骤5&#xff1a;启动项目并访…

PyTorch深度学习实践第二讲线性模型

目录监督学习四步骤线性模型泛化代码作业监督学习四步骤 DataSet&#xff08;数据集&#xff09;Model&#xff08;模型选择和设计&#xff0c;例如神经网络&#xff0c;决策树等&#xff09;Training&#xff08;大部分模型都需要训练&#xff0c;都有些例如KNN不需要训练&am…

BFS(四)127. 单词接龙、433. 最小基因变化

目录 127. 单词接龙 433. 最小基因变化 127. 单词接龙 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk&#xff1a; 每一对相邻的单词只差一个字母。 对于 1 < i < k 时&am…