exponenta event banner

rotmat

Преобразование кватерниона в матрицу вращения

Описание

пример

rotationMatrix = rotmat(quat,rotationType) преобразует кватернион, quat, в эквивалентное представление матрицы поворота.

Примеры

свернуть все

Определите кватернион для использования при вращении точки.

theta = 45;
gamma = 30;
quat = quaternion([0,theta,gamma],'eulerd','ZYX','point')
quat = quaternion
       0.8924 +  0.23912i +  0.36964j + 0.099046k

Преобразование кватерниона в матрицу вращения.

rotationMatrix = rotmat(quat,'point')
rotationMatrix = 3×3

    0.7071   -0.0000    0.7071
    0.3536    0.8660   -0.3536
   -0.6124    0.5000    0.6124

Чтобы проверить матрицу вращения, непосредственно создайте две матрицы вращения, соответствующие поворотам вокруг осей y и x. Умножьте матрицы вращения и сравните с выходом rotmat.

theta = 45;
gamma = 30;

ry = [cosd(theta)   0           sind(theta) ; ...
      0             1           0           ; ...
     -sind(theta)   0           cosd(theta)];
 
rx = [1             0           0           ;      ...
      0             cosd(gamma) -sind(gamma) ;     ...
      0             sind(gamma) cosd(gamma)];

rotationMatrixVerification = rx*ry
rotationMatrixVerification = 3×3

    0.7071         0    0.7071
    0.3536    0.8660   -0.3536
   -0.6124    0.5000    0.6124

Определите кватернион для использования при повороте рамки.

theta = 45;
gamma = 30;
quat = quaternion([0,theta,gamma],'eulerd','ZYX','frame')
quat = quaternion
       0.8924 +  0.23912i +  0.36964j - 0.099046k

Преобразование кватерниона в матрицу вращения.

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

    0.7071   -0.0000   -0.7071
    0.3536    0.8660    0.3536
    0.6124   -0.5000    0.6124

Чтобы проверить матрицу вращения, непосредственно создайте две матрицы вращения, соответствующие поворотам вокруг осей y и x. Умножьте матрицы вращения и сравните с выходом rotmat.

theta = 45;
gamma = 30;

ry = [cosd(theta)   0           -sind(theta) ; ...
      0             1           0           ; ...
     sind(theta)   0           cosd(theta)];
 
rx = [1             0           0           ;      ...
      0             cosd(gamma) sind(gamma) ;     ...
      0             -sind(gamma) cosd(gamma)];

rotationMatrixVerification = rx*ry
rotationMatrixVerification = 3×3

    0.7071         0   -0.7071
    0.3536    0.8660    0.3536
    0.6124   -0.5000    0.6124

Создайте нормализованный вектор кватерниона 3 на 1.

qVec = normalize(quaternion(randn(3,4)));

Преобразуйте массив кватернионов в матрицы вращения. Страницы rotmatArray соответствуют линейному индексу qVec.

rotmatArray = rotmat(qVec,'frame');

Принять qVec и rotmatArray соответствуют последовательности вращений. Объедините вращения кватернионов в одно представление, а затем примените вращение кватернионов к произвольно инициализированным декартовым точкам.

loc = normalize(randn(1,3));
quat = prod(qVec);
rotateframe(quat,loc)
ans = 1×3

    0.9524    0.5297    0.9013

Объедините матрицы вращения в одно представление, а затем примените матрицу вращения к тем же начальным декартовым точкам. Убедитесь, что матрица вращения кватерниона и вращения имеет одинаковую ориентацию.

totalRotMat = eye(3);
for i = 1:size(rotmatArray,3)
    totalRotMat = rotmatArray(:,:,i)*totalRotMat;
end
totalRotMat*loc'
ans = 3×1

    0.9524
    0.5297
    0.9013

Входные аргументы

свернуть все

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

Типы данных: quaternion

Тип вращения, представленный rotationMatrix выходные данные, указанные как 'frame' или 'point'.

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

Выходные аргументы

свернуть все

Представление матрицы вращения, возвращаемое как матрица 3 на 3 или 3-by-3-by-N многомерный массив.

  • Если quat является скаляром, rotationMatrix возвращается в виде матрицы 3 на 3.

  • Если quat нескалярный, rotationMatrix возвращается как 3-by-3-by-N многомерный массив, где rotationMatrix(:,:,i) - матрица поворота, соответствующая quat(i).

Тип данных матрицы ротации совпадает с базовым типом данных quat.

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

Алгоритмы

Учитывая кватернион формы

q = a + bi + cj + dk,

эквивалентная матрица поворота для поворота кадра определяется как

[2a2−1+2b22bc+2ad2bd−2ac2bc−2ad2a2−1+2c22cd+2ab2bd+2ac2cd−2ab2a2−1+2d2].

Эквивалентная матрица поворота для поворота точки представляет собой транспонирование матрицы поворота кадра:

[2a2−1+2b22bc−2ad2bd+2ac2bc+2ad2a2−1+2c22cd−2ab2bd−2ac2cd+2ab2a2−1+2d2].

Ссылки

[1] Койперс, Джек Б. Кватернионы и последовательности вращения: праймер с приложениями для орбит, аэрокосмической и виртуальной реальности. Принстон, Нью-Джерси: Princeton University Press, 2007.

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

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.

См. также

Функции

Объекты

Представлен в R2021a