【问题标题】:How to convert a rotation matrix to axis angle form?如何将旋转矩阵转换为轴角形式?
【发布时间】:2017-07-02 19:28:04
【问题描述】:
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 是一个向量,将轴存储在前三个位置,角度存储在最后一个位置。

【问题讨论】:

  • 提供旋转矩阵与轴角形式的关系。 “没用” 是什么意思。有什么错误吗?输出错误?什么?阅读如何根据您的问题创建minimal reproducible exampleedit
  • 啊。 @SardarUsama 谢谢。堆栈溢出的新功能。无论如何解决了我的问题。在一种情况下,我除以 0。当您说“提供旋转矩阵和轴角形式之间的关系”时,您最终帮助了我。还是谢谢。

标签: matlab robotics rotational-matrices


【解决方案1】:

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

axang = rotm2quat(R)

注意输出格式与documented by Matlab略有不同:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果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));

      如果 X(1) = 0,则求 Y(1) = sqrt((R(2,2)+1)/2) 如果 Y(1) 不为零,则从 Y(1) 中找到其他项

      else 找到 Z(1) 并从 Z(1) 中找到其他项

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-17
        • 2020-08-23
        • 1970-01-01
        • 2015-11-17
        • 2010-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多