21

我正在开发一个增强现实应用程序,(目前)希望在表面上显示一个简单的立方体,并且能够在空间中移动(旋转和位移)以从所有不同角度查看立方体。校准相机的问题在这里不适用,因为我要求用户将 iPhone 放在他想要放置立方体的表面上,然后按下按钮重置姿态。使用陀螺仪和核心运动来找出相机旋转非常简单。我这样做:

if (referenceAttitude != nil) {
    [attitude multiplyByInverseOfAttitude:referenceAttitude];
}

CMRotationMatrix mat = attitude.rotationMatrix;

GLfloat rotMat[] = {
    mat.m11, mat.m21, mat.m31, 0,
    mat.m12, mat.m22, mat.m32, 0,
    mat.m13, mat.m23, mat.m33, 0,
    0, 0, 0, 1
};

glMultMatrixf(rotMat);

这真的很好用。当我试图在加速过程中找到空间位移时,无论如何都会出现更多问题。带有 Core Motion 的 Apple Teapot 示例只是将加速度矢量的 x、y 和 z 值添加到位置矢量。这(除了没有太大的意义)具有使物体在加速后返回到原始位置的结果。(因为加速度从正变为负,反之亦然)。他们是这样做的:

translation.x += userAcceleration.x;
translation.y += userAcceleration.y;
translation.z += userAcceleration.z;

我应该怎么做才能从某个瞬间的加速度中找出位移?(具有已知的时差)。寻找其他一些答案,似乎我必须积分两次才能从加速度中获得速度,然后从速度中获得位置。但是代码中没有任何示例,我认为这不是真的必要。此外,还有一个问题是,当 iPhone 仍在飞机上时,加速度计值不为空(我认为有一些噪音)。我应该过滤多少这些值?我应该过滤它们吗?

4

4 回答 4

22

很酷,有人在为同样的问题而苦苦挣扎,所以值得花一些时间:-)

我同意 westsider 的说法,因为我花了几周时间尝试不同的方法,但结果很糟糕。我确信对于较大的距离或持续时间超过 1 或 2 秒的慢动作,不会有可接受的解决方案。如果您可以忍受一些限制,例如小距离(< 10 cm)和给定的最小运动速度,那么我相信可能有机会找到解决方案 - 根本无法保证。如果是这样,您将花费大量时间进行研究并感到沮丧,但是如果您得到了它,那将非常非常酷:-)也许您会发现这些提示很有用:

首先,为了让事情变得简单,只需查看一个轴,例如 x,但同时考虑左 (-x) 和右 (+x) 以具有可表示的情况。

是的,您是对的,您必须积分两次才能获得作为时间函数的位置。对于进一步的处理,您应该存储第一个集成的结果(== 速度),因为您将在稍后阶段需要它进行优化。非常小心,因为每一个微小的错误都会在短时间内导致巨大的错误。

始终牢记,即使是非常小的误差(例如 <0.1%),在进行两次积分后也会迅速增长。如果您将加速度计配置为比方说 50 Hz,即处理 50 个滴答声并且微小的可忽略误差将超过“真实”值,则情况会在一秒钟后变得更糟。我强烈建议不要依赖梯形规则,而是至少使用 Simpson 或更高阶的 Newton-Cotes 公式。

如果你做到了这一点,你将不得不留意设置正确的低通滤波。我不能给出一个普遍的值,但根据经验,尝试 0.2 到 0.8 之间的过滤因子将是一个很好的起点。正确的价值取决于您需要的业务案例,例如什么样的游戏、对事件的反应速度……

现在,您将拥有一个在特定情况下短时间内运行良好的解决方案。但是几秒钟后你就会遇到麻烦,因为你的对象正在漂走。现在您将进入解决方案中我最终未能在给定时间范围内处理的困难部分:-(

一种有前途的方法是引入我称之为“合成力量”或“虚拟力量”的东西。尽管设备在您手中保持固定(?没有母语人士,我的意思是没有移动),但这是对几种不良情况做出反应的策略,这些情况会触发对象漂移。最麻烦的是速度大于0,没有任何加速度。这是错误传播的不可避免的结果,可以通过人为减速来处理,这意味着即使没有真正的对应物,也要引入虚拟减速。一个非常简单的例子:

if (vX > 0 && lastAccelerationXTimeStamp > 0.3sec) {

     vX *= 0.9;
}

`

您将需要结合这些条件来驯服野兽。需要大量的尝试和错误才能找到正确的方法,这将是问题的难点。

如果您设法破解了代码,请告诉我,我很好奇一般情况下是否有可能:-)

干杯凯

于 2011-01-08T17:18:26.093 回答
7

当 iPhone 4 很新时,我花了很多很多时间尝试使用加速度计和陀螺仪来获得准确的位移。不应该过多担心增量漂移,因为设备最多只需要移动几米,并且数据收集通常最多运行几分钟。我们尝试了各种方法,甚至得到了几位苹果工程师的帮助。最终,陀螺仪似乎无法胜任这项任务。根据知识渊博的工程师的说法,这对 3D 方向很有用,但仅此而已。

我很想听到有人反驳这一点——因为该应用程序从未像我们希望的那样真正实现,等等。

于 2011-01-07T04:59:53.090 回答
5

我也试图在 iPhone 上获得位移。我没有使用积分,而是使用了 d = .5a * t^2 的基本物理公式,假设初始速度为 0(听起来不像您可以假设初始速度为 0)。到目前为止,它似乎工作得很好。

我的问题是我正在使用 deviceMotion.and 值不正确。deviceMotion.gravity 读数接近 0。有什么想法吗?- OK 固定,显然 deviceMotion.gravity 有 ax、y 和 z 值。如果您没有指定要返回的 x(应该接近 0)。

于 2011-01-15T21:29:31.550 回答
1

两年后找到这个问题,我刚刚在 iOS 6 文档集上找到了一个名为 pARk 的 AR 项目,它提供了使用 Gyroscope(又名 CoreMotion.Framework)进行的近似位移捕获和计算。

我刚刚开始学习代码。

未完待续...

于 2012-10-11T09:29:56.213 回答