2017-07-02 1 views
1
theta=acos((trace(R)-1)/2); 
if trace(R)==3 
    vec = [0 0 0]; 
    axang=[0 0 0 0]; 
    vec(1)=R(3,2)-R(2,3); 
    vec(2)=R(1,3)-R(3,1); 
    vec(3)=R(2,1)-R(1,2); 
    vec=(1/(2*sin(theta)))*vec;  
    axang = [vec, theta]; 
elseif trace(R)==-1 
    vec=[0 0 0;0 0 0]; 
    axang=[0 0 0 0;0 0 0 0]; 
    X=[0 0]; 
    Y=[0 0]; 
    Z=[0 0]; 
    Y(1)=sqrt((R(2,2)+1)/2); 
    Y(2)=-Y(1); 
    X(1)=R(2,1)/(2*Y(1)); 
    X(2)=R(2,1)/(2*Y(2)); 
    Z(1)=R(2,3)/(2*Y(1)); 
    Z(2)=R(2,3)/(2*Y(2)); 
    vec(1,:)=[X(1) Y(1) Z(1)]; 
    vec(2,:)=[X(2) Y(2) Z(2)]; 
    axang(1,:)=[vec(1,:), theta]; 
    axang(2,:)=[vec(2,:), theta]; 
else 
    vec = [0 0 0]; 
    axang=[0 0 0 0]; 
    vec(1)=R(3,2)-R(2,3); 
    vec(2)=R(1,3)-R(3,1); 
    vec(3)=R(2,1)-R(1,2); 
    vec=(1/(2*sin(theta)))*vec;  
    axang = [vec, theta]; 
end 

C'était donc mon code, mais il ne fonctionne pas lorsque la matrice de rotation estComment convertir une matrice de rotation en forme d'angle d'axe?

R = [-1 0 0; 
    0 -1 0; 
    0 0 1] 

Quel est le problème avec le code? axang est un vecteur qui stocke l'axe dans les trois premières positions et l'angle dans la dernière position.

+2

Fournir la relation entre la matrice de rotation et la forme de l'angle d'axe. Que voulez-vous dire par * "ne fonctionnait pas" *. Une erreur? mauvaise sortie? quelle? Lisez comment créer un [MCVE] et [modifier] (https://stackoverflow.com/posts/44874441/edit) votre question en conséquence. –

+0

Aah. @SardarUsama merci. Nouveau pour le débordement de pile. Correction de mon problème quand même. Je divisais par 0 dans un cas. Tu as fini par m'aider quand tu as dit 'Prévois la relation entre la matrice de rotation et la forme de l'angle de l'axe'. Merci quand même. –

Répondre

1

Il me semble que vous êtes à la recherche d'une conversion d'une matrice de rotation à escouades, qui est une fonction intégrée de Matlab si vous avez installé la boîte à outils système robotique, à savoir rotm2quat:

axang = rotm2quat(R) 

Notez que le format de sortie est légèrement différente comme documented by Matlab:

quaternion unitaire, est retourné en tant que matrice n par n 4 contenant quaternions. Chaque quaternion, un par ligne, est de la forme q = [w x y z], w étant le nombre scalaire.

Par conséquent, vous devrez peut-être échanger les colonnes comme suit:

axang = axang(:, [2 3 4 1]); 
0

Dans une veine similaire à la réponse ci-dessus, vous voudrez peut-être se pencher sur l'utilisation de l'outil MatLab Translation1 = se2(StructuringElement, TranslationOffset).

La variable TranslationOffset peut être appliquée en tant qu'angle sous la forme de 60*pi/180 par exemple.

0

En cas de trace (R) == - 1, le signe du terme d'axe peut être inversé. Pour s'en débarrasser, les étapes suivantes calculent le vecteur d'angle de l'axe.

  1. trouver X (1) = sqrt ((R (1,1) +1)/2);
  2. si ce n'est pas zéro, calculer Y (1) = R (1,2)/(2 * X (1)) et Y (2) = R (1,2)/(2 * X (2)) et Z (1) = R (1,3)/(2 * X (1)) Z (2) = R (1,3)/(2 * X (2));

Si X (1) = 0, alors trouver Y (1) = sqrt ((R (2,2) +1)/2) si Y (1) est différent de zéro alors trouver les autres termes à partir de Y (1)

trouver autre Z (1), et trouver les autres termes de Z (1)