2012-05-15 3 views
1

삼성 갤럭시 넥서스 (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++; 
    } 

} 

}

+0

더 이상의 업데이트가 있습니까? –

답변

2

: 여기

(나는 그것이 각각의 센서에 1,000 조치를 수행하는 데 걸리는 시간을 계산) 나는 안드로이드 SDK와 함께 테스트에 사용 된 코드입니다 Invensense의 "스마트 센서"의 결과이며 응용 프로그램 수준 코드의 버그가 아닙니다. 이 장치의 내부에서 훨씬 낮은 플랫폼 소프트웨어 구현상의 버그입니다.

Invensense MPU3050 chip on this phone에는 MEM 자이로 스코프 외에도 모션 처리 장치가 있습니다. 가속도계 및 자력계를 제어하고 데이터를 통합하고 응용 프로그램에서 볼 수있는 sensor fusionsends the data back up to Android을 실행합니다. MPU3050 datasheet 가입일

:

내장 디지털 모션 프로세서 (DMP)는 MPU-30X0 위치한 호스트 프로세서로부터 움직임 처리 알고리즘의 계산을 오프로드된다. DMP 은 가속도계, 자이로 스코프 및 자력계와 같은 추가 센서 에서 데이터를 수집하고 데이터를 처리합니다. [..snip ... 상기 DMP의 목적 에게 호스트 프로세서

+0

귀하의 답변에 감사드립니다. – steckl

1

이 이상한 타이밍에서 모두 요구 및 처리 능력을 오프로드 할 수있다. 나는 같은 문제도 경험했다. 그래서이 문제를 확인하기 위해 개발자 용 앱을 만들었습니다 here.

관련 문제