简单VR照片 使用陀螺仪、姿态角(Roll、Pitch、Yaw )、四元数实现

最近在做一个类似VR照片的demo,跟全景图片也很像,只是VR照片与全景720度显示,我只做了180度。但我发现他们实现的原理有一丝相似,希望可以给一些想入行AR、VR的朋友一些提示吧。

要想根据用户摇晃手机的行为轨迹展示相应的场景,那必须要使用移动端的陀螺仪、加速器等传感器来做相应的协调。现在的移动端已经提供了很多传感器,你可以根据自己的需要获取相应的数据。

刚开始的时候,我使用传感器提供的姿态角,也称为欧拉角:pitch yaw roll 来显示。这种 姿态角/欧拉角 比较常用在航空上,无人机技术应该也使用到了这个技术点。我用飞机的模型来展示一下这三个角,就一目了然了(不同作者使用不同的坐标系,使用哪种坐标系,个人而定。):

图一
姿态角/欧拉角 在数学上理解起来会有点抽象,我也是稍理解一点。在维基百科上,欧拉角定义为:用来描述刚体在三维欧几里得空间的取向 对于任何参考系,一个刚体的取向,是依照顺序,从这参考系,做三个欧拉角的旋转而设定的。有兴趣了解得深入一点,可以参考(需翻墙):

我们也可以简单理解这三个角代表什么意思:

1、 俯仰角θ( pitch ): 围绕Y轴旋转的。

图二
2、偏航角ψ(yaw):围绕Z轴旋转的角度。

图三
3、滚转角Φ(roll):围绕X轴旋转的角度。


图四

手机的坐标系:
                                 
手机定义的坐标系统:X轴是水平且指向右边,Y轴是垂直且指向前方,Z轴指向屏幕的正面正上方。
当手机左右摇摆时(绕 y 轴旋转),得到变化的 滚转角Φ(roll),范围为 (-90 to 90)
当手机前后摇摆时(绕 x 轴旋转), 得到变化的 俯仰角θ(pitch) ,范围为 (-180 to 180)
当手机横屏转换成竖屏或竖屏转换成横屏时(绕 z 轴旋转),即得到变化的 偏航角ψ(yaw)。

当手机旋转得到相应的角度时,我们把屏幕的图片替换成相应角度的图片,这让你感觉身临其境,屏幕里的场景会跟着我们视觉和谐变化,这就是VR大概实现的原理吧。

Android提供了类似这个 姿态角/欧拉角 的数据,但两者有些区别,Android 把 偏航角ψ(yaw)定义为 方位角 Azimuth。具体可查看Android官方文档: https://developer.android.google.cn/reference/android/hardware/SensorEvent.html#values
接收的传感器类型为: Sensor.TYPE_ORIENTATION (Android官方已经摈弃,换了其它方法来获取)

使用这种方式去获取的数据有些波动,当拿着手机不动的时候,数据有时变化也比较大,所以后期我改用了 四元数 来处理这个问题。后来听说了一个方案,通过滤波方法,可以把 姿态角/欧拉角 一些波动比较大的数据过滤点, 得到的数据就比较平滑了。(这个方式,我还没有去试,大家可以去了解了解)

使用 “四元数” 也可以实现。四元数理解起来也很抽象:简单的超复数 是复数的不可交换延伸。

我是这么简单理解:我们都知道向量,向量是用来形容一个二维空间的轨迹与方向, 形象化地表示为带箭头的线段。四元数则表示为在一个四维空间的轨迹与方向。

来看一个四元数的表现形式:

公式一
这是 A 到 B 的四元数表示,由四个元素组成的数组。我主要讲一些实现方法,里面有一些名词的含义,需要大家找其它的资料慢慢参透。

我们再来看一个公式,x、y、z轴的偏移量分别为:
                      
公式二
由该公式我们看得出,只要知道一个四元数的值, 我们就能算出 A 到 B 的x、y、z轴的偏移量。

我们从陀螺仪传感器获得的四元数数据,是相对于手机平放在桌面的 xyz 轴的偏移量,我们需要转换成相对上一个位置的偏移量,然后根据偏移量更换相应的图片。

现在我们看一下,怎么获取相对的偏移量:
在平面二维向量中,我们知道向量的运算: 向量AC = 向量AB + 向量BC

公式三

那么在四元数中,我们假设从传感器获取到
第一个 四元数为
假设A点原点,即手机平放在桌面水平位置上。第二个四元数为:
我们需要得到四元数:
这样才能算出B 到C 的相对 xyz 轴相对位移。通过下面公式可以得到
        
         
公式四


