• Sensor.TYPE_GYROSCOPE

陀螺仪就是内部有一个陀螺,它的轴由于陀螺效应始终与初始方向平行,这样就可以通过与初始方向的偏差计算出实际方向。手机里陀螺仪实际上是一个结构非常精密的芯片,内部包含超微小的陀螺。

陀螺仪测量是参考标准是内部中间在与地面垂直的方向上进行转动的陀螺。通过设备与陀螺的夹角得到结果。

陀螺仪的强项在于测量设备自身的旋转运动。对设备自身运动更擅长。但不能确定设备的方位。

陀螺仪对设备旋转角度的检测是瞬时的而且是非常精确的,能满足一些需要高分辨率和快速反应的应用比如FPS游戏的瞄准。而且陀螺仪配合加速计可以在没有卫星和网络的情况下进行导航,这是陀螺仪的经典应用。同时处理直线运动和旋转运动时,就需要把加速度和陀螺仪计结合起来使用。如果还想设备在运动时不至于迷失方向,就再加上磁力计。

因为手机运动的加速度不高,精确度也没有太大的要求,用加速计替代陀螺仪也可以。但如果做一些精度比较高的游戏的话,最好还是有陀螺仪。

陀螺仪的XYZ分别代表设备围绕XYZ三个轴旋转的角速度:radians/second。至于XYZ使用的坐标系与gsensor相同。逆时针方向旋转时,XYZ的值是正的。

所以需要角速度与时间积分计算角度,得到的角度变化量与初始角度相加,就得到目标角度,其中积分时间Dt越小,输出角度越准 
但陀螺仪的原理决定了它的测量基准是自身,并没有系统外的绝对参照物,加上Dt是不可能无限小 
所以积分的累积误差会随着时间流逝迅速增加,最终导致输出角度与实际不符,所以陀螺仪只能工作在相对较短的时间尺度内

下面是使用陀螺仪进行开发时的演示代码:

/**

 * 功能:采集加速度传感器,磁场传感器和陀螺仪传感器的数据,得到传感器从外界采集数据的时间间隔

 * @authorjarlen

 *

 */

publicclass MainActivityextends Activityimplements SensorEventListener {

private SensorManagersensorManager;

private SensormagneticSensor;

private TextViewshowTextView;

private SensoraccelerometerSensor;

private SensorgyroscopeSensor;

// 将纳秒转化为秒

privatestatic finalfloat NS2S = 1.0f / 1000000000.0f;

privatefloattimestamp;

privatefloatangle[] =newfloat[3];

@Override

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

showTextView = (TextView) findViewById(R.id.showTextView);

sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

magneticSensor =sensorManager

.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

accelerometerSensor =sensorManager

.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

gyroscopeSensor =sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);

//注册陀螺仪传感器,并设定传感器向应用中输出的时间间隔类型是SensorManager.SENSOR_DELAY_GAME(20000微秒)

//SensorManager.SENSOR_DELAY_FASTEST(0微秒):最快。最低延迟,一般不是特别敏感的处理不推荐使用,该模式可能在成手机电力大量消耗,由于传递的为原始数据,诉法不处理好会影响游戏逻辑和UI的性能

//SensorManager.SENSOR_DELAY_GAME(20000微秒):游戏。游戏延迟,一般绝大多数的实时性较高的游戏都是用该级别

//SensorManager.SENSOR_DELAY_NORMAL(200000微秒):普通。标准延时,对于一般的益智类或EASY级别的游戏可以使用,但过低的采样率可能对一些赛车类游戏有跳帧现象

//SensorManager.SENSOR_DELAY_UI(60000微秒):用户界面。一般对于屏幕方向自动旋转使用,相对节省电能和逻辑处理,一般游戏开发中不使用

sensorManager.registerListener(this,gyroscopeSensor,

SensorManager.SENSOR_DELAY_GAME);

sensorManager.registerListener(this,magneticSensor,

SensorManager.SENSOR_DELAY_GAME);

sensorManager.registerListener(this,accelerometerSensor,

SensorManager.SENSOR_DELAY_GAME);

}

//坐标轴都是手机从左侧到右侧的水平方向为x轴正向,从手机下部到上部为y轴正向,垂直于手机屏幕向上为z轴正向

