【问题标题】:iPhone - understanding iPhone rotationiPhone - 了解 iPhone 旋转
【发布时间】:2011-07-07 09:37:39
【问题描述】:

我正在努力理解这一点。请看下一张图片。

假设我有一部 iPhone 放在桌子上。此时,通过核心运动的旋转读数对于偏航、横滚和俯仰为 0,0,0(图 A)。

然后我将它滚动 90 度。现在它坐在桌子上,左侧是右侧,主页按钮。现在它的读数为 0,0,0(图 B)。

现在我偏航 180 度。现在它的右侧放在桌子上。左侧的主页按钮。它现在读取 180,0,0(图片 C)。

如果我现在滚动它,问题就来了。假设我将它滚动 -45 度。我应该读 180,-45,0 但我读的是 180,-45,180???? (图 D)。

这是为什么呢?如果我从未改变它,为什么它会给我一个音高价值?其他角度的旋转如何影响音高?谢谢。

【问题讨论】:

  • 1 为漂亮的演示文稿 :-)
  • 谢谢!现在我必须有一个很好的解决方案”:D
  • 您需要解释四元数以确定绝对位置还是可以处理增量运动?
  • 如果我能获得增量运动,我会是一个快乐的人,因为我使用绝对角度来精确计算增量运动!我试图在读取一个值后重置姿态参考,因此移动将与之前的读取相关。我遇到的问题是,如果我将 X 度旋转到一个方向然后返回相同的量,我会得到不同的读数。例如:iphone 静止时为 0,0,0,然后我旋转到某个角度并返回静止,我将不再读取 0,0,0。
  • 好的新想法。我开始一个新的答案以避免弄乱问题。

标签: iphone core-motion


【解决方案1】:

鉴于您可以接受增量运动,您可以使用“四元数差分”操作。假设您有一个先前的旋转作为四元数,称为 q1,而当前的旋转称为 q2。然后您可以计算它们之间的 delta dQ,以便 q2 = q1*dQ 有效。您所要做的就是构建 q1 (q1^(-1)) 的倒数,然后得到:

dQ = q1^(-1) * q2

如果 deviceMotionInterval 足够高,您总是可以方便地使用小欧拉角,而不会出现任何 90° 奇点或其他可怕的东西。由于错误传播和缺乏来自虚拟空间的反馈,此解决方案的可能缺点可能是轻微漂移。示例:如果您将 iPhone 放在显示立方体的桌子上,然后进行一系列旋转,则当您将手机放回起始位置时,您可能会发现立方体的角位移。

[编辑:忘记了某些部分]为了消除漂移效应,您“只”需要一种方法将最后一个对象的真实位置 (q1) 表示为四元数,即屏幕上显示的应用程序中的坐标。如果您使用 Unity 之类的工具,它可能只是在读取对象的适当属性。如果您无法轻松访问它,您可以手动跟踪此位置。

如果您想了解更多相关信息,请查看3D math primer for graphics and game development, by Fletcher Dunn,Ian Parberry 第 168 页。

【讨论】:

  • 啊,好吧,但是看看我上次的编辑,因为读数不同。祝你好运。来晚了,明天给你看。
  • @kay 我可以知道....,如果我通过 y 轴来回旋转 iphone,是否可以使用相同的概念来确定角位移?(围绕 y 轴)。请回复我。 :)
  • @sam 基本上是的。但是如果你只想要一个方向的角位移,你最好使用CMAttitude.roll
  • @kay 谢谢。好吧,如果我围绕 y 轴旋转我的手机,以便它描绘一个来回的正弦运动,是否有可能找到它从原始位置旋转到新位置并再次返回的角度(角度确实是相同的)?是不是我需要两次存储滚动阅读并做什么?如果我使用四元数来计算角位移是否更好,方法是使用逻辑在它通过零轴时调用四元数(作为正弦上升),然后在它通过零轴(向下)时再次调用四元数,在正弦的情况下?
  • @Kay 我使用 CMAttitude.roll 来查找一个轴上的角位移,但它会受到漂移和错误的影响。我能知道我是否可以从旋转矩阵中获得更好的读数吗?
【解决方案2】:

