Калибровка акселерометра

Я использую акселерометр, чтобы перемещать что-то по осям X/Y на экране.

Это легко, если телефон начинает лежать на столе.

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

Как мне откалибровать вещи, чтобы я мог получить разницу в ориентации от начальной точки?

cursorX -= accelerometerCalibrationY - getAccelerometerY();
cursorY += accelerometerCalibrationX - getAccelerometerX();

Это отлично работает для плоского положения на столе и НЕКОТОРЫХ стартовых позиций. Переменные просто getAccelerometerXY в начале.


person Richard Taylor    schedule 02.03.2011    source источник
comment
Для начала вы, вероятно, захотите, чтобы фильтр верхних частот удалял постоянную составляющую ускорения, вызванную 1G по направлению к земле, см. stackoverflow.com/questions/6937433/. Это может быть что-то вроде 0,2G по осям X и Y, когда он начинается с наклона, я полагаю, вы игнорируете Z? Попробуйте это для начала, но потом вы, вероятно, захотите посмотреть и на абсолютные значения, чтобы определить положение в свободном пространстве и преобразовать движения, но для начала попробуйте HPF.   -  person PeterJ    schedule 20.12.2012
comment
@PeterJ, ты имеешь в виду, что телефон запускается в какой-то ориентации, а затем движется без вращения в плоскости столешницы? И вы хотите, чтобы он назначал некоторые оси столешнице (возможно, как-то выровненные с осями XYZ телефона) и отслеживал движение в этой системе координат?   -  person Beta    schedule 26.12.2012
comment
@Beta, я думаю о ситуации, когда человек берет в руки телефон и говорит, что он наклонен к нему на 30 градусов, но вы все равно хотите отслеживать движение по X / Y, как если бы телефон был плоским, поэтому что-то, что компенсирует оба дополнительный наклон и статическая гравитация. Таким образом, обычно, если держать довольно неподвижно (скажем, после 2-секундного фильтра), это будет X/Y равным нулю, но тогда, возможно, X будет равен 0,5G, когда пользователь толкает телефон прямо вдоль его оси.   -  person PeterJ    schedule 26.12.2012
comment
Я уже пытался отвечать на подобные вопросы раньше, о векторах, поворотах и ​​различных системах координат. Математика на самом деле довольно проста, но если люди используют неточный язык, это просто безнадежно. Вы говорите о движении без вращения? Вас интересуют только составляющие движения в плоскости экрана телефона?   -  person Beta    schedule 26.12.2012
comment
@Beta, да, просто говорю о движении без вращения.   -  person PeterJ    schedule 26.12.2012


Ответы (3)


Вам нужно заняться математикой. Используйте getRotationMatrix, чтобы определить текущую матрицу ориентации телефона (M). Используя M, вы можете вычислить вектор g (гравитацию) в локальной системе координат устройства. Затем получите ускорение (Accel) от датчика. Calc Ans = вектор ускорения-гравитации. Компоненты Ans x/y - это то, что вам нужно. Отфильтруйте его, чтобы получить лучшие результаты.

Вот еще один простой способ. Получить вектор ускорения. Отфильтруйте его с помощью фильтра верхних частот, чтобы удалить постоянную составляющую, и фильтра нижних частот, чтобы удалить ненужный шум (вы потратите некоторое время на поиск подходящих параметров фильтра). Отфильтрованные компоненты x/y - это то, что вам нужно.

person Leonidos    schedule 27.12.2012

Акселерометр предоставляет вам вектор — так что просто вычислите разумное среднее значение в начале вашей деятельности и используйте его в качестве отправной точки. Преобразование разности в значения координатного управления осуществляется просто.

person Konstantin Pribluda    schedule 21.12.2012

Вам также нужен гироскоп, значения акселерометра относятся к системе координат телефона.

person nayab    schedule 20.12.2012
comment
Вопрос заключается в определении относительного движения по 2D-плоскости, а не абсолютного положения в 3D. - person PeterJ; 20.12.2012
comment
Вы имеете в виду преобразование значений акселерометра в разрешение экрана? - person nayab; 20.12.2012
comment
Нет, я имею в виду, что если он доволен результатами на плоской поверхности, проблемы будут связаны со смещением постоянного тока 1G, вызванным землей. Гироскоп нужен только в том случае, если вам нужно полное инерционное решение, например, возможность определить, что телефон был выдвинут вперед, повернут на 90 градусов, а затем снова выдвинут вперед. - person PeterJ; 20.12.2012
comment
Линейный ускоритель легко отменит гравитацию или напишет код, чтобы найти разницу между акселерометром и датчиком гравитации. - person nayab; 20.12.2012
comment
пожалуйста, проверьте приложение Acmeter в магазине игр - person nayab; 21.12.2012