@Override

publicvoid onSensorChanged(SensorEvent event) {

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

// x,y,z分别存储坐标轴x,y,z上的加速度

float x = event.values[0];

float y = event.values[1];

float z = event.values[2];

// 根据三个方向上的加速度值得到总的加速度值a

float a = (float) Math.sqrt(x * x + y * y + z * z);

System.out.println("a---------->" + a);

// 传感器从外界采集数据的时间间隔为10000微秒

System.out.println("magneticSensor.getMinDelay()-------->"

+magneticSensor.getMinDelay());

// 加速度传感器的最大量程

System.out.println("event.sensor.getMaximumRange()-------->"

+ event.sensor.getMaximumRange());

System.out.println("x------------->" + x);

System.out.println("y------------->" + y);

System.out.println("z------------->" + z);

Log.d("jarlen","x------------->" + x);

Log.d("jarlen","y------------>" + y);

Log.d("jarlen","z----------->" + z);

//showTextView.setText("x---------->" + x + "\ny-------------->" +

//y + "\nz----------->" + z);

}else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {

// 三个坐标轴方向上的电磁强度,单位是微特拉斯(micro-Tesla),用uT表示,也可以是高斯(Gauss),1Tesla=10000Gauss

float x = event.values[0];

float y = event.values[1];

float z = event.values[2];

// 手机的磁场感应器从外部采集数据的时间间隔是10000微秒

System.out.println("magneticSensor.getMinDelay()-------->"

+magneticSensor.getMinDelay());

// 磁场感应器的最大量程

System.out.println("event.sensor.getMaximumRange()----------->"

+ event.sensor.getMaximumRange());

System.out.println("x------------->" + x);

System.out.println("y------------->" + y);

System.out.println("z------------->" + z);

//

// Log.d("TAG","x------------->" + x);

// Log.d("TAG", "y------------>" + y);

// Log.d("TAG", "z----------->" + z);

//

// showTextView.setText("x---------->" + x + "\ny-------------->" +

// y + "\nz----------->" + z);

}else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {

//从 x、y、z 轴的正向位置观看处于原始方位的设备,如果设备逆时针旋转,将会收到正值;否则,为负值

if(timestamp != 0){ 

// 得到两次检测到手机旋转的时间差(纳秒),并将其转化为秒

finalfloat dT = (event.timestamp -timestamp) * NS2S;

// 将手机在各个轴上的旋转角度相加,即可得到当前位置相对于初始位置的旋转弧度

angle[0] += event.values[0] * dT;

angle[1] += event.values[1] * dT;

angle[2] += event.values[2] * dT;

// 将弧度转化为角度

float anglex = (float) Math.toDegrees(angle[0]);

float angley = (float) Math.toDegrees(angle[1]);

float anglez = (float) Math.toDegrees(angle[2]);

System.out.println("anglex------------>" + anglex);

System.out.println("angley------------>" + angley);

System.out.println("anglez------------>" + anglez);

System.out.println("gyroscopeSensor.getMinDelay()----------->" +

gyroscopeSensor.getMinDelay());

}

//将当前时间赋值给timestamp

timestamp = event.timestamp;

}

}

@Override

publicvoid onAccuracyChanged(Sensor sensor, int accuracy) {

//TODO Auto-generated method stub

}

@Override

protectedvoid onPause() {

//TODO Auto-generated method stub

super.onPause();

sensorManager.unregisterListener(this);

}

}

