老问题,但我想分享一些见解 . 加速度计中的部分偏差实际上不是来自传感器中的任何不准确性,而是来自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
}
请注意,即使消除了这种偏差,仍然存在很多噪声,并且每个加速度计芯片的制造偏差也可能不同 . 因此,你仍然很难获得速度,并且肯定会从中获得定位 .