使用Core Motion获取加速度计数据的位移

时间:2010-12-15 11:50:25

标签: iphone ios4 accelerometer augmented-reality gyroscope

我正在开发一种增强现实应用程序(目前)想要在表面上显示一个简单的立方体,并且能够在空间中移动(旋转和移位)以查看所有不同的立方体角。校准相机的问题在这里不适用,因为我要求用户将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 个答案:

答案 0 :(得分:21)

很酷,有些人在努力解决同样的问题,所以值得花一些时间: - )

我同意westsider的陈述,因为我花了几周的时间尝试不同的方法并最终得到了不好的结果。我相信,对于较长距离或持续超过1秒或2秒的慢速运动,将无法获得可接受的解决方案。如果您可以忍受一些限制,例如小距离(<10厘米)和给定动作的最小速度,那么我相信可能有机会找到解决方案 - 完全没有保证。如果是这样的话,你会花费很多时间进行研究和很多挫折,但是如果你得到它,它会非常酷:-)也许你会发现这些提示很有用:

首先,为了简单起见,只需看一个轴,例如x,但要考虑左(-x)和右(+ x)​​都有可表示的情况。

是的,你是对的,你必须整合两次以获得作为时间函数的位置。并且为了进一步处理,您应该存储第一个积分的结果(==速度),因为您将在稍后阶段进行优化。要非常小心,因为每一个小虫子都会在短时间内导致巨大的错误。

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

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

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

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

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

     vX *= 0.9;
}

`

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

如果您曾设法破解密码,请告诉我,我很好奇看一般是否可能: - )

Cheers Kay

答案 1 :(得分:7)

当iPhone 4非常新时,我花了很多时间试图使用加速度计和陀螺仪获得准确的位移。对增量漂移不应该有太多关注,因为设备最多只需移动几米,数据采集通常最多运行几分钟。我们尝试了各种方法,甚至得到了几位Apple工程师的帮助。最终,似乎陀螺仪无法完成任务。根据知识渊博的工程师的说法,这对3D定位很有好处,但就是这样......

我很想听到有人反驳这一点 - 因为应用程序从来没有像我们希望的那样真实,等等。

答案 2 :(得分:5)

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

我的问题是我正在使用deviceMotion。并且值不正确。 deviceMotion.gravity读近0。任何想法? - OK固定,显然deviceMotion.gravity有x,y和z值。如果你没有指定你想要的x(应该接近0)。

答案 3 :(得分:1)

两年后找到这个问题I just find a AR project on iOS 6 docset named pARk,它使用陀螺仪(又名CoreMotion.Framework)提供近似位移捕获和计算。

我刚刚开始学习代码。

继续......