Android开发者指南-运动传感器Motion Sensor
来源:互联网 发布:ios变音软件 编辑:程序博客网 时间:2024/05/21 12:52
转载地址:http://blog.sina.com.cn/s/blog_48d4913001010w0h.html
英文原文:http://developer.android.com/guide/topics/sensors/sensors_motion.html
版本:Android 4.0 r1
译者注:黄色底色为未决译文
- 使用加速度计
- 使用重力传感器
- 使用陀螺仪
- 使用线性加速度计
- 使用旋转向量传感器
- Sensor
- SensorEvent
- SensorManager
- SensorEventListener
- Accelerometer Play
- API Demos (OS - RotationVectorDemo)
- API Demos (OS - Sensors)
- 传感器
- 传感器概述
- 方位传感器
- 环境传感器
Android 平台支持很多监测设备运动的传感器。其中有两个传感器一定是基于硬件的(加速度计和陀螺仪),有三个可能基于硬件或软件(重力计、线性加速计和旋转向量传感器)。比如,某些设备的软传感器利用加速度计和磁力计来报送数据,而其它一些设备可能用陀螺仪来报送数据。 大部分 Android 平台的设备都带有加速计,有很多现在还带有陀螺仪。软传感器的可用性变数更大一些,因为它们常常依靠一个以上硬件传感器来报送数据。
运动传感器对于监测设备的移动非常有用,诸如倾斜、震动、旋转、摇摆等。这些动作通常是直观反映了用户的输入(比如用户在游戏中操纵汽车或者运球),但也可能反映了设备所处的物理环境变化(比如你在开车,设备也随着移动)。在第一种场合中,你监测的运动是以设备或应用为参照系;而在第二种场合,运动是以地球为参照系的。一般情况下,运动传感器不是用来监测设备的方位的,但它们可以与其他传感器合作使用,比如地磁传感器,用于检测设备的在地球参照系中的方位(详见方位传感器)
所有的运动传感器都会在 SensorEvent 中返回用多维数组表示的传感数据。例如,在一个传感器事件中,加速计会返回三维坐标轴上的加速度数据,陀螺仪会返回三维坐标轴上的旋转速率数据。这些数据以float 数组的方式在参数中返回。表 1 列出了 Android 平台支持的所有运动传感器:
表 1.. Android 平台支持的运动传感器。
检测和监视运动最常用的就是旋转向量传感器和重力传感器。旋转向量传感器尤为强大,在有关运动的任务中用途十分广泛,诸如检测手势、监测角度变化、监测相对方位的变化。比如,如果你正在开发游戏、增强现实(Augmented Reality)应用、二维或三维罗盘、相机防抖应用,那么旋转向量传感器将十分有用。在大多数场合,使用这两个传感器要比加速度计、磁力传感器和方向传感器更加合适。
Android 开源项目传感器
Android 开源项目(AOSP)提供了三种基于软件的运动传感器:重力传感器、线性加速度传感器和旋转向量传感器。 Android 4.0 中对这三种传感器进行了升级,目前利用陀螺仪(除了其它传感器)来增加稳定性和提高性能。如果你想试试这些传感器,你可以用getVendor() 和getVersion() 方法来识别它们(制造商 vendor 为 Google 公司);版本号为3)。 因为 Android 系统把这三种传感器视为备选传感器,所以必须用 vendor 和版本号来识别它们。比如,如果设备制造商已经提供了重力传感器,则 AOSP 重力传感器会显示为备选传感器。这三个传感器都依赖于陀螺仪:如果设备未提供陀螺仪,则它们都不会显示出来,也无法使用。
加速度传感器测量设备的加速度,包括重力加速度。以下代码展示了如何获取缺省的加速度传感器的一个实例:
private SensorManager mSensorManager;private Sensor mSensor;...mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
从概念上说,加速度传感器通过测量施于传感器上的作用力,并按以下关系来检测设备的加速度(Ad)。
Ad = - ∑Fs / mass
然而,重力总是会按以下关系影响测量的精度。
Ad = -g - ∑F / mass
因此,如果设备是平放在桌子上的(没有加速度),加速度计会读到g = 9.81 m/s2。同理,设备在自由落体或以 9.81 m/s2 的加速度坠向地面时,加速度计会读到 g = 0 m/s2。 因此,要测出设备真实的加速度,必须排除加速计数据中的重力干扰。这可以通过高通滤波器来实现。反之,低通滤波器则可以用于分离出重力加速度值。以下例程展示了它们的用法:
public void onSensorChanged(SensorEvent event){// 在本例中,alpha 由 t / (t + dT)计算得来, // 其中 t 是低通滤波器的时间常数,dT 是事件报送频率 final float alpha = 0.8; // 用低通滤波器分离出重力加速度 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];// 用高通滤波器剔除重力干扰 linear_acceleration [0] = event.values[0] - gravity[0];linear_acceleration [1] = event.values[1] - gravity[1];linear_acceleration [2] = event.values[2] - gravity[2];}
加速计使用了标准的传感器 坐标系 。这意味着,设备以原始方位平放在桌子上时,会发生以下状况:
- 如果你从左侧平推设备(它向右移),则 x 方向加速度为正值。
- 如果你从下侧平推设备(它向前移),则 y 方向加速度为正值。
- 如果以 A m/s2的加速度向空中移动设备,则 z 方向加速度等于 A + 9.81,即设备加速度(+A m/s2)减去重力加速度(-9.81 m/s2)。
- 静止设备的加速度值为 +9.81,即设备加速度(0 m/s2)减去重力加速度(-9.81 m/s2)。
一般情况下,加速度计已足够应付对设备移动情况的监测。几乎所有 Android 平台的手持和桌面终端都带有加速度计,它的能耗比其它运动传感器要少10倍。不过它有一个缺点,就是你不得不实现低通和高通滤波器,以消除重力影响并减少噪声数据。
Android SDK 给出了一个应用示例,展示了加速度传感器的使用方法( Accelerometer Play )。
重力传感器能以三维向量的方式提供重力方向和数量值。以下代码展示了如何获取缺省的重力传感器的一个实例:
private SensorManager mSensorManager;private Sensor mSensor;...mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
单位与加速度传感器的一样(m/s2),坐标系也相同。
陀螺仪测量设备围绕 x、y、z 轴旋转的速率,单位是 rad/s。以下代码展示了如何获取缺省的陀螺仪的一个实例:
private SensorManager mSensorManager;private Sensor mSensor;...mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
陀螺仪的 坐标系 与加速度传感器的相同。逆时针方向旋转用正值表示,也就是说,从 x、y、z 轴的正向位置观看处于原始方位的设备,如果设备逆时针旋转,将会收到正值。这是标准的数学意义上的正向旋转定义,而与方向传感器定义的转动不同。
通常,陀螺仪的输出反映了转动时的角度变化速率。例如:
// 创建常量,把纳秒转换为秒。private static final float NS2S = 1.0f / 1000000000.0f;private final float[] deltaRotationVector = new float[4]();private float timestamp; public void onSensorChanged(SensorEvent event) {// 根据陀螺仪采样数据计算出此次时间间隔的偏移量后,它将与当前旋转向量相乘。 if (timestamp != 0) { final float dT = (event.timestamp - timestamp) * NS2S; // 未规格化的旋转向量坐标值,。 float axisX = event.values[0]; float axisY = event.values[1]; float axisZ = event.values[2]; // 计算角速度 float omegaMagnitude = sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ); // 如果旋转向量偏移值足够大,可以获得坐标值,则规格化旋转向量 // (也就是说,EPSILON 为计算偏移量的起步值。小于该值的偏移视为误差,不予计算。) if (omegaMagnitude > EPSILON) { /= omegaMagnitude; axisX /= omegaMagnitude; axisY /= omegaMagnitude; axisZ } // 为了得到此次取样间隔的旋转偏移量,需要把围绕坐标轴旋转的角速度与时间间隔合并表示。 // 在转换为旋转矩阵之前,我们要把围绕坐标轴旋转的角度表示为四元组。 float thetaOverTwo = omegaMagnitude * dT / 2.0f; float sinThetaOverTwo = sin(thetaOverTwo); float cosThetaOverTwo = cos(thetaOverTwo); [0] = sinThetaOverTwo * axisX; deltaRotationVector [1] = sinThetaOverTwo * axisY; deltaRotationVector [2] = sinThetaOverTwo * axisZ; deltaRotationVector [3] = cosThetaOverTwo; deltaRotationVector } timestamp = event.timestamp;float[] deltaRotationMatrix = new float[9]; SensorManager.getRotationMatrixFromVec tor (deltaRotationMatrix, deltaRotationVector);// 为了得到旋转后的向量,用户代码应该把我们计算出来的偏移量与当前向量叠加。 // rotationCurrent = rotationCurrent * deltaRotationMatrix; }}
标准的陀螺仪能够提供未经过滤的原始旋转数据,或是经过噪声及漂移修正的数据。实际生活中,陀螺仪的噪声和漂移都会引入误差,这是需要补偿的。通常你要利用其它传感器来确定漂移和噪声值,比如重力传感器或加速计。
线性加速度传感器能向你提供一个三维向量,表示延着三个坐标轴方向的加速度,但不包括重力加速度。以下代码展示了如何获取缺省的线性加速度传感器的一个实例:
private SensorManager mSensorManager;private Sensor mSensor;...mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
理论上说,这个传感器基于以下公式给出加速度数据:
线性加速度 = 加速度 - 重力加速度
这个传感器的典型应用是获取去除了重力干扰的加速度数据。比如,你可以用这个传感器来获取汽车加速度。线性加速度传感器总是会有些偏差,你需要把这个偏差值抵消掉。最简单的消除方式就是在你的应用中增加一个校准的环节。在校准过程中,你可以要求用户先把设备放在桌子上,再来读取三个坐标轴的偏差值。然后你就可以从传感器的读数中减去这个偏差值,以获取真实的线性加速度。
传感器 坐标系 与加速度传感器使用的相同,单位也一样(m/s2)。
旋转向量代表了设备的方位,由角度和坐标轴信息组成,包含了设备围绕坐标轴(x、y、z)旋转的角度θ。以下代码展示了如何获取缺省的旋转向量传感器的一个实例:
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)
旋转向量的大小等于 sin(θ/2),方向等于旋转轴的方向。
图 1. 旋转向量传感器的坐标系。
- Android开发者指南-运动传感器Motion Sensor
- Android开发者指南-运动传感器Motion Sensor
- Android开发者指南-运动传感器Motion Sensor
- Android开发者指南-运动传感器Motion Sensor
- Android开发者指南-运动传感器Motion Sensor[原创译文]
- Android开发者指南-运动传感器Motion Sensor[原创译文]
- Android开发者指南-运动传感器!!!!!!!!!
- Android开发者指南-方位传感器-Position Sensor
- Android开发者指南-传感器Sensor[原创译文]
- Android开发者指南-方位传感器-Position Sensor
- Android开发者指南-方位传感器-Position Sensor[原创译文]
- Android开发者指南-方位传感器-Position Sensor[原创译文]
- Android传感器---Motion Sensor(一)
- Android传感器---Motion Sensor(二)
- Android传感器---Motion Sensor(三)
- Android传感器---Motion Sensor(四)
- Android传感器---Motion Sensor(一)
- Android传感器---Motion Sensor(二)
- Thread 1 cannot allocate new log, sequence 10018 Checkpoint not complete
- upx交叉编译过程
- linux 8小时时差 bios hwclock 解决 utc localtime
- delphi把窗体嵌入到dll中。实现方法
- 一个成功IT精英的必备品质
- Android开发者指南-运动传感器Motion Sensor
- 在Amazon EC2上安装jenkins
- PJNATH介绍 -- 开源的用于NAT穿透的ICE, STUN和TURN
- 成绩处理函数版
- js 常用正则表达式表单验证代码
- 正则表达式DFA构造方法
- 第十五周 统计成绩——字符串的比较
- USB设备枚举过程
- 串口通讯—通信协议