quaternion

Создайте массив кватернионов

Описание

Кватернион является четырёхчастным гиперкомплексным числом, используемым в трехмерных вращениях и ориентациях.

Число кватерниона представлено в виде a+bi+cj+dk, где a, b, c и d части являются вещественными числами, и i, j, и k являются базисными элементами, удовлетворяющими уравнению: i2 = j2 = k2 = ijk = − 1.

Множество кватернионов, обозначенное H, задано в четырехмерном векторном пространстве над вещественными числами R4. Каждый элемент H имеет уникальное представление, основанное на линейной комбинации базисных элементов, i, j и k.

Все повороты в 3-D могут быть описаны осью поворота и углом вокруг этой оси. Преимущество кватернионов перед матрицами поворота состоит в том, что ось и угол поворота легко интерпретировать. Для примера рассмотрим точку в R3. Чтобы повернуть точку, вы задаете ось поворота и угол поворота.

Кватернионное представление вращения может быть выражено как q=cos(θ2)+sin(θ2)(ubi+ucj+udk), где θ - угол поворота и [ub, uc, и ud] - ось поворота.

Создание

Описание

пример

quat = quaternion() создает пустой кватернион.

пример

quat = quaternion(A,B,C,D) создает массив кватернионов, где четыре кватернионные части взяты из массивов A, B, C, и D. Все входы должны иметь одинаковый размер и иметь совпадающий тип данных.

пример

quat = quaternion(matrix) создает N-на-1 кватернион из матрицы N-на-4, где каждый столбец становится одной частью кватерниона.

пример

quat = quaternion(RV,'rotvec') создает N-на-1 кватернионный массив из матрицы N-на-3 векторов вращения, RV. Каждая строка RV представляет вектор вращения в радианах.

пример

quat = quaternion(RV,'rotvecd') создает N-на-1 кватернионный массив из матрицы N-на-3 векторов вращения, RV. Каждая строка RV представляет вектор поворота в степенях.

пример

quat = quaternion(RM,'rotmat',PF) создает N-на-1 кватернионный массив из N массива матриц поворота 3 на 3 байта, RM. PF может быть либо 'point' если углы Эйлера представляют повороты точек или 'frame' для поворотов системы координат.

пример

quat = quaternion(E,'euler',RS,PF) создает N-на-1 кватернион массив из матрицы N-на-3, E. Каждая строка E представляет набор углов Эйлера в радианах. Углы в E - повороты вокруг осей последовательно RS.

пример

quat = quaternion(E,'eulerd',RS,PF) создает N-на-1 кватернион массив из матрицы N-на-3, E. Каждая строка E представляет набор углов Эйлера в степенях. Углы в E - повороты вокруг осей последовательно RS.

Входные параметры

расширить все

Части кватерниона, заданные как четыре разделенных запятыми скаляра, матрицы или многомерные массивы того же размера.

Пример: quat = quaternion(1,2,3,4) создает кватернион вида 1 + 2i + 3j + 4k.

Пример: quat = quaternion([1,5],[2,6],[3,7],[4,8]) создает массив кватерниона 1 на 2, где quat(1,1) = 1 + 2i + 3j + 4k и quat(1,2) = 5 + 6i + 7j + 8k

Типы данных: single | double

Матрица кватернионных частей, заданная как матрица N -на-4. Каждая строка представляет отдельный кватернион. Каждый столбец представляет отдельную часть кватерниона.

Пример: quat = quaternion(rand(10,4)) создает массив кватерниона 10 на 1.

Типы данных: single | double

Матрица векторов поворота, заданная как матрица N -на-3. Каждая строка RV представляет вектор вращения элементов массива [X Y Z]. Вектор поворота является вектором модуля, представляющим ось поворота, масштабируемую углом поворота в радианах или степенях.

Чтобы использовать этот синтаксис, задайте первый аргумент как матрицу векторов поворота, а второй аргумент как 'rotvec' или 'rotvecd'.

Пример: quat = quaternion(rand(10,3),'rotvec') создает массив кватерниона 10 на 1.

Типы данных: single | double

Массив матриц поворота, заданный матрицей 3 на 3 или массивом 3 на 3 N. Каждая страница массива представляет отдельную матрицу поворота.

Пример: quat = кватернион (rand (3), 'rotmat', 'point')

Пример: quat = кватернион (rand (3), 'rotmat', 'frame')

Типы данных: single | double

Тип матрицы вращения, заданный 'point' или 'frame'.

