我正在尝试使用 Android 中的传感器,并决定制作一个应用程序来使用线性加速度传感器测量设备移动的距离。我想出了以下一段代码:
override fun onSensorChanged(e: SensorEvent?) {
if (e != null) {
when (e.sensor.type) {
Sensor.TYPE_LINEAR_ACCELERATION -> {
var time = if (dta != 0L) (e.timestamp - dta) * 10f.pow(-9) else 0f
for (i in 0..2) {
acceleration[i] = e.values[i]
position[i] += acceleration[i] * time * time / 2
}
dta = e.timestamp
}
}
}
}
其中dta
是传感器上次更新的时间,acceleration
和position
是可变状态列表,显示在活动中。
但是,我注意到测量结果非常不准确。为了减少错误,我决定在相应事件值低于阈值时设置acceleration[i]
为0f
。但是,即使读数看起来正确,我也没有好的方法至少部分准确地将原始加速度数据转换为位置变化。
我真的不知道如何应对,例如由于人类步伐的加速度特性(它们保持一次增加一次减少),如活动中绘制的图表所示:
其中红色表示 X 加速度,绿色 - Y,蓝色 - Z,黑色是“总”加速度 - 单轴加速度平方和的平方根。
我发现值得注意的是,该应用程序的想法是按照一个人正常步行的速度(他按下按钮,走过去,放下手机,然后回到原来的位置)测量 1 到 5 米范围内的行进距离,因此移动时间不应超过一分钟。在这样的数量级下,传感器漂移不应该造成太大的干扰,但代价是无法使用 GPS 来校正结果。
我想达到 15-20 厘米的精度。这可能吗?如果可以,如何实现这种效果?如果不可能,还有其他方法可以有效地测量用户与设备的距离吗?我听说过 Google ARCore,它理论上应该能够计算两点之间的距离(称为命中记录),但读数的质量在很大程度上取决于相机质量和光照条件。我还阅读了(这里、
这里、
这里、
这里和
这里)关于“实施卡尔曼滤波器”和“融合传感器”的建议 - 这是什么意思?也许这能有所帮助?
我真的很感激每一个答案!