Кинематические уравнения в обобщенных координатах. Углы Эйлера, Крылова, кватернионы. Выставка по сигналам MEMS акселерометра

По работе у меня возникла необходимость переводить координаты объекта из углов Эйлера в кватернионы и обратно.

Формулы для пересчёта углов Эйлера в кватеринионы и обратно найти можно, но

Опишу коротко суть проблемы:

  1. Тело в трёхмерном пространстве имеет 6 степеней свободы: 3 координаты и 3 угла поворота.
  2. С координатами всё хорошо, например, если они (4,5,2), то это означает, что тело нужно сдвинуть относительно начала координат на +4 единицы по оси X, на +5 единиц по оси Y и на +2 единицы по оси Z. При этом порядок сдвига не важен. Можно сначала сдвинуть по X, потом по Y, потом по Z, а можно в другой последовательности. От перемены мест слагаемых сумма не меняется.
  3. С поворотами всё гораздо хуже. Иногда может сложиться ощущение, что для них тоже просто достаточно задать углы поворота вокруг трёх осей и этого будет достаточно (например: перевернуть предмет на 180 градусов вокруг оси X, потом на 180 градусов вокруг оси Y, а затем на 90 градусов вокруг оси Z - в каком порядке не поворачивай - результат будет один и тот же). Эта ловушка возникает оттого, что нам легче всего оперировать углами типа 90 или 180 градусов, а они-то как раз и представляют из себя очень частный случай. В общем случае порядок поворотов имеет значение.
А как же быть с законом, говорящим, что от перестановки мест слагаемых сумма не меняется? Дело в том, что композиция нескольких поворотов соответствует уже не сумме векторов (как в случае с операциями параллельного переноса), а произведению. И произведению не просто чисел, а специальных объектов - матриц поворота, например - на которые коммутативность «обычного» умножения не распространяется. В зависимости от порядка выбора осей поворота и от того, будут ли поворачиваться оси вместе с объектом или поворачиваться будет только объект, можно выделить 24 типа описаний поворотов. Очень часто углы поворота вокруг осей называются углами Эйлера. Иногда, в некоторых источниках эти углы называются углами Тэйт-Брайана либо углами Эйлера в зависимости от того, все три оси, вокруг которых делается вращение разные (углы Тэйт-Брайана), либо же первая и последняя оси - одна и та же. Также эти углы называют angles of extrinsic rotation - если оси неподвижны или angles of intrinsic rotation - если оси вращаются вместе с объектом.
Чтоб не запутаться, приведу все типы вращений здесь:
Тейт-Брайана, внутренние:
ZYXr; YZXr; XZYr; ZXYr; YXZr; XYZr.
Эйлера, внутренние:
XYXr; XZXr; YZYr; YXYr; ZXZr; ZYZr.
Тейт-Брайана, внешние:
ZYXs; YZXs; XZYs; ZXYs; YXZs; XYZs.
Эйлера, внешние:
XYXs; XZXs; YZYs; YXYs; ZXZs; ZYZs.
Внешние углы комплементарны внутренним, прочитанным задом наперёд, например: внешние углы Эйлера 10, 20, 30 градусов в формате XYXs это то же самое, что и внутренние углы Эйлера 30, 20, 10 градусов в формате XYXr.

Собственно, об этом уже было сказано много раз. Зачем же писать новую статью? Дело в том, что информации о том, как переводить из углов Эйлера в кватернион и обратно - не так уж и много. И в большинстве случаев описывается только 1 или 2, 3, 6 систем углов Эйлера. Но не все 24. И по аналогии вывести остальные (и не ошибиться) не очень-то и просто. Во время «откапывания истины» мне удалось найти несколько онлайн-конвертеров из углов в кватернионы и по тому, в каком направлении увеличивается их возможность по конвертации можно понять, сколько ещё вариантов осталось не охвачено:
quat.zachbennett.com - один тип углов