我无法复制相同的结果。使用(免费)Gyroscope app,报告为滚动、俯仰、偏航,我得到位置 A 的 (0, 0, 0),然后是 B 的 (-90, 0, 0), (-90, 0, 180) C(这实际上导致设备背对我,与您的图表不同),然后是 (-45, 0, 180) 用于 D。

即使翻转它,因为您似乎将其列为偏航、滚动、俯仰,它仍然是 (0, 0, 0) -> (0, -90, 0) -> (180, -90, 0) -> (180, -45, 0)。在报告之前添加 -90 的滚动将使俯仰轴和偏航轴平行,创建gimbal lock,正如比我更快的打字员所提到的那样。

基本问题是,任何描述三轴旋转的尝试都会给出隐含的旋转顺序——它是“围绕 x 旋转这么多,然后围绕 y 旋转这么多,然后围绕 z 旋转这么多”。无论您选择什么顺序,总是有可能围绕第一个轴旋转以对齐其他两个轴。方向是三维的,因此可以用三个数字来描述(例如,使用单位四元数,但不使用第四项),而不是欧拉角。

编辑:参考您上面的评论,您可以通过使用 -startDeviceMotionUpdatesToQueue:withHandler: 注册处理程序来获得增量移动。这将收到一系列 CMDeviceMotions,您可以从中查看 rotationRate 成员。

【讨论】:

  • 谢谢。我明白那个。我看不到如何解决这个问题。在这个确切的时间,我所做的就是从四元数表示中计算角度并将其列出在屏幕上。这怎么会加起来并引发万向节锁?我想这就是正在发生的事情,但我不知道如何。
  • 我正在使用此代码进行计算:euclideanspace.com/maths/geometry/rotations/conversions/… 那个叫银行的人给我带来了问题。
  • 我不得不承认,我假设您将使用 CoreMotion 直接返回的俯仰、滚动和偏航值,作为 CMDeviceMotion 的“态度”属性,传递给 CMDeviceMotionHandler。这似乎没有任何特殊的不连续性,当俯仰接近 90 度时(当设备处于正常、纵向时),您所看到的只是偏航和滚动循环。我无法立即评论链接的四元数到欧拉转换代码。
  • 俯仰、行和偏航的问题正是这种限制。问题是我看到的是四元数...... ??????!!!!!
  • 这个问题是不可避免的,但是你最终会遇到欧拉角。这只是所涉及的数学的结果。保持中间四元数并没有什么不同。这就是为什么该页面对奇点进行了长时间的阐述,并建议您可能需要考虑替代欧拉角序列。
【解决方案3】:

这个问题看起来很相关:

iphone - core motion range of yaw, pitch and roll

【讨论】:

    【解决方案4】:

    欧拉角对于描述像四元数或旋转矩阵这样的任意旋转并不是那么精确。通常有不止一组角度来描述旋转,因此它不是唯一的。

    [编辑:] 正如 Harinder 核心运动所述,将角度转换为规范表示,即存在一些限制 - 我不确定,但认为俯仰角限制为 [-90;90]。

    请查看Gimbal Lock 或有关该现象的一些类似文章。

    【讨论】:

    • 我使用四元数转换了所有旋转,问题仍然存在。完全一样的问题
    • 你有一个实际的例子来说明如何做到这一点吗?元代码会很好,只是为了让我知道如何解决这个问题。谢谢
    • 我在 3 周前为此苦苦挣扎,最后我几乎可以正常工作,但事实证明它作为游戏控制器很复杂,因此我们把它扔掉了 :-( 在那种情况下,我们使用了 2 个轴控制和俯仰的 90 度限制是相当痛苦的。
    • 基本上这取决于您的需求。您必须使用全部 3 个旋转轴还是只使用其中的 1 个或 2 个?
    • 是的,我知道。出于这个原因,我决定使用四元数来计算角度。它工作正常......除了这个“小”问题。
    【解决方案5】:

    加速度计测量两个加速度矢量的总和:重力和用户加速度。用户加速度是用户赋予设备的加速度。因为 Core Motion 能够使用陀螺仪和加速度计来跟踪设备的姿态,所以它可以区分重力和用户加速度

    这可能对你有帮助:

    an-absolute-degree-measurement

    【讨论】:

    • 谢谢。我已经读过,但它缺乏一个可靠的例子来说明正在解释的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2011-01-08
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多