Работа с акселерометром - PullRequest
1 голос
/ 09 июля 2009

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

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

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

Ответы [ 4 ]

5 голосов
/ 09 июля 2009

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

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

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

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

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

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

EDIT:

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

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

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

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

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

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

1 голос
/ 09 июля 2009

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

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

1 голос
/ 09 июля 2009

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

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

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

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

0 голосов
/ 09 июля 2009

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

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

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

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

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

...