onlineconversion.com - один тип углов
quaternions.online - три типа углов
andre-gaschler.com - шесть типов углов

Единственное место, где я смог найти описание преобразований для всех 24 типов углов - это книга «Graphics Gems IV». Репозитарий с исходниками от этой книги находится здесь: Исходники к книге Graphics Gems IV . Если говорить про код преобразования из углов Эйлера в кватернионы и обратно, то эти исходники в репозитарии находятся здесь: .../GraphicsGems/gemsiv/euler_angle. Но у них есть один недостаток: с целью сделать максимально общую функцию расчёта углов и кватернионов, автор очень сильно усложнил код. Т.е. код получился очень компактным, но плохо подходящим для перевода на другие языки или для оптимизации под конкретные случаи. Так как мне очень нужно было разобраться со всеми 24-мя случаями, то пришлось этот код немного поисследовать и развернуть его в набор простых случаев. Также я написал небольшие юнит-тесты и проверил, что мой код работает корректно. Т.к. эти юнит-тесты используют код, скомпилированный из исходников от книги Graphics Gems, то выкладывать их (юнит-тесты) я не стал.

Не буду приводить в тексте статьи свои исходники (они написаны на языке Octave). Дам лишь ссылку на репозитарий и прокомментирую его содержимое:

Обеих функций в Octave нет. В Matlab поддерживаются только 6 типов углов Эйлера на неподвижных осях. В моих реализациях поддерживаются все 24 типа. При этом типы с буквой r на конце (например, XYZr) означают, что оси вращаются вместе с объектом. Типы с буквой s на конце (например, XYZs) означают, что оси остаются неподвижными.

Матрица поворот применяется для вращения системы координат или объекта, сцены.

Матрицы поворота вокруг основных осей.

Матрица поворота вокруг произвольной оси.

Обобщённая матрица поворота.

Хочется задавать положение объекта в пространстве однозначно. Достаточно очевидно что любое положение однозначно определяется 3 поворотами вокруг разных осей. Но встаёт вопрос в каком порядке вращать и как выбрать оси?

Обобщённую матрица поворота можно задать по разному. С одной стороны мы можем вращать объект вокруг неподвижных осей. С другой вокруг осей связанных с объектом ещё их называют локальными. Стоит вспомнить что операции умножения матриц не коммутативна поэтому для однозначного определения положения нужно знать не только 3 угла, но и схему умножения матриц.

Можно выделить 2 популярные схемы.
1) Матрица поворота через углы Эйлера.
2) Матрица поворота через углы летательного аппарата (ЛА): рыскание, тангаж и крен(yaw, pitch и roll).
В виду того что первая требует большого числа вычислений, то на практике обычно применяют вторую.

Матрица поворота через углы Эйлера.

Углы Эйлера - три угла однозначно определяющие ориентацию твёрдого тела, определяющие переход от неподвижной системы координат к подвижной.
Подвижная система координат это система координат привязанная к телу. Иногда говорят в мороженная в тело. Прежде чем дать определения углов нам понадобиться ещё одно. Линия узлов ON - линия пересечение плоскости OXY и Oxy

