Pull to refresh

Comments 30

Резиновой слух "… Повороты — это уже не сумма, а произведение… ". Это не то и не другое, если быть точным. Это некая операция. Поэтому сумма и произведение — это некорректно. Именно потому что это не сумма и не произведение чисел, оно и не коммутативно

>
Это не то и не другое, если быть точным. Это некая операция.


Умножение на комплексное число z, такое что модуль z = 1 — является поворотом плоскости на угол, равный аргументу z
© В.И. Арнольд, «Геометрия комплексных чисел, кватернионов и спинов», МЦНМО, 2002

Автор аротивопоставил умножение сложения и мне это показалось странным. Вот и все

А вы алгебру дальше школьной математики видели? Их коммутативность это частный случай.
Естественно, что цитата касается не пространственного поворота, а поворота на плоскости (пример — если мы будем рассматривать ось y как чисто мнимую, а x как чисто действительную, то повороту на 90 градусов против часовой стрелки вполне соответствует умножение на i) — но кватернионы это расширение комплексных чисел etc. А вот умножение кватернионов как раз некоммутативно — не потому, разумеется, что это «не умножение». Просто такова алгебра кватернионов.
DoctorMoriarty, спасибо за дополнения и пояснения. Там у меня изначально было некоторое костноязычие при изложении, и оно, действительно, могло бросаться в глаза. Hedgehogues обратил на это внимание, я поправил. В любом случае, за любые замечания — спасибо. Над стилем изложения мне тоже нужно будет поработать.
то не то и не другое, если быть точным. Это некая операция.

Умножение — более фундаментальная сущность, чем какие-то там числа.
Кватернионы единичной длины — группа SU(2). Группа (любая) по определению имеет операцию умножения, и коммутативности никто не требует.


Именно потому что это не сумма и не произведение чисел, оно и не коммутативно.

Это вообще бред. Вот я возьму строчки вида "aaa" (произвольное количество символов "a") и определю на них сложение как конкатенацию: "a" + "aa" = "aa" + "a" = "aaa", оно будет коммутативным и ассоциативным. А вот если взять строчки из символов "a" и "б", то на них сложение вдруг перестанет быть коммутативным, но останется ассоциативным: "аб" + "ба" != "ба" + "aб", ("a"+"б") + "c" == "a" + ("б" + "c")

Мне, безусловно, надо было написать строже, например так: композиция нескольких поворотов, в отличие от композиции нескольких сдвигов, соответствует не сумме каких-то элементарных движений (как в случае со сдвигами), а произведению матриц поворота. Или как-нибудь ещё более аккуратно. Возможно, в этом случае, читать материал новичкам было бы труднее. В любом случае, работа была проделана. Отчёт о ней был опубликован здесь. Если кому-то это пригодится - будет очень хорошо.

Никогда не мог понять, зачем вообще нужны углы Эйлера. Ну, кроме исторического аспекта (какие были методы описания поворота). Их же совершенно невозможно ни во что пересчитать без адской боли.
То ли дело тензор поворота — в виде матрицы (проще) или кватернион (компактнее и сразу видна ось вращения).

Aamonster, очень часто эффективные инструменты характеризуются более высоким порогом вхождения, что не всегда удобно для большинства пользователей. Например, есть программа для моделирования, которую любят мейкеры (3д-печатники) — OpenSCAD. В ней повороты задаются углами Эйлера, потому что их проще представить себе в голове.
В моём случае углы Эйлера нужны из-за особенностей специфики алгоритма, который я пытаюсь сформулировать. Если получится заставить этот алгоритм работать и если мне разрешат — я про него напишу.
Вы когда-нибудь пытались самолет посадить? Ну там на тренажере или в игрушке? Ну или беспилотником поуправлять. Попробуйте это сделать по кватернионам. Получится?

Так что человеку — только углы Эйлера: курс, крен, тангаж (дифферент). И никаких кватеринионов. И системе управления (что морской, что самолетной) тоже только углы Эйлера нужны.

P.S. Мы как раз и делаем приборы для определения курса, крена и дифферента по сигналам GPS/ГЛОНАСС. Пока что ни один заказчик не просил выдавать кватернионы. Всем только углы Эйлера нужны.
А если кубик надо покатать к примеру? Я пробовал — словил gimbal lock
Вращение кубика рубика — тоже в углах Эйлера описывается. Вы знаете хоть один пример, чтобы человек с аппаратурой или другим человеком общался в терминах кватернионов?

