2014-01-05 4 views
7

놀랍게도 Android 4.0 이상에서는 사용 가능한 소프트웨어 센서에서 LINEAR ACCELERATION 센서를 제거하고 일반 전화기에서는 거의 사용할 수없는 자이로 스코프 인 하드웨어 센서에 넣기로 결정했습니다. . 나는 왜 그들이 그것을했는지는 모르지만 저가의 2.3 휴대폰에서 테스트 한 소프트웨어를 전달했을 때 놀라움을 상상해보십시오. 그리고 2 개월 된 전화에서 선형 가속 센서을 인스턴스화 할 수 없습니다. 왜 그들은 그것을 했습니까?AcceleroMeter를 사용하여 Android에서 AcceleroMeter를 올바르게 계산하는 방법

내 피부를 저장하려면 휴대 전화에서 가속도계를 사용할 수 있는지 확인했습니다. this article을 기준으로 볼 때 가속도계의 데이터를 사용하여 선형 가속도를 계산할 수 있어야합니다. 내가 코드를 확인하고 사용할 수있는 선언이 변수를 참조하십시오.

public void onSensorChanged(SensorEvent event){ 
    // In this example, alpha is calculated as t/(t + dT), 
    // where t is the low-pass filter's time-constant and 
    // dT is the event delivery rate. 

    final float alpha = 0.8; 
    float[] gravity=new float[]{0.0f,0.0f,0.0f}; //should it be here??? 

    // Isolate the force of gravity with the low-pass filter. 
    gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; 
    gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; 
    gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; 

    // Remove the gravity contribution with the high-pass filter. 
    linear_acceleration[0] = event.values[0] - gravity[0]; 
    linear_acceleration[1] = event.values[1] - gravity[1]; 
    linear_acceleration[2] = event.values[2] - gravity[2]; 
} 

첫 번째 실행에서 중력 어레이에는 무엇이 포함되어 있습니까? 같이 추가할까요

float[] gravity=new float[]{0.0f,0.0f,0.0f}; 

?

또는 중력 센서를 통해 사용할 수있는 실제 중력 데이터가 있어야합니까 (일반 장치에서는 사용할 수 없음)?

계산 결과에 선형 가속도 데이터가 있습니까? 들어오는 센서 데이터에서 숫자를 빼서 계산할 수 있습니까?

+0

이다."장치에 자이로 스코프가 없으면 센서가 나타나지 않고 사용할 수 없습니다." – Jerry101

+1

그리고 2.3 휴대 ​​전화에서 사용할 수있는 센서를 제거하기로 결정한 이유는 무엇입니까? 따라서 그들은 4.0 가속도를 측정 할 수있는 2.3 휴대 ​​전화보다 덜 전문적인 4.0 휴대 전화 (자이로가없는)의 절반을 고려합니다. 위대한 혁신 .... – Nestor

+0

네, 악취가납니다. 앱의 uses-sdk'android : targetSdkVersion'을 9 (Android 2.3) 또는 13 (Android 3.2)으로 설정해보세요. 새로운 OS를 이전 버전과 호환 가능하게 만들 예정입니다. 실험 결과를 문서화하는 것이 좋습니다. – Jerry101

답변

1

나는 cannonical 대답이 없다. 그러나 내가 알고있는 것은 장치가 움직이지 않을 때 0이 아니기 때문에 가속도계의 실제 초기 수치는 거의 (0, 0, 0)이되지 않는다는 것이다. 값은 움직임이 아닌 3 축의 위치에 따라 달라집니다 (위치의 차이와 함께, 우리는 움직임을 추론 할 수 있습니다). 따라서 관련 데이터를 얻으려면 서로 다른 판독 값을 비교해야합니다. 이를 위해 처음에는 가속도계 값을 읽고 (onsensorchanged에 대한 첫 번째 호출에서) 두 번째 호출에서 필요한 기능을 계산하기를 원합니다.

실제로 중력에 대해 이야기하면 가속도 센서가 실제로 있기 때문에 중력 센서가 필요하지 않습니다. 각 축의 중력 값을 0에서 1까지 측정합니다.

