Вращения, ориентация и кватернионы

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

HelperDrawRotation класс используется, чтобы проиллюстрировать несколько фрагментов этого примера.

dr = HelperDrawRotation;

Вращения в трех измерениях

Все вращения в 3-D могут быть заданы осью вращения и углом вращения вокруг той оси. Рассмотрите 3-D изображение заварного чайника в крайнем левом графике. Заварной чайник вращается 45 градусами вокруг оси Z во втором графике. Более комплексное вращение 15 градусов вокруг оси [1 0 1] показывают в третьем графике. Кватернионы инкапсулируют ось и угол вращения и имеют алгебру для управления этими вращениями. quaternion класс и этот пример, используют соглашение "правила правой руки" задать вращения. Таким образом, положительные вращения по часовой стрелке вокруг оси вращения, когда просматривается от источника.

dr.drawTeapotRotations;

Укажите вращение

Вершины чайника были повернуты вокруг оси вращения в системе координат. Рассмотрим точку (0,7, 0,5), повернутую на 30 градусов вокруг оси Z.

figure;
dr.draw2DPointRotation(gca);

Структурируйте вращение

Вращение кадра в некотором смысле противоположно повороту точки. При повороте кадра точки объекта остаются неподвижными, но система отсчета поворачивается. Снова рассмотрим точку (0,7, 0,5). Теперь опорная рамка повернута на 30 градусов вокруг оси Z. Обратите внимание, что хотя точка (0,7, 0,5) остается фиксированной, она имеет другие координаты в новой повернутой системе отсчета.

figure;
dr.draw2DFrameRotation(gca);

Ориентация

Ориентация относится к угловому смещению объекта относительно системы отсчета. Как правило, ориентация описана вращением, которое вызывает это угловое смещение от стартовой ориентации. В этом примере ориентация задана как вращение, которое берет количество в родительской системе координат к дочерней системе координат. Ориентация обычно дается как кватернион, матрица вращения, набор Углов Эйлера или вектор вращения. Полезно думать об ориентации как вращение системы координат: дочерняя система координат вращается относительно родительской системы координат.

Рассмотрите пример, где дочерняя система координат вращается 30 градусов вокруг вектора [1/3 2/3 2/3].

figure;
dr.draw3DOrientation(gca, [1/3 2/3 2/3], 30);

Кватернионы

Кватернионы это числа в выражении

$$a + b\textbf{i} + c\textbf{j} + d\textbf{k}$$

где

$$i^2=j^2=k^2=ijk=-1$$

и$a, b, c,$ и$d$ вещественные числа. В остальной части этого примера, этих четырех чисел$a, b, c,$ и$d$ упоминаются как части кватерниона.

Кватернионы для вращений и ориентации

Ось и угол вращения инкапсулируются в частях кватерниона. Для оси единичного вектора вращения [x, y, z], и угол поворота$\alpha$, кватернион, описывающий это вращение,

$$\cos\left(\frac{\alpha}{2}\right) +
\sin\left(\frac{\alpha}{2}\right)\left(x\textbf{i} + y\textbf{j}
+ z\textbf{k}\right)$$

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

$$norm(q) = \sqrt{a^2 + b^2 + c^2 + d^2}$$

Существует множество способов создать кватернион в MATLAB, например:

q1 = quaternion(1,2,3,4)
q1 = 

  quaternion


     1 + 2i + 3j + 4k

Массивы кватернионов могут быть сделаны таким же образом:

quaternion([1 10; -1 1], [2 20; -2 2], [3 30; -3 3], [4 40; -4 4])
ans = 

  2x2 quaternion array


      1 +  2i +  3j +  4k     10 + 20i + 30j + 40k
     -1 -  2i -  3j -  4k      1 +  2i +  3j +  4k

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

qmgk = quaternion(magic(4))
qmgk = 

  4x1 quaternion array


     16 +  2i +  3j + 13k
      5 + 11i + 10j +  8k
      9 +  7i +  6j + 12k
      4 + 14i + 15j +  1k