Несмотря на gimbal lock, мыслим мы, увы, в терминах углов Эйлера. И пока роботы не заменят людей — так и будет дальше.
Чтобы было понятней — если вы на самолете или корабле словили gimbal lock — вам уже ничто не поможет. Ибо это положение — носом к центру Земли. Ну разве что авиабомба так падает. Ни курса ни крена, один дифферент -90 градусов

Эм, на самолёте или спутнике вполне может быть и "носом вверх" и "носом вниз".
Если бы я реализовывал софт для них, я бы внутри использовал кватернионы. Как Вы в терминах углов Эйлера представите угловую скорость? Как производные по этим трём углам? Это же убого получится — спутник, например, вращается с постоянной скоростью, а нам приходится постоянно пересчитывать углы и угловые скорости. А если он вращается вокруг неудачной оси, то в окрестности gimbal lock ошибка вычислений станет большой.
Или, например, как найти оптимальный поворот их положения А в Б?

Мы с вами о разном. Вы о реализации софта, а я о том, что человек думает в терминах углов Эйлера. И все системы управления транспортными средствами — работают в углах Эйлера. Угловая скорость тоже в углах Эйлера, что на кораблях, что на самолетах.

Вы видели хоть одного человека, который думает в терминах кватернионов? Что там будет вместо «поверни направо» и «наклонись вперед»?

Я не скажу про управление спутником — не знаю, как там расположены двигатели ориентации. Но у корабля и самолета — оси выделены естественным путем.

Что касается моей области (спутниковая навигация), то в ИКД ГЛОНАСС в расчете положения фазового центра передающей антенны (приложение Т) используются углы Эйлера. Ну просто потому, что человеку так понятней.
Вы видели хоть одного человека, который думает в терминах кватернионов? Что там будет вместо «поверни направо» и «наклонись вперед»?

Можно определить операцию логарифмирования от кватерниона — это будет вектор, направленный вдоль оси вращения и длиной, равной углу поворота. Почти как кватернион, там тоже в координатах x,y,z спрятана ось вращения. Ещё есть обратная операция — экспонента. Например, у нас есть вектор угловой скорости, мы его умножаем на время t, и потом делаем экспоненту и получаем текущую ориентацию.


Так вот, люди вполне могут использовать обозначения "поверни по часовой стрелке вокруг вертикальной оси" или "поверни вокруг поперечной оси на 90 градусов".
Это не совсем то, что принято называть кватернионом, но описание вращения в виде "ось поворота, угол поворота", как мне кажется, намного ближе к кватерниону, чем к углам Эйлера.


Вращение кубика рубика — тоже в углах Эйлера описывается.

Забавно, но я хочу привести это как пример использования кватернионов)


  1. Поворот всего кубика на 90 градусов вокруг оси х — обозначается как "x". Аналогично с осями y,z.
  2. Поворот правой части вокруг оси, смотрящей право, по часовой стрелке — R (right)

Второй пример не очень удачный — можно сказать, что правую грань больше никак и не покрутить. Но тут есть нюанс (возможно, я ошибаюсь, кубиком Рубика не увлекался): повороты L и R делаются в разные стороны. Т.е., R делается по часовой стрелке, если смотреть справа, а L — если смотреть слева.


С точки зрения поворотов относительно вращающего, это немножко нелогично. А вот если смотреть на это как "R — вращение вокруг оси, направленной вправо, L — вокруг оси, направленной влево", то всё становится понятно.


Вы видели хоть одного человека, который думает в терминах кватернионов? Что там будет вместо «поверни направо» и «наклонись вперед»?

Короче, я утверждаю, что люди довольно часто мыслят в терминах "поворот вокруг такой-то оси на такой-то угол", и такая формулировка ближе к кватернионам, чем к углам Эйлера.


Причём если человек внутри корабля или самолёта, ему почему-то привычнее думать в углах Эйлера, а если вращает что-то перед собой (тот же кубик рубика), то становится проще представить ось вращения и крутить вокруг неё.

Короче, я утверждаю, что люди довольно часто мыслят в терминах «поворот вокруг такой-то оси на такой-то угол», и такая формулировка ближе к кватернионам, чем к углам Эйлера.


