2016-08-03 196 views
3

我使用两种方法在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 

据我所知,使用欧拉角可导致万向节锁定,使不确定性,但在这种情况下,使用四元数得到的结果是不正确的而从欧拉角获得的结果是。我错过了什么? (蓝色),WCS(黑色),p0(黑色),p1_1(蓝色),p1_2(红色)。

回答

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 

结论: 使用四元数或定向余弦矩阵,我们旋转坐标系,而点(矢量)保持固定。而使用旋转矩阵,我们能够将矢量旋转到坐标系。

相关问题