Как удалить коэффициент силы тяжести с показаний акселерометра на 3-осевом акселерометре Android

Может ли кто-нибудь помочь в снятии g-фактора с показаний акселерометра. Я использую SensorEventListener с методом onSensorChanged() для получения данных Sensor.TYPE_ACCELEROMETER. Мне нужны только чистые значения ускорения во всех направлениях. Поэтому в любом состоянии, если устройство стабильно (или в постоянной скорости), оно должно давать (0,0,0,0,0,0) примерно. В настоящее время, в зависимости от его высоты и валка, он дает переменную мощность в зависимости от сил g, действующих на каждую ось.

Я надеюсь, что есть некоторая формула, чтобы удалить это, так как я также получаю ориентировочные значения (pitch and roll) из прослушивателя Sensor.TYPE_ORIENTATION. Я использовал некоторые, но не работал.

Любая помощь пожалуйста?

Ответы

Ответ 2

Вы можете использовать фильтр нижних частот.

Сделайте это для каждого из ваших значений датчика:

g = 0.9 * g + 0.1 * v

Где v - ваше текущее значение датчика, а g - глобальная переменная, первоначально установленная на ноль. Имейте в виду, что вам понадобится столько же переменных, сколько у вас есть оси.

С помощью v = v - g вы можете устранить коэффициент силы тяжести от значения вашего датчика.

Ответ 3

Используйте Sensor.TYPE_LINEAR_ACCELERATION вместо Sensor.TYPE_ACCELEROMETER

Ответ 4

Дифференцируя по времени, функция времени избавляет вас от констант.

Таким образом, взяв производную от сигнала акселерометра, вы получите "Jerk", который затем можно повторно интегрировать, чтобы получить непостоянную часть ускорения, которое вы ищете.

В терминах Лаймана возьмите образец с акселерометра каждые 1 секунду и вычтите его из предыдущего образца. Если ответ (очень близко к нулю), вы не ускоряетесь относительно земли. Если результат отличен от нуля, интегрируйте его (в этом случае умножьте на одну секунду), у вас есть ускорение.

Две вещи: -Посмотрите на шум в сигнале, закруглите ваш вход. -Не ожидайте сверхточных результатов от встроенных акселерометров. Вы можете использовать их для обнаружения дрожания, изменения ориентации, но не для того, чтобы узнать, сколько G вы испытываете, делая резкие повороты в своем автомобиле.

Ответ 5

Одним из способов (для устройств с акселерометром) является удаление гравитационного вектора из данных акселерометра путем вычитания значений, которые приходили бы в статическом случае для такой же ориентации. Но по мере того, как ориентация снова рассчитывается, принимая показания ускорения, а не независимо, ее не очень точно.

В этом случае может помочь гироскоп. Но у немногих андроидов все еще есть настоящий гироскоп. И использование его необработанных показаний не так просто.

Ответ 6

Просто вычтите g (~ 9.8m/s ^ 2) раз в направлении z матрицы вращения. Или, чтобы быть более явным, пусть

a = your accelerometer reading,
R = your rotation matrix (as a 9-long vector).

Тогда вы хотите

(a[0]-g*R[6], a[1]-g*R[7], a[2]-g*R[8]).