TL; DR为什么我从Sensor.TYPE_ACCELEROMETER获得的加速度计值略微偏移?我不是指重力,而是一些因轴到轴和手机到手机不同的小错误 . 我可以校准加速度计吗?或者是否有一种补偿这些错误的标准方法?
我正在开发一种应用程序,它需要尽可能精确的加速度测量(主要是垂直加速度,即与重力方向相同) .
我一直在进行大量的测试,事实证明我从 Sensor.TYPE_ACCELEROMETER 得到的原始值是关闭的 . 如果我让手机在屏幕上方处于完全水平的表面,则加速度计显示的Z值为9.0,应该约为9.81 . 同样,如果我将手机设置为纵向或横向模式,则X和Y加速度计值显示大约9.6 . 而不是9.81 .
这当然影响我的垂直加速度,因为我正在使用 SensorManager.getRotationMatrixFromVector() 来计算垂直加速度,导致垂直加速度根据设备的旋转而偏离不同的量 .
现在,在任何人跳枪并提到我应该尝试使用 Sensor.TYPE_LINEAR_ACCELERATION 之前,我必须指出我实际上也是这样做的,与 TYPE_ACCELERATION 平行 . 通过使用重力传感器I然后计算垂直加速度(as described in this answer) . 有趣的是,我得到的结果与使用原始加速度计, SensorManager.getRotationMatrixFromVector() 和矩阵乘法(最后减去重力)的方法完全相同 .
在任何旋转中,我能够为固定电话获得几乎完全零垂直加速度的唯一方法是获取原始加速度计值,添加偏移量(从之前的观察结果,即 X+0.21 , Y+0.21 和 Z+0.81 ),然后执行旋转矩阵获得世界坐标系加速度的东西 . 请注意,因为's not just the calculated vertical acceleration that is wrong - it' s实际上来自 Sensor.TYPE_ACCELEROMETER 的原始值,我认为它会排除陀螺仪传感器等其他误差来源?
我已经在两款不同的手机(三星Galaxy S5和索尼Xperia Z3紧凑型)上进行了测试,两者都有这些加速度计的 Value 偏差 - 但两款手机的 Value 当然不一样 .
为什么 Sensor.TYPE_ACCELEROMETER 的值是关闭的,加速度计是否有一个更好的方法,而不是简单地观察它们偏离重力的程度,并在使用之前将差值加到值上?