• Sensor.TYPE_GYROSCOPE

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

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

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

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

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

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

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

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

private static final float NS2S = 1.0f / 1000000000.0f;
private float timestamp;
public void onSensorChanged(SensorEvent event)
{
   if (timestamp != 0) {
       final float dT = (event.timestamp - timestamp) * NS2S;
       angle[0] += event.data[0] * dT;
       angle[1] += event.data[1] * dT;
       angle[2] += event.data[2] * dT;
   }
   timestamp = event.timestamp;
}

/**

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

* @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);

}

}

Android陀螺仪传感器学习相关推荐

  1. Android方向传感器学习之指南针示例

    刚刚跟着视频学习了关于Android中传感器的操作示例,利用方向传感器做了一个很简单的指南针应用...平时工作项目中很少有用到传感器功能,所以很多都不知道,现在自学些,当作慢慢入门吧... 首先贴出软 ...

  2. 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 ...

  3. Android 硬件传感器

    为什么80%的码农都做不了架构师?>>> 1. 传感器入门 自从苹果公司在2007年发布第一代iPhone以来,以前看似和手机挨不着边的传感器也逐渐成为手机硬件的重要组成部分.如果读 ...

  4. android动作传感器

    android动作传感器 Android平台支持一些用于监视设备动作的传感器(这样的传感器共有5个).其中两个(加速传感器和陀螺仪传感器)是纯的硬件传感器.另外三个(重力传感器.线性加速传感器和旋转向 ...

  5. Android Sensor——传感器

    Android SDK 支持的传感器类型,在Sensor类中的定义: 01.TYPE_ACCELEROMETER  : 加速传感器(硬件) 02.TYPE_AMBIENT_TEMPERATURE : ...

  6. android 传感器ceshi,Android代码-传感器-测试手机支持那几种传感

    Android代码----传感器-----测试手机支持那几种传感 一个小小Demo检测手机支持那几种传感: 具体代码如下: [Java代码]DemoSensorActivity.java packag ...

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

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

  8. Android Qcom Display学习(十三)

    该系列文章总目录链接与各部分简介: Android Qcom Display学习(零) 在上一篇中dump GraphicBuffer中,知道了护眼模式中调用setColorTransform应用于每 ...

  9. android磁场传感器页面布局在哪,教程:Android传感器—传感器查询demo

    今天给大家带来一个篇安卓传感器查询的干货教程,五一出去旅游看人山人海,不如宅在家学技术! 在Android系统中提供有加速度.磁场.方向.陀螺仪.光线.压力.温度和接近等传感器.传感器系统会主动对上层 ...

  10. android 陀螺仪简单的使用

    参考这篇博文 android 传感器使用与开发---陀螺仪传感器 没啥好说的,就是把陀螺仪的偏移量给计算出来拿来用 public class MainActivity extends AppCompa ...

最新文章

  1. 每日一皮:公鸡说,你不会下蛋上去瞎扭啥嘛...
  2. Spring整合的quartz任务调度的实现方式
  3. ssh框架分页显示问题
  4. ASP 调用dll(VB)及封装dll实例
  5. 二分查找算法(C#实现)
  6. VS 2008 和 .NET 3.5 Beta 2 发布了
  7. CSMA协议:改进的ALOHA协议
  8. 编写python程序、找出100_100+ Python挑战性编程练习(1)
  9. Matlab逻辑运算符/与/或/非/异或/all/any
  10. STM32F103ZET6+红外温度传感器mlx90614芯片
  11. 成功解决python.exe无法找到程序入口 无法定位程序输入点
  12. 日志宝:大众也能看懂的Web访问日志数据分析
  13. 数据资产治理:元数据采集那点事
  14. 批量修改图片的后缀名以及删除相同的符号
  15. 暄桐教室的50本必读书 | 39《前朝梦忆》
  16. Python学习初阶:Python基本介绍及常用数据类型
  17. 异常 exception
  18. uni-app写小程序音乐播放器
  19. java爬虫爬取天猫指定店铺下全部商品详细信息(实时价格、尺码、库存等) 超详细(思路篇)!
  20. 微小区V2 v2.3.2

热门文章

  1. abs包含在哪个头文件_C语言abs和labs函数详解和示例
  2. postgres常用SQL
  3. android模拟器录制视频教程,夜神安卓模拟器怎么录制视频 夜神安卓模拟器录制视频教程...
  4. 苹果屏蔽更新描述文件_屏蔽iPhone更新的iOS描述文件安装办法
  5. 软件测试基础知识【纯知识分享】
  6. [转帖]张汝京:告别中芯国际这10年
  7. 解决 Win7 远程桌面 已停止工作的问题
  8. 2012-7-06可樂词汇积累#9313;
  9. Python中scipy.signal.stft函数详解
  10. 惠普电脑u盘重装系统步骤_惠普电脑重装系统图文教程