传感器类型

本部分介绍了传感器坐标轴、基础传感器和复合传感器(动作传感器、姿势传感器、未校准传感器和互动传感器)。

传感器坐标轴

许多传感器的传感器事件值在相对于设备静止的特定坐标系中表示。

移动设备坐标轴

Sensor API 仅与屏幕的自然方向相关(当设备的屏幕方向更改时,坐标轴不会发生交换。)

移动设备的 Sensor API 坐标系

图 1. Sensor API 使用的坐标系(相对于移动设备)

汽车坐标轴

在 Android Automotive 实现中,坐标轴相对于车身坐标系进行定义。 车辆参考坐标系的原点是后轴的中心。车辆参考坐标系的方向设置需满足以下要求:

  • X 轴指向右侧,并位于水平面上,与车辆的对称平面垂直。
  • Y 轴指向前方,并位于水平面上。
汽车设备的 Sensor API 坐标系

图 2. Sensor API 使用的坐标系(相对于汽车设备)

车辆参考坐标系是右手坐标系。因此,Z 轴向上。

参考坐标系的 Z 轴与重力方向一致,这意味着 X 轴和 Y 轴都是水平的。因此,Y 轴可能并不总是穿过前轴。

基础传感器

基础传感器类型以其代表的物理传感器命名。这些传感器会转发来自单个物理传感器的数据(与通过其他传感器生成数据的复合传感器相反)。基础传感器类型的示例包括:

  • SENSOR_TYPE_ACCELEROMETER
  • SENSOR_TYPE_GYROSCOPE
  • SENSOR_TYPE_MAGNETOMETER

不过,基础传感器不等同于其底层物理传感器,也不得与这些传感器相混淆。来自基础传感器的数据不是物理传感器的原始输出信息,因为数据已进行了校正(如偏差补偿和温度补偿)。

例如,在以下使用情况下,基础传感器的特性可能与其底层物理传感器的特性有所不同:

  • 额定偏差范围为 1 度/秒的陀螺仪芯片。
    • 在出厂校准后,通过应用温度补偿和偏差补偿降低 Android 传感器的实际偏差,可能最终确保偏差低于 0.01 度/秒。
    • 在此情况下,即使底层传感器的数据表显示偏差为 1 度/秒,我们仍认为 Android 传感器的偏差低于 0.01 度/秒。
  • 功耗为 100 uW 的气压计。
    • 由于生成的数据需要从芯片传输到 SoC,因此从气压计 Android 传感器收集数据的实际功耗可能会高得多,例如 1,000 uW。
    • 在此情况下,即使在气压计芯片引线上测得的功耗为 100 uW,我们仍认为 Android 传感器的功耗为 1000 uW。
  • 校准后功耗为 100 uW 的磁力计(但校准时的功耗更高)。
    • 其校准程序可能需要激活陀螺仪(消耗 5000 uW),并运行一些算法(额外消耗 900 uW)。
    • 在此情况下,我们认为(磁力计)Android 传感器的最大功耗为 6000 uW。
    • 在这种情况下,测量平均功耗更为实用,这也是通过 HAL 报告的传感器静态特征之一。

加速度计

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER) 返回非唤醒传感器

加速度计传感器可报告设备沿三个传感器坐标轴的加速度。测量的加速度包括物理加速度(速度变化)和重力加速度。测量结果在 sensor_event_t.acceleration 的 x、y 和 z 字段中报告。

所有值均采用国际单位制单位 (m/s^2),测量结果为设备加速度减去沿三个传感器坐标轴的重力加速度。

示例如下:

  • 自由落体时,(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)。

读数根据以下参数校准:

  • 温度补偿
  • 在线偏差校准
  • 在线尺度校准

仅当传感器已禁用时,才可更新偏差校准和尺度校准,以避免流式传输时出现值激增。

加速度计还通过 sensors_event_t.acceleration.status 报告其预测的读数精度。如需详细了解此字段的可能值,请参阅 SensorManagerSENSOR_STATUS_* 常量。

环境温度传感器

报告模式:变化时触发模式

getDefaultSensor(SENSOR_TYPE_AMBIENT_TEMPERATURE) 返回非唤醒传感器

该传感器可提供环境(室内)温度,单位是摄氏度。

磁场传感器

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD) 返回非唤醒传感器