Пример: quat = кватернион (rand (3), 'rotmat', 'point')

Пример: quat = кватернион (rand (3), 'rotmat', 'frame')

Типы данных: char | string

Матрица углов Эйлера, заданная матрицей N -by-3. При использовании 'euler' синтаксис, задайте E в радианах. При использовании 'eulerd' синтаксис, задайте E в степенях.

Пример: quat = кватернион (E, 'euler', 'YZY', 'point')

Пример: quat = кватернион (E, 'euler', 'XYZ', 'frame')

Типы данных: single | double

Последовательность вращения, заданная как трехэлементный вектор символов:

  • 'YZY'

  • 'YXY'

  • 'ZYZ'

  • 'ZXZ'

  • 'XYX'

  • 'XZX'

  • 'XYZ'

  • 'YZX'

  • 'ZXY'

  • 'XZY'

  • 'ZYX'

  • 'YXZ'

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

point = [sqrt(2)/2,sqrt(2)/2,0];
В этом представлении первый столбец представляет x -ось, второй столбец представляет y -ось, а третий столбец представляет z -ось.

Вы хотите повернуть точку с помощью представления угла Эйлера [45,45,0]. Поверните точку с помощью двух различных последовательностей поворота:

  • Если вы создаете вращатель кватерниона и задаете последовательность 'ZYX', система координат сначала поворачивается на 45 ° вокруг оси z, затем на 45 ° вокруг новой оси y-.

    quatRotator = quaternion([45,45,0],'eulerd','ZYX','frame');
    newPointCoordinate = rotateframe(quatRotator,point)
    newPointCoordinate =
    
        0.7071   -0.0000    0.7071

  • Если вы создаете вращатель кватерниона и задаете последовательность 'YZX', система координат сначала поворачивается на 45 ° вокруг оси y, затем на 45 ° вокруг новой оси z-.

    quatRotator = quaternion([45,45,0],'eulerd','YZX','frame');
    newPointCoordinate = rotateframe(quatRotator,point)
    newPointCoordinate =
    
        0.8536    0.1464    0.5000

Типы данных: char | string

Функции объекта

angvelСкорость вращения из массива кватернионов
classUnderlyingКласс частей в кватернионе
compactПреобразуйте массив кватерниона в N -на-4 матрицу
conjКомплексный сопряженный кватерниона
ctranspose, 'Комплексная сопряженная транспозиция массива кватернионов
distУгловое расстояние в радианах
eulerПреобразуйте кватернион в углы Эйлера (радианы)
eulerdПреобразуйте кватернион в углы Эйлера ( степени)
expЭкспоненциал кватерниона массива
ldivide, .\Поэлементное кватернионное левое деление
logЕстественный логарифм массива кватернионов
meanrotСреднее вращение Кватерниона
minus, -Вычитание кватерниона
mtimes, *Кватернионное умножение
normКватернионовая норма
normalizeКватернионная нормализация
onesСоздайте массив кватернионов с вещественными частями, установленными на единицу, и воображаемыми частями, установленными на нуль
partsИзвлечение частей кватерниона
power, .^Элементарная кватернионная степень
prodПродукт массива кватернионов
randrotРавномерно распределенные случайные повороты
rdivide, ./Элементарное кватернионное правое деление
rotateframeВращение кватернионной системы координат
rotatepointВращение точки кватерниона
rotmatПреобразуйте кватернион в матрицу вращения
rotvecПреобразуйте кватернион в вектор вращения (радианы)
rotvecdПреобразуйте кватернион в вектор вращения (в градусах)
slerpСферическая линейная интерполяция
times, .*Поэлементное кватернионное умножение
transpose, 'Транспонируйте массив кватерниона
uminus, -Кватернион унарный минус
zerosСоздайте массив кватерниона с нулем всех деталей

Примеры

свернуть все

quat = quaternion()
quat = 

  0x0 empty quaternion array

По умолчанию базовый класс кватерниона является double.

classUnderlying(quat)
ans = 
'double'

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

Задайте кватернионные части как скаляры.

A = 1.1;
B = 2.1;
C = 3.1;
D = 4.1;
quatScalar = quaternion(A,B,C,D)
quatScalar = quaternion
     1.1 + 2.1i + 3.1j + 4.1k

Задайте кватернионные части как векторы-столбцы.

A = [1.1;1.2];
B = [2.1;2.2];
C = [3.1;3.2];
D = [4.1;4.2];
quatVector = quaternion(A,B,C,D)
quatVector=2×1 quaternion array
     1.1 + 2.1i + 3.1j + 4.1k
     1.2 + 2.2i + 3.2j + 4.2k

