这可能是之前被问过的, 但我找不到合适的答案。
我正在尝试将欧拉角转换为四元数 (更容易和更快的calucations,没有gimbel锁定), 但由于某种原因,它不起作用。 我正在使用tinkerforge IMUV2, (amoung其他人)给我的态度是四元数, 欧拉角中的欧拉角和姿态变化。
我使用四元数和欧拉角态来确定我从欧拉角到四元数的转换是否正确。 奇怪的是,到目前为止,只有我计算的标量部分是正确的; 矢量部分完全是胡说八道。 我根本无法找到我的错误。
公式
q=[cos(w/2),v_x sin(w/2),v_y sin(w/2),v_z sin(w/2)]
w是矢量角|| v ||;并且v归一化向量v / || v ||。
public static Quaternion eulerToQuaternion(short[] eulerR,double dt){
double[] euler = new double[] {eulerR[0]/16*(Math.PI/180),eulerR[1]/16*(Math.PI/180),eulerR[2]/16*(Math.PI/180)};
double scalar = Math.sqrt(euler[0]*euler[0]+euler[1]*euler[1]+euler[2]*euler[2]);
double[] vector = new double[]{euler[0]/scalar,euler[1]/scalar,euler[2]/scalar};
scalar = scalar*dt;
double a = Math.sin(scalar/2);
return new Quaternion(Math.cos(scalar/2),vector[0]*a,vector[1]*a,vector[2]*a);
}
我用1/16*(Math.PI/180)
转换输入,因为tinkerforge输出是1/16°,我需要它以弧度为单位。
如果这是问题我真的会感到惊讶。
dt部分是为了将来,我保持dt = 1。
构造函数只是将数组中的值排列为我编写的Quaternion类以进行计算。
来自维基百科的方法也不起作用(标量和向量部分都是错误的)。
编辑:Balazs Vago发现了我使用第一个欧拉角三次的错误。 通过切换结果四元数的第二个和第三个值并获得全等,我能够使维基百科版本工作(编辑版本)
public static Quaternion toQuaternion(short[] euler, double dt)
{
double yaw=euler[0]/16*(Math.PI/180);
double roll=euler[1]/16*(Math.PI/180);
double pitch=euler[2]/16*(Math.PI/180);
double t0 = Math.cos(yaw * 0.5);
double t1 = Math.sin(yaw * 0.5);
double t2 = Math.cos(roll * 0.5);
double t3 = Math.sin(roll * 0.5);
double t4 = Math.cos(pitch * 0.5);
double t5 = Math.sin(pitch * 0.5);
return new Quaternion(t0 * t2 * t5 + t1 * t3 * t4,-(t0 * t2 * t4 + t1 * t3 * t5),-(t0 * t3 * t4 - t1 * t2 * t5),-(t1 * t2 * t4 - t0 * t3 * t5));
}
这个版本效率有点低,我仍然需要帮助eulerToQuaternion
来理解我的错误。