SENSOR_TYPE_GEOMAGNETIC_FIELD == SENSOR_TYPE_MAGNETIC_FIELD

磁场传感器(也称为磁力计)可报告沿三个传感器坐标轴测量的环境磁场。

测量结果在 sensors_event_t.magnetic 的 x、y 和 z 字段中报告,且所有值单位均是微特斯拉 (uT)。

磁力计还通过 sensors_event_t.magnetic.status 报告其预测的读数精度。如需详细了解此字段的可能值,请参阅 SensorManagerSENSOR_STATUS_* 常量。

读数根据以下参数校准:

  • 温度补偿
  • 出厂(或在线)软铁校准
  • 在线硬铁校准

陀螺仪

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_GYROSCOPE) 返回非唤醒传感器

陀螺传感器可报告设备围绕三个传感器坐标轴的旋转速率。

逆时针方向为正转方向(右手定则)。 即,如果位于原点的设备逆时针旋转,观察者从设备 x、y 或 z 轴某个正向位置看过去,将报告设备呈正向旋转。请注意,这是正向旋转的标准数学定义,与航空航天领域对转动的定义并不一致。

测量结果在 sensors_event_t.gyro 的 x、y 和 z 字段中报告,且所有值的单位均为每秒转动弧度 (rad/s)。

读数根据以下参数校准:

  • 温度补偿
  • 出厂(或在线)尺度补偿
  • 在线偏差校准(以去除偏移)

陀螺仪还通过 sensors_event_t.gyro.status 报告其读数的准确性。如需详细了解此字段的可能值,请参阅 SensorManagerSENSOR_STATUS_* 常量。

陀螺仪不能基于磁力计和加速度计进行模拟,因为这会导致它的局部一致性和响应速度下降。。

心率

报告模式:变化模式

getDefaultSensor(SENSOR_TYPE_HEART_RATE) 返回非唤醒传感器

心率传感器可报告触摸设备的人员当前的心率。

以每分钟心跳次数 (BPM) 表示的当前心率在 sensors_event_t.heart_rate.bpm 中报告,而传感器的状态在 sensors_event_t.heart_rate.status 中报告。如需详细了解此字段的可能值,请参阅 SensorManagerSENSOR_STATUS_* 常量。特别是在第一次激活时,除非已知不会随身携带设备,否则首次事件的状态字段必须设置为 SENSOR_STATUS_UNRELIABLE。因为传感器采用变化模式,当且仅当 heart_rate.bpmheart_rate.status 自上次事件后已发生变化时才会触发事件。事件生成速度不会大于每隔 sampling_period 一次。

sensor_t.requiredPermission 始终为 SENSOR_PERMISSION_BODY_SENSORS

光线

报告模式:变化时触发模式

getDefaultSensor(SENSOR_TYPE_LIGHT) 返回非唤醒传感器

光线传感器可报告当前照明度,采用国际单位勒克斯 (lux)。

测量结果在 sensors_event_t.light 中报告。

近程传感器

报告模式:变化时触发模式

通常定义为唤醒传感器

getDefaultSensor(SENSOR_TYPE_PROXIMITY) 返回唤醒传感器

近程传感器可报告从传感器到最近的可见表面的距离。

在 Android 4.4 或更早版本中,近程传感器一直是唤醒传感器,也就是说,此类传感器在检测到近程距离发生变化时会唤醒 SoC。对于 Android 4.4 之后的版本,我们建议您首先实现该传感器的唤醒版本,因为该版本在打电话时用于开启和关闭屏幕。

测量结果在 sensors_event_t.distance 中报告(以厘米为单位)。请注意,一些近程传感器仅支持“近”或“远”二元测量结果。在此情况下,传感器检测到“远”状态时报告值 sensor_t.maxRange,检测到“近”状态时报告一个小于 sensor_t.maxRange 的值。

压力

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_PRESSURE) 返回非唤醒传感器

压力传感器(也称为气压计)可报告大气压力,以百帕斯卡 (hPa) 为单位。

使用以下参数校准读数:

  • 温度补偿
  • 出厂偏差校准
  • 出厂尺度校准

气压计通常用于估算高度变化。 如需估算绝对高度,必须将海平面压力(随天气变化)作为参照点。

相对湿度传感器

报告模式:变化时触发模式

getDefaultSensor(SENSOR_TYPE_RELATIVE_HUMIDITY) 返回非唤醒传感器

