四元数转欧拉算法。 getPitch() 返回楠?

Posted

技术标签:

【中文标题】四元数转欧拉算法。 getPitch() 返回楠?【英文标题】:quaternion To Euler algorithm. getPitch() returns Nan? 【发布时间】:2013-08-06 03:30:51 【问题描述】:

我正在尝试转换从传感器获得的四元数,并通过计算 theta 来获得音高。如果有人感兴趣,请看in this article- 第 2 章

我的问题出在以下代码中:

 private void quaternionToEuler(float[] q, float[] euler)
    
        euler[0] = (float)Math.Atan2((2 * q[1] * q[2]) - (2 * q[0] * q[3]), (2 * q[0] * q[0]) + ((2 * q[1] * q[1]) - 1));
        euler[1] = -(float)Math.Asin(((2 * q[1] * q[3]) + (2 * q[0] * q[2]))); // theta
        euler[2] = (float)Math.Atan2((2 * q[2] * q[3]) - (2 * q[0] * q[1]), (2 * q[0] * q[0]) + ((2 * q[3] * q[3]) - 1)); // phi

        Console.WriteLine(euler[0] + ","+euler[1]+"," + euler[2]);
    

euler 1 得到的音高总是返回 Nan(不是数字) 我不确定我是否正确实施了算法。出于某种原因,Asin(d),其中 d 的输出为 >1 且

【问题讨论】:

【参考方案1】:

我认为你的四元数没有标准化。只有归一化的四元数代表 3D 中的旋转,你必须拥有它

q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3] == 1

如果是这样,那么我们总是有

d = q[1]*q[3] + q[0]*q[2] <= 0.5

我们有这个

q[1]*q[3] <= 0.25 *(q[1] + q[3])^2

^ 表示功率,AM-GM 表示功率,q[0]*q[2] 也是如此

现在我们有了这个

d <= 0.25 * ( (q[1] + q[3])^2 + (q[0] + q[2])^2 ) 
  <= 0.25 * ( q[1]^2 + q[2]^2 + q[3]^2 + q[4]^2 )
  <= 0.25

根据正态假设。

【讨论】:

以上是关于四元数转欧拉算法。 getPitch() 返回楠?的主要内容,如果未能解决你的问题,请参考以下文章

3D图形学在游戏开发中的,矩阵,四元数,欧拉角之间的底层转换算法。

怎么把向量转化为四元数或欧拉角

欧拉角与四元数互转,及四元数slerp球面线性插值算法

龙格库塔(Runge-Kutta)法求四元数微分方程

龙格库塔(Runge-Kutta)法求四元数微分方程

四旋翼飞控里 为啥一定要用四元数?用欧拉角不一样吗? 就算用四元数也是将四元数转化为欧拉角进