计算沿 y 轴的方向变化率(角度测量)?

Posted

技术标签:

【中文标题】计算沿 y 轴的方向变化率(角度测量)?【英文标题】:Compute rate of change of orientation(angular measurement) along y axis? 【发布时间】:2012-09-06 17:07:13 【问题描述】:

我想计算 iPhone 沿 y 轴方向的变化率。 1.最初我需要将参考定义为y轴, 2. 然后根据定义的参考测量方向的变化率(角度测量)。

CMAttitude 是否提供可靠的角度测量来实现这一点?或者我可以使用旋转矩阵或集成陀螺仪数据(我实现了这个方法,但由于陀螺仪的漂移它不起作用)。所以请给我一个可靠的方法来完成这项工作?

提前谢谢你!

【问题讨论】:

【参考方案1】:

首先,澄清一下:旋转速率不是“从”任何轴测量的,而是“围绕”一个轴测量的。您不需要提供初始参考框架,因为您只是担心随着时间的推移变化

无论如何,你会得到最好的是CMDeviceMotion 的rotationRate 属性,文档说:

CMRotationRate 结构包含指定设备速率的数据 围绕三个轴旋转。该属性的值包含一个 陀螺仪数据的测量,其偏差已被 Core 移除 运动算法。

据说它集成了来自多个来源(加速度计)的传感器数据,以试图从读数中消除陀螺漂移,而不是文档所说的 CMGyroData 类:

此属性产生设备旋转速率的测量值 围绕三个轴。而这个属性给出了原始数据 陀螺仪,CMDeviceMotion 的同名属性给出了一个 CMRotationRate 结构测量陀螺仪数据,其偏差已 由 Core Motion 算法移除。

从这些参考资料中得出的结论是,如果您想要最准确的旋转速率数据,您应该使用类似的方法:

CMMotionManager* manager = [[CMMotionManager alloc] init];
[manager startDeviceMotionUpdates];

// Later, in some other scope...
double rotationAroundY = [[manager deviceMotion] rotationRate].y;

【讨论】:

感谢您的宝贵回复。但是考虑一下,我将 iPhone 垂直于重力轴,然后我将 iPhone 向上移动 45 度,然后再次(向下)转回 60 度(所以它通过我的参考轴并变为负数,所以如果我绘制它相对于垂直的角度变化,它应该向我显示,正轴移动 45 度(如果是正读数)和负方向移动 15 度(考虑到它通过参考)所以这就是我想要实现的目标?怎么能我做吗? @sam,当您开始向另一个方向旋转时,旋转速率将改变其符号,而不是在您通过原始参考系时。如果您尝试随时间绘制相对于参考系的旋转偏移量,则根本不想使用rotationRate。最好只是定期对 attitude 属性进行采样,然后准确地绘制出它给你的内容。 我直接绘制了姿态的读数,但它显示了信号在不同级别之间旋转偏移变化的点处突然漂移,但这里我没有使用参考姿态的更新,是否(更新从参考态度)提供优于正常更新的优势?即使在更高的计算成本下,除了使用姿态属性之外,还有其他准确的方法吗?谢谢! @sam 从参考姿态更新对读数的准确性没有影响。这只是一种方便的方式来更改完全相同的数据的表示方式。 CMDeviceMotion 是计算成本最高、读取数据最准确的方法,因为 CoreMotion 正在为您按摩一组传感器数据。 CMGyroData 更便宜且不太准确,因为它只是原始陀螺数据。不幸的是,即使是最准确的版本仍然存在明显的偏差,我们对此无能为力,只能希望 Apple 可以在未来改进框架。 感谢您宝贵的时间;为了您的信息,我整合了陀螺仪数据(rotationRate)并计算了角度的变化率,但该图显示了相当大的漂移,即使 CMDeviceMotion 提供了无漂移信号(正如他们所说的旋转率不应包含任何直流偏移),但它还在继续,,,似乎,不知怎的,我需要想办法从这个深黑洞中出来! :)

以上是关于计算沿 y 轴的方向变化率(角度测量)?的主要内容,如果未能解决你的问题,请参考以下文章

WebGL常用数学公式

运动的6个自由度

高数学习笔记:计算方向导数

将围绕任意轴的旋转解析为围绕 X、Y 和 Z 轴的旋转

设备保持静止时垂直轴上的 Android 设备角度

[算法] 优化算法 梯度下降