相对湿度传感器用于测量环境空气相对湿度,并返回百分比值。

复合传感器类型

复合传感器通过处理和/或融合来自一个或多个物理传感器的数据来生成数据。(任何非基础传感器的传感器均称为复合传感器。)复合传感器的示例包括:

与基础传感器一样,复合传感器的特性来自于其最终数据的特性。例如,游戏旋转矢量传感器的功耗可能等于加速度计芯片、陀螺仪芯片、数据处理芯片和传输数据的总线的功耗之和。另外,游戏旋转矢量传感器的偏移既取决于校准算法的质量,也取决于物理传感器的特性。

下表列出了可用的复合传感器类型。每种复合传感器都依赖于来自一个或多个物理传感器的数据。请避免选择使用其他底层物理传感器来估算结果,因为这样带来的用户体验较差。

传感器类型 类别 底层物理传感器 报告模式

游戏旋转矢量传感器

姿势类

加速度计、陀螺仪,不得使用磁力计

连续模式

地磁旋转矢量传感器 低功耗传感器

姿势类

加速度计、磁力计,不得使用陀螺仪

连续模式

快览手势传感器 低功耗传感器

互动

未定义

单次模式

重力传感器

姿势类

加速度计、陀螺仪

连续模式

未校准陀螺仪传感器

未校准类

陀螺仪

连续模式

线性加速器

动作传感器

加速度计、陀螺仪(如有)或磁力计(如果陀螺仪不存在)

连续模式

未校准磁场传感器

未校准类

磁力计

连续模式

方向传感器(已废弃)

姿势类

加速度计、磁力计、陀螺仪(如有)

连续模式

拿起手势传感器 低功耗传感器

互动

未定义

单次模式

旋转矢量传感器

姿势类

加速度计、磁力计、陀螺仪

连续模式

大幅度动作传感器 低功耗传感器

动作传感器

加速度计(或其他功耗极低的传感器)

单次模式

计步器 低功耗传感器

动作传感器

加速度计

变化模式

步测器 低功耗传感器

动作传感器

加速度计

特殊模式

倾斜检测器 低功耗传感器

动作传感器

加速度计

特殊模式

唤醒手势传感器 低功耗传感器

互动

未定义

单次模式

低功耗传感器 = 低功耗传感器

动作复合传感器

线性加速器

底层物理传感器:加速度计和(如有)陀螺仪(或如果陀螺仪不存在,则使用磁力计)

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_LINEAR_ACCELERATION) 返回非唤醒传感器

线性加速度传感器可报告传感器框架内设备的线性加速度(不包括重力加速度)。

从概念上看,输出结果为:加速度计的输出结果减去重力传感器的输出结果。结果在 sensors_event_t.acceleration 的 x、y 和 z 字段中报告,单位为 m/s^2。

当设备不动时,所有轴上的读数应接近 0。

如果设备配备陀螺仪,则线性加速度传感器必须将陀螺仪和加速度计作为输入源。

如果设备未配备陀螺仪,则线性加速度传感器必须将加速度计和磁力计作为输入源。

大幅度动作传感器

底层物理传感器:加速度计(或其他低功耗的传感器)

报告模式:单次模式

低功耗

仅实现该传感器的唤醒版本。

getDefaultSensor(SENSOR_TYPE_SIGNIFICANT_MOTION) 返回唤醒传感器

当检测到大幅度动作时,会触发大幅度动作传感器;大幅度动作是指可能导致用户位置发生变化的动作。

此类大幅度动作示例如下:

  • 步行或骑自行车
  • 乘坐在正在行驶的汽车、巴士或火车内

不会触发大幅度动作传感器的情况示例如下:

  • 手机放在口袋里,人不动
  • 手机放在桌子上,而桌子由于附近的交通情况或洗衣机运转而轻微振动

从更高层面来看,大幅度动作传感器可用于降低位置测定的功耗。当定位算法检测到设备静止时,可将设备切换到低功耗模式,在该模式下,这些算法依赖用户改变位置时发生的大幅度动作来唤醒设备。

该传感器必须具备低功耗特性。这样可以节省功耗,但可能会导致少量漏报情况。这样做是出于以下几个原因:

  • 该传感器的目标是节省电量。
  • 用户不动时触发事件(误报)会消耗大量电量,因此应尽量加以避免。
  • 在用户移动时不触发事件(漏报)是可以接受的,只要不频繁出现这种情况即可。如果用户已经行走 10 秒钟,但这 10 秒内一直未触发事件,则是不可接受的。

