наклон рыскания оси -Z от датчиков андроида - PullRequest
1 голос
/ 24 января 2012

Тональность рыскания, которую мы получаем из SensorManager.getOrientation () андроида, все для оси Y телефона.Под этим я подразумеваю, что угол рыскания и тангажа говорят, где указана ось Y, а крен находится вокруг оси Y.(и моя ориентация экрана фиксируется на ландшафт, поэтому ось Y не меняется).Но то, что я хочу, это шаг рыскания и крен отрицательной оси Z (указывает на телефон), больше похоже на то, что если мой экран телефона представляет собой пейзажное окно в кабине самолета, то какой будет шаг рыскания?и катиться будет?

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Если я понимаю то, что вы говорите, вы видите, что текущий наклон рыскания и крена возвращаются, как если бы ось + y была вектором по умолчанию 'front', а ось + z была вектором 'up' по умолчанию.Вы хотели бы сделать преобразование координат так, чтобы ваши рыскание, тангаж и крен были рассчитаны с осью -z в качестве вектора по умолчанию 'front' и вектора + x в качестве вектора 'up' по умолчанию.

Во-первых, вам нужно вычислить текущие векторы фронта и восходящего направления от вашего рыскания, тангажа и крена в текущей конфигурации.Это можно сделать с помощью трехмерных матриц вращения: http://en.wikipedia.org/wiki/Rotation_matrix#Rotations_in_three_dimensions

Используйте угол поворота вокруг оси вращения вокруг оси z, угол поворота вокруг оси x и угол поворота вокруг оси y.Умножьте эти матрицы вместе, затем умножьте фронтальный вектор (0, 1, 0) и верхний вектор (0, 0, 1) на результат, чтобы получить новый фронтальный и верхний векторы.

Далее вам нужно будет вычислить новые углы рыскания, тангажа и крена.Yaw - это угол между фронтальным вектором, проецируемым в плоскость yz (установите значение x на 0), и вектором -z (0, 0, -1), pitch - это угол между фронтальным вектором, проецируемым на плоскость xz, и -вектор z, а roll - угол между вектором вверх, спроецированным на плоскость xy, и вектором + x (1, 0, 0).Если мы допустим, что Fx = компонент x переднего вектора, Fy будет компонентом y, и так далее, мы получим:

yaw   = acos ( -z dot (0,  Fy, Fz) ) / sqrt(Fy*Fy + Fz*Fz)
pitch = acos ( -z dot (Fx, 0,  Fz) ) / sqrt(Fx*Fx + Fz*Fz)
roll  = acos ( +x dot (Ux, Uy, 0 ) ) / sqrt(Ux*Ux + Uy*Uy)

Вы сможете сделать это для других векторов, если я выбралнеправильные.

0 голосов
/ 26 апреля 2013

Условные обозначения осей тела, используемые в Android, не совпадают с используемыми в аэрокосмической сфере (по уважительным причинам). Ось x "плоскости" эквивалентна оси "y" устройства Android и (аналогично, ось x связана с осью y, положительной или отрицательной в зависимости от ENU ro NED). Хорошую статью о конвенциях Yaw Pitch и Roll можно найти здесь, и это может быть началом ответа на ваш вопрос: http://www.sensorplatforms.com/understanding-orientation-conventions-mobile-platforms/

...