2009-07-09 1 views
1

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

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

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

+0

Вы должны сказать, какой вывод вы require – teabot

+0

Вы имеете в виду: вы меняете направление устройства, и цифры становятся ненулевыми, даже если они не двигаются ИЛИ вы имеете в виду, что вы меняете направление устройства, а номера отключены, когда вы перемещаете его с этой новой позиции? – colithium

+0

Спасибо, если я изменяю ориентацию устройства, значения меняются (ноль), даже если устройство не перемещается. Выход I требует (x, y, z) быть (0,0,0), если устройство не движется.Сделать ориентацию (направленную) независимой, – Madni

ответ

-1

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

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

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

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

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

+0

Спасибо! Я думаю, что это сделает бесплатную аранжировку устройства. Знаете ли вы какую-либо реализацию RotMat в C ?? С уважением – Madni

+0

реализация RotMat в C/C++ – Madni

+0

Google для классов реализации Vector и Matrix в C++. Получение кода для умножения вектора и матрицы не должно быть проблемой. Получение фактических значений вращения с устройства является сложной частью. – Radu094

1

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

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

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

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

+0

Согласен. Поворот акселерометра из одного фиксированного положения в другое должен приводить к разным выходным значениям. – Key

+0

Спасибо. Значения акселерометра в положении покоя: \t x = 766; \t y = 766; \t z = 821; где x является горизонтальным, а z - вертикальным, находящимся под воздействием силы тяжести. – Madni

1

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

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

+0

Спасибо, Как мы можем выполнить калибровку. У меня есть 3 значения, когда устройство не движется (i-e x = 766; y = 766; z = 821). Я вычитаю его из текущих событий, чтобы сделать их + - значениями. Проблема изменяет ориентацию устройства, значения (x, y, z) изменяются. Как сделать ориентацию значений бесплатной – Madni

+0

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

5

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

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

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

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

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

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

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

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

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

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

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

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

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