每个传感器事件在 sensors_event_t.data[0] 中报告 1

步测器

底层物理传感器:加速度计(可能还有其他低功耗计量器)

报告模式:特殊模式(一步触发一个事件)

低功耗

getDefaultSensor(SENSOR_TYPE_STEP_DETECTOR) 返回非唤醒传感器

用户每走一步,步测器就触发一个事件。

sensors_event_t.timestamp 事件的时间戳对应脚部触地的时刻,此时会产生较大的加速度变化。

与计步器相比,步测器的延迟较低(小于两秒)。步测器和计步器都可以在用户步行、奔跑和走楼梯时进行感测。当用户骑自行车、驾车或乘坐其他交通工具时,不应触发感测。

该传感器必须具备低功耗特性。也就是说,如果在硬件中无法完成步数感测,则不应定义此传感器。尤其是,当启用步测器但未启用加速度计时,只有步数(而非每次加速度计读取)会触发中断。

sampling_period_ns 对步测器没有影响。

每个传感器事件在 sensors_event_t.data[0] 中报告 1

计步器

底层物理传感器:加速度计(可能还有其他低功耗计量器)

报告模式:变化时触发模式

低功耗

getDefaultSensor(SENSOR_TYPE_STEP_COUNTER) 返回非唤醒传感器

计步器报告自激活后上一次重新启动以来用户行走的步数。

测量结果在 sensors_event_t.step_counter 中以 uint64_t 报告,并仅在系统重新启动时重置为零。

事件的时间戳设置为该事件最后一次迈步的时间。

请参阅步测器传感器类型,了解一步所对应的时间的意义。

与步测器相比,计步器可能具有更高的延迟(最多 10 秒)。也正因这种延迟,该传感器具备较高的准确性;完成一整天的测量后,步数应在实际步数的 10% 偏差范围内。步测器和计步器都可以在用户步行、奔跑和走楼梯时进行感测。当用户骑自行车、驾车或乘坐其他交通工具时,不应触发感测。

硬件必须确保内部步数始终不会溢出。硬件内部计数器的大小下限应为 16 位。在即将发生溢出时(最多约每 2^16 步一次),可以唤醒 SoC,以便驱动程序可进行计数器维护。

正如互动传感器中所述,当该传感器工作时,不得干扰任何其他传感器,特别是很可能正在使用中的加速度计。

如果特定设备不支持这些操作模式,则 HAL 不得报告该传感器类型。也就是说,不能在 HAL 中“模拟”该传感器。

该传感器必须具备低功耗特性。也就是说,如果在硬件中无法完成步数感测,则不应定义此传感器。尤其是,当启用计步器但未启用加速度计时,只有步数(而非加速度计数据)会触发中断。

倾斜检测器

底层物理传感器:加速度计(可能还有其他低功耗计量器)

报告模式:特殊模式

低功耗

仅实现该传感器的唤醒版本。

getDefaultSensor(SENSOR_TYPE_TILT_DETECTOR) 返回唤醒传感器

每次检测到倾斜事件时,倾斜检测器会生成一个事件。

倾斜事件定义如下:自激活或自传感器生成的最后一次事件起,2 秒时隙内平均重力加速度方向变化至少 35 度。算法如下:

  • reference_estimated_gravity = 激活后的第一秒内加速度计的平均测量值或生成最后一次倾斜事件时的估算重力。
  • current_estimated_gravity = 过去 2 秒内加速度计的平均测量值。
  • 触发条件为 angle(reference_estimated_gravity, current_estimated_gravity) > 35 degrees

当加速度较大而手机方向未发生改变时,不应触发倾斜事件。例如,驾驶汽车时急转弯或猛烈加速不应触发倾斜事件,即使平均加速度的角度变化可能超过 35 度亦如此。通常情况下,只需借助加速度计就能实现该传感器。也可以使用其他传感器(如果功耗增加不明显的话)。这是一个低功耗传感器,应允许 SoC 进入挂起模式。请勿在 HAL 中模拟此传感器。每个传感器事件在 sensors_event_t.data[0] 中报告 1

姿势复合传感器

旋转矢量传感器

