重力为测量结果中的不变成分。因此在获取到三轴的加速度分量后,可以采用低通滤波的方式分离出重力分量,然后在原始值中减去重力。最后得到不含重力的手机加速度。
手机的x、y、z轴定义如图:
以下为安卓开发者文档中提供的低通滤波算法:
public void onSensorChanged(SensorEvent event)
{
// alpha 由 t / (t + dT)得到
// t为滤波器时间常量,为传感器单次采样时间
// dT为采样频率
final float alpha = 0.8;
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
}
values数组分别存放手机x、y、z轴的原始加速度。
gravity为重力值。
linear_acceleration为最终结果。