nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Ликбез по кватернионам, часть 2: основные операции

Часть 1 - история вопроса
Часть 2 - основные операции
Часть 3 - запись вращения через кватернионы
Часть 4 - кватернионы и спиноры; порядок перемножения
Часть 5 - практическая реализация поворота
Часть 5 1/2 - введение метрики, "расстояния" между поворотами
Часть 6 - поворот по кратчайшему пути
Часть 6 1/4 - кратчайший поворот в общем случае
Часть 6 2/4 - поворот, совмещающий два направления
Часть 6 3/4 - кватернион из синуса и косинуса угла
Часть 7 - интегрирование угловых скоростей, углы Эйлера-Крылова
Часть 8 - интегрирование угловых скоростей, матрицы поворота
Часть 8 1/2 - ортонормирование матрицы и уравнения Пуассона
Часть 9 - интегрирование угловых скоростей с помощью кватернионов
Часть 10 - интегрирование угловых скоростей, методы 2-го порядка
Часть 10 1/2 - интегрирование с поддержанием нормы
Часть 11 - интегрирование угловых скоростей, методы высших порядков (в разработке)
Часть 12 - навигационная задача
Часть 13 - Дэвенпорт берёт след!
Часть 14 - линейный метод Мортари-Маркли
Часть 15 - среднее от двух кватернионов
Часть 15 1/2 - проверка и усреднение кватернионов
Часть 16 - разложение кватерниона на повороты

Наверное, самая простая часть, самая стандартная (сложно это всё изложить как-то иначе, да и не нужно) и самая важная.

Основные операции

Пора поиграться с надписью на мосту. Выпишем эти соотношения отдельными пунктами:
i2 = -1(2.1)
j2 = -1 (2.2)
k2 = -1 (2.3)
ijk = -1 (2.4)



Помножим обе части (2.4) слева на i:

i*ijk = i2 * jk = - jk= -i,
jk = i
(2.5)


помножим обе части (2.4) на k справа:

ijk*k = ij * k2 = -ij = -k,
ij = k
(2.6)


помножим обе части (2.5) слева на j:

j2k = -k = ji,
ji = -k
(2.7)


и мы обнаруживаем, что мнимые единицы не коммутируют. Точнее, они антикоммутируют, т.е от перемены мест множителей произведение меняет знак. Ну а кватернионы в общем случае просто не коммутируют, и это совершенно ожидаемое явление, ведь повороты в пространстве тоже, вообще говоря, не коммутируют!
В книгах любят приводить поворот книги в двух направлениях, но опыт автора показывает – повторить это вживую очень тяжело, моментально запутаешься, по какой оси делался каждый поворот. Лучше демонстрировать повороты на модельке самолёта, у него нос и хвост, верх и низ, лево и право куда лучше выражены, чем у книги, и все направления имеют свои названия!

Начнем с абстрактного самолёта, на которого мы смотрим сзади:
PlaneRear.png

Пусть он повернется на 90 градусов по крену, по часовой стрелке:
PlaneRear90CW.png

А теперь - на 90 градусов по курсу, направо (направо для пилота, т.е по направлению к правому крылу!):
PlaneFromLeft90CW.png

Итог двух поворотов в порядке "сначала крен, потом курс" - самолёт летит (или скорее падает) вертикально вниз. Пожалуйста, не повторяйте это дома!

Попробуем поменять повороты местами. Начнем с курса - самолёт повернул направо:
PlaneFromLeft.png

А теперь поворот по крену:
PlaneTop.png

Итог: самолёт летит горизонтально "направо", правым крылом книзу - ну совсем другая картина!

Здесь мы выполняли повороты в подвижной, или связанной системе координат, т.е вокруг осей, которые "прикреплены" к объекту, в нашем случае - курс, крен и тангаж.

Похожая ситуация будет с неподвижной системой координат, оставим её в качестве упражнения читателю.

Если бы умножение кватернионов было коммутативным, они были бы абсолютно непригодны для представления поворотов в пространстве!
Но продолжим выводить соотношения.
Помножим обе части (2.6) справа на j:

ij2 = -i = kj,
kj = -i
(2.8)


Помножим обе части (2.7) справа на i:

ji2 = -j = -ki,
ki = j
(2.9)


И последнее соотношение: помножим обе части (2.6) слева на i:

i2j= -j = ik,
ik = -j
(2.10)

Подытожим:

i2 = -1 ij = k ik = -j
ji = -k j2 = -1 jk = i
ki = j kj = -i k2 = -1


Эти соотношения довольно легко запомнить. Когда мы умножаем две различные мнимые единицы, получаем оставшуюся, причём со знаком “+”, если мы называем их по порядку (i->j->k->i) и со знаком “-“, если с пропуском.

Обозначение кватернионов
Принято присваивать кватернионам большие греческие буквы, начиная обычно с Λ, а индексы начинать с нуля:
Λ = a0+a1i+a2j+a3k,
Μ = b0+b1i+b2j+b3k

Сложение кватернионов
Ничего неожиданного: мы просто складываем их почленно:
Λ+Μ = (a0+b0)+(a1+b1)i+(a2+b2 )j+(a3+b3)k
(2.11)


Можно их и вычитать:
Λ-Μ = (a0-b0)+ (a1-b1)i+(a2-b2 )j+(a3-b3)k
(2.12)


Умножение кватернионов
Мы раскрываем скобки, после чего применяем соотношения (2.1)-(2.10):
ΛΜ = (a0+a1i+a2j+a3k)(b0+b1 i+b2 j+b3 k)=

