Android Sensor概述
Posted Dufre.WC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Sensor概述相关的知识,希望对你有一定的参考价值。
文章目录
Sensor就是传感器,提供高精度的原始数据,比如操作系统,手势,倾斜等动作就是利用重力传感器的数据来判断;磁力传感器和加速度传感器可以计算出方位。
本篇文章侧重于学习基本的知识,包括sensor的功能,使用场景,工作原理,输出数据含义。
Sensor分类
- Motion Sensors:测量三轴的加速度和旋转
- accelerometers
- gravity(g-sensor)
- gyroscopes(陀螺仪)
- ratational vector
- Environment Sensors:测量环境参数
- temperature
- pressure
- light
- humidity(湿度)
- Position Sensors:测量物理位置
- proximity(距离)
- orientation(方向)
- magnetometers(磁力)
Sensor axes
Mobile device axes
Automative axes
Motion Sensor
Motion Sensor是判断物体姿态和物体移动的传感器,其应用也很广泛:
- 车辆姿态
- 无人机
- 穿戴设备
- 手机重力感应
accelerometers/gravity
如下图是android对传感器数值的定义,其单位是m/s2。这里要注意accelerometer的值是包含了gravity的值,比如手机水平向上放置,其z轴的数值就是gravity的值(约等于9.81m/s2)
线性加速度可以表示除掉gravity影响的accelerometer。
For example:
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];
accelerometer和gravity芯片内部的工作原理可以看:MEMS加速度计陀螺仪磁力计的工作原理
如下图所示:
-
红色的部分是可移动的。
-
有加速度的时候的,放大如图2,C1和C2两侧的电压会产生微小的变化,电压值可以反应加速度。
加速度计会输出三个轴的加速度,测量的加速度包括物理加速度(速度变化)和重力加速度。所有值均采用国际单位制单位 (m/s^2),测量结果为设备加速度减去沿 3 个传感器坐标轴的重力加速度。 -
自由落体时,(x, y, z) 的范数应接近于 0。
-
当设备平放在桌子上并从其左侧向右推动时,x 轴加速度值为正。
-
当设备平放在桌子上时,z 轴上的加速度值为 +9.81,相当于设备的加速度 (0 m/s^2) 减去重力加速度 (-9.81 m/s^2)。
-
当设备平放在桌子上并向上抬起时,加速度值大于 +9.81,相当于设备的加速度 (+A m/s^2) 减去重力加速度 (-9.81 m/s^2)。
重力加速度和加速度计的联系与区别:
- 坐标系相同
- 设备水平静止的时候,数值相同
- 加速度主要测试运动方向上速度的变化,重力传感器主要测试设备和地球水平面的差异
gyroscope
gyroscope的单位是rad/s,绕轴顺时针旋转的方向是正值,逆时针旋转的方向是负值。
For example:下面的代码表示通过陀螺仪的值,计算物体旋转角度。
private static final float NS2S = 1.0f / 1000000000.0f;
private float timestamp;
public void onSensorChanged(SensorEvent event)
if (timestamp != 0)
// event.timesamp表示当前的时间,单位是纳秒(1百万分之一毫秒)
final float dT = (event.timestamp - timestamp) * NS2S;
angle[0] += event.values[0] * dT;
angle[1] += event.values[1] * dT;
angle[2] += event.values[2] * dT;
timestamp = event.timestamp;
工作原理是利用了科里奥利力:
- 假设圆盘不动,从A往B点方向扔一个小球,会落在B点,其轨迹也是一条直线
- 假设圆盘逆时针旋转,角速度为w,从A往B方向扔一个小球,从A的角度来看,还是落在B(实际是B’),但实际的B点已经偏移,而且A的运动轨迹是一条曲线AB’
从B的角度来看,A是受到了侧向的力,这个力就是科里奥利力。
根据这个力,我们可以得到角速度。rad/s。
芯片内部工作原理: - 如左图,没有旋转的时候,谐振器是水平方向高速振动。
- 如右图,有旋转的时候,垂直方向会检测到科里奥利力加速度。
Position Sensor
magnetometers
磁力传感器应用也很广泛:
- 汽车ABS
- 里程表
- 指南针
- 金属探测
磁力传感器是利用霍尔效应去测试磁场强度的。当电流通过一个位于磁场中的导体的时候,磁场会对导体中的电子产生一个垂直于电子运动方向上的作用力(洛伦兹力),从而在垂直于导体和磁感线的方向上产生电势差。
磁场也是输出3个方向的数值,单位是微特斯拉(uT)
proximity
距离传感器,透过红外线LED灯发射红外线,被物体反射后由红外线探测器接受,藉此判断接收到红外线的强度来判断距离,有效距离大约在10米左右。它可感知手机是否被贴在耳朵上讲电话,若是则会关闭屏幕来省电;距离传感器也可以运用在部分手机支持的手套模式中,用来解锁或锁定手机。
Environment Sensor
环境传感器主要是检测环境的传感器,Android支持包括温度(环境温度,设备温度)光,压力,湿度等传感器。
light
- 功能:控制屏幕亮度
- 原理:光敏三极管,接收外界光线时,会产生强弱不等的电流,从而感知环境光亮度。
- 单位:环境光的单位是lx
barometer/pressure
- 功能:测量压力
- 原理:薄膜与变阻器或电容连接起来,气压变化导致电阻或电容的数值发生变化,从而获得气压值。
- 单位:hPa
temperature
- 功能:测量温度
- 原理:热敏电阻
- 单位:摄氏度
- TYPE_AMBIENT_TEMPERATURE:表示环境温度
- TYPE_TEMPERATURE:表示设备湿度
以上是关于Android Sensor概述的主要内容,如果未能解决你的问题,请参考以下文章