如何在java中同时从多个移动传感器收集数据?

0wi1tuuw  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(473)

我想同时从加速度计、陀螺仪和磁强计收集数据。我正在使用 SensorManager 基于 SensorEvent . 问题是在给定的时间点我只能从一个传感器获取数据。所以在时间t1,我从加速器得到数据,在t2,我从陀螺仪得到数据,在t3,我从磁强计得到数据。
我的代码如下:

public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
        sText.setText("S: " + event.sensor.getStringType());
    }
    else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE){
        sText.setText("S: " + event.sensor.getStringType());
    } 
    else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
        sText.setText("S: " + event.sensor.getStringType());
    }
}

我不需要在3个不同的时间处理3个传感器,而是希望能够在一个时间间隔内收集所有传感器的数据。这可能吗?

eoigrqb6

eoigrqb61#

当传感器被改变时,你将得到与每一个传感器相关的所有事件。对于每个事件, 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
        }
}
kyks70gy

kyks70gy2#

有点晚,但可能对其他人有用-您可以使用简单的解决方法:
选择更新频率最高的传感器,并通过全局变量“同步”所有其他传感器数据。e、 g.(对于作为主传感器的加速计):

...
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 对于每个传感器。

相关问题