我最近一直在尝试同步传感器更新,尤其是尽可能快地从TYPE_ROTATION_VECTOR和TYPE_ACCELEROMETER获取值。
这是一个完整的程序,用于显示让我难以做到的事情:
public class FusionTest extends Activity implements SensorEventListener {
private SensorManager sensorManager = null;
private Sensor rotSensor = null;
private Sensor accSensor = null;
private int rots = 0;
private int accs = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
rotSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
accSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(this, rotSensor, 500 * 1000);
sensorManager.registerListener(this, accSensor, 500 * 1000);
}
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
accs++;
System.out.println("accs: "+accs+", rots: "+rots);
}else if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR){
rots++;
System.out.println("accs: "+accs+", rots: "+rots);
}
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) { }
@Override
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this, rotSensor);
sensorManager.unregisterListener(this, accSensor);
}
}
此计划的目的是了解传感器提供延迟设置更新的频率。如果我让这个程序运行50秒,这是输出的最后一行:
05-21 19:37:01.431: D/FusionTest(26378): accs: 758, rots: 100
似乎我得到旋转矢量更新,延迟时间为500毫秒,但加速度更新时延迟约为66毫秒。这来自registerListener的文档:
rateUs - >速率传感器事件在。这只是对系统的暗示。可以比指定的速率更快或更慢地接收事件。通常会更快地收到事件。该值必须是SENSOR_DELAY_NORMAL,SENSOR_DELAY_UI,SENSOR_DELAY_GAME或SENSOR_DELAY_FASTEST之一,或者是事件之间所需的延迟(以微秒为单位)。以微秒为单位指定延迟仅适用于Android 2.3(API级别9)以上。对于早期版本,您必须使用SENSOR_DELAY_ *常量之一。
我的目标是Android 4.4.2,所以我应该能够以微秒为单位指定延迟。据我所知,如果我指定系统提供500毫秒延迟的更新,那么它只是对系统的暗示。但是在旋转矢量和加速度计的实现中延迟时间被不同地解释的事实使得难以同步数据。当我在时间t得到加速度更新时,我也想在时间t得到旋转矢量,反之亦然。有没有办法实现这个目标?
编辑:我现在最接近的是选择提供最慢更新的传感器,然后在另一个传感器的值之间进行插值,以便在我得到一个值时接近较慢传感器的值。第一传感器。这仍然不是我想要的,但至少是收集非同步数据的改进。