对于我的硕士论文,我正在开发一个能够从三星Galaxy S5的3轴加速度计收集数据的Android应用程序。因为我想跟踪人类活动我需要大约50Hz的采样率。 我通过将采样率设置为SENSOR_DELAY_GAME来实现这一点。要检查采样率,我会在电话显示屏上显示包含加速度计数据的列表长度。即使我在不同应用程序之间的数据收集期间切换,当手机屏幕打开时一切正常。这样做,我在30秒内收到大约1500个值,这意味着采样率的准确性适合我的目的。
我现在的问题是,当屏幕处于超时状态时,加速计采样率降至5Hz,并在屏幕打开时再次变为50 Hz。有没有办法将加速度计采样率固定为50 Hz?
PS:如果没有将屏幕永久设置为ON,我宁愿选择一种解决方案,以节省电池寿命。
感谢, Ziegi
编辑:我添加了加速度计所需的必要方法。不使用已存在的onPause(),onStop()和onResume()方法,因为只有在停止按钮单击事件发生时才应停止测量。
public void initListeners(){
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);
}
public void onSensorChanged(SensorEvent event) {
if (startFlag == true) {
switch(event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
// copy new accelerometer data into accel array
// then calculate new orientation
System.arraycopy(event.values, 0, accel, 0, 3);
calculateAccMagOrientation();
xText.setText("X: " + decimal.format(event.values[0]));
yText.setText("Y: " + decimal.format(event.values[1]));
zText.setText("Z: " + decimal.format(event.values[2]));
xValue.add(event.values[0]);
yValue.add(event.values[1]);
zValue.add(event.values[2]);
try {
xSize.setText(String.valueOf(xValue.size()));} catch(Exception e) {
Toast.makeText(getBaseContext(), "Fehler bei Add to List", Toast.LENGTH_SHORT).show();
}
break;
}
}
}
答案 0 :(得分:0)
我现在的问题是,当屏幕处于超时状态时, 加速度计采样率降至5Hz,最高可达50 Hz 屏幕打开时再次显示。有没有办法修复加速度计 采样率为50 Hz?
PS:我更喜欢没有将屏幕设置为ON的解决方案 永久性地延长电池寿命。
这是重点。屏幕关闭时,应使用较少的电量。用户还希望功率使用率更低。以较低的速率进行采样是任何体面的操作系统处理功率约束情况的众多方式之一。
因此,如果手机屏幕关闭时有任何支持的提高采样率的方式,我会感到非常惊讶。
答案 1 :(得分:0)
您可能希望运行将加速度计读取为服务而不是应用程序的代码。 AleAdam在此处的类似答案中对此进行了详细描述:Keep UI Thread running when screen is off
在其他线程答案中提到了几个教程。
答案 2 :(得分:0)
您可能想要的是让CPU以相同的速率运行,尝试使用Wakelock:
class Consumer
{
Consumer(Producer* producer) :
_producer(producer),
_t(std::bind(&Consumer::WorkerThread, this))
{ }
......
Producer* _producer;
std::thread _t;
}