与此问题类似: CMDeviceMotion userAcceleration drift
我在iOS5 SDK中使用CMDeviceMotion.userAcceleration来绘制其x,y,z组件。像上面的文章一样,我看到z加速度分量总是显示小的正值(0.005 - 0.015),而当我的iPhone 4s坐在平坦的表面上时,x和y分量以零(-0.005 - 0.005)为中心。
即使我的手机没有移动一点,这个小偏差仍然会增加估计的速度(我通过积分加速度数据来计算)。有没有已知的方法可以从加速度计数据中消除这种偏差?我不能简单地从z分量中减去偏差,因为如果设备处于某个任意方向,偏差似乎沿着重力轴在x y和z上扩展。
我知道CMDeviceMotion.userAcceleration中的数据已经使用Gyro数据计算了重力,但想知道是否有任何有效的方法可以消除这种残留偏差?
答案 0 :(得分:1)
首先,您需要一些外部参考,不会漂移,例如GPS。然后你必须进行传感器融合(卡尔曼滤波器)。否则,您无法消除偏差,集成错误将无限增长。
更新:仅通过整合加速度无法获得相对位移,请参阅我对Android accelerometer accuracy (Inertial navigation)的回答。但是,我举一些例子说明你实际上可以做什么。
如果你检查我的答案,你会发现陀螺白噪声使整合无望。
答案 1 :(得分:1)
老问题,但我想分享一些见解。加速度计中的部分偏差实际上并非来自传感器中的任何不准确性,而是来自Apple计算中的疏忽。计算假设重力始终为1 G(根据定义为9.80665 m / s2)。任何遗留都必须是用户加速。
但是,gravity varies slightly遍布全球。如果您所在区域的重力不是精确到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 :(得分:-1)
感谢Ali更新您的答案和其他参考资料。他们肯定帮助我理解了这个问题(我很惊讶地看到有多少人对这个问题感兴趣)。我可能听起来有点顽固,但我仍然认为我无法从任何地方找到原始问题的答案。我们现在就忘记整合了。通过更多实验,我在x和y轴上看到了一些恒定的偏差(尽管更小),当我随着时间平均用户加速度数据时也是如此。我只是想知道是否有任何方法可以从iOS5 CMDeviceMotion中获取的“用户”加速数据中消除这些偏差。如果它们是在滤除重力的过程中由陀螺仪的白噪声引起的,我想我们可能会在用户加速度计数据中看到随机噪声而不是那些偏差。但根据我迄今为止的印象,似乎这些偏差是由加速度计和陀螺仪的有限“准确度”引起的,虽然我不是100%肯定,但我们无能为力。我试图把我的印象放在评论中(不是在答案部分),但是因为时间太长而不允许,但我想知道有多少人会通过投票支持我的印象,所以我决定把它放在答案部分。 ..对不起,如果我有点乱。