Люди действительно мыслят в таких терминах. Но когда это сумма поворотов по трем ортогональным осям — это углы Эйлера. А когда из трех поворотов по трем осям суммируется один поворот по суммарной оси — это уже кватернион.

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

А вот пни перекатывают действительно чем-то близким к кватернионам. :-) Уж больно кривые оси у выкорчеванного пня.
Чтобы было ещё более понятно — не [кубик-рубик-вращать], а катать по плоской поверхности обляпаный разными текстурами кубик, переваливая его через грань.
Так не вы кубик катаете, а ваша программа. А программе — конечно кватернионы удобней. А вот человека, думающего в терминах кватернионов я не встречал.

Попробуйте, выразите это в терминах кватернионов

Ну, к примеру, я так и не разобрался, как с помощью кватернионов задавать ограничения соеденений при расчете инверсной кинематики, с углами Эйлера это делается легко и понятно...

tminnigaliev, как вы оцениваете возможность эти преобразования залить в прошивку arduino? Достаточно заморочно пересчитывать? Те считывает поворотв/углы, чтобы получить координаты/смещения? Добавил в закладки, думаю пригодится.

Blandger, формулы там простые, т.е. в ардуино их запрограммировать можно. Но из вашей формулировки задачи мне кажется, что я недостаточно понятно описал, что делают две описанных функции. Повторю кратко: есть несколько способов задания поворота объекта в трёхмерном пространстве:
— с помощью углов Эйлера/Тейт-Брайана
— с помощью матриц поворота
— с помощью кватернионов
способ задания положения объекта с помощью углов Эйлера — самый неоднозначный как с точки зрения целесообразности, так и с точки зрения возможности внести путаницу. Поэтому хочется уметь преобразовывать углы Эйлера во что-то более удобное (например, кватернионы). С другой стороны, иногда возникает обратная задача, например, нужно нарисовать объект в программе, которая понимает только углы Эйлера (т.к. расчитана на пользователя-человека), а данные этой программе даёт другая программа, которой внутри себя проще оперировать кватернионами. Для этого две описанных функции и нужны: одна переводит из углов в кватернионы, вторая обратно.
В вашем вопросе прозвучала необходимость переводить углы в координаты. Это точно не относится к теме статьи. Возможно, вы имели в виду решение прямой кинематической задачи (расчёт координат манипулятора по углам и кинематической модели робота). Эта задача тоже легко решается средствами, доступными на Ардуино, но это другая задача, не рассмотренная в данной статье.
UFO just landed and posted this here
Oam2oam, спасибо за подсказку, статья интересная, сохраню её себе на будущее.
У углов Эйлера есть много соглашений о том, в каком порядке их отсчитывать, и к каким осям поворота они относятся. Пишешь функцию, потом берёшь датчик — а он внутри насыпает тебе углы по другой конвенции. И все расчёты возвращают чепуху. По хорошему нужно написать не одну, а 12 пар таких функций, и к ним плюс функции преобразования к радианам, градусам и полным оборотам vs абсолютных углов. Короче, меня этот вопрос тоже долгое время бесил, и мне в итоге пришлось писать свою библиотеку…
Nick_mentat, видимо, я сделал недостаточный упор на это в статье. Если совсем по-хорошему, то не 12, а 24 пары. И как раз они все и рассмотрены. У обеих функций есть параметр order, который как раз и задаёт порядок осей. Например,
XYZr означает, что первый угол отсчитывается вокруг оси X, второй вокруг оси Y, третий вокруг оси Z, при этом сами оси поворачиваются (т.е. после первого поворота оси Y и Z превращаются в Y' и Z', после второго поворота ось Z' превращается в Z")
ZXZs означает, что первый угол отсчитывается вокруг оси Z, при этом оси остаются на месте, второй угол вокруг оси X, и третий угол снова вокруг той же самой оси Z.

Таким образом, весь «зоопарк» порядков осей покрывается за счёт параметра order. Предполагается, что если датчик вам возвращает чепуху, вы можете его показания конвертировать с помощью одной из приведённых функций и попробовать по очереди каждый из 24 порядков, на том, на котором результат будет совпадать с вашими ожиданиями, можно будет остановиться.
Да, я всё понял, просто недавно пришлось по работе выписывать вручную этот зоопарк. Очень больная тема для меня, прямо в самое сердце статья пришлась… Спасибо.
Sign up to leave a comment.

Articles