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
是一个向量,它存储前三个位置的轴和最后一个位置的角度。
答案 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的情况下,可以翻转轴项的符号。为了摆脱它,下面的步骤计算轴角矢量。
如果X(1)= 0,则找到Y(1)= sqrt((R(2,2)+1)/ 2) 如果Y(1)不为零,则从Y(1)
中找到其他项否则找到Z(1)并从Z(1)
中找到其他项