传感器采样率总是太高
Sensors sampling rate is always too high
我正在编写一个 Android 日志记录应用程序,它作为后台服务运行并记录传感器数据。
这是我开始记录重力传感器的代码示例:
public void StartLogging(int intervalInMilliseconds) {
mySensorManager.registerListener(this, myGravitySensor, intervalInMilliseconds * 1000); //millisec * 1000 = microsec
}
但是,我遇到了一个问题:我设置的采样率完全被忽略了,而实际的采样率要快得多。
例如:即使我设置了 10000000 微秒(又名:10000 毫秒,或 10 秒)的非常慢的采样率,我实际上每秒收到大约十几次更新,这比我要求的快一百倍!
我在文档中看到间隔并不意味着严格精确,但我们在这里谈论至少两个数量级的差异,这是荒谬的!
我知道我可以只比较时间戳并且只记录,比如说,每 100 个事件一次,但问题是我正在尝试最小化功耗,我想唤醒 CPU 一次每 10 秒对电池的影响与每秒唤醒 10 次对电池的影响完全不同。
我也知道我可以传递第四个参数来设置传感器事件在传递之前可以在队列中停留多长时间,但这似乎也没有任何明显的效果。
我哪里错了?
根据其他答案,这根本不可能:
Android - user-defined delay is used in registerListener(). Not working, why?
如果您无法使用采样率参数使其工作,请尝试使用预定义的采样率参数并查看它们是否有所作为。
如果采样率仍然太高,您可以使用一个计数器值,并且仅在每 X 个样本后调用该事件。
它会在某些 phone 中工作,但可能在其他人中不起作用,实际上这取决于 phone 使用的传感器和其他因素。
您不应依赖该值,而应根据您所需的速率过滤不需要的值。
干杯!!!
虽然 "SensorManager is free to give you more samples than you asked for" 是一个很好的答案,但无法解释原因。我推断出以下两种解释可能适用于所有设备也可能不适用:
如果两个组件以不同的频率请求传感器读数,它们都将以请求的最高速率接收数据,这从效率的角度来看是有意义的,具体取决于传感器类型。请注意,跨进程也是如此,因此用于检测手机摇动手势的后台服务会影响共享率。
传感器速率可以以意想不到的方式组合。例如,相机以适度的 10Hz 读取加速度计以确定方向,而上述 shake-gesture-detector 可能 运行 20Hz 的陀螺仪。现在使用 TYPE_ROTATION_VECTOR 的第三个组件可能希望 运行 在 SENSOR_DELAY_GAME,通常是 50Hz。因为最后一个传感器(通常)是加速度计和陀螺仪的软融合,它似乎要求它们都 运行 在相同的频率,但无法计算出应该是什么并放弃 运行s 以活泼的 1KHz(至少在我的一台设备上)。
我正在编写一个 Android 日志记录应用程序,它作为后台服务运行并记录传感器数据。 这是我开始记录重力传感器的代码示例:
public void StartLogging(int intervalInMilliseconds) {
mySensorManager.registerListener(this, myGravitySensor, intervalInMilliseconds * 1000); //millisec * 1000 = microsec
}
但是,我遇到了一个问题:我设置的采样率完全被忽略了,而实际的采样率要快得多。 例如:即使我设置了 10000000 微秒(又名:10000 毫秒,或 10 秒)的非常慢的采样率,我实际上每秒收到大约十几次更新,这比我要求的快一百倍!
我在文档中看到间隔并不意味着严格精确,但我们在这里谈论至少两个数量级的差异,这是荒谬的!
我知道我可以只比较时间戳并且只记录,比如说,每 100 个事件一次,但问题是我正在尝试最小化功耗,我想唤醒 CPU 一次每 10 秒对电池的影响与每秒唤醒 10 次对电池的影响完全不同。
我也知道我可以传递第四个参数来设置传感器事件在传递之前可以在队列中停留多长时间,但这似乎也没有任何明显的效果。
我哪里错了?
根据其他答案,这根本不可能: Android - user-defined delay is used in registerListener(). Not working, why?
如果您无法使用采样率参数使其工作,请尝试使用预定义的采样率参数并查看它们是否有所作为。
如果采样率仍然太高,您可以使用一个计数器值,并且仅在每 X 个样本后调用该事件。
它会在某些 phone 中工作,但可能在其他人中不起作用,实际上这取决于 phone 使用的传感器和其他因素。
您不应依赖该值,而应根据您所需的速率过滤不需要的值。
干杯!!!
虽然 "SensorManager is free to give you more samples than you asked for" 是一个很好的答案,但无法解释原因。我推断出以下两种解释可能适用于所有设备也可能不适用:
如果两个组件以不同的频率请求传感器读数,它们都将以请求的最高速率接收数据,这从效率的角度来看是有意义的,具体取决于传感器类型。请注意,跨进程也是如此,因此用于检测手机摇动手势的后台服务会影响共享率。
传感器速率可以以意想不到的方式组合。例如,相机以适度的 10Hz 读取加速度计以确定方向,而上述 shake-gesture-detector 可能 运行 20Hz 的陀螺仪。现在使用 TYPE_ROTATION_VECTOR 的第三个组件可能希望 运行 在 SENSOR_DELAY_GAME,通常是 50Hz。因为最后一个传感器(通常)是加速度计和陀螺仪的软融合,它似乎要求它们都 运行 在相同的频率,但无法计算出应该是什么并放弃 运行s 以活泼的 1KHz(至少在我的一台设备上)。