Вычислить относительную ориентацию с учетом азимута, тангажа и крена в Android? - PullRequest
4 голосов
/ 03 декабря 2010

Когда я слушаю событие ориентации в приложении для Android, я получаю SensorEvent, который содержит 3 числа с плавающей точкой - азимут, шаг и поворот по отношению к оси реального мира.

Теперь скажите, что я создаю приложение, похожее на лабиринт, но я не хочу заставлять пользователя разговаривать по телефону и держать телефон так, чтобы плоскость xy была параллельна земле.Вместо этого я хочу позволить пользователю держать телефон, как он хочет, лежа или, возможно, сесть и держать телефон под углом.Другими словами, мне нужно откалибровать телефон в соответствии с предпочтениями пользователя.

Как я могу это сделать?

Также обратите внимание, что я считаю, что мой ответ связан с getRotationMatrixи getOrientation, но я не уверен, как!

Пожалуйста, помогите!Я застрял в этом в течение нескольких часов.

Ответы [ 2 ]

3 голосов
/ 03 декабря 2010

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

Если вам действительно нужна ориентация, то 3 угловых значения представляют 3 угла Эйлера,Однако, я подозреваю, что вам, вероятно, не нужны сами углы, а скорее матрица вращения R , которая возвращается API getRotationMatrix () .Если у вас есть эта матрица, то - это в основном та калибровка, которую вы ищете.Если вы хотите преобразовать вектор в мировых координатах в координаты вашего устройства, вы должны умножить его на обратный этой матрицы (где в этом особом случае inv ( R ) = transpose( R ).

Итак, следуя примеру, который я нашел в документации, если вы хотите преобразовать вектор мировой гравитации g ([0 0 g])к координатам устройства, умножьте его на inv ( R ):

g = inv ( R ) * g

(обратите внимание, что это должно дать вам тот же результат, что и чтение акселерометров)

Возможные API для использования здесь: invertM () и multiplyMV () методы матричного класса.

0 голосов
/ 03 декабря 2010

Я не знаю каких-либо специфичных для Android API, но все, что вам нужно, это уменьшить азимут на определенную величину, верно?Таким образом, вы перемещаете «источник» из (0,0,0) во все, что они хотят.В псевдокоде:

myGetRotationMatrix:
    return getRotationMatrix() - origin
...