锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

一文搞懂什么VR,什么是6Dof,欧拉角,四元数转视图矩阵

时间:2022-10-11 23:30:01 1k角位移传感器

目录

一、什么是VR

二、什么是3Dof,6Dof, 9Dof

三、欧拉角(姿态角)

四、Android手机的欧拉角和坐标系

五、安卓坐标系转换欧拉角

六、根据姿态四元数求视图矩阵

一篇文章理解什么VR,什么是6Dof,欧拉角,四元数转视图矩阵_AppNinja 开发手记-CSDN博客

一、什么是VR

VR它是在眼睛上覆盖一个具有透镜成像功能的显示器。无论人们看哪里,他们都会在显示器中显示相应方向的风景图片,让人感觉自己在一个无限的虚拟空间中。

该功能的实现由以下基础设施组成:

1.处理器

处理器是计算的核心,用于计算和生成图像,并根据陀螺仪数据计算您的姿态定位。防止速度不同步引起的眩晕,VR设备要求图像刷新率达到900Hz,在这种情况下,处理器的运行速度要求很高。所以,一般来说,好的VR芯片性能指标对设备处理器至关重要。

2. 显示器

图像分别显示在左右眼睛上。通常当我们说的时候 2k 屏幕的VR眼镜是指整个屏幕的长边尺寸,如 2k*1k 尺寸。但如果说:单眼2k,指屏幕短边尺寸为2k。目前市场主流配置是 单眼1.5k左右。屏幕分辨率越高,要求的处理器越强。

3. 透镜

如果显示器直接贴在人眼前,人眼看不到如此近距离的影响,所以VR突透镜片在设备中的意义在于通过折射光线将显示器上的图像拉近视网膜位置,让人的眼睛很容易看到几乎贴在眼前的显示屏。

4. 陀螺仪

如果要让VR如果设备显示器中的场景随着头部的运动而实时变化,必须知道头部的方向。比如你穿的时候VR设备向上看时,眼睛里的显示器,需要向你实时地显示虚拟世界中的天空,当你回头时,显示器则需要向你展示身后的景象,模拟真正的回头。而VR如何检测你的向上看动作?陀螺仪需要配合。这里就不介绍陀螺仪的具体原理了,你知道,它可以用来检测空间中人(物体)的姿势和方向。

当天只有360°显示不够,VR设备之所以给我们带来超强的沉浸感,是因为你不仅可以看到全方位的虚拟场景,还可以通过VR设备与虚拟场景实时交互,即VR游戏的真正魅力在于。

根据不同程度的可交互性,我们经常听到把手VR设备中涉及的3DOF和6DOF等说法。

dof:degree of freedom,即自由度。

其中3dof它指的是三个旋转角度的自由度 6dof 是指除了三个转角外,加上 与上下、前后、左右三个位置相关的自由度。

所以,当我们说的时候 3dof的VR眼镜或VR设备时,指的是VR该设备可以检测头部向不同方向自由旋转,但不能检测头部前后左右的空间位移。dof的VR除了检测头部旋转引起的视角变化外,设备(眼镜)还可以检测身体运动引起的上下左右位移的变化。

用更生动的图解释很容易理解:

3DOF的VR一般可以用来看设备VR为了在玩游戏时与场景互动,电影需要能够支持6DOF的VR只有这样,我们才能在游戏中体验到跨越障碍、避开子弹和怪物、跳楼、登山、滑雪等超真实感受。

二、什么是3Dof,6Dof, 9Dof

自由度(DoF)与空间中刚体的运动有关,可以解释为物体运动的不同基本方式。

共有6种自由度,可分为两种不同类型:平移和旋转。

#1

平移运动

Translational motion

在三个自由度中,刚体可以向前/向后、向上/向下、向左/向右移动。

#2

旋转运动

Rotary motion

刚体也可以在3个自由度中旋转:

俯仰-纵摇(Pitch)、偏航航向-垂摇(Yaw)、横滚翻滚-横摇(Roll)。

飞机动画展示如下:

pitch():俯仰,绕X轴旋转物体(localRotationX)


yaw():航向,绕Y轴旋转物体(localRotationY)


roll():横滚,将物体绕Z轴旋转(localRotationZ)

因此,三种类型的平移自由度 三种类型的旋转自由度 = 6自由度!

旋转自由度3Dof在VR坐标轴如下:

在任何自由度中,物体都可以沿着两个方向自由移动。例如,电梯仅限于一个自由度(垂直平移),但电梯可以在这个自由度中上下移动。同样,摩天轮仅限于一个自由度,但这是旋转自由度,因此摩天轮可以向相反的方向旋转。

我们可以继续举一个例子,比如主题公园。碰碰车有三个自由度:它只能在三轴中的两条中平移(不能像电梯一样上下移动);然后它只能以一种方式旋转(不能像飞机一样垂直和垂直)。所以两个平移 1个旋转=3自由度。

无论多么复杂,刚体的任何可能性运动都可以通过6自由度的组合来表达。例如,当你用球拍打网球时,球拍的复杂运动可以表示为平移和旋转的组合。

#3

惯性测量单元和自由度

nertial measurement unit and degrees of freedom

惯性测量单元(IMU)它是一种通过传感器组合(加速度计、陀螺仪和磁力计)来测量和报告速度、方向和重力的电子设备。IMU过去的主要应用之一是飞机仪表设备,但现在已经应用于智能手机等一系列电子设备。IMU成本大幅下降,映维网认为我们今天可以认为3DoF解决了定位问题。但遗憾的是,IMU在实际应用中,只能准确测量和报告方向值(旋转),不能处理平移。

#4

九自由度是什么?

Nine degrees of freedom

IMU的世界里出现了有趣的术语,比如一系列关于“9自由度”IMU但这是相当令人困惑的,因为总共只有自由。

基本上,很多IMU制造商生产9自由度一词来推销他们的产品,但这并不是真正的自由度。9自由主要是IMU自由度的总和可以在每个传感器中测量。比如,如果IMU配备3自由度加速度计、3自由度陀螺仪和3自由度磁力计,制造商可称之为9自由度IMU(九轴)。但这与现实不符,因为这三个传感器测量的是相同的3自由度(只有方向)。

一个9自由度IMU(九轴)可能比6自由度IMU(六轴)更好,因为它可以通过传感器融合(结合来自不同传感器的数据)来提高最终输出的质量。然而,这仍然无法测量平移。

三、欧拉角(姿态角)

莱昂哈德·欧拉用欧拉角来描述刚体在三维欧几里得空间的取向。对于任何参考系,一个刚体的取向,是依照顺序,从这参考系,做三个欧拉角的旋转而设定的。所以,刚体的取向可以用三个基本旋转矩阵来决定。换句话说,任何关于刚体旋转的旋转矩阵是由三个基本旋转矩阵复合而成的。

欧拉角 - 维基百科,自由的百科全书 (wikipedia.org)