加速度传感器,磁场传感器和陀螺仪传感器案例相关推荐

  1. 安卓传感器全解:注册、注销传感器、监听传感器,距离传感器、方向传感器、陀螺仪、加速计、磁场、气压传感器

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓传感器全解:注册.注销传感器.监听传感器.距离传感器.方向传感器.陀螺仪.加速计.磁场.气压传感器. 注册.注销.监听传感器 1.自定义传感器监听 ...

  2. 三轴加速度传感器和六轴惯性传感器_一文读懂三轴,六轴,MEMS陀螺仪(角速率传感器)的区别...

    原标题:一文读懂三轴,六轴,MEMS陀螺仪(角速率传感器)的区别 随着现代科技的不断发展,陀螺仪也被应用到越来越多的领域和行业,例如我们常见纸飞机等飞行类游戏,赛车类游戏等.以陀螺仪为核心的惯性制导系 ...

  3. Android传感器——传感器监听器及摇一摇案例

    接上<Android传感器--获取本机传感器> https://blog.csdn.net/nishigesb123/article/details/90143498 部分参考:https ...

  4. 三轴加速度传感器和六轴惯性传感器_一文读懂汽车MEMS惯性传感器的七大应用(上)...

    本文中,我们将研究汽车MEMS惯性传感器的应用,描述它们的工作原理,并讨论如何利用MEMS惯性传感器来实现更大的应用改进. 当前,微机电系统(MEMS)传感器已被大多数汽车工程师视为尖端技术或边缘技术 ...

  5. 一种基于陀螺仪传感器的准确计步器算法

    一种基于陀螺仪传感器的准确计步器算法 A Gyroscope Based Accurate Pedometer Algorithm 作者:Sampath Jayalath.Nimsiri Abhaya ...

  6. 重力加速度陀螺仪传感器MPU-…

    原文地址:重力加速度陀螺仪传感器MPU-6050(一)作者:liuzhangchao MPU-60X0 对陀螺仪和加速度计分别用了三个16 位的ADC,将其测量的模拟量转化 为可输出的数字量.为了精确 ...

  7. 重力加速度陀螺仪传感器MPU-6050

    MPU-60X0 对陀螺仪和加速度计分别用了三个16 位的ADC,将其测量的模拟量转化 为可输出的数字量.为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250,±50 ...

  8. 手机中陀螺仪传感器的四大作用

    核心提示:陀螺仪传感器可以全方位的感受空间上位移的变化维较少,最早应用于航空.航天和航海等领域.随着陀螺仪传感器成本的下降,现在很多智能手机都集成有陀螺 陀螺仪传感器可以全方位的感受空间上位移的变化维 ...

  9. Android传感器之陀螺仪传感器

    代码片段,双击复制 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ...

  10. I2C通信之Arduino 陀螺仪传感器ITG3205

    topic I2C通信之Arduino与陀螺仪传感器ITG3205 I2C通信之Arduino与陀螺仪传感器ITG3205 转载自:https://www.geek-workshop.com/thre ...

最新文章

  1. 把握每天的第一个钟头
  2. quick-cocos2d-x教程12:实现文本和password输入界面
  3. local_response_normalization 和 batch_normalization
  4. 简单的shell脚本实例
  5. 个人阅读的Deep Learning方向的paper整理
  6. AI降成本利器!阿里云弹性加速计算实例来了,最高节省50%推理成本
  7. mybatis中转义 大于,小于,大于等于,小于等于
  8. python的xlwt库的作用_Python:使用第三方库xlwt来写Excel
  9. Java 学习经验[转]
  10. Java绿盾解密- Ldterm(绿盾加密文件解密)
  11. 葛道辉,李洪升,张亮,等. 轻量级神经网络架构综述
  12. 题解 【NOIP2016】魔法阵
  13. 中兴2618交换机的STP环网基本操作
  14. BUUCTF_Crypto_[MRCTF2020]天干地支+甲子
  15. matlab的title太长,如何换行?
  16. chrome添加右键菜单收藏CSDN文章到我的博客
  17. 天天特惠系统秒杀优化方案
  18. 重磅!两万字长文总结,梳理 Java 入门进阶哪些事(推荐收藏)
  19. 彪哥情人节期间征女友一名铃声 彪哥情人节期间征女友一名手机...
  20. MySQL批量入库的几种方式详解

热门文章

  1. oracle学习笔记 学习前奏
  2. 8个免费在线PDF转Word工具,一键轻松转换
  3. 思科简单教程CCNA
  4. PHP实现zip字典破解
  5. windows黑客编程系列(一):运行单一实例
  6. java程卫琴_43名基层工会干部在“机关开放日”走进安徽省总工会参观并座谈
  7. 韩顺平Java笔记(自用1)
  8. SOLA(苏拉)病毒
  9. SQL Server安装教程
  10. 腾讯x5内核(TBS)简单集成封装