Комментарии 30
Резиновой слух "… Повороты — это уже не сумма, а произведение… ". Это не то и не другое, если быть точным. Это некая операция. Поэтому сумма и произведение — это некорректно. Именно потому что это не сумма и не произведение чисел, оно и не коммутативно
Это не то и не другое, если быть точным. Это некая операция.
Умножение на комплексное число z, такое что модуль z = 1 — является поворотом плоскости на угол, равный аргументу z© В.И. Арнольд, «Геометрия комплексных чисел, кватернионов и спинов», МЦНМО, 2002
то не то и не другое, если быть точным. Это некая операция.
Умножение — более фундаментальная сущность, чем какие-то там числа.
Кватернионы единичной длины — группа SU(2). Группа (любая) по определению имеет операцию умножения, и коммутативности никто не требует.
Именно потому что это не сумма и не произведение чисел, оно и не коммутативно.
Это вообще бред. Вот я возьму строчки вида "aaa" (произвольное количество символов "a") и определю на них сложение как конкатенацию: "a" + "aa" = "aa" + "a" = "aaa", оно будет коммутативным и ассоциативным. А вот если взять строчки из символов "a" и "б", то на них сложение вдруг перестанет быть коммутативным, но останется ассоциативным: "аб" + "ба" != "ба" + "aб", ("a"+"б") + "c" == "a" + ("б" + "c")
Мне, безусловно, надо было написать строже, например так: композиция нескольких поворотов, в отличие от композиции нескольких сдвигов, соответствует не сумме каких-то элементарных движений (как в случае со сдвигами), а произведению матриц поворота. Или как-нибудь ещё более аккуратно. Возможно, в этом случае, читать материал новичкам было бы труднее. В любом случае, работа была проделана. Отчёт о ней был опубликован здесь. Если кому-то это пригодится - будет очень хорошо.
Никогда не мог понять, зачем вообще нужны углы Эйлера. Ну, кроме исторического аспекта (какие были методы описания поворота). Их же совершенно невозможно ни во что пересчитать без адской боли.
То ли дело тензор поворота — в виде матрицы (проще) или кватернион (компактнее и сразу видна ось вращения).
В моём случае углы Эйлера нужны из-за особенностей специфики алгоритма, который я пытаюсь сформулировать. Если получится заставить этот алгоритм работать и если мне разрешат — я про него напишу.
Так что человеку — только углы Эйлера: курс, крен, тангаж (дифферент). И никаких кватеринионов. И системе управления (что морской, что самолетной) тоже только углы Эйлера нужны.
P.S. Мы как раз и делаем приборы для определения курса, крена и дифферента по сигналам GPS/ГЛОНАСС. Пока что ни один заказчик не просил выдавать кватернионы. Всем только углы Эйлера нужны.
Несмотря на gimbal lock, мыслим мы, увы, в терминах углов Эйлера. И пока роботы не заменят людей — так и будет дальше.
Эм, на самолёте или спутнике вполне может быть и "носом вверх" и "носом вниз".
Если бы я реализовывал софт для них, я бы внутри использовал кватернионы. Как Вы в терминах углов Эйлера представите угловую скорость? Как производные по этим трём углам? Это же убого получится — спутник, например, вращается с постоянной скоростью, а нам приходится постоянно пересчитывать углы и угловые скорости. А если он вращается вокруг неудачной оси, то в окрестности gimbal lock ошибка вычислений станет большой.
Или, например, как найти оптимальный поворот их положения А в Б?
Вы видели хоть одного человека, который думает в терминах кватернионов? Что там будет вместо «поверни направо» и «наклонись вперед»?
Я не скажу про управление спутником — не знаю, как там расположены двигатели ориентации. Но у корабля и самолета — оси выделены естественным путем.
Что касается моей области (спутниковая навигация), то в ИКД ГЛОНАСС в расчете положения фазового центра передающей антенны (приложение Т) используются углы Эйлера. Ну просто потому, что человеку так понятней.
Вы видели хоть одного человека, который думает в терминах кватернионов? Что там будет вместо «поверни направо» и «наклонись вперед»?
Можно определить операцию логарифмирования от кватерниона — это будет вектор, направленный вдоль оси вращения и длиной, равной углу поворота. Почти как кватернион, там тоже в координатах x,y,z спрятана ось вращения. Ещё есть обратная операция — экспонента. Например, у нас есть вектор угловой скорости, мы его умножаем на время t, и потом делаем экспоненту и получаем текущую ориентацию.
Так вот, люди вполне могут использовать обозначения "поверни по часовой стрелке вокруг вертикальной оси" или "поверни вокруг поперечной оси на 90 градусов".
Это не совсем то, что принято называть кватернионом, но описание вращения в виде "ось поворота, угол поворота", как мне кажется, намного ближе к кватерниону, чем к углам Эйлера.
Вращение кубика рубика — тоже в углах Эйлера описывается.
Забавно, но я хочу привести это как пример использования кватернионов)
- Поворот всего кубика на 90 градусов вокруг оси х — обозначается как "x". Аналогично с осями y,z.
- Поворот правой части вокруг оси, смотрящей право, по часовой стрелке — R (right)
Второй пример не очень удачный — можно сказать, что правую грань больше никак и не покрутить. Но тут есть нюанс (возможно, я ошибаюсь, кубиком Рубика не увлекался): повороты L и R делаются в разные стороны. Т.е., R делается по часовой стрелке, если смотреть справа, а L — если смотреть слева.
С точки зрения поворотов относительно вращающего, это немножко нелогично. А вот если смотреть на это как "R — вращение вокруг оси, направленной вправо, L — вокруг оси, направленной влево", то всё становится понятно.
Вы видели хоть одного человека, который думает в терминах кватернионов? Что там будет вместо «поверни направо» и «наклонись вперед»?
Короче, я утверждаю, что люди довольно часто мыслят в терминах "поворот вокруг такой-то оси на такой-то угол", и такая формулировка ближе к кватернионам, чем к углам Эйлера.
Причём если человек внутри корабля или самолёта, ему почему-то привычнее думать в углах Эйлера, а если вращает что-то перед собой (тот же кубик рубика), то становится проще представить ось вращения и крутить вокруг неё.
Короче, я утверждаю, что люди довольно часто мыслят в терминах «поворот вокруг такой-то оси на такой-то угол», и такая формулировка ближе к кватернионам, чем к углам Эйлера.
Люди действительно мыслят в таких терминах. Но когда это сумма поворотов по трем ортогональным осям — это углы Эйлера. А когда из трех поворотов по трем осям суммируется один поворот по суммарной оси — это уже кватернион.
Так вот те же кубики Рубика записываются как суперпозиция простых поворотов. То есть именно углы Эйлера.
А вот пни перекатывают действительно чем-то близким к кватернионам. :-) Уж больно кривые оси у выкорчеванного пня.
Ну, к примеру, я так и не разобрался, как с помощью кватернионов задавать ограничения соеденений при расчете инверсной кинематики, с углами Эйлера это делается легко и понятно...
tminnigaliev, как вы оцениваете возможность эти преобразования залить в прошивку arduino? Достаточно заморочно пересчитывать? Те считывает поворотв/углы, чтобы получить координаты/смещения? Добавил в закладки, думаю пригодится.
— с помощью углов Эйлера/Тейт-Брайана
— с помощью матриц поворота
— с помощью кватернионов
способ задания положения объекта с помощью углов Эйлера — самый неоднозначный как с точки зрения целесообразности, так и с точки зрения возможности внести путаницу. Поэтому хочется уметь преобразовывать углы Эйлера во что-то более удобное (например, кватернионы). С другой стороны, иногда возникает обратная задача, например, нужно нарисовать объект в программе, которая понимает только углы Эйлера (т.к. расчитана на пользователя-человека), а данные этой программе даёт другая программа, которой внутри себя проще оперировать кватернионами. Для этого две описанных функции и нужны: одна переводит из углов в кватернионы, вторая обратно.
В вашем вопросе прозвучала необходимость переводить углы в координаты. Это точно не относится к теме статьи. Возможно, вы имели в виду решение прямой кинематической задачи (расчёт координат манипулятора по углам и кинематической модели робота). Эта задача тоже легко решается средствами, доступными на Ардуино, но это другая задача, не рассмотренная в данной статье.
XYZr означает, что первый угол отсчитывается вокруг оси X, второй вокруг оси Y, третий вокруг оси Z, при этом сами оси поворачиваются (т.е. после первого поворота оси Y и Z превращаются в Y' и Z', после второго поворота ось Z' превращается в Z")
ZXZs означает, что первый угол отсчитывается вокруг оси Z, при этом оси остаются на месте, второй угол вокруг оси X, и третий угол снова вокруг той же самой оси Z.
Таким образом, весь «зоопарк» порядков осей покрывается за счёт параметра order. Предполагается, что если датчик вам возвращает чепуху, вы можете его показания конвертировать с помощью одной из приведённых функций и попробовать по очереди каждый из 24 порядков, на том, на котором результат будет совпадать с вашими ожиданиями, можно будет остановиться.
Ещё одна статья про кватернионы и углы Эйлера