使用四元数和欧拉角的不同结果

时间:2016-08-03 13:44:37

标签: matlab quaternions coordinate-systems euler-angles

我使用两种方法在3D空间中旋转点p0(矢量)。我有世界坐标系(WCS),以黑色显示,坐标系1(CS1),以蓝色显示,定义为围绕z轴旋转10度。我首先通过计算点积来计算WCS和CS1之间的方向余弦。现在,我可以使用dcm2quatdcm2angle轻松计算四元数和欧拉角。然后我可以使用四元数和欧拉角旋转点p0

p0  = [1 0 0]; % point in world CS
ijk = [1 0 0;0 1 0;0 0 1];
uvw1 = [0.9848 0.1736 0;-0.1736 0.9848 0;0 0 1.0000]; % CS1
DC01 = [dot(uvw1(1,:),ijk(1,:)) dot(uvw1(1,:),ijk(2,:)) dot(uvw1(1,:),ijk(3,:))
        dot(uvw1(2,:),ijk(1,:)) dot(uvw1(2,:),ijk(2,:)) dot(uvw1(2,:),ijk(3,:))
        dot(uvw1(3,:),ijk(1,:)) dot(uvw1(3,:),ijk(2,:)) dot(uvw1(3,:),ijk(3,:))];

[rz, ry, rx] = dcm2angle(DC01,'ZYX'); 
q1 = dcm2quat(DC01);

p1_1 = quatrotate(q1,p0);
p1_2 = (rotz(rz*180/pi)*roty(ry*180/pi)*rotx(rx*180/pi)*p0').';

但最后结果却不同:

p1_1 = 
    0.9848   -0.1736         0
p1_2 =
    0.9848    0.1736         0

据我所知,使用欧拉角会导致万向节锁定并产生模糊,但在这种情况下,使用四元数得到的结果不正确,而从欧拉角获得的结果是。我错过了什么?

下图显示了CS1(蓝色),WCS(黑色),p0(黑色),p1_1(蓝色),p1_2(红色)。

enter image description here

2 个答案:

答案 0 :(得分:0)

在MATLAB中:

如果我使用方向余弦或四元数来旋转点,我实际上是在旋转参考系:

pdc = (DC01*p0')'    % rotation using directional cosine matrix
pdc =

    0.9848   -0.1736         0

相当于:

p1_1 = quatrotate(q1,p0);
p1_1 = 

     0.9848   -0.1736         0

另一方面,使用欧拉角和旋转矩阵,我可以旋转一个点(向量)w.r.t坐标系:

p1_2 = (rotz(rz*180/pi)*roty(ry*180/pi)*rotx(rx*180/pi)*p0').';
p1_2 =

    0.9848    0.1736         0

<强>结论: 使用四元数或方向余弦矩阵,我们旋转坐标系,而点(矢量)保持固定。然而,使用旋转矩阵,我们能够在坐标系中旋转矢量。

答案 1 :(得分:0)

当你遇到同样的现象 我使用dcm和四元数来旋转向量。

我们可以将WCS视为唯一参考。上述DCM逆时针旋转矢量,四元数顺时针旋转矢量。