这是一个小背景,并介绍了该问题:
我在基于运动和位置的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-偏航。
实际上,这个问题早在几年前就已由Apple解决,但我无法访问.m文件,而且我不知道哪种乘法对iOS设备来说是正确的。
类似的问题已发布here,但解决方案中来自that math example的命令对我不起作用。

最佳答案

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

看到这个:
link:https://developer.apple.com/documentation/coremotion/getting_processed_device-motion_data/understanding_reference_frames_and_device_attitude

ios - Euler角度到iOS设备的旋转矩阵手动转换-LMLPHP

关于旋转顺序,用于计算旋转矩阵和欧拉角(俯仰,横滚,偏航)

简短答案: ZXY 是iOS上的轮换顺序。

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

方法:

  • 编写了一个小的iPhone应用程序以返回四元数值和相应的俯仰角,横滚角和偏航角
  • 针对各种旋转顺序(XYZ,XZY,YZX,YXZ,ZYX,ZXY)的四元数计算的俯仰,侧倾,偏航值
  • 关于iOS设备运动报告的俯仰,偏航和侧倾值的RMS误差。确定方向的误差最小。

  • 结果:

    轮换订单:ZYX和ZXY都返回非常接近iOS报告值的值。但是,每种情况下ZXY的误差都比ZXY低约46-597X。因此,我相信ZXY是旋转顺序。

    ios - Euler角度到iOS设备的旋转矩阵手动转换-LMLPHP

    07-26 01:13