Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

rotmat

Convertir un cuaternión en matriz de rotación

Desde R2019b

Descripción

ejemplo

rotationMatrix = rotmat(quat,rotationType) convierte el cuaternión, quat, en una representación matricial de rotación equivalente.

Ejemplos

contraer todo

Defina un cuaternión para usarlo en la rotación de puntos.

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

Convierta el cuaternión en una matriz de rotación.

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

Para verificar la matriz de rotación, cree directamente dos matrices de rotación correspondientes a las rotaciones alrededor de los ejes y y x. Multiplique las matrices de rotación y compárelas con la salida de 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

Defina un cuaternión para usar en la rotación de marcos.

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

Convierta el cuaternión en una matriz de rotación.

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

Para verificar la matriz de rotación, cree directamente dos matrices de rotación correspondientes a las rotaciones alrededor de los ejes y y x. Multiplique las matrices de rotación y compárelas con la salida de 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

Cree un vector de cuaternión normalizado de 3 por 1.

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

Convierta el arreglo de cuaterniones en matrices de rotación. Las páginas de rotmatArray corresponden al índice lineal de qVec.

rotmatArray = rotmat(qVec,"frame");

Supongamos que qVec y rotmatArray corresponden a una secuencia de rotaciones. Combine las rotaciones de cuaterniones en una sola representación, luego aplique la rotación de cuaterniones a puntos cartesianos inicializados arbitrariamente.

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

    0.9524    0.5297    0.9013

Combine las matrices de rotación en una sola representación, luego aplique la matriz de rotación a los mismos puntos cartesianos iniciales. Verifique que la rotación del cuaternión y la matriz de rotación den como resultado la misma orientación.

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

Argumentos de entrada

contraer todo

Cuaternión a convertir, especificado como un objeto quaternion o un arreglo de objetos quaternion de cualquier dimensionalidad.

Tipo de rotación representada por la salida rotationMatrix , especificada como "frame" o "point".

Tipos de datos: char | string

Argumentos de salida

contraer todo

Representación de matriz de rotación, devuelta como una matriz numérica de 3 por 3 o un arreglo numérico de 3 por 3 por N .

  • Si quat es un escalar, rotationMatrix se devuelve como una matriz de 3 por 3.

  • Si quat no es escalar, rotationMatrix se devuelve como un arreglo de 3 por 3 por N , donde rotationMatrix(:,:,i) es la matriz de rotación correspondiente a quat(i).

El tipo de datos de la matriz de rotación es el mismo que el tipo de datos subyacente de quat.

Tipos de datos: single | double

Algoritmos

Dado un cuaternión con el formato

q=a+bi+cj+dk,

la matriz de rotación equivalente para rotación de marcos se define como

[2a21+2b22bc+2ad2bd2ac2bc2ad2a21+2c22cd+2ab2bd+2ac2cd2ab2a21+2d2].

La matriz de rotación equivalente para rotación de puntos es la transposición de la matriz de rotación de marcos:

[2a21+2b22bc2ad2bd+2ac2bc+2ad2a21+2c22cd2ab2bd2ac2cd+2ab2a21+2d2].

Referencias

[1] Kuipers, Jack B. Quaternions and Rotation Sequences: A Primer with Applications to Orbits, Aerospace, and Virtual Reality. Princeton, NJ: Princeton University Press, 2007.

Capacidades ampliadas

Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.

Historial de versiones

Introducido en R2019b