有没有办法在加速度计数据中消除沿重力轴的小偏差?

4
类似于这个问题: CMDeviceMotion userAcceleration drift 我正在使用iOS5 SDK中的CMDeviceMotion.userAcceleration来绘制其x、y、z分量随时间的变化。就像上面的帖子一样,当我的iPhone 4s放在平坦的表面上时,我发现z加速度分量始终显示小的正值(0.005-0.015),而x和y分量则沿着零点居中(-0.005-0.005)。
即使我的手机没有移动,这个小的偏差也会持续累加到所估计的速度(我通过积分加速度数据来计算)中。是否已知有任何方法可以从加速度计数据中消除这种偏差?我不能简单地从z分量中减去偏差,因为如果设备处于某种任意方向,则偏差会沿着重力轴扩散到x、y和z上。
我知道CMDeviceMotion.userAcceleration中的数据已经使用陀螺仪数据排除了重力,但想知道是否有任何有效的方法可以消除这种剩余偏差?
3个回答

2

虽然这是一个老问题,但我想分享一些见解。加速度计中的偏差实际上并不是来自传感器的任何不准确性,而是来自苹果公司在计算时的疏忽。计算假设重力始终为1 G(按定义为9.80665 m/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
}

即使消除了这种偏差,仍然存在很多噪声,并且每个加速度计芯片的制造偏差也可能不同。因此,您仍然会很难从中推导出速度,更不用说位置了。

2
首先,您需要一些不会漂移的外部参考,例如GPS。然后,您必须执行传感器融合(考虑使用卡尔曼滤波器)。否则,您无法消除偏差,积分误差将无限增长。
更新:您无法仅通过积分加速度来获取相对位移,请参阅我的回答Android accelerometer accuracy (Inertial navigation)。但是,我在那里提供了一些实际可行的解决方案。
如果您查看我的回答,您将看到陀螺仪白噪声使积分变得无望。

谢谢回复。明确一下,我正在寻找一种有效地消除原始加速度计数据中偏差的方法(暂时不考虑积分误差)。如果需要进行任何校准步骤也可以,但不确定卡尔曼滤波器对这种情况有何帮助。 - atisman
@atisman MEMS传感器总是会漂移,它们对温度变化等因素非常敏感,你无法做太多事情来解决这个问题...如果你没有进行集成,那么为什么一个小的偏差会给你带来问题?你想要做什么? - Ali
此刻,我只是试图理解这些传感器和相关的iOS API以及我可以从中获得什么。我的初步目标是尽可能准确地获取iPhone两个任意位置的相对位移。但是由于这个恒定的正偏差,即使不考虑积分步骤中的任何误差,位移误差似乎也太大了。例如,0.0015 g/s^2的量在1秒后(基于公式1/2at^2)将会给出约7.35厘米的位移,即使手机没有任何移动。 - atisman
好的,我更新了答案。我自己尝试了一下这个集成,结论是:令人惊讶的是,它不可能是加速度计偏差,而是陀螺仪白噪声导致的。请查看我的更新答案。 - Ali

-1

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


将加速度平均以获得“偏差”,然后应用 1/2 at^2 就是 积分。公式 1/2 cx^2 是对常数 c 进行两次积分的一般结果。请接受阿里的答案。顺便说一下,除非每次测量的误差相同,否则它不是偏差。 - Potatoswatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接