我使用两种方法在3D空间中旋转点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
(红色)。
答案 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逆时针旋转矢量,四元数顺时针旋转矢量。