最近在做一个类似VR照片的demo,跟全景图片也很像,只是VR照片与全景720度显示,我只做了180度。但我发现他们实现的原理有一丝相似,希望可以给一些想入行AR、VR的朋友一些提示吧。
要想根据用户摇晃手机的行为轨迹展示相应的场景,那必须要使用移动端的陀螺仪、加速器等传感器来做相应的协调。现在的移动端已经提供了很多传感器,你可以根据自己的需要获取相应的数据。
刚开始的时候,我使用传感器提供的姿态角,也称为欧拉角:pitch yaw roll 来显示。这种 姿态角/欧拉角 比较常用在航空上,无人机技术应该也使用到了这个技术点。我用飞机的模型来展示一下这三个角,就一目了然了(不同作者使用不同的坐标系,使用哪种坐标系,个人而定。):
图一
姿态角/欧拉角 在数学上理解起来会有点抽象,我也是稍理解一点。在维基百科上,欧拉角定义为:用来描述刚体在三维欧几里得空间的取向 ,对于任何参考系,一个刚体的取向,是依照顺序,从这参考系,做三个欧拉角的旋转而设定的。有兴趣了解得深入一点,可以参考(需翻墙):
https://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E8%A7%92
我们也可以简单理解这三个角代表什么意思:
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

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

  1. 「 机器人学 」“姿态角 roll、yaw、pitch”讲解

    一.前言 载体坐标系与载体坐标系的关系是三个Euler角:yaw,pitch,roll,反应了载体相对基准面的姿态. 二.姿态角讲解 1. pitch是围绕X轴旋转,也叫做俯仰角.当X轴的正半轴位于过 ...

  2. roll,pitch,yaw

    转自:https://stackoverflow.com/questions/23009549/roll-pitch-yaw-calculation Your equations are correc ...

  3. 欧拉角roll pitch yaw

    老是把roll pitch yaw弄混,特此记录一下: roll是绕X轴旋转,pitch绕Y轴旋转,yaw绕Z轴旋转: 如果三轴相乘,就是yaw*pitch*roll 飞行器控制中的欧拉角(roll, ...

  4. 什么是姿态角(Euler角)pitch yaw roll

    Z轴正方向为前进方向pitch():俯仰,将物体绕X轴旋转(localRotationX) 百度上居然搜不到俯仰滚转和偏航的定义,可见大家的浮躁了,没事摇一摇都不干正事了,整理了一下资料,公布给大家. ...

  5. 飞行器控制中的欧拉角(roll, pitch, yaw)

    简言之,pitch是俯仰角,是"点头" yaw是偏航角,是'摇头' roll是旋转角,是"翻滚" 欧拉角是表达旋转的最简单的一种方式,形式上它是一个三维向量,其 ...

  6. MPU9250 使用 DMP 输出姿态角:DMP 库到 STM32 平台移植笔记

    本文开发环境: MCU型号:STM32F103C8T6 IDE环境: MDK 5.27 代码生成工具:STM32CubeMx 5.6.1 HAL库版本:STM32Cube_FW_F1_V1.8.0 本 ...

  7. STM32实现四驱小车(三)传感任务——姿态角解算

    目录 一. 绪论 二. 惯性传感器测量原理 1. 三轴加速度计 2. 三轴陀螺仪 3. 三轴磁力计 三. 状态估计 1. 姿态估计 (1)线性互补滤波器 (2)非线性互补滤波器 (3)卡尔曼滤波器 2 ...

  8. Ardupilot飞控姿态角与姿态角速度控制过程

    目录 目录 摘要 1.自稳模式初始化 2.自稳模式更新函数 这个代码主要把横滚输入,俯仰输入量转换成目标角度需要的范围,也就是+4500,-4500 3.姿态角速度代码控制过程分析 4.电机PWM控制 ...

  9. 十二.四轮车驱动开发之五: 由浅至深理解6轴陀螺仪姿态解算算法<上>

    这是"四轮车驱动控制"系列,分多个小节来介绍: 1. 八.四轮车驱动开发之一:正/逆向运动学分析 2. 九.四轮车驱动开发之二: 配置PWM驱动直流电机 3. 十.四轮车驱动开发之 ...

最新文章

  1. Classifying dynamic textures via spatiotemporal fractal analysis(许教授)
  2. 鼎尚影院计算机售票管理系统,电影院售票管理信息系统
  3. 冰刃——IceSword
  4. 读取excel日期 c++_实例9:用Python自动生成Excel档每日出货清单
  5. 一个可以在github上搜代码段的网站
  6. Druid 配置_DruidDataSource参考配置
  7. jQuery学习之七---CSS
  8. coreboot学习1:编译并使用qemu模拟
  9. 在DataGrid和GridView中对表头设定背景图片
  10. 使用Autodesk Vault插件向导轻松创建Vault插件
  11. CodeMirror自动提醒配置
  12. Navicat Premium For Mac破解版
  13. dell 服务器 重装Linux系统
  14. 手把手教你画架构图,看一次就会了!
  15. 如何快速定位页面(江湖故人就是个铁憨憨)即时相关性?
  16. 福大软工 · 第八次作业 课堂实战+后续部分
  17. css保持图片原始比例
  18. c++中字符数组与字符串的转换
  19. 剑指 Offer 61-68
  20. linux下Dnw配置(mini2440)

热门文章

  1. C# 实现HttpGet请求
  2. STM32 正弦波输出
  3. 如何简单高效的进行系统维护——延时任务及定时任务
  4. Unity3D中的空间与运动
  5. 楚留香水龙吟是正版服务器吗,楚留香手游哪些服务器是互通的 安卓/ios互通服务器汇总一览...
  6. Error response from daemon: manifest for nvidia/cuda:latest not found: manifest unknown: manifest
  7. 使用mysql_upgrade命令_mysql_upgrade命令
  8. svn upgrade
  9. linux 无法识别NTFS格式的u盘
  10. 重复数据删除和压缩处理