2012-06-17 3 views
16

을 필요로하는 Android 어플리케이션을 개발할 예정입니다. 3D 공간에서 휴대폰의 x, y, z 좌표를 읽으십시오.가속도계를 사용하여 안드로이드 폰의 xy 좌표를 읽으십시오

나는 장치의 간단한 코드와 테스트를 작성하고 싶습니다

.. 내가 장치 및 에뮬레이터에 생강 빵을 사용하고

.

+0

가능한 [3D 세계에서 장치의 움직임을 계산하기 위해 가속도계, 자이로 스코프 및 나침반 사용] (http://stackoverflow.com/questions/8264518/using-accelerometer-gyroscope-and-compass-to-calculate-devices- 3 차원 이동) 슈퍼 세트는 회전 상태를 요구합니다. –

답변

16

가속도에서 위치를 얻으려면 두 번 통합해야합니다.

통합 가속은 속도를 제공하고 속도를 통합하면 위치가 부여됩니다.

잡음을 통합하면 드리프트가 생성되고 드리프트를 통합하면 드리프트가 많이 생성되므로 안드로이드 센서는 상당히 많은 잡음을 발생시키는 경향이 있습니다.

내 갤럭시 S3에서 나는 Google의 선형 가속도계 복합 센서를 사용하여 5 초 동안 0.02m까지 드리프트를 얻을 수있었습니다.

진저 브레드에 선형 가속도계 센서를 사용할 수 있는지 확실하지 않습니다. 당신이 통합 할 수없는 경우에 통합하기 전에 중력을 제거해야 할 것입니다. 당신이 지금

static final float NS2S = 1.0f/1000000000.0f; 
float[] last_values = null; 
float[] velocity = null; 
float[] position = null; 
long last_timestamp = 0; 

@Override 
public void onSensorChanged(SensorEvent event) { 
    if(last_values != null){ 
     float dt = (event.timestamp - last_timestamp) * NS2S; 

     for(int index = 0; index < 3;++index){ 
      velocity[index] += (event.values[index] + last_values[index])/2 * dt; 
      position[index] += velocity[index] * dt; 
     } 
    } 
    else{ 
     last_values = new float[3]; 
     velocity = new float[3]; 
     position = new float[3]; 
     velocity[0] = velocity[1] = velocity[2] = 0f; 
     position[0] = position[1] = position[2] = 0f; 
    } 
    System.arraycopy(event.values, 0, last_values, 0, 3); 
    last_timestamp = event.timestamp; 
} 

: 당신이하지 않았다면

, 여기 http://developer.android.com/guide/topics/sensors/sensors_motion.html

모든 안드로이드

http://www.youtube.com/watch?v=C7JQ7Rpwn2k

코드의 모션 센서에 대한 좋은 이야기 읽기 3D 공간에서의 위치, 전화가 정지 상태 일 때이를 가정 할 때 명심하십시오 rts 샘플링.

중력을 제거하지 않으면 곧 매우 멀리 떨어져 있습니다.

이것은 데이터를 전혀 필터링하지 않으며 많은 드리프트를 생성합니다.

+1

드리프트가 발생하는 것은 센서 노이즈 만이 아닙니다. 이 방법의 주된 한계는 가속도계로 일정한 속도를 감지하는 것이 근본적으로 불가능하다는 것입니다.그래서 통합은 마치 휴대 전화를 조금 흔들면 겉으로보기에는 합리적인 결과를 가져올 수 있지만 운전이나 자전거 타기와 같은 다른 유형의 운동에서는 드리프트가 엄청납니다. – Junuxx

+0

당신은 절대적으로 옳습니다. 나는 가속도계를 사용하여 차를 추적하고 있으며이를 위해 표류를 줄이기 위해 칼만 필터를 구현했습니다. 또한 정적 인 경우 노이즈를 측정하여 가속도계의 정확도를 계산 한 다음 필터의 데이터에 가중치를 부여하는 데 사용됩니다. 나는 지금까지 꽤 좋은 결과를 얻고있다. – spontus

+0

뉴턴의 물리학으로이 모든 것을 계산했기 때문에 여기에서 많은 "드리프트"가 발생합니다. 이는 부정확합니다. Runge-kutta 또는 더 나은 결과를 얻기 위해 위치를 계산하는 좀 더 정확한 방법을 수행하십시오. – Automatico

7

this tutorial을 읽으십시오. 위의 주어진 튜토리얼의

간단한 요약 ::

먼저 SensorManagerSensor의 인스턴스를 얻을.
onCreate() 내부 :이 후

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 

, onSensorChanged(SensorEvent event)을 무시하고 좌표를 얻을 수 event.values[]를 사용합니다.

@Override 
public void onSensorChanged(SensorEvent event) { 
    float x = event.values[0]; 
    float y = event.values[1]; 
    float z = event.values[2]; 
} 
관련 문제