+0

Google이 선형 가속도를 계산하는 데 앞서 언급 한 코드에 왜 그런지 알지 못합니다. 당신의 대답에 따르면, 그것은 초기 중력 수치가 부족합니다. – Nestor

+0

저는 예제가 모든 것을 읽을 수 없기 때문에 다른 사람들만큼 완벽하지는 않다고 말했고 여러분이 말했듯이, 모든 변수가 초기화되지는 않았습니다. 모두 0으로 초기화하면 (자동으로 제안하는 것일 수도 있음) 코드가 작동하고 첫 번째 측정에서 약간 덜 정확합니다. 내가 할 수있는 것은, 접근법 중 하나를 코딩하고, 테스트하고, 결과가 좋다고 생각하지 않는다면, 작은 요인에 대비할 준비를하는 것입니다. 코드의 차이는 크지 않을 것이며 아마도 –

+0

을 살펴보기 위해 일부 데이터를 이해하는 것이 더 쉬울 것입니다. 그리고 위의 코드에서 계산 된 선형 가속 값이 다소 정확하다는 것을 확인하겠습니까? 우리는 코드를 사용했고, 전화기가 뒤로 젖혀지면 Z 축 선형 가속도로 7.5를 나타냅니다. 위의 코드가 중력 효과를 수정하면 모든 축에 약 0.0을 표시해야합니다. 그렇지 않습니다. 제가 전화기를 세우면 Y 축에 7.5가 표시됩니다. – Nestor

1

중력 벡터를 계산해야합니다. 기본적으로 가속도계는 중력 + 가속도로 총계를 측정하므로 중력을 제거해야합니다. 당신이 제공 한 같은 기사에서 중력 센서를 사용하는 방법에 대한 정보가 있습니다. 따라서 그 센서를 듣고 중력 벡터 전역 변수를 업데이트하십시오.

+1

초기 게시물에서 언급했듯이 중력 센서는 대부분의 장치에서 누락 된 센서이기 때문에 계산할 수 없습니다. – Nestor

1

실제로 코드에서 제공되는 코드 스 니펫은 가속도계 (중력 가속도 및 선형 가속도 모두 포함)에서 데이터를 가져 와서 필터링하는 것입니다. 그래서 기본적으로 어떻게 작동하는지, 우리는 미가공 데이터를 취해 중력 벡터가 일정하고 선형 가속과는 반대로 매우 빠르게 변할 수 있다고 가정합니다. 따라서 과거에 계산 된 중력 벡터의 80 %를 가져 와서 원시 데이터의 20 %를 더하면 빠른 선형 가속 피크를 필터링하고 중력 벡터를 얻는다고 가정 해 봅시다. 원시 데이터에서 중력 벡터를 제거하면 중력이없는 선형 가속도가됩니다. 자세한 내용은 Google for exponential 필터를 참조하십시오. 여기에 http://copterpilot.ru/custom-app/exponential/으로 게임을 할 수 있습니다. 그래서 플로트의 전역 중력 배열을 0으로 초기화하고 필터링 된 데이터를 약간 기다릴 수 있습니다. 여기 안드로이드 4.0에서, 선형 가속도 센서는 자이로가 기기에서만 사용할 http://developer.android.com/guide/topics/sensors/sensors_motion.html 따르면 코드

public class MainActivity extends AppCompatActivity implements SensorEventListener { 
private float[] gravity = new float[3]; 
private float[] linear_acceleration = new float[3]; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
    Sensor mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
} 

@Override 
public void onSensorChanged(SensorEvent event) { 
    // alpha is calculated as t/(t + dT) 
    // with t, the low-pass filter's time-constant 
    // and dT, the event delivery rate 

    final float alpha = 0.8f; 

    gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; 
    gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; 
    gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; 

    linear_acceleration[0] = event.values[0] - gravity[0]; 
    linear_acceleration[1] = event.values[1] - gravity[1]; 
    linear_acceleration[2] = event.values[2] - gravity[2]; 
} 
}