Кватернионы могут индексироваться и управляться точно так же, как любой другой массив:

qmgk(3)
ans = 

  quaternion


      9 +  7i +  6j + 12k

reshape(qmgk,2,2)
ans = 

  2x2 quaternion array


     16 +  2i +  3j + 13k      9 +  7i +  6j + 12k
      5 + 11i + 10j +  8k      4 + 14i + 15j +  1k

[q1; q1]
ans = 

  2x1 quaternion array


     1 + 2i + 3j + 4k
     1 + 2i + 3j + 4k

Математика кватерниона

Кватернионы имеют четко определенные арифметические операции. Сложение и вычитание аналогичны комплексным числам: части складываются/вычитаются независимо. Умножение сложнее из-за предыдущего уравнения:

$$i^2=j^2=k^2=ijk=-1$$

Это означает, что умножение кватернионов не является коммутативным. Таким образом,$pq \neq qp$ для кватернионов$p$ и$q$. Однако каждый кватернион имеет мультипликативную инверсию, таким образом, кватернионы могут быть разделены. Массивы quaternion класс может быть добавлен, вычтен, умножен и разделен на MATLAB.

q = quaternion(1,2,3,4);
p = quaternion(-5,6,-7,8);

Сложение

p + q
ans = 

  quaternion


     -4 +  8i -  4j + 12k

Вычитание

p - q
ans = 

  quaternion


     -6 +  4i - 10j +  4k

Умножение

p*q
ans = 

  quaternion


    -28 - 56i - 30j + 20k

Умножение в обратном порядке (отмечают различный результат),

q*p
ans = 

  quaternion


    -28 + 48i - 14j - 44k

Правое деление p q эквивалентно$p(q^{-1})$.

p./q
ans = 

  quaternion


         0.6 +  2.2667i + 0.53333j - 0.13333k

Левое деление q p эквивалентно$p^{-1}q$.

p.\q
ans = 

  quaternion


     0.10345 +  0.2069i +       0j - 0.34483k

Сопряженный из кватерниона формируется путем отрицания каждой из недействительных частей, похожих на спряжение для комплексного числа:

conj(p)
ans = 

  quaternion


    -5 - 6i + 7j - 8k

Кватернионы могут быть нормированы в MATLAB:

pnormed = normalize(p)
pnormed = 

  quaternion


    -0.37905 + 0.45486i - 0.53067j + 0.60648k

norm(pnormed)
ans =

     1

Укажите и структурируйте вращения с кватернионами

Кватернионы могут использоваться, чтобы вращать точки в статической системе отсчета или вращать саму систему отсчета. rotatepoint функция вращает точку$v = (v_x, v_y, v_z)$ с помощью кватерниона q посредством следующего уравнения:

$$p v_{quat} p^*$$

где$v_{quat}$

$$v_{quat} = 0 + v_x\textbf{i} + v_y\textbf{j} + v_z\textbf{k}$$

и$p^*$ указывает на спряжение кватерниона. Отметьте вышеупомянутые результаты умножения кватерниона в кватернионе с действительной частью$a$, равной 0.$b$$c$, и$d$ части результата формируют вращаемую точку $b$()$c$$d$.

Рассмотрите пример вращения точки сверху. Точка (0.7, 0.5) вращалась 30 градусов вокруг оси Z. В трех измерениях эта точка имеет 0 Z-координат. Используя формулировку угла оси, кватернион может быть создан с помощью [0 0 1] как ось вращения.

ang = deg2rad(30);
q = quaternion(cos(ang/2), 0, 0, sin(ang/2));
pt = [0.7, 0.5, 0];  % Z-coordinate is 0 in the X-Y plane
ptrot = rotatepoint(q, pt)
ptrot =

    0.3562    0.7830         0

Точно так же rotateframe функционируйте берет кватернион$q$ и точку$v$, чтобы вычислить

$$p^* v_{quat} p$$

