Main Content

Cette page a été traduite par traduction automatique. Cliquez ici pour voir la dernière version en anglais.

tapis rouge

Convertir le quaternion en matrice de rotation

Depuis R2019b

Description

exemple

rotationMatrix = rotmat(quat,rotationType) convertit le quaternion, quat, en une représentation matricielle de rotation équivalente.

Exemples

réduire tout

Définissez un quaternion à utiliser dans la rotation des points.

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

Convertissez le quaternion en matrice de rotation.

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

Pour vérifier la matrice de rotation, créez directement deux matrices de rotation correspondant aux rotations autour des axes y et x. Multipliez les matrices de rotation et comparez-les à la sortie 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

Définissez un quaternion à utiliser dans la rotation du cadre.

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

Convertissez le quaternion en matrice de rotation.

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

Pour vérifier la matrice de rotation, créez directement deux matrices de rotation correspondant aux rotations autour des axes y et x. Multipliez les matrices de rotation et comparez-les à la sortie 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

Créez un vecteur quaternion normalisé 3 par 1.

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

Convertissez le tableau de quaternions en matrices de rotation. Les pages de rotmatArray correspondent à l'index linéaire de qVec.

rotmatArray = rotmat(qVec,"frame");

Supposons que qVec et rotmatArray correspondent à une séquence de rotations. Combinez les rotations des quaternions en une seule représentation, puis appliquez la rotation des quaternions à des points cartésiens arbitrairement initialisés.

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

    0.9524    0.5297    0.9013

Combinez les matrices de rotation en une seule représentation, puis appliquez la matrice de rotation aux mêmes points cartésiens initiaux. Vérifiez que la rotation du quaternion et la matrice de rotation donnent la même orientation.

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

Arguments d'entrée

réduire tout

Quaternion à convertir, spécifié comme un objet quaternion ou un tableau d'objets quaternion de n'importe quelle dimensionnalité.

Type de rotation représenté par la sortie rotationMatrix , spécifié comme "frame" ou "point".

Types de données : char | string

Arguments de sortie

réduire tout

Représentation matricielle de rotation, renvoyée sous forme de matrice numérique 3 x 3 ou de tableau numérique 3 x 3 x N .

  • Si quat est un scalaire, rotationMatrix est renvoyé sous forme de matrice 3 par 3.

  • Si quat n'est pas scalaire, rotationMatrix est renvoyé sous la forme d'un tableau 3 par 3 par N , où rotationMatrix(:,:,i) est la matrice de rotation correspondant à quat(i).

Le type de données de la matrice de rotation est le même que le type de données sous-jacent de quat.

Types de données : single | double

Algorithmes

Étant donné un quaternion de la forme

q=a+bi+cj+dk,

la matrice de rotation équivalente pour la rotation du cadre est définie comme

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

La matrice de rotation équivalente pour la rotation des points est la transposée de la matrice de rotation du cadre :

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

Références

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

Capacités étendues

Génération de code C/C++
Générez du code C et C++ avec MATLAB® Coder™.

Historique des versions

Introduit dans R2019b