Задайте кватернионные части как матрицы.

A = [1.1,1.3; ...
     1.2,1.4];
B = [2.1,2.3; ...
     2.2,2.4];
C = [3.1,3.3; ...
     3.2,3.4];
D = [4.1,4.3; ...
     4.2,4.4];
quatMatrix = quaternion(A,B,C,D)
quatMatrix=2×2 quaternion array
     1.1 + 2.1i + 3.1j + 4.1k     1.3 + 2.3i + 3.3j + 4.3k
     1.2 + 2.2i + 3.2j + 4.2k     1.4 + 2.4i + 3.4j + 4.4k

Задайте кватернионные части как трехмерные массивы.

A = randn(2,2,2);
B = zeros(2,2,2);
C = zeros(2,2,2);
D = zeros(2,2,2);
quatMultiDimArray = quaternion(A,B,C,D)
quatMultiDimArray = 2x2x2 quaternion array
quatMultiDimArray(:,:,1) = 

     0.53767 +       0i +       0j +       0k     -2.2588 +       0i +       0j +       0k
      1.8339 +       0i +       0j +       0k     0.86217 +       0i +       0j +       0k


quatMultiDimArray(:,:,2) = 

     0.31877 +       0i +       0j +       0k    -0.43359 +       0i +       0j +       0k
     -1.3077 +       0i +       0j +       0k     0.34262 +       0i +       0j +       0k

Можно создать скаляр или вектор-столбец кватернионов путем задания N-by-4 матрицы кватернионов, где столбцы соответствуют кватернионам A, B, C и D.

Создайте вектор-столбец случайных кватернионов.

quatParts = rand(3,4)
quatParts = 3×4

    0.8147    0.9134    0.2785    0.9649
    0.9058    0.6324    0.5469    0.1576
    0.1270    0.0975    0.9575    0.9706

quat = quaternion(quatParts)
quat=3×1 quaternion array
     0.81472 + 0.91338i +  0.2785j + 0.96489k
     0.90579 + 0.63236i + 0.54688j + 0.15761k
     0.12699 + 0.09754i + 0.95751j + 0.97059k

Как извлечь quatParts матрица из представления кватерниона, используйте compact.

retrievedquatParts = compact(quat)
retrievedquatParts = 3×4

    0.8147    0.9134    0.2785    0.9649
    0.9058    0.6324    0.5469    0.1576
    0.1270    0.0975    0.9575    0.9706

Можно создать N-by-1 кватернионный массив, задав N-by-3 матрицу векторов поворота в радианах или степенях. Векторы вращения являются компактными пространственными представлениями, которые имеют отношение один к одному с нормализованными кватернионами.

Векторы Вращения в Радианах

Создайте скалярный кватернион с помощью вектора вращения и проверьте, что полученный кватернион нормирован.

rotationVector = [0.3491,0.6283,0.3491];
quat = quaternion(rotationVector,'rotvec')
quat = quaternion
     0.92124 + 0.16994i + 0.30586j + 0.16994k

norm(quat)
ans = 1.0000

Можно преобразовать из кватернионов в векторы вращения в радианах, используя rotvec функция. Восстановление rotationVector от кватерниона, quat.

rotvec(quat)
ans = 1×3

    0.3491    0.6283    0.3491

Векторы поворота в степенях

Создайте скалярный кватернион с помощью вектора вращения и проверьте, что полученный кватернион нормирован.

rotationVector = [20,36,20];
quat = quaternion(rotationVector,'rotvecd')
quat = quaternion
     0.92125 + 0.16993i + 0.30587j + 0.16993k

norm(quat)
ans = 1

Можно преобразовать из кватернионов в векторы поворота в степенях с помощью rotvecd функция. Восстановление rotationVector от кватерниона, quat.

rotvecd(quat)
ans = 1×3

   20.0000   36.0000   20.0000

Можно создать N-by-1 массив кватернионов путем определения 3-by-3-by-N массива матриц поворота. Каждая страница массива матриц поворота соответствует одному элементу массива кватернионов.

Создайте скалярный кватернион с помощью матрицы вращения 3 на 3. Задайте, следует ли интерпретировать матрицу поворота как систему координат или поворот точки.

rotationMatrix = [1 0         0; ...
                  0 sqrt(3)/2 0.5; ...
                  0 -0.5      sqrt(3)/2];
