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概述的主要内容,如果未能解决你的问题,请参考以下文章

Android Sensor概述

Android传感器简单总结

Android传感器简单总结

传感器 Sensor 加速度示例

如何使用此传感器 API 中的磁力计?

Android开发之Sensors与摇一摇