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

3

我正在使用两种方法来旋转一个点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

当我使用DCM和四元数旋转向量时,我与您遇到了相同的现象。

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


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

另一方面,使用欧拉角和旋转矩阵,我可以围绕坐标系旋转一个点(向量):
p1_2 = (rotz(rz*180/pi)*roty(ry*180/pi)*rotx(rx*180/pi)*p0').';
p1_2 =

    0.9848    0.1736         0

结论: 使用四元数或方向余弦矩阵,我们可以旋转坐标系而点(向量)保持不变。而使用旋转矩阵,我们能够将一个向量相对于一个坐标系进行旋转。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接