Углы Эйлера для преобразования матрицы поворота вручную для устройств iOS

Это небольшая предыстория и введение в проблему:

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

[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical
                                                   toQueue:motionQueue
                                               withHandler:
 ^(CMDeviceMotion* motion, NSError* error){
  //get and process matrix data
 }

В этой структуре доступны только 4 кадра:

XПроизвольныйZВертикальный

XArbitraryCorrectedZVertical

XMagneticNorthZVertical

XTrueNorthZVertical

Мне нужно иметь другую ссылку, f.e. значение гироскопа вместо севера, и эти кадры не могут предложить мне именно то, что я хочу.

Чтобы достичь своей цели, я использую следующую структуру:

[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryCorrectedZVertical
                                                   toQueue:motionQueue
                                               withHandler:
 ^(CMDeviceMotion* motion, NSError* error){
  //get Euler angles and transform it to rotation matrix
 }

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

Эта проблема:

Чтобы получить матрицу поворота из углов Эйлера, нам нужно составить матрицу для каждого угла, а затем перемножить их. Для трехмерного случая у нас будет матрица для каждой оси (3 из них). После этого перемножаем матрицы. Проблема в том, что результат зависит от порядка умножения. XYZ не равно ZYX. Википедия говорит мне, что существует 12 вариантов, и я не знаю, какой из них лучше. правильный для реализации iOS. Мне нужно знать, в каком порядке мне нужно их умножить. Кроме того, мне нужно знать, какие углы обозначают X, Y, Z. Например, X — крен, Y — тангаж, Z — рыскание.

На самом деле, эта проблема была решена Apple много лет назад, но у меня нет доступа к .m-файлам, и я не знаю, какой порядок умножения является правильным для iOS-устройства.

Аналогичный вопрос был опубликован здесь, но заказ с этот математический пример в решении мне не подходит.


person Oleksandr Tomashchuk    schedule 19.10.2016    source источник
comment
Я не разработчик iOS (вообще не разработчик!), но гугление показывает, что iOS поддерживает нотацию Quaternions q. Так как существует только 2 стандарта кватернионов (вместо 12 вариантов поворота матрицы), но есть соответствие между R-матрицей и кватернионами, попробуйте его вместо углов Эйлера. Насколько я знаю, кватернионы однозначны. (Да, это больше похоже на математический ответ, но... если у вас есть вопросы о кватернионах в целом, не стесняйтесь спрашивать.   -  person marcoresk    schedule 21.10.2016


Ответы (1)


Относительно: какие углы относятся к какой оси.

См. это: https://developer.apple.com/documentation/coremotion/getting_processed_device-motion_data/understanding_reference_frames_and_device_attitude

введите здесь описание изображения

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

Краткий ответ: ZXY — это порядок вращения в iOS.

Я тоже искал этот ответ. Устал. Не уверен, почему это не задокументировано где-нибудь, где легко найти. Я решил собрать эмпирические данные и проверить, какой порядок вращения лучше всего соответствует значениям. Мои значения ниже.


Методология:

  1. Написал небольшое приложение для iPhone, чтобы возвращать значения кватернионов и соответствующие углы тангажа, крена и рыскания.

  2. Вычисленные значения тангажа, крена, рыскания из кватернионов для различных порядков вращения (XYZ, XZY, YZX, YXZ, ZYX, ZXY)

  3. Расчетная среднеквадратическая ошибка относительно значений тангажа, рысканья и крена, о которых сообщает движение устройства iOS. Выявлено направление с наименьшей ошибкой.

Результаты:

Порядок ротации: ZYX и ZXY возвращают значения, очень близкие к значениям, указанным в отчетах iOS. Однако ошибка на ZXY была примерно в 46-597 раз ниже, чем на ZXY для каждого случая. Следовательно, я считаю, что ZXY - это порядок вращения.

введите здесь описание изображения

person Ravindhran Sankar    schedule 15.10.2019
comment
Вы уверены?? пожалуйста, проверьте мой вопрос: stackoverflow.com/questions/63758384/ - person lady; 07.09.2020