iOS 设备上的欧拉角转换为旋转矩阵的手动转换方法

5

这是关于问题的简要背景和介绍:

我的基于运动和位置的iOS应用程序中有一些功能需要旋转矩阵作为输入。一些图形输出依赖于此矩阵。随着设备的每次移动,图形输出都会发生变化。以下是实现此功能的代码的一部分:

[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical
                                                   toQueue:motionQueue
                                               withHandler:
 ^(CMDeviceMotion* motion, NSError* error){
  //get and process matrix data
 }

在这个结构中,只有4个框架可用:

XArbitraryZVertical

XArbitraryCorrectedZVertical

XMagneticNorthZVertical

XTrueNorthZVertical

我需要另一个参考值,例如陀螺仪值,而这些框架不能完全满足我的需求。

为了达到我的目标,我使用下面的结构:

[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryCorrectedZVertical
                                                   toQueue:motionQueue
                                               withHandler:
 ^(CMDeviceMotion* motion, NSError* error){
  //get Euler angles and transform it to rotation matrix
 }

你可能会问我,为什么不使用内置的旋转矩阵?答案很简单。我需要创建一种自己的参考框架,并且可以通过在角度的修改值中实现这一点。
问题:
为了从欧拉角得到旋转矩阵,我们需要为每个角度制作矩阵,然后将它们相乘。对于3D情况,我们将为每个轴(其中3个)制作矩阵。之后我们相乘矩阵。问题是输出取决于乘法的顺序。XYZ不等于ZYX。Wikipedia告诉我,有12种变体,我不知道哪一个是iOS实现的正确顺序。我需要知道需要按哪个顺序相乘。此外,我需要知道哪些角度代表X、Y、Z。例如,X-横滚,Y-俯仰,Z-偏航。
实际上,这个问题已经被苹果公司解决多年了,但我无法访问.m文件,也不知道iOS设备的正确乘法顺序。

这里有一个类似的问题在这里发布过,但是那个数学示例中的顺序在解决方案中对我不起作用。


我不是iOS开发者(我根本不是开发者!),但通过一些“谷歌搜索”,我发现iOS支持四元数“q”符号。由于只有2种四元数标准(而不是12种矩阵旋转变体),但R矩阵和四元数之间存在对应关系,因此请尝试使用它来代替欧拉角。据我所知,四元数是无歧义的。(是的,这似乎更像是一个数学答案,但是......如果您对四元数有任何问题,请随时问我。) - marcoresk
1个回答

2
关于:哪些角度与哪个轴相关。
请参考: link:https://developer.apple.com/documentation/coremotion/getting_processed_device-motion_data/understanding_reference_frames_and_device_attitude

enter image description here

关于旋转顺序的翻译:

计算旋转矩阵和欧拉角(俯仰、横滚、偏航)的旋转顺序。

简短回答:iOS上使用ZXY作为旋转顺序。

我也一直在寻找这个答案。感到非常疲惫。不确定为什么这个答案没有被记录在容易查找的地方。我决定收集实际数据并测试哪种旋转顺序最能匹配数值。我的数据如下。


方法:
1.编写了一个小型iPhone应用程序来返回四元数值和相应的俯仰、横滚和偏航角度。
2.从四元数计算不同旋转次序(XYZ、XZY、YZX、YXZ、ZYX、ZXY)的俯仰、横滚和偏航值。
3.计算与iOS设备运动报告的俯仰、偏航和横滚值的均方根误差。确定具有最小误差的方向。
结果:
旋转次序:ZYX和ZXY都返回非常接近iOS报告值的值。然而,对于每种情况,ZXY的误差约为ZYX的46-597倍。因此,我认为ZXY是旋转次序。

enter image description here


你确定吗?请检查我的问题:https://stackoverflow.com/questions/63758384/arkit-calc-euler-angles-from-rotation-matrix-in-yxz-world - lady

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接