标签:
Motion Sensors
Android平台提供了多种感应器,让你监控设备的运动。这些传感器的两个总是基于硬件的(加速度计和陀螺仪),并且可以要么基于硬件或基于软件的这三个传感器(重力,线性加速度和旋转矢量传感器)。例如,在某些设备上的基于软件的传感器从加速度计和磁力计获得它们的数据,但在其他装置也可以使用陀螺仪来导出他们的数据。大多数Android设备有一个加速度计,现在许多人包括陀螺仪。基于软件的传感器的可用性是更加可变的,因为它们通常依赖于一个或一个以上硬件传感器来导出他们的数据。
运动传感器用于监视设备的运动,比如倾斜,摇动,旋转或摇摆有用。运动通常是直接用户输入的反射(例如,用户在游戏或控制在游戏中球的用户操纵汽车),但它也可以是在该装置所坐的物理环境的反射(例如,与你动,而你开你的车)。在第一种情况下,您正在监视相对于参考设备的框架或引用您的应用程序框架的议案;在第二种情况下,你正在监测相对于参考世界帧运动。本身运动传感器通常不用于监控设备的位置,但它们可以与其他传感器,例如地磁场传感器中使用,以确定设备的相对于参考世界帧位置(更多信息参见位置传感器)。
所有的运动传感器返回传感器值的多维数组每个SensorEvent。例如,一个单一的传感器事件期间加速度返回加速度力数据为三个坐标轴,和陀螺仪返回旋转数据的速率为三个坐标轴。这些数据值与其他SensorEvent参数一起float数组(值)返回。表1总结了可用的Andr??oid平台上的运动传感器。
所支持的Andr??oid平台上表1.运动传感器。
传感器传感器事件数据说明测量单位
TYPE_ACCELEROMETER SensorEvent.values?? [0]沿x轴(包括重力)加速力。米/秒2
沿y轴(包括重力)SensorEvent.values?? [1]加速力。
沿z轴(包括重力)SensorEvent.values?? [2]加速力。
TYPE_GRAVITY SensorEvent.values?? [0]沿x轴的重力的力。米/秒2
SensorEvent.values?? [1]沿y轴的重力的力。
SensorEvent.values?? [2]沿着z轴的重力的力。
TYPE_GYROSCOPE SensorEvent.values?? [0]速率围绕x轴的旋转。弧度/秒
SensorEvent.values?? [1]速率绕y轴的旋转。
SensorEvent.values?? [2]速率围绕z轴的旋转。
型陀螺仪无标定传感器Event.values?? [0]速率旋转(无漂移补偿)的绕x轴。弧度/秒
SensorEvent.values?? [1]速率绕y轴的旋转(无漂移补偿)的。
SensorEvent.values?? [2]速率围绕z轴的旋转(无漂移补偿)的。
SensorEvent.values?? [3]围绕x轴的估计漂移。
SensorEvent.values?? [4]绕y轴的估计漂移。
SensorEvent.values?? [5]围绕z轴的估计漂移。
TYPE_LINEAR_ACCELERATION SensorEvent.values?? [0]沿x轴(不包括重力)加速力。米/秒2
SensorEvent.values?? [1]加速沿y轴(不包括重力)的力。
沿z轴(不包括重力)SensorEvent.values?? [2]加速力。
沿x轴TYPE_ROTATION_VECTOR SensorEvent.values?? [0]旋转矢量分量(X * SIN(θ/ 2))。无单位
沿y轴(y * SIN(θ/ 2))SensorEvent.values?? [1]旋转矢量分量。
沿z轴SensorEvent.values?? [2]旋转矢量成分(Z * SIN(θ/ 2))。
旋转向量的SensorEvent.values?? [3]标量成分((COS(θ/ 2))。1
TYPE_SIGNIFICANT_MOTION N / A N / A N / A
TYPE_STEP_COUNTER SensorEvent.values?? [0],而传感器被激活自上次重启用户采取步数。脚步
TYPE_STEP_DETECTOR N / A N / A N / A
1标量分量是可选的值。
旋转矢量传感器和重力传感器是用于运动检测和监测中最常用的传感器。旋转矢量传感器是特别通用,可用于广泛范围的运动相关的任务,如检测的手势,监测的角度变化,和监测的相对定向的改变。例如,如果你正在开发一个游戏,增强现实应用,二维或三维罗盘,或相机稳定应用的旋转矢量传感器是理想的。在大多数情况下,使用这些传感器比使用加速度计和地磁传感器或方位传感器更好的选择。
Android开源项目的传感器
Android开源项目(AOSP)提供了三个基于软件的运动传感器:重力传感器,线性加速度传感器和旋转矢量传感器。这些传感器中的Andr??oid 4.0更新和现在使用的装置的陀螺仪(除了其他传感器),以改善稳定性和性能。如果你想尝试这些传感器,可以通过使用getVendor()方法和getVersion()方法识别它们(供应商是谷歌公司;版本号为3)。由供应商和版本号识别这些传感器是必要的,因为Android系统认为这些三个传感器是次要传感器。例如,如果一个设备制造商提供了其自身的重力传感器,则AOSP重力传感器示出了作为辅助重力传感器。所有这三个传感器依靠一个陀螺仪:如果一个装置不具有一个陀螺仪,这些传感器没有显示出来,并且不能使用。
使用加速度计
加速度传感器测量施加到该装置的加速度,包括重力的力。下面的代码展示了如何获得默认加速度传感器的一个实例:
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);概念上,加速度传感器确定是通过测量被施加到使用以下关系传感器本身(FS)的力施加到一个装置(广告)的加速度:
public void onSensorChanged(SensorEvent event){ // In this example, alpha is calculated as t / (t + dT), // where t is the low-pass filter‘s time-constant and // dT is the event delivery rate. final float alpha = 0.8; // Isolate the force of gravity with the low-pass filter. gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; // Remove the gravity contribution with the high-pass filter. linear_acceleration[0] = event.values[0] - gravity[0]; linear_acceleration[1] = event.values[1] - gravity[1]; linear_acceleration[2] = event.values[2] - gravity[2]; }注意:您可以使用许多不同的技术来过滤传感器数据。上面的代码示例使用一个简单的过滤器常数(阿尔法)来创建一个低通滤波器。此滤波器常数从一个时间常数(t)的,它是延迟的粗略表示该滤波器增加了传感器事件,并且传感器的事件传递率(DT)的。该代码示例使用的0.8用于演示的alpha值。如果使用这种过滤方法可能需要选择不同的alpha值。
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);单位是相同的那些由加速度传感器(米/秒2)中使用,和坐标系是与由加速度传感器所使用的。
陀螺仪测量围绕一个设备的x,y和z轴中弧度/秒的速率或旋转。下面的代码展示了如何获得默认陀螺仪的实例:
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);传感器的坐标系中是一样的用于加速度传感器中之一。旋转是在反时针方向阳性;即,从在x一些积极的位置看的观察者,在定位在原点的装置y或z轴方向会如果设备出现逆时针方向被旋转报告正转。这是正转的标准的数学定义,是不一样的是,用于由方位传感器的定义为辊。
// Create a constant to convert nanoseconds to seconds. private static final float NS2S = 1.0f / 1000000000.0f; private final float[] deltaRotationVector = new float[4](); private float timestamp; public void onSensorChanged(SensorEvent event) { // This timestep‘s delta rotation to be multiplied by the current rotation // after computing it from the gyro sample data. if (timestamp != 0) { final float dT = (event.timestamp - timestamp) * NS2S; // Axis of the rotation sample, not normalized yet. float axisX = event.values[0]; float axisY = event.values[1]; float axisZ = event.values[2]; // Calculate the angular speed of the sample float omegaMagnitude = sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ); // Normalize the rotation vector if it‘s big enough to get the axis // (that is, EPSILON should represent your maximum allowable margin of error) if (omegaMagnitude > EPSILON) { axisX /= omegaMagnitude; axisY /= omegaMagnitude; axisZ /= omegaMagnitude; } // Integrate around this axis with the angular speed by the timestep // in order to get a delta rotation from this sample over the timestep // We will convert this axis-angle representation of the delta rotation // into a quaternion before turning it into the rotation matrix. float thetaOverTwo = omegaMagnitude * dT / 2.0f; float sinThetaOverTwo = sin(thetaOverTwo); float cosThetaOverTwo = cos(thetaOverTwo); deltaRotationVector[0] = sinThetaOverTwo * axisX; deltaRotationVector[1] = sinThetaOverTwo * axisY; deltaRotationVector[2] = sinThetaOverTwo * axisZ; deltaRotationVector[3] = cosThetaOverTwo; } timestamp = event.timestamp; float[] deltaRotationMatrix = new float[9]; SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector); // User code should concatenate the delta rotation we computed with the current rotation // in order to get the updated rotation. // rotationCurrent = rotationCurrent * deltaRotationMatrix; } }标准陀螺仪提供没有经过任何过滤或更正噪声和漂移(偏差)的原始数据旋转。在实践中,陀螺仪的噪声和漂移将引入需要被补偿的误差。通常你确定通过监控其它传感器,如重力传感器或加速度计的漂移(偏差)和噪音。
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE_UNCALIBRATED);
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);概念上,该传感器根据以下的关系提供了加速度数据:
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);旋转矢量的三个元素表示如下:
x*sin(θ/2) y*sin(θ/2) z*sin(θ/2)于旋转轴的方向。
private SensorManager mSensorManager; private Sensor mSensor; private TriggerEventListener mTriggerEventListener; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION); mTriggerEventListener = new TriggerEventListener() { @Override public void onTrigger(TriggerEvent event) { // Do work } }; mSensorManager.requestTriggerSensor(mTriggerEventListener, mSensor);欲了解更多信息,请参见触发事件侦听器。
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);使用步骤检测仪传感器
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
Android API Guides---Motion Sensors
标签:
原文地址:http://blog.csdn.net/qq_21413973/article/details/51188826