2015-07-28 59 views
2

我正在尝试创建一个四元数,旋转欧拉角并将其转换回欧拉角。我正在使用Eigen。从Euler转换到Quaternion反之亦然,但是当我使用角度轴旋转时,我的值约为20-50%。例如,当我尝试从0,0,0旋转到90,50,60时,我得到x:75,5 y:103,13,z:78,46。 任何想法,我错了转弯?我使用102/YXZ惯例。 我试图像这里描述的那样实现它:Rotate a quaternion by Euler angles input使用特征根据欧拉角旋转四元数

Vector3f retVector; 
    Matrix3f rotFromMat, qautRotMatrix; 

const auto fromPitch = xFrom*M_PI/360; 
const auto fromYaw = zFrom*M_PI/360; 
const auto fromRoll = yFrom*M_PI/360; 



rotFromMat = AngleAxisf(fromRoll, Vector3f::UnitY()) 
    * AngleAxisf(fromPitch, Vector3f::UnitX()) 
    * AngleAxisf(fromYaw, Vector3f::UnitZ()); 
Quaternionf fromQuat(rotFromMat); 

    fromQuat.normalize(); 

    fromQuat = fromQuat * AngleAxisf(yTo, Vector3f::UnitY()); 
    fromQuat = fromQuat * AngleAxisf(xTo, Vector3f::UnitX()); 
    fromQuat = fromQuat * AngleAxisf(zTo, Vector3f::UnitZ()); 


    qautRotMatrix = fromQuat.toRotationMatrix(); 

    retVector = quatRotMatrix.eulerAngles(1, 0, 2); 
    retVector *= 360/M_PI; 

    return retVector; 
+0

当旋转在欧拉角度任意轴旋转90度,一个名为'万向节锁'的现象出现了,这就产生了意想不到的行为。你处理了吗? –

+0

我将旋转矩阵转换为四元数“Quaternionf fromQuat(rotFromMat);”在旋转之前。万向节锁应该没问题。 –

回答

1

您没有给出足够的细节来说明如何重现这一点。

但我可以看出两个错误: *度数和弧度之间的比率是180/PI而不是360/PI。 *您的轮换命令错误!左侧旋转右侧:

fromQuat = AngleAxisf(...) * fromQuat; 

从我能猜到你已经解决了这个日期,我在这里评论的新观众