Android удалить гравитацию из показаний акселерометра - PullRequest
17 голосов
/ 02 августа 2011

Я разрабатываю приложение для Android, где мне нужно убрать гравитацию из показаний акселерометра.Я прочитал несколько обсуждений по этой проблеме, я также нашел алгоритм здесь , но я не совсем понял его.полное ускорение.

Не могли бы вы мне помочь?Мой код должен выглядеть примерно так:

public void onSensorChanged(SensorEvent sensorEvent) {
    float vals[] = sensorEvent.values;
    float accelerationX = filterGravity(vals[0]);
    float accelerationY = filterGravity(vals[1]);
    float accelerationZ = filterGravity(vals[2]);
}

Какой код я должен поместить в метод filterGravity ()?

Ответы [ 4 ]

23 голосов
/ 02 августа 2011

Для базового решения вам понадобится фильтр нижних частот Другие подходы, такие как фильтр Калмана, довольно сложны с точки зрения математики. Простой пример для Android - один клик по ссылке на http://developer.android.com/reference/android/hardware/SensorEvent.html#values.

Проще говоря, фильтр нижних частот строит средневзвешенное значение из всех ваших значений истории. Например, если у вас коэффициент фильтрации 0,1, это означает, что к предыдущему среднему значению добавляется 10% вашего текущего значения: newMeanValue = 10% currentValue + 90% oldMeanValue. Это означает, что даже если есть резкий пик, он будет только медленно увеличивать ваше среднее значение из-за 10%.

12 голосов
/ 02 августа 2011

Линейное ускорение - это то, что вам нужно. Проверьте Sensor.TYPE_LINEAR_ACCELERATION здесь .

10 голосов
/ 25 июля 2013

Если у вас нет телефона с TYPE_LINEAR_ACCELERATION, вы застряли с TYPE_ACCELERATION, который не может отделить гравитацию (наклон) от линейного ускорения.

Один из вариантов - применить фильтр нижних частот. Другой подход заключается в использовании датчика слияния, если доступен гироскоп. Оба подхода имеют свои преимущества и недостатки.

У меня есть много рабочих примеров в проекте с открытым исходным кодом. Acceleration Explorer .

0 голосов
/ 02 августа 2011

Не слишком уверен, что вы пытаетесь выполнить, но если вы ищете величину (которая даст результат от 0 до 1), тогда все, что вы делаете, это делите результат на 10

public void onSensorChanged(SensorEvent sensorEvent) {
float vals[] = sensorEvent.values;
float accelerationX = (vals[0]/10);
float accelerationY = (vals[1]/10);
float accelerationZ = (vals[2]/10);

}

В игровой среде, когда датчик находится на полном наклоне, ваш объект будет на максимальной скорости

...