现在知道
由下面公式可以得到:

公式五
从A到B的 四元数 转换成 B到A 的四元数公式,只需把第二、第三、第四个元素取负。

知道了
我们用 公式四 得出 ,然后通过公式二求出 xyz 轴的偏移量。
四元数 x 轴的偏移量 与 欧拉角的 俯仰角θ( pitch )类似,都是指手机竖屏时,左右摇摆的数值。
四元数 y 轴的偏移量 与 欧拉角的滚转角Φ(roll) 类似,都是指手机竖屏时,前后摇摆的数值。
四元数 z 轴的偏移量 与 欧拉角的偏航角ψ(yaw) 类似,都是指手机竖屏时,左右旋转的数值。

在移动端比较常用到 x、y轴偏移量,就是手机左右摇摆与前后摇摆间的偏移。

我做了一个Android demo,用的就是四元数 实现方案,通过四元数得到的y轴偏移量,不断替换图片。

<-------------------------------
当手机横屏,向左倾斜的时候,就会看到右边的视野。也就是判断y轴的相对偏移量,替换不同角度的图片。(gif 图做得有些卡顿,demo里的例子就平滑多了)


-------------------------------->
当手机横屏,向右倾斜的时候,就会看到左边的视野。

demo 链接:https://github.com/xiaoxiaoqingyi/VRPhoto
### 回答1: MPU6050是一种常见的三轴陀螺仪和三轴加速度计传感器,DMP(数字运动处理器)是其内部的处理单元,可用于读取和处理MPU6050的数据。 要利用DMP读取MPU6050的四元数pitchrollyaw(俯仰、横滚和偏航),可以按照以下步骤进行: 1. 初始化MPU6050和DMP:首先,需要连接MPU6050传感器到微控制器或单片机上,并通过相应的接口初始化MPU6050和DMP。这可以通过使用合适的库或驱动程序来实现。 2. 启用DMP功能:通过在代码中调用相应的功能函数或设置相应的参数,启用DMP功能。这将使DMP开始读取和处理MPU6050的原始数据。 3. 获取四元数数据:使用MPU6050的DMP功能,可以通过调用相应的函数或方法来获取当前的四元数数据。四元数表示空间中物体的旋转姿态,可以通过计算来得到。将四元数的四个分量(通常是w、x、y、z)保存在适当的变量中。 4. 计算俯仰、横滚和偏航:根据得到的四元数数据,可以通过相应的计算公式计算出俯仰、横滚和偏航。具体的计算方法可以在MPU6050的文档或相关资料中找到。这些度表示物体相对于参考坐标系的旋转姿态。 5. 数据处理和应用:根据需要,可以进一步处理或应用这些度数据。例如,可以将这些度数据用于自动平衡机器人或其他姿态控制应用中。 总结起来,要利用DMP读取MPU6050的四元数和俯仰、横滚和偏航,需要初始化MPU6050和DMP,并通过调用相应的函数获取数据,然后根据计算公式得到所需的度信息。这些度数据可以用于各种姿态控制和导航应用中。 ### 回答2: MPU6050是一种常用的六轴惯性测量单元,可以通过数字运动处理器(DMP)读取四元数(四维向量)和姿态pitchrollyaw)。MPU6050的四元数提供了物体在三维空间中的旋转姿态信息,通过四元数可以计算出姿态。为了读取MPU6050的四元数姿态,可以按照以下步骤进行操作: 1. 连接MPU6050模块:将MPU6050模块的SDA和SCL引脚分别连接到微控制器(例如Arduino)的对应引脚,同时连接模块的VCC和GND引脚到电源。 2. 初始化I2C通信:使用微控制器上的I2C库函数初始化I2C通信,设置MPU6050的I2C地址和传输速率。 3. 设置MPU6050的DMP功能:使用MPU6050库函数设置MPU6050的DMP功能,使其可以自动计算四元数姿态。 4. 读取四元数值:使用MPU6050库函数读取MPU6050模块的四元数值,存储到相应的变量中。 5. 计算姿态:根据四元数的值,使用相关的数学公式计算出姿态,例如使用欧拉角pitchrollyaw)或其他旋转矩阵的方法。 6. 输出数据:将计算得到的四元数姿态值输出到需要的地方,例如通过串口发送给计算机进行显示或保存。 需要注意的是,读取MPU6050的四元数姿态的准确性和平滑度取决于DMP的配置和采样率,以及硬件设备的准确性。在实际应用中,可能需要根据具体情况进行一些调试和优化,以获得更精确和稳定的姿态数据。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值