Снова вышеупомянутое умножение кватерниона приводит к кватерниону с 0 действительными частями.$b$$c$$d$, части результата формируют координату точки$v$ в новой, вращаемой системе координат. Используя quaternion класс:

ptframerot = rotateframe(q, pt)
ptframerot =

    0.8562    0.0830         0

Кватернион и его сопряженный имеют противоположные эффекты из-за симметрии в уравнениях поворота точки и системы отсчета. Вращение сопряженным «отменяет» вращение.

rotateframe(conj(q), ptframerot)
ans =

    0.7000    0.5000         0

Из-за симметрии уравнений этот код выполняет то же вращение.

rotatepoint(q, ptframerot)
ans =

    0.7000    0.5000         0

Другие представления вращения

Часто вращения и ориентации описаны с помощью альтернативных средних значений: Углы Эйлера, матрицы вращения и/или векторы вращения. Все они взаимодействуют с кватернионами в MATLAB.

Углы Эйлера часто используются, потому что их легко интерпретировать. Считайте систему отсчета вращаемой 30 градусами вокруг оси Z, затем 20 градусами вокруг Оси Y, и затем-50 градусами вокруг Оси X. Отметьте здесь, и повсюду, вращения вокруг каждой оси являются внутренним параметром: каждое последующее вращение вокруг недавно созданного набора осей. Другими словами, второе вращение вокруг "новой" Оси Y, созданной первым вращением, не вокруг исходной Оси Y.

figure;
euld = [30 20 -50];
dr.drawEulerRotation(gca, euld);

Чтобы создать кватернион из этих Углов Эйлера в целях вращения системы координат, используйте quaternion конструктор. Поскольку порядок вращений вокруг оси Z сначала, затем вокруг новой Оси Y, и наконец вокруг новой Оси X, используйте 'ZYX' флаг.

qeul = quaternion(deg2rad(euld), 'euler', 'ZYX', 'frame')
qeul = 

  quaternion


      0.84313 -  0.44275i + 0.044296j +  0.30189k

'euler' флаг указывает, что первый аргумент исчисляется в радианах. Если аргумент в градусах, используйте 'eulerd' флаг.

qeuld = quaternion(euld, 'eulerd', 'ZYX', 'frame')
qeuld = 

  quaternion


      0.84313 -  0.44275i + 0.044296j +  0.30189k

Преобразовывать назад в Углы Эйлера:

rad2deg(euler(qeul, 'ZYX', 'frame'))
ans =

   30.0000   20.0000  -50.0000

Эквивалентно, eulerd метод может использоваться.

eulerd(qeul, 'ZYX', 'frame')
ans =

   30.0000   20.0000  -50.0000

В качестве альтернативы это то же вращение может быть представлено как матрица вращения:

rmat = rotmat(qeul, 'frame')
rmat =

    0.8138    0.4698   -0.3420
   -0.5483    0.4257   -0.7198
   -0.1926    0.7733    0.6040

Преобразование назад в кватернионы подобно:

quaternion(rmat, 'rotmat', 'frame')
ans = 

  quaternion


      0.84313 -  0.44275i + 0.044296j +  0.30189k

Так же, как кватернион может использоваться или для точки или для вращения системы координат, это может быть преобразовано в матрицу вращения (или набор Углов Эйлера) специально для вращения системы координат или точки. Матрица вращения для вращения точки является транспонированием матрицы для вращения системы координат. Чтобы преобразовать между представлениями вращения, необходимо задать 'point' или 'frame'.

Матрица вращения для раздела вращения точки этого примера:

rotmatPoint = rotmat(q, 'point')
rotmatPoint =

    0.8660   -0.5000         0
    0.5000    0.8660         0
         0         0    1.0000

Чтобы найти местоположение вращаемой точки, право - умножает rotmatPoint транспонированным массивом pt.