quat = quaternion(rotationMatrix,'rotmat','frame')
quat = quaternion
     0.96593 + 0.25882i +       0j +       0k

Можно преобразовать из кватернионов в матрицы вращения с помощью rotmat функция. Восстановление rotationMatrix от кватерниона, quat.

rotmat(quat,'frame')
ans = 3×3

    1.0000         0         0
         0    0.8660    0.5000
         0   -0.5000    0.8660

Можно создать N-by-1 кватернионный массив, задав N-by-3 массив углов Эйлера в радианах или степенях.

Углы Эйлера в радианах

Используйте euler синтаксис для создания скалярного кватерниона с помощью вектора 1 на 3 углов Эйлера в радианах. Задайте последовательность поворота углов Эйлера и представление углов поворотом системы координат или точки.

E = [pi/2,0,pi/4];
quat = quaternion(E,'euler','ZYX','frame')
quat = quaternion
     0.65328 +  0.2706i +  0.2706j + 0.65328k

Вы можете преобразовать из кватернионов в углы Эйлера с помощью euler функция. Восстановите углы Эйлера, E, от кватерниона, quat.

euler(quat,'ZYX','frame')
ans = 1×3

    1.5708         0    0.7854

Углы Эйлера в степенях

Используйте eulerd синтаксис для создания скалярного кватерниона с помощью вектора 1 на 3 углов Эйлера в степенях. Задайте последовательность поворота углов Эйлера и представление углов поворотом системы координат или точки.

E = [90,0,45];
quat = quaternion(E,'eulerd','ZYX','frame')
quat = quaternion
     0.65328 +  0.2706i +  0.2706j + 0.65328k

Можно преобразовать из кватернионов в углы Эйлера в степенях с помощью eulerd функция. Восстановите углы Эйлера, E, от кватерниона, quat.

eulerd(quat,'ZYX','frame')
ans = 1×3

   90.0000         0   45.0000

Кватернионы образуют некоммутативную ассоциативную алгебру над вещественными числами. Этот пример иллюстрирует правила алгебры кватерниона.

Сложение и вычитание

Сложение и вычитание кватерниона происходят частично по частям и являются коммутативными:

Q1 = quaternion(1,2,3,4)
Q1 = quaternion
     1 + 2i + 3j + 4k

Q2 = quaternion(9,8,7,6)
Q2 = quaternion
     9 + 8i + 7j + 6k

Q1plusQ2 = Q1 + Q2
Q1plusQ2 = quaternion
     10 + 10i + 10j + 10k

Q2plusQ1 = Q2 + Q1
Q2plusQ1 = quaternion
     10 + 10i + 10j + 10k

Q1minusQ2 = Q1 - Q2
Q1minusQ2 = quaternion
    -8 - 6i - 4j - 2k

Q2minusQ1 = Q2 - Q1
Q2minusQ1 = quaternion
     8 + 6i + 4j + 2k

Можно также выполнить сложение и вычитание вещественных чисел и кватернионов. Первая часть кватерниона упоминается как действительная часть, в то время как вторая, третья и четвертая части называются вектором. Сложение и вычитание с вещественными числами влияют только на вещественную часть кватерниона.

Q1plusRealNumber = Q1 + 5
Q1plusRealNumber = quaternion
     6 + 2i + 3j + 4k

Q1minusRealNumber = Q1 - 5
Q1minusRealNumber = quaternion
    -4 + 2i + 3j + 4k

Умножение

Умножение кватерниона определяется продуктов базисных элементов и распределительного закона. Напомним, что умножение элементов базиса, i, j и k, не коммутативны, и поэтому кватернионное умножение не коммутативно.

Q1timesQ2 = Q1 * Q2
Q1timesQ2 = quaternion
    -52 + 16i + 54j + 32k

Q2timesQ1 = Q2 * Q1
Q2timesQ1 = quaternion
    -52 + 36i + 14j + 52k

isequal(Q1timesQ2,Q2timesQ1)
ans = logical
   0

Можно также умножить кватернион на действительное число. Если умножить кватернион на действительное число, каждая часть кватерниона умножается на действительное число индивидуально:

Q1times5 = Q1*5
Q1times5 = quaternion
      5 + 10i + 15j + 20k

Умножение кватерниона на вещественное число коммутативно.

isequal(Q1*5,5*Q1)
ans = logical
   1

Спряжение

Комплексный сопряженный кватерниона задан таким образом, что каждый элемент векторного фрагмента кватерниона отрицается.

