我在基于动作和位置的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的顺序对我不起作用。
答案 0 :(得分:1)
关于:哪个角度与哪个轴相关。
关于旋转顺序,用于计算旋转矩阵和欧拉角(俯仰,横滚,偏航)
简短回答: ZXY 是iOS上的轮换顺序。
我也一直在寻找这个答案。累了。不知道为什么没有在易于查找的地方对此进行记录。我决定收集经验数据,并测试哪种轮换顺序最适合该值。我的值如下。
方法:
编写了一个小型iPhone应用程序以返回四元数值和相应的俯仰角,横滚角和偏航角
根据四元数计算的各种旋转顺序(XYZ,XZY,YZX,YXZ,ZYX,ZXY)的俯仰,横滚,偏航值
关于iOS设备运动报告的俯仰,偏航和侧倾值的RMS误差计算值。确定方向的误差最小。
结果:
轮换订单:ZYX和ZXY都返回非常接近iOS报告值的值。但是,每种情况下ZXY的误差都比ZXY低约46-597X。因此,我相信ZXY是旋转顺序。