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

Posted

技术标签:

【中文标题】使用 Core Motion 从加速度计数据中获取位移【英文标题】:Getting displacement from accelerometer data with Core Motion 【发布时间】:2011-05-25 20:59:49 【问题描述】:

我正在开发一个增强现实应用程序,该应用程序(目前)希望在表面上显示一个简单的立方体,并且能够在空间中移动(旋转和位移)以查看立方体的所有不同角度。校准相机的问题在这里不适用,因为我要求用户将 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 仍在飞机上时,加速度计值不为空(我认为有一些噪音)。我应该过滤多少这些值?我应该过滤它们吗?

【问题讨论】:

【参考方案1】:

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

我同意 westsider 的说法,因为我花了几周时间尝试不同的方法,但结果很糟糕。我确信对于较大的距离或持续时间超过 1 或 2 秒的慢动作,不会有可接受的解决方案。如果您可以忍受一些限制,例如小距离(

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

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

请始终牢记,即使是非常小的误差(例如

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

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

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

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

     vX *= 0.9;

`

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

如果你成功破解了密码,请告诉我,我很想知道一般情况下是否有可能:-)

干杯凯

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

d=0.5*a*t^2 的问题通常是,它需要像en.wikipedia.org/wiki/Acceleration 中所述的恒定加速度。 好吧,假设 v(0) == 0 很关键,但我们需要一个起点,并且应该接受这一点。当您有 a==0 和 v!=0 时,IMO 更关键的部分会在几秒钟后出现(如我的回答中所述)。【参考方案4】:

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

我刚刚开始学习代码。

待续……

【讨论】:

以上是关于使用 Core Motion 从加速度计数据中获取位移的主要内容,如果未能解决你的问题,请参考以下文章

为 lumia 520 使用 Motion 类

IOS Core MotionUIAccelerometer(加速计使用)

Core Motion 陀螺仪旋转有问题

从 Kinect 获取 BVH 文件的 MOTION 数据

Core Motion传感器原始数据

使用 Core Motion 构建计步器