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

时间:2016-10-19 10:34:31

标签: ios objective-c transformation rotational-matrices euler-angles

这是一个小背景和问题介绍:

我在基于动作和位置的iOS应用程序中有一些功能,它需要一个旋转矩阵作为输入。某些图形输出取决于此矩阵。随着设备的每次移动,图形输出都会发生变化。这是代码的一部分:

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

在这种结构中,只有4帧可用:

XArbitraryZVertical

XArbitraryCorrectedZVertical

XMagneticNorthZVertical

XTrueNorthZVertical

我需要另外一个参考,f.e。陀螺仪价值而不是北方,这些框架无法满足我的需要。

为了实现我的目标,我使用下一个结构:

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

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

问题:

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

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

已发布类似问题here,但解决方案中来自that math example的顺序对我不起作用。

1 个答案:

答案 0 :(得分:1)

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

查看此:  link:https://developer.apple.com/documentation/coremotion/getting_processed_device-motion_data/understanding_reference_frames_and_device_attitude

enter image description here

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

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

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


方法:

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

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

  3. 关于iOS设备运动报告的俯仰,偏航和侧倾值的RMS误差计算值。确定方向的误差最小。

结果:

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

enter image description here