将x86四元数装配到欧拉角会输出错误的顺序

问题描述

将四元数转换为欧拉角时遇到麻烦。

我一直遵循Wikipedia上的C ++代码,并且我认为我在汇编程序中很好地复制了它,问题是我的代码将WXYZ值转换为ZYX而不是XYZ顺序。

C ++代码:https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles#Source_Code_2

(提供的asm代码仅计算滚动轴)

//ROLL
finit
fld dword ptr [WRot]
fld dword ptr [ZRot]
fmulp st(1),st(0)
fld dword ptr [XRot]
fld dword ptr [YRot]
fmulp st(1),st(0)
faddp st(1),st(0)
mov dword ptr [Math],40000000 //2
fld dword ptr [Math]
fxch
fmulp st(1),st(0)
fstp dword ptr [sinr_cosp] //sinr_cosp

finit
fld dword ptr [YRot]
fld dword ptr [YRot]
fmulp st(1),st(0)
fld dword ptr [ZRot]
fld dword ptr [ZRot]
fmulp st(1),3F800000 //1
fld dword ptr [Math]
fxch
fsubp st(1),st(0)
fstp dword ptr [cosr_cosp] //cosr_cosp

finit
fld dword ptr [sinr_cosp]
fld dword ptr [cosr_cosp]
fpatan
mov dword ptr [Math],42652EE1 //57.29577951308232
fld dword ptr [Math]
fxch
fmulp st(1),st(0)
fstp dword ptr [Roll] //Roll value

我使用https://quaternions.online/设置了以下值:

w:  0.549
x:  0.747
y:  0.092
z:  0.363

应用时,应输出XYZ顺序:

x:  100.000
y:  40.000
z:  20.000

But my code produces:

x:  98.527
y: -26.213
z:  36.644

我该如何解决?我可以找到合适的C ++代码作为将Quat转换为XYZ的参考吗?

我认为这与内存分配无关,每个浮点值之间相距8字节。

我还发现了一个有趣的回复https://stackoverflow.com/a/27496984/13741865,其中显示了各种可能的情况,但对我来说,要理解它有点复杂,因为它没有注释,我很想知道将哪个公式应用于哪个旋转(对于XYZ情况)。

我还处于组装的初期阶段,可能对术语没有足够的了解。

希望我已添加了所有可能的细节,在此先感谢您的关注。

解决方法

问题在于公式本身,Wikipedia中提供的源代码是针对ZYX订单制作的(上面的代码对此进行了评论,但我没有注意到)。

我所做的是花时间阅读https://stackoverflow.com/a/27496984/13741865此处提供的答案,分析代码并修复我编写的代码。

这给出了正确的输出

finit
fld dword ptr [WRot]
fld dword ptr [WRot]
fmulp
fld dword ptr [XRot]
fld dword ptr [XRot]
fmulp
faddp
fld dword ptr [YRot]
fld dword ptr [YRot]
fmulp
fsubp
fld dword ptr [ZRot]
fld dword ptr [ZRot]
fmulp
fsubp
fld dword ptr [XRot]
fld dword ptr [YRot]
fmulp
fld dword ptr [WRot]
fld dword ptr [ZRot]
fmulp
fsubp
mov dword ptr [Math],0 //hex of 0
fld dword ptr [Math]
mov dword ptr [Math],40000000 //hex of 2
fld dword ptr [Math]
fsubp
fxch
fmulp
fxch
fpatan
mov dword ptr [Math],42652ee1 //hex of 57.29577951308232
fld dword ptr [Math]
fxch
fmulp
fstp dword [Roll] //Roll value

谢谢大家

,

也许只是算法中的四元数约定与您期望的不同。尝试将四元数的共轭信息输入算法。即,反转Xrot,Yrot和Zrot输入的符号。 不幸的是,根据我的经验,大多数在线发布的四元数信息很少讨论所发布算法的假定四元数约定(包括您提到的quaternions.online链接)。您编写的网站完全有可能与quaternions.online网站采用不同的约定。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...