底层物理传感器:加速度计、磁力计和陀螺仪

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_ROTATION_VECTOR) 返回非唤醒传感器

旋转矢量传感器可报告设备相对于东北天坐标系的方向。通常通过集成加速度计、陀螺仪和磁力计的读数获得该值。东北天坐标系是指完全正交基,其中:

  • X 轴指向东,与地面相切。
  • Y 轴指向北,与地面相切。
  • Z 轴指向上,与地面垂直。

手机方向表示为东北天坐标系与手机坐标系对齐所需的旋转幅度。也就是说,对世界坐标系 (X,Y,Z) 应用这一幅度的旋转将使该坐标系与手机坐标系 (x,y,z) 对齐。

该旋转可看作围绕轴 rot_axis 将手机旋转 θ 角度,从参照(与东北天对齐)设备方向转到当前设备方向。该旋转被编码为一个单位四元数的四个无量纲 x、y、z、w 分量:

  • sensors_event_t.data[0] = rot_axis.x*sin(theta/2)
  • sensors_event_t.data[1] = rot_axis.y*sin(theta/2)
  • sensors_event_t.data[2] = rot_axis.z*sin(theta/2)
  • sensors_event_t.data[3] = cos(theta/2)

其中:

  • rot_axis 的 x、y 和 z 字段是表示旋转轴的单位长度向量的东北天坐标
  • theta 是旋转角度

四元数是一个单位四元数:其范数必须为 1。 不满足此要求将导致客户端行为不稳定。

此外,该传感器会报告估算的首向精度:

sensors_event_t.data[4] = estimated_accuracy(以弧度为单位)

在 95% 的时间里,首向误差必须小于 estimated_accuracy。该传感器必须使用陀螺仪作为主要方向变化输入源。

该传感器还使用加速度计和磁力计输入源来弥补陀螺仪偏移,但不能仅使用加速度计和磁力计来实现该传感器。

游戏旋转矢量传感器

底层物理传感器:加速度计和陀螺仪(无磁力计)

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_GAME_ROTATION_VECTOR) 返回非唤醒传感器

游戏旋转矢量传感器类似于旋转矢量传感器,但不使用地磁场。因此,Y 轴不指向北,而是指向其他参照坐标。该参考坐标可以偏移与陀螺仪沿 Z 轴偏移时的幅度相同数量级的幅度。

请参阅旋转矢量传感器,详细了解如何设置 sensors_event_t.data[0-3]。此传感器不报告估算的首向精度:保留 sensors_event_t.data[4],并且应将其设置为 0

理想情况下,经过旋转并返回到与现实世界方向同向的手机应该报告相同的游戏旋转矢量。

该传感器必须基于陀螺仪和加速度计。不能使用磁力计作为输入源,也不可通过估算陀螺仪偏差间接作为输入源。

重力传感器

底层物理传感器:加速度计和(如有)陀螺仪(或如果陀螺仪不存在,则使用磁力计)

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_GRAVITY) 返回非唤醒传感器

重力传感器可报告设备坐标系中重力的方向和大小。

重力矢量分量在 sensors_event_t.acceleration、x、y 和 z 字段中报告(以 m/s^2 为单位)。

当设备静止时,重力传感器的输出结果应与加速度计的输出结果相同。在地球上,重力加速度约为 9.8 m/s^2。

如果设备具有陀螺仪,则重力传感器必须使用陀螺仪和加速度计作为输入源。

如果设备不具有陀螺仪,则重力传感器必须使用加速度计和磁力计作为输入源。

地磁旋转矢量传感器

底层物理传感器:加速度计和磁力计(无陀螺仪)

报告模式:连续模式

低功耗

getDefaultSensor(SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR) 返回非唤醒传感器

地磁旋转矢量传感器与旋转矢量传感器类似,但它使用磁力计而不是陀螺仪。

该传感器必须基于磁力计。它不能使用陀螺仪来实现,并且不能使用陀螺仪输入。

请参阅旋转矢量传感器,详细了解如何设置 sensors_event_t.data[0-4]

与旋转矢量传感器类似,在 95% 的时间里,首向误差必须小于估算精度 (sensors_event_t.data[4])。

该传感器必须具备低功耗特性,因此必须在硬件中实现。

方向传感器(已废弃)

底层物理传感器:加速度计、磁力计和(如有)陀螺仪

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_ORIENTATION) 返回非唤醒传感器