Q1
Q1 = quaternion
     1 + 2i + 3j + 4k

conj(Q1)
ans = quaternion
     1 - 2i - 3j - 4k

Умножение между кватернионом и его сопряженным коммутативно:

isequal(Q1*conj(Q1),conj(Q1)*Q1)
ans = logical
   1

Можно организовать кватернионы в векторы, матрицы и многомерные массивы. Встроенные функции MATLAB ® были расширены для работы с кватернионами.

Конкатенация

Кватернионы обрабатываются как отдельные объекты во время конкатенации и следуют правилам MATLAB для манипуляции массивами.

Q1 = quaternion(1,2,3,4);
Q2 = quaternion(9,8,7,6);

qVector = [Q1,Q2]
qVector=1×2 quaternion array
     1 + 2i + 3j + 4k     9 + 8i + 7j + 6k

Q3 = quaternion(-1,-2,-3,-4);
Q4 = quaternion(-9,-8,-7,-6);

qMatrix = [qVector;Q3,Q4]
qMatrix=2×2 quaternion array
     1 + 2i + 3j + 4k     9 + 8i + 7j + 6k
    -1 - 2i - 3j - 4k    -9 - 8i - 7j - 6k

qMultiDimensionalArray(:,:,1) = qMatrix;
qMultiDimensionalArray(:,:,2) = qMatrix
qMultiDimensionalArray = 2x2x2 quaternion array
qMultiDimensionalArray(:,:,1) = 

     1 + 2i + 3j + 4k     9 + 8i + 7j + 6k
    -1 - 2i - 3j - 4k    -9 - 8i - 7j - 6k


qMultiDimensionalArray(:,:,2) = 

     1 + 2i + 3j + 4k     9 + 8i + 7j + 6k
    -1 - 2i - 3j - 4k    -9 - 8i - 7j - 6k

Индексация

Для доступа или назначения элементов в массиве кватернионов используйте индексацию.

qLoc2 = qMultiDimensionalArray(2)
qLoc2 = quaternion
    -1 - 2i - 3j - 4k

Замените кватернион по индексу два на кватернион.

qMultiDimensionalArray(2) = ones('quaternion')
qMultiDimensionalArray = 2x2x2 quaternion array
qMultiDimensionalArray(:,:,1) = 

     1 + 2i + 3j + 4k     9 + 8i + 7j + 6k
     1 + 0i + 0j + 0k    -9 - 8i - 7j - 6k


qMultiDimensionalArray(:,:,2) = 

     1 + 2i + 3j + 4k     9 + 8i + 7j + 6k
    -1 - 2i - 3j - 4k    -9 - 8i - 7j - 6k

Измениться

Чтобы изменить форму массивов кватернионов, используйте reshape функция.

qMatReshaped = reshape(qMatrix,4,1)
qMatReshaped=4×1 quaternion array
     1 + 2i + 3j + 4k
    -1 - 2i - 3j - 4k
     9 + 8i + 7j + 6k
    -9 - 8i - 7j - 6k

Переместить

Чтобы транспонировать векторы и матрицы кватерниона, используйте transpose функция.

qMatTransposed = transpose(qMatrix)
qMatTransposed=2×2 quaternion array
     1 + 2i + 3j + 4k    -1 - 2i - 3j - 4k
     9 + 8i + 7j + 6k    -9 - 8i - 7j - 6k

Переставить

Для транспозиции векторов кватерниона, матриц и многомерных массивов используйте permute функция.

qMultiDimensionalArray
qMultiDimensionalArray = 2x2x2 quaternion array
qMultiDimensionalArray(:,:,1) = 

     1 + 2i + 3j + 4k     9 + 8i + 7j + 6k
     1 + 0i + 0j + 0k    -9 - 8i - 7j - 6k


qMultiDimensionalArray(:,:,2) = 

     1 + 2i + 3j + 4k     9 + 8i + 7j + 6k
    -1 - 2i - 3j - 4k    -9 - 8i - 7j - 6k

qMatPermute = permute(qMultiDimensionalArray,[3,1,2])
qMatPermute = 2x2x2 quaternion array
qMatPermute(:,:,1) = 

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


qMatPermute(:,:,2) = 

     9 + 8i + 7j + 6k    -9 - 8i - 7j - 6k
     9 + 8i + 7j + 6k    -9 - 8i - 7j - 6k

Расширенные возможности

Генерация кода C/C + +
Сгенерируйте код C и C++ с помощью Coder™ MATLAB ®

.
Введенный в R2021a