Подтвердить что ты не робот

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

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

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

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

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

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

Это отлично работает для стола на столе, а НЕКОТОРЫЕ стартовые позиции. Переменные - это только getAccelerometerXY в начале.

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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