注意:这是已在 Android SDK 中弃用的旧版传感器类型,已由定义更为清晰的旋转矢量传感器取代。尽可能使用旋转矢量传感器来替代方向传感器。

方向传感器可报告设备的姿势。测量结果在 sensors_event_t.orientation 的 x、y 和 z 字段中报告(以度为单位)。

  • sensors_event_t.orientation.x:方位角,磁北方向与 Y 轴之间的夹角,绕 Z 轴转动 (0<=azimuth<360)。0 = 北,90 = 东,180 = 南,270 = 西。
  • sensors_event_t.orientation.y:俯仰,绕 X 轴旋转 (-180<=pitch<=180),当 Z 轴向 Y 轴移动时为正值。
  • sensors_event_t.orientation.z:滚动,绕 Y 轴旋转 (-90<=roll<=90),当 X 轴向 Z 轴移动时为正值。

请注意,因历史原因,滚动角度在顺时针方向为正。(从数学上讲,逆时针方向应为正):

相对于设备的方向描述

图 3. 相对于设备的方向

该定义与航空中使用的偏航、俯仰和滚动不同,其中 X 轴沿飞机长边(机尾到机头)延伸。

方向传感器还通过 sensors_event_t.orientation.status 报告其预测的读数精度。如需详细了解此字段的可能值,请参阅 SensorManagerSENSOR_STATUS_* 常量。

未校准传感器

未校准传感器可提供更多的原始结果,可能包括一些偏差,还包含校准后更正结果中的少数“激增”值。一些应用可能更倾向于使用这些未校准结果,因为此类结果更流畅、可靠。例如,如果应用试图自己进行传感器融合,则引入校准可能会使结果失真。

未校准加速度计

底层物理传感器:加速度计

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED) 返回非唤醒传感器

未校准加速度计传感器可在没有偏差校正的情况下报告设备沿三个传感器坐标轴的加速度(出厂设置偏差和温度补偿应用于未校准的测量结果)以及偏差估值。所有值均采用国际单位制单位 (m/s^2),并在 sensors_event_t.uncalibrated_accelerometer 的字段中报告:

  • x_uncalib:沿 X 轴的加速度(无偏差补偿)
  • y_uncalib:沿 Y 轴的加速度(无偏差补偿)
  • z_uncalib:沿 Z 轴的加速度(无偏差补偿)
  • x_bias:沿 X 轴的估算偏差
  • y_bias:沿 Y 轴的估算偏差
  • z_bias:沿 Z 轴的估算偏差

未校准陀螺仪传感器

底层物理传感器:陀螺仪

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_UNCALIBRATED) 返回非唤醒传感器

未校准陀螺仪可报告围绕传感器坐标轴的旋转速率(未应用偏差补偿)以及偏差估值。所有值均以弧度/秒为单位,并在 sensors_event_t.uncalibrated_gyro 的字段中报告:

  • x_uncalib:绕 X 轴的角速度(无偏移补偿)
  • y_uncalib:绕 Y 轴的角速度(无偏移补偿)
  • z_uncalib:绕 Z 轴的角速度(无偏移补偿)
  • x_bias:绕 X 轴的偏移估值
  • y_bias:绕 Y 轴的偏移估值
  • z_bias:绕 Z 轴的偏移估值

在概念上看,未校准的测量结果是校准测量结果和估算偏差之和:_uncalibrated = _calibrated + _bias

一旦估算偏差发生变化,x_biasy_biasz_bias 值就会激增,而在其余时间则应保持不变。

有关所用坐标系的详细信息,请参阅陀螺仪传感器的定义。

必须将出厂校准和温度补偿应用于测量结果。此外,必须实现陀螺仪偏移估算,以便在 x_biasy_biasz_bias 中报告合理的估算值。如果该实现无法估算偏移,则不得实现该传感器。

如果存在此传感器,则相应的陀螺仪传感器也必须存在,并且这两个传感器必须共用相同的 sensor_t.namesensor_t.vendor 值。

未校准磁场传感器

底层物理传感器:磁力计

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED) 返回非唤醒传感器

