Вопрос

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

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

Решение

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

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

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

Далее вам нужно будет вычислить новые углы рыскания, тангажа и крена.Рыскание — это угол между передним вектором, проецируемым на плоскость yz (установите значение x равным 0), и вектором -z (0, 0, -1), шаг — это угол между передним вектором, проецируемым на плоскость xz, и -z. вектор z, а крен — это угол между вектором вверх, проецируемым на плоскость 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)

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

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

Соглашения осей тела, используемые в Android, не совпадают, что используются в аэрокосмическом (по причинам).Ось X «плоскость» эквивалентна оси «y» и устройства Android (и а также оси X связано с осью y, положительным или отрицательным в зависимости от компоновки ENU RO NED).Хорошая статья о прилипенах ans ans Colls можно найти здесь, и может быть начать отвечать на ваш вопрос: http://www.sensorplatforms.com/underStanding-orientation-conventions-mobile-platforms/

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