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 设备。
关于:哪些角度与哪个轴相关。
关于计算旋转矩阵和欧拉角(Pitch、Roll、Yaw)的旋转顺序
简短回答: ZXY是 iOS 上的旋转顺序。
我也一直在寻找这个答案。累了。不知道为什么这没有记录在易于查找的地方。我决定收集经验数据并测试哪种轮换顺序与这些值最匹配。我的价值观如下。
方法:
编写了一个小型 iPhone 应用程序来返回四元数值和相应的俯仰角、滚动角、偏航角
根据各种旋转顺序(XYZ、XZY、YZX、YXZ、ZYX、ZXY)的四元数计算俯仰、滚动、偏航值
计算出与 iOS 设备运动报告的俯仰、偏航、滚转值相关的 RMS 误差。确定误差最小的方向。
结果:
旋转顺序:ZYX 和 ZXY 都返回非常接近 iOS 报告值的值。然而,在每种情况下,ZXY 上的误差都比 ZXY 低约 46-597 倍。因此我相信 ZXY 是旋转顺序。
归档时间: |
|
查看次数: |
1022 次 |
最近记录: |