未校准磁场传感器可报告环境磁场以及硬铁校准估值。所有值均以微特斯拉 (uT) 为单位,并在 sensors_event_t.uncalibrated_magnetic 的字段中报告:

  • x_uncalib:沿 X 轴的磁场(无硬铁补偿)
  • y_uncalib:沿 Y 轴的磁场(无硬铁补偿)
  • z_uncalib:沿 Z 轴的磁场(无硬铁补偿)
  • x_bias:沿 X 轴的估算硬铁偏差
  • y_bias:沿 Y 轴的估算硬铁偏差
  • z_bias:沿 Z 轴的估算硬铁偏差

在概念上看,未校准的测量结果是校准测量结果和估算偏差之和:_uncalibrated = _calibrated + _bias

对于未校准的磁力计,可使用更高级别的算法来处理不良的硬铁估算。一旦硬铁估值发生变化,x_biasy_biasz_bias 值就会激增,而在其余时间则应保持不变。

必须将软铁校准和温度补偿应用于测量结果。此外,必须实现硬铁估算,以便在 x_biasy_biasz_bias 中报告合理的估值。如果该实现无法估算偏差,则不得实现该传感器。

如果存在此传感器,则相应的磁场传感器也必须存在,并且这两个传感器必须共用相同的 sensor_t.namesensor_t.vendor 值。

合页角度传感器

报告模式:变化时触发模式

getDefaultSensor(SENSOR_TYPE_HINGE_ANGLE) 返回唤醒传感器

合页角度传感器用于测量设备两个独立部分之间的角度(以度为单位)。通过这种传感器类型测量的合页的移动预计会改变用户与设备的交互方式,例如通过展开或显示显示屏。

互动复合传感器

一些传感器主要用于检测与用户的互动。我们没有定义这些传感器的实现方式,但它们必须具备低功耗特性,并且设备制造商有责任验证它们在用户体验方面的质量。

唤醒手势传感器

底层物理传感器:未定义(任何低功耗传感器)

报告模式:单次模式

低功耗

仅实现该传感器的唤醒版本。

getDefaultSensor(SENSOR_TYPE_WAKE_GESTURE) 返回唤醒传感器

唤醒手势传感器可以使用特定设备动作来唤醒设备。当该传感器被触发时,设备会开启屏幕,就如同按下电源按钮一样。用户可在设备设置中禁用这种设备行为(当该传感器被触发时开启屏幕)。更改设置不会影响该传感器的行为:仅改变当该传感器被触发时,框架是否会开启屏幕。未指定待感测的实际手势,可由设备制造商进行选择。

该传感器必须具备低功耗特性,因为它可能会全天候启用。

每个传感器事件在 sensors_event_t.data[0] 中报告 1

拿起手势传感器

底层物理传感器:未定义(任何低功耗传感器)

报告模式:单次模式

低功耗

仅实现该传感器的唤醒版本。

getDefaultSensor(SENSOR_TYPE_PICK_UP_GESTURE) 返回唤醒传感器

拿起手势传感器仅在拿起设备时被触发,并且不考虑设备在拿起前的所在位置(桌面、口袋里或袋子里)。

每个传感器事件在 sensors_event_t.data[0] 中报告 1

快览手势传感器

底层物理传感器:未定义(任何低功耗传感器)

报告模式:单次模式

低功耗

仅实现该传感器的唤醒版本。

getDefaultSensor(SENSOR_TYPE_GLANCE_GESTURE) 返回唤醒传感器

快览手势传感器可短暂开启屏幕,方便用户使用特定动作浏览屏幕内容。当该传感器被触发时,设备将短暂开启屏幕,让用户可以在设备处于锁定且非互动状态(低电耗模式)时浏览通知或其他内容,然后屏幕将再次关闭。用户可在设备设置中禁用这种行为(当该传感器被触发时,短暂开启屏幕)。更改设置不会影响传感器的行为:仅改变当该传感器被触发时,Android 框架是否短暂开启屏幕。未指定待感测的实际手势,可由设备制造商进行选择。

该传感器必须具备低功耗特性,因为它可能会全天候启用。每个传感器事件在 sensors_event_t.data[0] 中报告 1

有限轴 IMU 传感器

有限轴 IMU 传感器从 Android 13 开始提供,是指支持并非 3 个轴(x、y、z)全都可用的用例的传感器。Android 中的标准 IMU 类型(例如 SENSOR_TYPE_ACCELEROMETERSENSOR_TYPE_GYROSCOPE)假定 3 个轴均受支持。不过,并非所有外形规格和设备都支持 3 轴加速度计和 3 轴陀螺仪。

