Core Motion加速度计显示奇怪的数据

时间:2012-10-18 21:01:14

标签: ios accelerometer core-motion

简短的问题:来自CoreMotion值的加速度甚至可以在桌面上放置相当大的漂移。没关系,或者我做错了什么?

很长的问题:我正在使用CoreMotion加速度计,在-init方法中:

motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 1.0 / 60.0;

然后开始更新它:

if ([motionManager isDeviceMotionAvailable])
{
    [motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryCorrectedZVertical];
}

然后在某些更新方法中读取值(由Cocos3d通过计时器调用)。此外,我有一个静态变量accum - accumulator,它为它添加当前的加速度值。所以accum保存所有加速度值的总和:

if (motionManager.deviceMotionActive)
{
    CMDeviceMotion *deviceMotion = motionManager.deviceMotion;
    CMAcceleration accel = deviceMotion.userAcceleration;
    static CC3Vector accum = {0,0,0};
    accum.x += accel.x;
    accum.y += accel.y;
    accum.z += accel.z;
    NSLog(@"%f, %f, %f", accum.x, accum.y, accum.z);
}

我将iPad 3放在桌子上,乍一看加速度值似乎没问题,但是可以看出,在一个轴上累积的值开始快速增加。我知道,从原始数据中移除重力不是100%准确,但我没想到即使iPad放在桌子上而且没有移动也是如此糟糕。所以问题是我做错了什么,或者这应该是怎么回事?

3 个答案:

答案 0 :(得分:1)

帮助提高准确性的一种方法是使用以下内容:

accum.x += (previous_accel.x - accel.x)/2;
previouis_accel.x = accel.x;

当您拍摄并记录原始传感器读数时,您会自动丢失数据,就像您在下面的丑陋图片/图表中看到的那样。通过平均最后读数和当前读数,您可以帮助平滑(或填写)缺失的信息 Data "lost" between samples

你可能从微积分1(我认为是最小二乘法)中认识到这一点,无论如何,就像在微积分中一样,区间越小,你就越接近真实信息。我想我问,你是否以最高频率进行采样?

使用加速度计时始终建议使用的另一种(某种)基本数据管理技术是低通滤波器。它很容易实现,即使没有上面的平均技术,它也可以消除静止时的漂移。如果您还没有听说过,那么只需要对所读取的值进行测试,看它们是否足够大,除了噪音之外的其他任何东西。 (噪音可能是由很多东西造成的,但从我所读到的温度来看,我们凡人无法察觉的微振动是最大的问题之一)。

if(accel.x < .05)
    accel.x = 0.0;

使用的实际值完全取决于您的传感器,并且在某种程度上,您要做的事情/读数需要的灵敏度,因此您需要进行一些测试以找出适合您情况的最佳值。如果可以的话,我会输出到csv文件,然后将它们导入到具有图形功能的电子表格中。在图表中查看过滤器测试以及稍后调试程序时的数据非常有用。

答案 1 :(得分:0)

即使你精确地知道重力的方向和强度,加速度计也太嘈杂而无法准确地整合速度。

您可以通过累积平均加速度矢量并减去偏差来稍微抵消偏差,但显然在您倾斜或加速设备的瞬间停止工作。

答案 2 :(得分:0)

您正在使用CMAttitudeReferenceFrameXArbitraryCorrectedZVertical,它会根据磁力计更新偏航。虽然这通常可以很好地纠正长期价值,但它确实会随着环境而变化。