α (или φ) это угол между осью Оx и осью ON. Диапазон значений / http://habrahabr.ru – Хабрахабр, 2006. – Режим доступа: http://habrahabr.ru/post/183116/. – Дата доступа: 10.10.2013.

  • Кватернионы и вращение пространства [Электронный ресурс] / http://ru.wikipedia.org/ – Википедия - свободная энциклопедия, 2001. – Режим доступа: http://ru.wikipedia.org/wiki/ Кватернионы_и_вращение_пространства. – Дата доступа: 11.10.2013.
  • Выставите любой палец левой руки вперед. Давайте, не стесняйтесь, никто не будет над вами смеяться. Это нужно для важного эксперимента. Выставили? Теперь представьте что вы - это ваш палец (ну и бред). Повернитесь под прямым углом направо, затем наверх, и наконец налево. Где вы оказались? Правильно, в том же месте, но уже на спине.

    С некоторой натяжкой именно так работает вращение с помощью углов Эйлера. Немного непредсказуемо и неудобно, не правда ли? Углы Эйлера имеют несколько недостатков, но есть одно особенно нехорошее свойство из-за которого вы не захотите с ними связываться. Его имя - Gimbal lock.

    В русском языке gimbal lock называют по-разному: шарнирный замок, блокировка осей, складывание рамок. К сожалению, по запросам в поисковике с такими ключевыми словами выдаётся много мусора, а статья в Википедии оставляет желать лучшего, поэтому я сам расскажу вам об этом феномене и предложу как с ним бороться.

    Внимание! Заходя под кат вы подвергаетесь риску поломать голову.

    Для начала напомню что такое углы Эйлера. Вы наверное помните, что это что-то вроде набора из трёх углов вращения вокруг осей X, Y и Z? Не совсем так. Предположим, вы хотите повернуть некий объект, и у вас есть набор конечных углов (X: 45°, Y: 45°, Z: 45°). Один из подвохов эйлеровых углов - необходимость выбора какого-то одного порядка поворотов. Если сначала повернуть на 45° вокруг оси X, затем вокруг Y и в конце вокруг Z, то получится результат как на левой половине картинки снизу. Если порядок будет Z-X-Y, то результат будет другой, как на правой половинке.


    На самом деле…

    На самом деле выше описаны не просто углы Эйлера, а углы Тэйта - Брайана . Эйлеровы углы имеют много сбивающих с толку вариаций, в одних из которых нужно вращать вокруг глобальных осей, в других оси поворачиваются после каждого шага, в третьих оси всегда закреплены на самом объекте и двигаются вместе с ним. Ко всему прочему добавляется разный порядок поворотов. Если есть возможность - не пользуйтесь углами Эйлера.


    От выбора порядка поворотов зависит место появления шарнирного замка. Что же это такое? Возьмём к примеру такой порядок поворотов: Z-X-Y. Если вращение вокруг оси X будет равно 90° или -90°, то вращения вокруг Z и Y будут «есть» друг друга и останется только огрызок от большего из вращений. Например (X: 90°, Y: 90°, Z: 90°) превратится в просто (X: 90°, Y: 0°, Z: 0°). Внимание на иллюстрацию.

    Так же можно подставить (X: 90°, Y: 130°, Z: 140°) или (X: 90°, Y: 30°, Z: 40°), но в результате всё равно будет получаться (X: 90°, Y: 0°, Z: 10°). Немного не интуитивно, вам не кажется? Это всё из-за шарнирного замка. Когда вращение вокруг оси X становится равным 90° или -90°, ещё не использованная локальная ось вращения Y становится параллельной оси Z, но с обратным направлением, поэтому вращение вокруг неё вступает в конфликт с предыдущим вращением вокруг Z.

    Это взорвались головы особо впечатлительных читателей. Поясню то же самое со стрелочками.

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

    Шарнирный замок появляется в середине иерархии поворотов. Если использовать порядок X-Y-Z или Z-Y-X, то поворот направо или налево будет заклинивать анимацию. Поскольку такой поворот встречается гораздо чаще чем, например, поворот в сторону зенита или надира, то во многих программах используют последовательность Z-X-Y. Такая иерархия поворотов используется в Unity3d, правда внутри все вращения всё равно хранятся в кватернионах. Что такое кватернионы? Об этом лучше рассказать отдельно. Кватернионы и матрицы вращения это один из способов избежать шарнирного замка. Также существуют хитрые алгоритмы, которые плавно обходят замок стороной, но это отражается на качестве анимации. Лучше всего использовать углы Эйлера только для простых случаев: пропеллеры, колёса, маятники. Иногда можно поменять иерархию поворотов, но тогда всё равно придётся помнить о замке.