加速度计有限轴

底层物理传感器:加速度计

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES) 返回非唤醒传感器

加速度计有限轴传感器等同于 TYPE_ACCELEROMETER,但支持一个或两个轴不受支持的情况。

传感器报告的最后 3 个传感器事件值表示 x 轴、y 轴和 z 轴的加速度值是否受支持。值 1.0 表示轴受支持,值 0 表示轴不受支持。设备制造商会在构建时识别支持的轴,并且在运行时相应值不会更改。

设备制造商必须将未使用的轴的加速度值设置为 0,而不是使用未定义的值。

陀螺仪有限轴

底层物理传感器:陀螺仪

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES) 返回非唤醒传感器

陀螺仪有限轴传感器等同于 TYPE_GYROSCOPE,但支持一个或两个轴不受支持的情况。

传感器报告的最后 3 个传感器事件值表示 x 轴、y 轴和 z 轴的角速度值是否受支持。值 1.0 表示轴受支持,值 0 表示轴不受支持。设备制造商会在构建时识别支持的轴,并且在运行时相应值不会更改。

设备制造商必须将未使用的轴的角速度值设置为 0

未校准加速度计有限轴

底层物理传感器:加速度计

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED) 返回非唤醒传感器

未校准加速度计有限轴传感器等同于 TYPE_ACCELEROMETER_UNCALIBRATED,但支持一个或两个轴不受支持的情况。

传感器报告的最后 3 个传感器事件值表示 x 轴、y 轴和 z 轴的加速度值和偏差值是否受支持。值 1.0 表示轴受支持,值 0 表示轴不受支持。设备制造商会在构建时识别支持的轴,并且在运行时相应值不会更改。

设备制造商必须将未使用的轴的加速度值和偏差值设置为 0

未校准陀螺仪有限轴

底层物理传感器:陀螺仪

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED) 返回非唤醒传感器

未校准陀螺仪有限轴传感器等同于 TYPE_GYROSCOPE_UNCALIBRATED,但支持一个或两个轴不受支持的情况。

传感器报告的最后 3 个传感器事件值表示 x 轴、y 轴和 z 轴的角速度值和偏移值是否受支持。值 1.0 表示轴受支持,值 0 表示轴不受支持。设备制造商会在构建时识别支持的轴,并且在运行时相应值不会更改。

设备制造商必须将未使用的轴的角速度值和偏移值设置为 0

复合有限轴 IMU

底层物理传感器:3 轴加速度计传感器、3 轴陀螺仪传感器、未校准 3 轴加速度计传感器和未校准 3 轴陀螺仪传感器的任意组合。

报告模式:连续模式

复合有限轴 IMU 传感器等同于有限轴 IMU 传感器,但并非受 HAL 支持,而是将 3 轴传感器数据转换为等效的有限轴变体。这些复合传感器仅为车载设备启用。

下表显示了从标准 3 轴加速度计到复合有限轴加速度计的示例转换。

SENSOR_TYPE_ACCELEROMETER 的 SensorEvent 值 示例 SENSOR_TYPE_ACCELEROMETER SensorEvent 复合 SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES SensorEvent
values[0]

-0.065

-0.065

values[1]

0.078

0.078

values[2]

9.808

9.808

values[3]

不适用

1.0

values[4]

不适用

1.0

values[5]

不适用

1.0

汽车传感器

用于支持汽车用例的传感器。

首向

底层物理传感器:GPS、磁力计、加速度计和陀螺仪的任意组合。

报告模式:连续模式

getDefaultSensor(SENSOR_TYPE_HEADING) 返回非唤醒传感器

首向传感器从 Android 13 开始提供,能够以角度为单位测量设备相对于正北指向的方向。首向传感器包含两个 SensorEvent 值。 一个值代表所测量的设备首向,另一个值代表所提供的首向值的准确度。

此传感器报告的首向值必须在 0.0(含)和 360.0(不含)之间,其中 0 表示北,90 表示东,180 表示南,270 表示西。

此传感器的准确度以 68% 的置信度定义。如果潜在分布情况是高斯正态分布,则准确度为标准偏差。例如,如果首向传感器返回的首向值为 60 度,且准确度值为 10 度,则真实首向介于 50 度和 70 度之间的概率为 68%。