陀螺仪属性介绍和实战
Posted 怪诞咖啡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了陀螺仪属性介绍和实战相关的知识,希望对你有一定的参考价值。
- 陀螺仪属性介绍和实战
- 什么是陀螺仪?
- 陀螺仪的分类
- 陀螺仪的作用
- 手机陀螺仪的作用
- deviceorientation事件
- devicemotion事件
什么是陀螺仪?
陀螺仪又叫角速度传感器,是不同于加速度计(G-sensor)的,他的测量物理量是偏转、倾斜时的转动角速度。在手机上,仅用加速度计没办法测量或重构出完整的3D动作,测不到转动的动作的,G-sensor只能检测轴向的线性动作。但陀螺仪则可以对转动、偏转的动作做很好的测量,这样就可以精确分析判断出使用者的实际动作。而后根据动作,可以对手机做相应的操作![百度百科]
陀螺仪的分类
- 压电陀螺仪
- 微机械陀螺仪
- 光纤陀螺仪
- 激光陀螺仪
陀螺仪的作用
- 陀螺仪器能提供准确的方位、水平、位置、速度和加速度等信号,以便驾驶员或用自动导航仪来控制飞机、舰船或航天飞机等航行体按一定的航线飞行。
- 作为稳定器,陀螺仪器能使列车在单轨上行驶,能减小船舶在风浪中的摇摆,能使安装在飞机或卫星上的照相机相对地面稳定等等。
- 作为精密测试仪器,陀螺仪器能够为地面设施、矿山隧道、地下铁路、石油钻探以及导弹发射井等提供准确的方位基准。
手机陀螺仪的作用
- 通过陀螺仪,能够对手机的偏转角度、速度、时间等进行测量,从而实现对游戏视野的变化和车辆方向速度的改变,让游戏的体验有了质的提升!
- 能够帮助摄像头进行防抖,通俗来说就是当你按下快门的那一刻,陀螺仪检测手机抖动的角度,然后根据角度来算出镜头模组需要补偿的距离,让镜头通过反向运动来抵消手机的抖动,从而实现镜头在拍摄的那一刻的绝对静止,提高成片率。
- 辅助GPS导航,在某些gps信号弱或者无信号的地方,比如隧道等,手机就可以根据之前定位的地点和陀螺仪检测的运动速度和时间和方向,推算出当前的位置,来达到暂时定位的目的。
deviceorientation事件
先来个激发兴趣的例子:根据手机旋转移动而变化的骰子
deviceorientation事件:是在加速计检测到设备方向变化时在window对象上触发,不过,deviceorientation事件的意图是告诉开发人员设备在空间中朝向哪儿,而不是如何移动
三维空间中xyz三轴定位:
- x轴方向是从左往右
- y轴方向是从下往上
- z轴方向是从后往前
为了方便说明:引入三轴实际旋转手势表示图,经过真机测试,所有轴都是按照逆时针旋转
事件对象包含的属性:
- alpha:围绕Z轴旋转,Y轴的度数差;范围介于:0-360之间的浮点数
- beta:围绕X轴旋转,Z轴度数差;范围介于:-180度-180度之间的浮点数
- gamma:围绕Y轴旋转,Z轴度数差;范围介于:-90度-90度之间的浮点数
- absolute:布尔值,表示设备是否返回一个绝对值
- compassCalibrated:布尔值,表示设备的指南针是否校准过
- webkitCompassHeading:与正北方向的角度差值。正北为0度,正东为90度,正南为180度,正西为270度。因为0度是正北,所以叫指北针,不是指南针
- webkitCompassAccuracy:指北针的精确度,表示偏差为正负多少度。一般是10
手机上的指南针,其实就是指北针,ios端使用alpha角不对,应该使用webkitCompassHeading来获得真实的旋转角度,真机测试的时候发现使用alpha角,进入界面时候,手机顶部方向对着的方位默认为正北,这明显是不对的;安卓端使用alpha是对的,当然也不支持webkitCompassHeading;W3C上还有关于罗盘航向的计算公式等相关信息和资料,对于这个属性的使用和探索到目前的位置暂时可以了
devicemotion事件
devicemotion事件是要告诉开发人员设备什么时候移动,而不仅仅是设备方向如何改变。如:检测设备是不是正在往下掉、检测设备是不是被走着的人拿在手里
事件对象包含4个属性:
- acceleration:一个包含x、y、z属性的对象,在不考虑重力的情况下,告诉开发者在每个方向上的加速度
- accelerationIncludingGravity:一个包含x、y、z属性的对象,在考虑z轴自然重力加速度的情况下,告诉开发者每个方向上的加速度
- interval:以毫秒表示的时间值,必须在另一个devicemotion事件触发前传入。这个值在每个事件是一个常量
- rotationRate:一个包含表示方向的alpha、beta、gamma属性的对象
摇一摇实际例子:
<script>
if (window.DeviceMotionEvent) {
window.addEventListener(‘devicemotion‘, deviceMotionHandler, false);
}
var speed = 30; //speed
var x = y = z = lastX = lastY = lastZ = 0;
function deviceMotionHandler(eventData) {
var acceleration = eventData.accelerationIncludingGravity;
x = acceleration.x;
y = acceleration.y;
z = acceleration.z;
if (Math.abs(x - lastX) > speed || Math.abs(y - lastY) > speed || Math.abs(z - lastZ) > speed) {
//简单的摇一摇触发代码
alert(‘摇一摇成功‘);
}
lastX = x;
lastY = y;
lastZ = z;
}
</script>
说明:当xyz任意方向上的加速大大于30(任意设置,设置大一点能治肩周炎,哈哈)的时候,触发成功
以上是关于陀螺仪属性介绍和实战的主要内容,如果未能解决你的问题,请参考以下文章
RK3399平台开发系列讲解(内核驱动外设篇)6.35IAM20680陀螺仪介绍