Android开发系列- Android传感器类型
本部分介绍了传感器坐标轴、基础传感器和复合传感器(动作传感器、姿势传感器、未校准传感器和互动传感器)。
1.传感器坐标轴
许多传感器的传感器事件值在相对于设备静止的特定坐标系中表示。
1.1移动设备坐标轴
Sensor API 仅与屏幕的自然方向相关(当设备的屏幕方向更改时,坐标轴不会发生交换)。
移动设备的 Sensor API 坐标系
1.2.汽车坐标轴
在 Android Automotive 实现中,坐标轴相对于车身坐标系进行定义:
汽车设备的 Sensor API 坐标系
X 轴沿车辆右侧延伸
Y 轴沿车架前方延伸
Z 轴沿车架顶部延伸
坐标系的原点位于车辆后轴的中心。从坐标轴的正方向观察时,正旋转方向为逆时针方向。因此,当车辆向左转时,z 轴的陀螺仪转速应该为正值。
2. 基础传感器
基础传感器类型以其代表的物理传感器命名。这些传感器会转发来自单个物理传感器的数据(与通过其他传感器生成数据的复合传感器相反)。基础传感器类型的示例包括:
SENSOR_TYPE_ACCELEROMETER
SENSOR_TYPE_GYROSCOPE
SENSOR_TYPE_MAGNETOMETER
注意:有关 Android 传感器类型的详细信息,请查看以下部分。
但是,基础传感器不等同于其底层物理传感器,也不得与其相混淆。来自基础传感器的数据不是物理传感器的原始输出信息,因为数据已进行了校正(如偏差补偿和温度补偿)。
例如,在以下使用情况下,基础传感器的特性可能与其底层物理传感器的特性有所不同:
(1)额定偏差范围为 1 度/秒的陀螺仪芯片
在出厂校准后,通过应用温度补偿和偏差补偿,使 Android 传感器的实际偏差得到降低,最终偏差可能低于 0.01 度/秒。
在此情况下,即使底层传感器的数据表显示偏差为 1 度/秒,我们仍认为 Android 传感器的偏差低于 0.01 度/秒。
(2)功耗为 100 uW 的气压计。
由于生成的数据需要从芯片传输到 SoC,因此从气压计 Android 传感器收集数据的实际功耗可能会高得多,例如 1000 uW。
在此情况下,即使在气压计芯片引线上测得的功耗为 100 uW,我们仍认为 Android 传感器的功耗为 1000 uW。
(3)校准后功耗为 100 uW 的磁力计(但校准时的功耗更高)。
其校准程序可能需要**陀螺仪(消耗 5000 uW),并运行一些算法(额外消耗 900 uW)。
在此情况下,我们认为(磁力计)Android 传感器的最大功耗为 6000 uW。在此情况下,平均功耗是更为实用的测量指标,系统会通过 HAL 在传感器静态特性中报告平均功耗。
3.加速度计
报告模式:连续模式
getDefaultSensor(SENSOR_TYPE_ACCELEROMETER) 会返回一个非唤醒传感器
加速度计传感器可报告设备沿 3 个传感器坐标轴的加速度。测量的加速度包括物理加速度(速度变化)和重力加速度。测量结果在 sensor_event_t.acceleration 的 x、y 和 z 字段中报告。
所有值均采用国际单位制单位 (m/s^2),测量结果为设备加速度减去沿 3 个传感器坐标轴的重力加速度。
加速度计还通过 sensors_event_t.acceleration.status 报告其预测的读数精度
4.环境温度传感器
报告模式:变化模式
getDefaultSensor(SENSOR_TYPE_AMBIENT_TEMPERATURE) 会返回一个非唤醒传感器
该传感器可提供环境(室内)温度,单位是摄氏度。
5.磁场传感器
报告模式:连续模式
getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD) 会返回一个非唤醒传感器
SENSOR_TYPE_GEOMAGNETIC_FIELD == SENSOR_TYPE_MAGNETIC_FIELD
磁场传感器(也称为磁力计)可报告沿 3 个传感器坐标轴测量的环境磁场。
测量结果在 sensors_event_t.magnetic 的 x、y 和 z 字段中报告,且所有值单位均是微特斯拉 (uT)。
磁力计还通过 sensors_event_t.magnetic.status 报告其预测的读数精度。
6.陀螺仪
报告模式:连续模式
getDefaultSensor(SENSOR_TYPE_GYROSCOPE) 会返回一个非唤醒传感器
陀螺传感器可报告设备围绕 3 个传感器坐标轴的旋转速率。
逆时针方向为正转方向(右手规则)。即,如果位于原点的设备逆时针旋转,观察者从设备 x、y 或 z 轴某个正位置看过去,将报告正向旋转。请注意,这是正向旋转的标准数学定义,与航空航天领域对转动的定义并不一致。
测量结果在 sensors_event_t.gyro 的 x、y 和 z 字段中报告,且所有值的单位均为每秒转数 (rad/s)。
7.心率传感器
报告模式:变化模式
getDefaultSensor(SENSOR_TYPE_HEART_RATE) 会返回一个非唤醒传感器
心率传感器可报告触摸设备的人员当前的心率。
以每分钟心跳次数 (BPM) 表示的当前心率在sensors_event_t.heart_rate.bpm 中报告,而传感器的状态在 sensors_event_t.heart_rate.status 中报告。
因为传感器采用变化模式,当且仅当 heart_rate.bpm 或 heart_rate.status 自上次事件后已发生变化时才会触发事件。事件生成速度不会大于每隔 sampling_period 一次。
sensor_t.requiredPermission 始终是 SENSOR_PERMISSION_BODY_SENSORS。
8.光线传感器
报告模式:变化模式
getDefaultSensor(SENSOR_TYPE_LIGHT) 会返回一个非唤醒传感器
光线传感器可报告当前照明度,采用国际单位勒克斯 (lux)。
测量结果在 sensors_event_t.light 中报告。
9.近程传感器
报告模式:变化模式
通常定义为唤醒传感器
getDefaultSensor(SENSOR_TYPE_PROXIMITY) 会返回一个唤醒传感器
近程传感器可报告从传感器到最近的可见表面的距离。
在 Android KitKat 版本或更早版本中,近程传感器一直是唤醒传感器,也就是说,此类传感器在检测到近程距离发生变化时会唤醒 SoC。
对于 Android KitKat 之后的版本,我们建议您首先实现该传感器的唤醒版本,因为该版本在打电话时用于开启和关闭屏幕。
测量结果在 sensors_event_t.distance 中报告(以厘米为单位)。请注意,一些近程传感器仅支持二元“近”或“远”测量结果。在此情况下,传感器检测到“远”状态时报告值 sensor_t.maxRange,检测到“近”状态时报告一个小于 sensor_t.maxRange 的值。
10.复合传感器类型
复合传感器通过处理和/或融合来自一个或多个物理传感器的数据来生成数据。(任何非基础传感器的传感器均称为复合传感器。)复合传感器的示例包括:
步测器和大幅度动作传感器,通常基于加速度计,但是也可基于其他传感器(如果功耗和精度可接受的话)。
游戏旋转矢量传感器,基于加速度计和陀螺仪。
与基础传感器一样,复合传感器的特性来自于其最终数据的特性。例如,游戏旋转矢量传感器的功耗可能等于加速度计芯片、陀螺仪芯片、数据处理芯片和传输数据的总线的功耗之和。另外,游戏旋转矢量传感器的漂移既取决于校准算法的质量,也取决于物理传感器的特性。
下表列出了可用的复合传感器类型。每种复合传感器都依赖于来自一个或多个物理传感器的数据。
11.总结
从 Android 应用的角度来看,每个 Android 传感器都是一个独立的实体,这意味着不同传感器之间不存在交互性。
即使几个 Android 传感器可能共享同一个底层物理传感器,也是如此
例如:全部依靠同一个物理加速度计的计步器、大幅度动作感测器和加速度计必须能够同时工作
对于同一传感器的唤醒和非唤醒版本也是如此
Android 传感器必须能够同时并且彼此独立工作。也就是说,一个 Android 传感器上的任何操作都不能影响其他传感器的行为。