我想一次从加速度计,陀螺仪和磁力计收集数据。我目前正在使用基于SensorManager
的{{1}}服务。问题在于,我只能在给定的时间点从1个传感器获取数据。因此,在时间t1中,我从加速器获取数据,在时间t2中,我从陀螺仪获取数据,在时间t3中,我从磁力计获取数据。
我的代码如下:
SensorEvent
我希望不必在3个不同的时间使用三个传感器,而是希望能够在一个时间间隔内从所有传感器收集数据。这可能吗?
我想一次从加速度计,陀螺仪和磁力计收集数据。我目前正在使用基于SensorManager
的{{1}}服务。问题在于,我只能在给定的时间点从1个传感器获取数据。因此,在时间t1中,我从加速器获取数据,在时间t2中,我从陀螺仪获取数据,在时间t3中,我从磁力计获取数据。
我的代码如下:
SensorEvent
我希望不必在3个不同的时间使用三个传感器,而是希望能够在一个时间间隔内从所有传感器收集数据。这可能吗?
更换传感器后,您将获得与每个传感器相关的所有事件。对于每个事件,onSensorChanged
都会被调用。
如果您想一次访问所有这些事件,则应将它们放在某个缓冲区中。
一种实现方法如下
// At class level
private Map<Integer,Stack<SensorEvent>> eventsBuffer = new HashMap<>();
// to be called from constructor
private void initEventsBuffer() {
eventsBuffer.put(Sensor.TYPE_ACCELEROMETER,new Stack<>());
}
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
eventsBuffer.get(Sensor.TYPE_ACCELEROMETER).push(event);
}
else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE){
eventsBuffer.get(Sensor.TYPE_GYROSCOPE).push(event);
}
else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
eventsBuffer.get(Sensor.TYPE_MAGNETIC_FIELD).push(event);
}
processEvents();
}
private void processEvents() {
// Start reading from the stack based on event type
for (Map.Entry<Integer,Stack<SensorEvent>> entry : stack.entrySet()) {
SensorEvent sensorEvent = entry.getValue().pop();
Integer eventType = entry.getKey();
// process now
}
}
,
有点晚了,但可能对其他人有用 - 您可以使用简单的解决方法:
选择更新频率最高的传感器,并通过全局变量与它们“同步”所有其他传感器数据。例如。 (加速度计作为主传感器):
...
float mAccX;
float mAccY;
float mAccZ;
float mGyroX;
float mGyroY;
float mGyroZ;
float mMagX;
float mMagY;
float mMagZ;
...
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
sText.setText("S: " + event.sensor.getStringType());
mAccX = event.values[0];
mAccY = event.values[1];
mAccZ = event.values[2];
// use all sensors data here
processAllSensorsData(mAccX,mAccY,mAccZ,mGyroX,mGyroY,mGyroZ,mMagX,mMagY,mMagZ);
}
else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE){
sText.setText("S: " + event.sensor.getStringType());
mGyroX = event.values[0];
mGyroY = event.values[1];
mGyroZ = event.values[2];
}
else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
sText.setText("S: " + event.sensor.getStringType());
mMagX = event.values[0];
mMagY = event.values[1];
mMagZ = event.values[2];
}
}
或者使用某种插值(二次线性),但在这种情况下,您会延迟获得当前传感器值。
并且还为每个传感器使用单独的 SensorEventListener
。