三个欧拉角: ({\displaystyle \alpha ,\ \beta ,\ \gamma }蓝色的轴是xyz-轴,红色的轴是XYZ-坐标轴。绿色的线是交点线 (N)。

欧拉角动画

 

单位四元数,又称欧拉参数,提供另外一种方法来表述三维旋转。这与特殊酉群的描述是等价的。四元数方法用在大多数的演算会比较快捷,概念上比较容易理解,并能避免一些技术上的问题,如万向现象。因为这些原因,许多高速度三维图形程式制作都使用四元数。

四、Android手机的欧拉角与坐标系

在安卓的官方文档中,IMU的 坐标系是这样的:

手机定义的坐标系统:X轴是水平且指向右边,Y轴是垂直且指向前方,Z轴指向屏幕的正面正上方。

当手机左右摇摆时(绕 y 轴旋转),得到变化的 滚转角Φ(roll),范围为 (-90 to 90)
当手机前后摇摆时(绕 x 轴旋转), 得到变化的 俯仰角θ(pitch) ,范围为 (-180 to 180)当手机横屏转换成竖屏或竖屏转换成横屏时(绕 z 轴旋转),即得到变化的 偏航角ψ(yaw)。

安卓手机IMU坐标系

所以如果是后置摄像头的话,那么相机 轴与IMU 轴一致,相机 轴与 IMU 轴相反。相机 轴也与 IMU的 轴相反。其实就是有一个绕IMU 轴的180度旋转。

实际情况可能有一点误差,需要标定。当然相机坐标系和IMU坐标系除了旋转外,还有平移。这个平移量不同的手机也是不一样的。

五、安卓坐标系转换欧拉角

本文链接:安卓坐标系转换之二:旋转角(欧拉角)_落日之城-CSDN博客_android 坐标旋转

欧拉角是按照既定的顺序,如依次绕z,y,x分别旋转一个固定角度,使用roll,yaw ,pitch分别表示物体绕,x,y,z的旋转角度,可以完成一个坐标系转换成另一个坐标系。
但是在安卓中,这里的角度定义有所不同,原文如下:

Note: This definition is different from yaw, pitch and roll used in aviation where the X axis is along the long side of the plane (tail to nose).
也就是说,X轴与航空系统所定义的不同。安卓里的X轴是短边。

具体如下图:

注: 图中旋转方向只是示意方向,不是指定的正方向!!!

当手机坐标系与地球坐标系重合时,三个角度都为0。

  • Azimuth:绕z轴旋转,磁北与y轴的夹角,顺时针增大,0到359度。
  • Pitch:绕x轴旋转的角度,即手机上下旋转,y轴往z轴方向为正。-180到180度。
  • Roll:绕y轴旋转的角度, 即手机的左右旋转,顺时针为正,-90到90度。

看一下getgetOrientation()方法,求出手机坐标系相对于世界坐标系三个轴的旋转角。

 public static float[] getOrientation(float[] R, float[] values) {
        /*
         * 4x4 (length=16) case:
         *   /  R[ 0]   R[ 1]   R[ 2]   0  \
         *   |  R[ 4]   R[ 5]   R[ 6]   0  |
         *   |  R[ 8]   R[ 9]   R[10]   0  |
         *   \      0       0       0   1  /
         *
         * 3x3 (length=9) case://上篇文章讲到的旋转矩阵
         *   /  R[ 0]   R[ 1]   R[ 2]  \
         *   |  R[ 3]   R[ 4]   R[ 5]  |
         *   \  R[ 6]   R[ 7]   R[ 8]  /
         *
         */
        if (R.length == 9) {
            values[0] = (float) Math.atan2(R[1], R[4]);//azimuth
            values[1] = (float) Math.asin(-R[7]);//pitch
            values[2] = (float) Math.atan2(-R[6], R[8]);//roll
        } else {
            values[0] = (float) Math.atan2(R[1], R[5]);
            values[1] = (float) Math.asin(-R[9]);
            values[2] = (float) Math.atan2(-R[8], R[10]);
        }
        return values;
    }

这里三个角的计算不大好理解,我画几个示意图大致讲一下我的看法。
还望大家一起讨论。
首先复习一下上一节R矩阵的内容:

R[0] = Hx;     R[1] = Hy;     R[2] = Hz;//【地球坐标系】X方向,指东
R[3] = Mx;     R[4] = My;     R[5] = Mz;//【地球坐标系】Y方向,指北
R[6] = Ax;     R[7] = Ay;     R[8] = Az;//【地球坐标系】Z反方向,向下

首先看azimuth,代码如下:

 values[0] = (float) Math.atan2(R[1], R[4]);

也就是arctan2(Hy,My)。 Hy是【地球坐标系】指向东的单位向量在【手机坐标系】Y轴上的分量。
同样地,My是【地球坐标系】指向北的单位向量在【手机坐标系】Y轴上的分量。
azimuth是绕z轴旋转,磁北与y轴的夹角,顺时针增大,0到359度。这里用了atan2函数,因为atan只可以表示−90o到90o−90o到90o,atan2可以表示−180o到180o−180o到180o。具体详细的区别可以看这里。
示意图如下:

pitch的代码如下:

values[1] = (float) Math.asin(-R[7]);

也就是arcsin(-Ay).Ay是【地球坐标系】指向下(重力)的单位向量在【手机坐标系】Y轴上的分量。示意图如下:

roll的代码如下:

 values[2] = (float) Math.atan2(-R[6], R[8]);

也就是arctan2(-Ax,Az).Ax【地球坐标系】指向下(重力)的单位向量在【手机坐标系】x轴上的分量。Az是【地球坐标系】指向下(重力)的单位向量在【手机坐标系】z轴上z的分量。
示意图如下:

这里需要指出的是,这个图的俯视方向是沿着y轴的正方向,所以本来是顺时针为正,这里是逆时针为负,所以也要加负号。

六、根据姿态四元数求视图矩阵

姿态解算3-四元数与旋转矩阵 - 知乎 (zhihu.com)

根据姿态四元数q0,q1,q2,q3求出视图矩阵。

(待续...)


 

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章