如何在Java中一次从多个移动传感器收集数据?

我想一次从加速度计,陀螺仪和磁力计收集数据。我目前正在使用基于SensorManager的{​​{1}}服务。问题在于,我只能在给定的时间点从1个传感器获取数据。因此,在时间t1中,我从加速器获取数据,在时间t2中,我从陀螺仪获取数据,在时间t3中,我从磁力计获取数据。

我的代码如下:

SensorEvent

我希望不必在3个不同的时间使用三个传感器,而是希望能够在一个时间间隔内从所有传感器收集数据。这可能吗?

lufengjun 回答:如何在Java中一次从多个移动传感器收集数据?

更换传感器后,您将获得与每个传感器相关的所有事件。对于每个事件,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

本文链接:https://www.f2er.com/2718198.html

大家都在问