Как убрать гравитационный коэффициент из показаний акселерометра в Android-3-осевом акселерометре - PullRequest
15 голосов
/ 31 июля 2010

Может кто-нибудь помочь убрать g-фактор из показаний акселерометра?

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

В настоящее время, в зависимости от его шага и крена, он дает мне переменную мощность в зависимости от сил g, действующих на каждую ось.

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

Ответы [ 7 ]

10 голосов
/ 13 марта 2013

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

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

g = 0.9 * g + 0.1 * v

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

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

9 голосов
/ 12 января 2016

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

9 голосов
/ 05 мая 2011

Посмотрите следующую ссылку.

http://developer.android.com/reference/android/hardware/SensorEvent.html

4 голосов
/ 01 мая 2015

Просто вычтите g (~ 9,8 м / с ^ 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]).
4 голосов
/ 19 августа 2010

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

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

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

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

3 голосов
/ 18 декабря 2010

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

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

1 голос
/ 16 мая 2018

нужно принять две системы координат: 1- фиксированная глобальная система. 2- движущаяся система координат, в которой начало координат перемещается и вращается, как это делает датчик. в глобальной системе g всегда параллельна оси z, но в движущейся системе это не так. так что все, что вам нужно сделать, это вычислить матрицу вращения 3 * 3 из углов ориентации или рыскание, тангаж и крен (формулы можно найти везде). затем умножьте эту матрицу вращения на вектор ускорения 3 * 1, измеренный датчиком. это преобразует координаты и объявляет значения в фиксированной глобальной системе. после этого нужно просто вычесть g из значения z.

...