삼성 갤럭시 넥서스 (Android 4.0)에서 센서 값을 최대한 빨리 읽으려고합니다. 이를 위해 여러 센서와 샘플링 속도를 사용하여 몇 가지 실험을 수행하여 매우 이상한 행동을 파악했습니다. Acc 센서 만 사용할 경우 샘플링 속도는 약 50Hz입니다. 그러나 자이로 센서 (또는 자기장 센서)를 사용하면 Acc 센서의 샘플 속도가 증가하며 둘 다 90 ~ 100Hz의 샘플 속도를 갖습니다. 센서 지연 (예 : SENSOR_DELAY_FASTEST에서 SENSOR_DELAY_UI로)의 변경은 샘플링 속도에 영향을 미치지 않으며 자기장 센서를 추가 할 때 세 센서 모두 높은 샘플링 속도 (90-100Hz)를 갖습니다. 또 다른 이상한 점은 세 센서의 값이 항상 같은 타임 스탬프로 도착한다는 것입니다 (때로는 하나 또는 두 개의 ms 차이가 있지만 다른 두 개는 정확히 동일한 타임 스탬프를 가짐). 또한 Android-NDK에서도 동일한 테스트를 거쳤으며 샘플링 속도의 변경 (ASensorEventQueue_setEventRate() 사용)이 아무런 효과가 없음을 포함하여 정확히 동일한 동작이 있습니다.갤럭시 넥서스 : 센서 샘플링 속도가 빨라졌습니다.
내 친구는 HTC Desire HD (안드로이드 2.3 및 자이로 센서 만 포함되어 있기 때문에 자이로가 없기 때문에)에서 같은 것을 시도했으며 센서의 샘플링 속도가 서로 다릅니다 그리고 acc 센서의 샘플링 속도는 자기 센서의 사용에 독립적이었습니다 (그것이 정상적인 동작으로 기대되는 것입니다).
다른 센서를 추가로 사용하면 왜 acc 센서가 빨라지 는가? 누군가 비슷한 행동을 알아 냈습니까? 이거 버그 야? 아니면 내 코드의 버그일까요? 당신이보고있는 무엇
package de.tum.sdktest;
import java.util.ArrayList;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class TestSDKActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mAccSensor;
private Sensor mGyroSensor;
private Sensor mMagSensor;
private int accCounter = 0;
private long lastAccTime = 0;
private int gyroCounter = 0;
private long lastGyroTime = 0;
private int magCounter = 0;
private long lastMagTime = 0;
private int measuresPerInterval = 1000;
private ArrayList<Float> accValues;
private ArrayList<Float> gyroValues;
private ArrayList<Float> magValues;
private static final String TAG = "TestSDKActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
accValues = new ArrayList<Float>();
gyroValues = new ArrayList<Float>();
magValues = new ArrayList<Float>();
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mAccSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mGyroSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
mMagSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
TextView tv = new TextView(this);
tv.setText("Hello World!!!");
setContentView(tv);
}
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mAccSensor, SensorManager.SENSOR_DELAY_UI);
mSensorManager.registerListener(this, mGyroSensor, SensorManager.SENSOR_DELAY_UI);
mSensorManager.registerListener(this, mMagSensor, SensorManager.SENSOR_DELAY_UI);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
public synchronized void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
{
if(accCounter == 0 || accCounter == measuresPerInterval)
{
String s = String.valueOf("acc: "+(event.timestamp-lastAccTime)/1000000000.0);
lastAccTime = event.timestamp;
Log.i(TAG, s);
accCounter = 0;
accValues.clear();
}
accValues.add(event.values[0]);
accCounter++;
}
else if(event.sensor.getType() == Sensor.TYPE_GYROSCOPE)
{
if(gyroCounter == 0 || gyroCounter == measuresPerInterval)
{
String s = String.valueOf("gyro: "+(event.timestamp-lastGyroTime)/1000000000.0);
lastGyroTime = event.timestamp;
Log.i(TAG, s);
gyroCounter = 0;
}
gyroValues.add(event.values[0]);
gyroCounter++;
}
else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
{
if(magCounter == 0 || magCounter == measuresPerInterval)
{
String s = String.valueOf("mag: "+(event.timestamp-lastMagTime)/1000000000.0);
lastMagTime = event.timestamp;
Log.i(TAG, s);
magCounter = 0;
}
magValues.add(event.values[0]);
magCounter++;
}
}
}
더 이상의 업데이트가 있습니까? –