=a0b0+a0b1i+a0b2j+a0 b3k+
+a1b0i-a1b1+a1b2k-a1 b3j+
+a2b0j-a2b1k-a2b2+a2 b3i+
+a3b0k+a3b1j-a3b2i-a3b3
(2.13)


Такая форма записи вполне подходит для компьютера – мы можем легко сосчитать, что для умножения двух кватернионов требуется 16 умножений и 12 сложений/вычитаний. Громоздко, однако перемножение двух матриц 3х3 ещё хуже – такая операция требует 27 умножений и 18 сложений. Именно эта причина, по мнению многих, предопределила использование кватернионов в космических аппаратах – интегрирование угловых скоростей через кватернионы требует меньше вычислительных затрат. Да, и это тоже (хотя, как мы увидим позже, применить поворот к вектору с помощью кватернионов требует больше труда, чем с помощью матрицы), но подозреваю, что это отнюдь не самая важная из причин.

Для человека же понять, что происходит в формуле (2.13) – не так-то легко. Попробуем сгруппировать отдельные компоненты, как это показано цветом.

И введём новые обозначения: действительную часть (нулевую компоненту) кватерниона назовём скалярной частью, а три компоненты мнимой части – векторной. То есть,
vector_notation.png

В таком случае, слагаемое, обозначенное красным в (2.13) – это произведение двух скалярных частей.
Слагаемые, обозначенные голубым – вектор b, помноженный на скаляр a.
Слагаемые, обозначенные фиолетовым – вектор a, помноженный на скаляр b.
Слагаемые, обозначенные зелёным – это скалярное произведение векторов a,b, взятое со знаком «минус».
И наконец, 6 слагаемых, обозначенных черным – это векторное произведение векторов a,b.
Итак, в новых обозначениях произведение кватернионов запишется следующим образом:

multiply_in_vector.png

Такая форма записи хороша ещё и тем, что мы захотим применять кватернионы для поворота векторов в пространстве, так вот, вектор и будет частным случаем кватерниона, с нулевой (а вообще говоря, произвольной) скалярной частью.

Сопряженный кватернион

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

conj.png

Важным для нас окажется следующее равенство:

conj_eq.png

то есть, сопряжение от произведения кватернионов равно произведению сопряженных кватернионов, выполненному в обратном порядке. Аналогичными свойствами обладают операции транспонирования матрицы, а также гильбертова сопряжения.
Найдём, чему равно произведение кватерниона на сопряженный к нему:

moduleSquared.png

Итак, произведение кватерниона на сопряженный к нему равно сумме квадратов всех компонентов и не зависит от порядка умножения, эту величину называют квадратом модуля, а сам модуль определяется как:

module.png

При умножении кватернионов выполняется равенство:
module_eq.png

К примеру, если перемножать единичные кватернионы (т. е с модулем единица), получится также единичный кватернион.
Данное свойство встречается столь же редко в системах гиперкомплексных чисел, как и деление, и это не случайно. По сути, из (2.19) мы видим, что при умножении ненулевых кватернионов результат никогда не обратится в ноль.

Деление кватернионов
Как мы видели раньше, наличие операции деления – принципиально важно для представления поворотов. Тем не менее, саму по себе запись деления очень редко можно встретить при работе с кватернионами, и на это есть основание.
Запишем деление как дробь с горизонтальной чертой:

quatDivide1.png

По аналогии с комплексными числами, помножим числитель и знаменатель на Μ. И тут-то возникает проблема: должны ли мы умножать их слева или справа? Как мы знаем, умножение кватернионов вообще говоря некоммутативно, поэтому результаты получатся разными.
При записи

quatDivide2.png

по крайней мере M находится справа, поэтому логичным кажется умножать числитель и знаменатель именно справа. Проделаем это:

quatDivideFormula.png

Тем не менее, такая запись тоже встречается довольно редко, а в большинстве случаев мы находим кватернион, обратный данному:
quatInversion.png

и уже его будем умножать либо слева, либо справа – такая запись получается наиболее строгой. Заметим, кстати, что для единичных кватернионов

inversionEq.png

можно провести аналогию с ортогональными матрицами (матрицы поворота - их частный случай), для которых

matrixInv.png

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

Tags: кватернионы-это просто (том 1), математика, работа
Subscribe

Recent Posts from This Journal

  • Великая Октябрьская резня бензопилой

    Сегодня прокатился прочистить Абрамцевскую просеку. Как обычно, с приключениями. Выезжал на велосипеде, а вернулся на самокате. Первый раз по этим…

  • Очередная несуразность в единицах измерения

    Когда-то я написал программу PhysUnitCalc - калькулятор, умеющий работать с размерностями. Мне казалось, что я наступил уже на все грабли, которые…

  • Big Data, чтоб их... (3)

    "В предыдущих сериях": мой прибор выдаёт 6 значений: 3 координаты и 3 угла, т.е все 6 степеней свободы твёрдого тела. Причём ошибки измерения этих 6…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 18 comments

Recent Posts from This Journal

  • Великая Октябрьская резня бензопилой

    Сегодня прокатился прочистить Абрамцевскую просеку. Как обычно, с приключениями. Выезжал на велосипеде, а вернулся на самокате. Первый раз по этим…

  • Очередная несуразность в единицах измерения

    Когда-то я написал программу PhysUnitCalc - калькулятор, умеющий работать с размерностями. Мне казалось, что я наступил уже на все грабли, которые…

  • Big Data, чтоб их... (3)

    "В предыдущих сериях": мой прибор выдаёт 6 значений: 3 координаты и 3 угла, т.е все 6 степеней свободы твёрдого тела. Причём ошибки измерения этих 6…