rotmatPoint * (pt')
ans =

    0.3562
    0.7830
         0

Матрица вращения для раздела вращения системы координат этого примера:

rotmatFrame = rotmat(q, 'frame')
rotmatFrame =

    0.8660    0.5000         0
   -0.5000    0.8660         0
         0         0    1.0000

Чтобы найти местоположение точки во вращаемой системе координат, право - умножает rotmatFrame транспонированным массивом pt.

rotmatFrame * (pt')
ans =

    0.8562
    0.0830
         0

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

rv = rotvec(qeul)
rv =

   -0.9349    0.0935    0.6375

Преобразовывать в кватернион:

quaternion(rv, 'rotvec')
ans = 

  quaternion


      0.84313 -  0.44275i + 0.044296j +  0.30189k

Расстояние

Одним преимуществом кватернионов по Углам Эйлера является отсутствие разрывов. Углы Эйлера имеют разрывы, которые варьируются в зависимости от используемого соглашения. dist функция сравнивает эффект вращения двумя различными кватернионами. Результатом является номер в области значений 0 к pi. Считайте два кватерниона созданными из Углов Эйлера:

eul1 = [0, 10, 0];
eul2 = [0, 15, 0];
qdist1 = quaternion(deg2rad(eul1), 'euler', 'ZYX', 'frame');
qdist2 = quaternion(deg2rad(eul2), 'euler', 'ZYX', 'frame');

Вычитая Углы Эйлера, вы видите, что нет никакого вращения вокруг оси Z или Оси X.

eul2 - eul1
ans =

     0     5     0

Различием между этими двумя вращениями являются пять градусов вокруг Оси Y. dist показывает различие также.

rad2deg(dist(qdist1, qdist2))
ans =

    5.0000

Для Углов Эйлера, таких как eul1 и eul2, вычисление углового расстояния тривиально. Более комплексный пример, который охватывает разрыв Угла Эйлера:

eul3 = [0, 89, 0];
eul4 = [180, 89, 180];
qdist3 = quaternion(deg2rad(eul3), 'euler', 'ZYX', 'frame');
qdist4 = quaternion(deg2rad(eul4), 'euler', 'ZYX', 'frame');

Хотя eul3 и eul4 представляйте почти ту же ориентацию, простое вычитание Угла Эйлера производит впечатление, которое эти две ориентации очень далеко друг от друга.

euldiff = eul4 - eul3
euldiff =

   180     0   180

Используя dist функция на кватернионах показывает, что существует только различие 2D степени в этих вращениях:

euldist = rad2deg(dist(qdist3, qdist4))
euldist =

    2.0000

Кватернион и его отрицание представляют то же вращение. Это не очевидно из вычитания кватернионов, но dist функция проясняет.

qpos = quaternion(-cos(pi/4), 0 ,0, sin(pi/4))
qpos = 

  quaternion


    -0.70711 +       0i +       0j + 0.70711k

qneg = -qpos
qneg = 

  quaternion


     0.70711 +       0i +       0j - 0.70711k

qdiff = qpos - qneg
qdiff = 

  quaternion


    -1.4142 +      0i +      0j + 1.4142k

dist(qpos, qneg)
ans =

     0

Поддерживаемые функции

quaternion класс позволяет вам эффективно описать вращения и ориентации в MATLAB. Полный список поддержанных кватернионом функций может быть найден с methods функция:

methods('quaternion')
Methods for class quaternion:

angvel              ismatrix            prod                
cat                 isnan               quaternion          
classUnderlying     isrow               rdivide             
compact             isscalar            reshape             
conj                isvector            rotateframe         
ctranspose          ldivide             rotatepoint         
disp                length              rotmat              
dist                log                 rotvec              
double              meanrot             rotvecd             
eq                  minus               single              
euler               mtimes              size                
eulerd              ndims               slerp               
exp                 ne                  times               
horzcat             norm                transpose           
iscolumn            normalize           uminus              
isempty             numel               validateattributes  
isequal             parts               vertcat             
isequaln            permute             
isfinite            plus                
isinf               power               

Static methods:

ones                zeros