这是一个小背景,并介绍了该问题:
我在基于运动和位置的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
关于旋转顺序,用于计算旋转矩阵和欧拉角(俯仰,横滚,偏航)
简短答案: ZXY 是iOS上的轮换顺序。
我也一直在寻找这个答案。累了。不知道为什么没有在易于查找的地方对此进行记录。我决定收集经验数据,并测试哪种轮换顺序最适合该值。我的价值观如下。
方法:
结果:
轮换订单:ZYX和ZXY都返回非常接近iOS报告值的值。但是,每种情况下ZXY的误差都比ZXY低约46-597X。因此,我相信ZXY是旋转顺序。