是否有任何方法可以消除加速度计数据中沿重力轴的小偏差



类似于这个问题:CMDeviceMotion用户加速度漂移

我在iOS5 SDK中使用CMDeviceMotion.userAcceleration来绘制其随时间变化的x、y、z组件。就像上面的帖子一样,当我的iPhone 4s坐在平坦的表面上时,我看到z加速度分量总是显示较小的正值(0.005-0.015),而x和y分量则以零为中心(-0.005-0.005)。

即使我的手机一点也不动,这个小偏差也会不断增加到估计的速度(我通过积分加速度数据来计算)。有什么已知的方法可以从加速度计数据中消除这种偏差吗?我不能简单地从z分量中减去偏移,因为如果设备处于某个任意方向,偏移似乎会沿着重力轴分布在xy和z上。

我知道CMDeviceMotion.userAcceleration中的数据已经使用Gyro数据计算出了重力,但我想知道是否有任何有效的方法来消除这种残余偏差?

首先,您需要一些不会漂移的外部参考,如GPS。然后,您必须执行传感器融合(脑海中浮现出卡尔曼滤波器)。否则,您无法消除偏差,积分误差将无限期增长。

更新:仅通过积分加速度无法获得相对位移,请参阅我对Android加速度计精度(惯性导航)的回答。然而,我在那里举了一些例子,你实际上可以做什么。

如果你检查我的答案,你会发现正是陀螺仪的白噪声使集成变得毫无希望。

老问题,但我想分享一些见解。加速度计的部分偏差实际上并不是来自传感器的任何不准确,而是苹果公司在计算中的疏忽。计算假设重力始终为1G(根据定义为9.80665m/s2)。剩下的必须是用户加速。

然而,重力在世界各地略有不同。如果你所在区域的重力不是9.80665 m/s2,那么用户加速度会有一个小的偏差,这可以通过低通滤波器检测到。这样的偏差可以通过以下计算来消除:

- (void) handleDeviceMotion:(CMDeviceMotion *)m atTime:(NSDate *)time
{
    // calculate user acceleration in the direction of gravity
    double verticalAcceleration = m.gravity.x * m.userAcceleration.x + 
                                  m.gravity.y * m.userAcceleration.y +  
                                  m.gravity.z * m.userAcceleration.z;
    // update the bias in low pass filter (bias is an object variable)
    double delta = verticalAcceleration - bias;
    if (ABS(delta) < 0.1) bias += 0.01 * delta;
    // remove bias from user acceleration
    CMAcceleration acceleration;
    acceleration.x = m.userAcceleration.x - bias * m.gravity.x;
    acceleration.y = m.userAcceleration.y - bias * m.gravity.y;
    acceleration.z = m.userAcceleration.z - bias * m.gravity.z;
    // do something with acceleration
}

请注意,即使消除了这种偏差,仍然会有很多噪音,而且每个加速度计芯片的制造偏差也可能不同。因此,你仍然很难从中推导出速度和位置。

感谢Ali更新您的答案和其他参考资料。它们确实有助于我理解这个问题(我很惊讶看到有这么多人对这个问题感兴趣)。我可能听起来有点固执,但我仍然认为我没有从任何地方找到我最初问题的答案。现在让我们忘记集成。随着更多的实验,当我对用户加速度数据进行一段时间的平均时,我在x和y轴上也看到了一些恒定的偏差(尽管更小)。我只是想知道是否有任何方法可以从iOS5 CMDeviceMotion获得的"用户"加速度数据中消除这些偏见。如果它们是由陀螺仪在过滤重力过程中的白噪声引起的,我想我们可能会在用户加速度计数据中看到随机噪声,但不会看到这些偏差。但根据我目前的印象,这些偏差似乎是由加速度计和陀螺仪的有限"精度"造成的,尽管我不能100%确定,但我们对此无能为力。我试图把我的印象放在评论中(而不是回答部分),但SO不允许,因为时间太长了,但我想知道有多少人会通过投票来支持我的印象,所以我决定把它放在回答部分。。。对不起,我说得有点乱。

最新更新