Вопрос

Я работаю над жестами, используя значения ускорения (x, y, z) с устройства.

Если я держу устройство в руке в положении покоя (x,y,z) = ((0,0,0)).Но если я изменю направление устройства (все еще в состоянии покоя), значения изменятся на что-то вроде ((766,766,821)).Поскольку все оси x, y, z изменяются по сравнению с их исходной ориентацией.

Есть ли способ (тригонометрическая функция ИЛИ другой) решить эту проблему?

Это было полезно?

Решение

Если устройство не компенсирует автоматически гравитационное ускорение, вам необходимо вычесть вектор (0,0,~9,8 м/с2) из ​​выходного сигнала устройства.

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

Ваше компенсированное ускорение станет:

 OutputAcc = InputAcc x RotMat - (0,0,9.8)

Таким образом, ваш вектор OutputAcc всегда будет находиться в локальной системе координат (т.Z всегда вверху)

Другие советы

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

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

Значения (x,y,z) дают вам вектор, который указывает направление ускорения.Вы можете вычислить длину (квадрат) этого вектора как x^2 + y^2 + x^2.Если это то же самое, что и когда устройство находится в состоянии покоя, то вы знаете, что устройство находится без ускорения, но в определенной ориентации.(Либо покоится, либо движется с постоянной скоростью.)

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

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

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

РЕДАКТИРОВАТЬ:

Вышеприведенное обсуждение относится к нормализованным значениям x, y и z.Вам нужно будет определить значения, которые нужно вычесть из показаний, чтобы получить вектор.Из комментария выше видно, что 766 — это «нулевые» значения для вычитания.Но они могут быть разными для разных осей вашего устройства.Измерьте показания, повернув устройства во всех шести направлениях.То есть получить максимальное и минимальное значения для x, y и z.Центральные значения должны находиться посередине между крайностями (и, будем надеяться, 766).

Некоторые жесты будут иметь характерные подписи.

Падение устройства на мгновение уменьшит вектор ускорения, а затем мгновенно увеличит его, когда устройство остановится.

Поднятие устройства мгновенно увеличит вектор, а затем мгновенно уменьшит его.

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

В большинстве случаев длина вектора будет равна ускорению свободного падения.

Мне кажется ваш вопрос неясным.Что именно вы измеряете и чего ожидаете?

В общем, акселерометр, если его держать в фиксированном положении, измеряет силу тяжести Земли.Это отображается как ускорение вверх, что на первый взгляд может показаться странным, но это совершенно правильно:поскольку сила тяжести ускоряется «вниз» и устройство находится в фиксированном положении, некоторая сила действует в противоположном направлении, т.е.Необходимо применить «вверх».Сила, необходимая для удержания устройства в фиксированном положении, — это сила, имеющая соответствующее ускорение в направлении «вверх».

В зависимости от вашего устройства это ускорение силы тяжести может быть вычтено до того, как вы получите значения на ПК.Но если вы повернете акселератометр, ускорение силы тяжести все еще сохраняется и указывает в том же направлении «вверх».Если бы до поворота акселератометра «вверх» соответствовало бы Икс он будет соответствовать другой оси, если его повернуть на 90°, скажем й.Таким образом, как измеренное ускорение на Икс и й ось изменится.

Поэтому, чтобы ответить на ваш вопрос, необходимо знать, как ваш акселерометр представляет значения.Я сомневаюсь, что в состоянии покоя измеренные значения ускорения равны (0, 0, 0).

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

Калибровка либо встроена в API устройства (проверьте документацию), либо вам придется делать это вручную.Чтобы сделать это вручную, вам необходимо прочитать текущее ускорение и сохранить эти три значения.Затем всякий раз, когда вы снимаете показания с устройства, вычитайте эти 3 значения из каждого считанного значения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top