如何将旋转矩阵转换为轴角形式?

时间:2017-07-02 19:28:04

标签: matlab robotics rotational-matrices

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

所以这是我的代码,但是当旋转矩阵

时它没有用
R = [-1 0  0;
     0  -1 0;
     0  0  1]

代码有什么问题? axang是一个向量,它存储前三个位置的轴和最后一个位置的角度。

3 个答案:

答案 0 :(得分:1)

在我看来,您正在寻找将旋转矩阵转换为四元数的方法,如果您安装了Robotics系统工具箱,这是Matlab的内置功能,即rotm2quat:

axang = rotm2quat(R)

请注意,输出格式与documented by Matlab

略有不同
  

单位四元数,作为包含n的n乘4矩阵返回   四元。每个四元数,每行一个,形式为q = [w x y   z],w为标量数。

因此,您可能需要按如下方式交换列:

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

答案 1 :(得分:0)

与上述答案类似,您可能希望研究使用MatLab工具Translation1 = se2(StructuringElement, TranslationOffset)

变量TranslationOffset可以以60*pi/180的形式应用为角度。

答案 2 :(得分:0)

在trace(R)== - 1的情况下,可以翻转轴项的符号。为了摆脱它,下面的步骤计算轴角矢量。

  1. 找到X(1)= sqrt((R(1,1)+1)/ 2);
  2. 如果不为零,则计算Y(1)= R(1,2)/(2 * X(1))和Y(2)= R(1,2)/(2 * X(2) )和Z(1)= R(1,3)/(2 * X(1))Z(2)= R(1,3)/(2 * X(2));
  3. 如果X(1)= 0,则找到Y(1)= sqrt((R(2,2)+1)/ 2) 如果Y(1)不为零,则从Y(1)

    中找到其他项

    否则找到Z(1)并从Z(1)

    中找到其他项