我正在使用两种方法来旋转一个点p0
(一个向量)在三维空间中。我有世界坐标系(WCS),显示为黑色,和坐标系1(CS1),显示为蓝色,它被定义为绕z轴旋转10度。首先通过计算点积来计算WCS和CS1之间的方向余弦。现在我可以使用dcm2quat
和dcm2angle
轻松地计算四元数和欧拉角。然后我可以使用四元数和欧拉角旋转点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(红色)。