iOS 设备的欧拉角到旋转矩阵手动转换

Ole*_*huk 5 transformation objective-c euler-angles ios rotational-matrices

这是问题的小背景和介绍:

我的基于运动和位置的 iOS 应用程序中有一些功能,它需要一个旋转矩阵作为输入。一些图形输出依赖于这个矩阵。随着设备的每一次移动,图形输出都会改变。这是代码的一部分,它使得:

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

在此结构中,只有 4 个帧可用:

X任意Z垂直

XArbitraryCorrectedZVertical

XMagneticNorthZ垂直

XTrueNorthZ垂直

我需要另一个参考,fe 陀螺仪值而不是 North,而这些框架不能完全提供我想要的。

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

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

你可能会问我,为什么我不使用内置的旋转矩阵?答案很简单。我需要制作某种自己的参考系,我可以通过放入修改后的角度值来实现。

问题:

为了从欧拉角获得旋转矩阵,我们需要为每个角度制作矩阵,然后将它们相乘。对于 3D 情况,我们将为每个轴(其中 3 个)设置矩阵。之后我们乘以矩阵。问题是输出取决于乘法的顺序。X Y Z 不等于 Z Y X。维基百科告诉我,有 12 种变体,我不知道哪一种适合 iOS 实现。我需要知道我需要按什么顺序将它们相乘。另外,我需要知道哪些角度代表X、Y、Z。例如,X-roll,Y-pitch,Z-yaw。

实际上,Apple 多年前就解决了这个问题,但我无法访问 .m 文件,而且我不知道哪种乘法顺序适合 iOS 设备。

此处发布类似的问题,但解决方案中该数学示例的顺序对我不起作用。

Rav*_*kar 2

关于:哪些角度与哪个轴相关。

请参阅: 链接:https://developer.apple.com/documentation/coremotion/getting_processed_device-motion_data/understanding_reference_frames_and_device_attitude

在此输入图像描述

关于计算旋转矩阵和欧拉角(Pitch、Roll、Yaw)的旋转顺序

简短回答: ZXY是 iOS 上的旋转顺序。

我也一直在寻找这个答案。累了。不知道为什么这没有记录在易于查找的地方。我决定收集经验数据并测试哪种轮换顺序与这些值最匹配。我的价值观如下。


方法:

  1. 编写了一个小型 iPhone 应用程序来返回四元数值和相应的俯仰角、滚动角、偏航角

  2. 根据各种旋转顺序(XYZ、XZY、YZX、YXZ、ZYX、ZXY)的四元数计算俯仰、滚动、偏航值

  3. 计算出与 iOS 设备运动报告的俯仰、偏航、滚转值相关的 RMS 误差。确定误差最小的方向。

结果:

旋转顺序:ZYX 和 ZXY 都返回非常接近 iOS 报告值的值。然而,在每种情况下,ZXY 上的误差都比 ZXY 低约 46-597 倍。因此我相信 ZXY 是旋转顺序。

在此输入图像描述