我正在尝试使用 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,它理论上应该能够计算两点之间的距离(称为命中记录),但读数的质量在很大程度上取决于相机质量和光照条件。我还阅读了(这里、
这里、
这里、
这里和
这里)关于“实施卡尔曼滤波器”和“融合传感器”的建议 - 这是什么意思?也许这能有所帮助?
我真的很感激每一个答案!
这与其他问题一样,都是应用数学或物理问题。您用于更新位置的代码仅适用于静止的传感器。经典力学中与此相关的两个最有用的方程式是:
您的代码假设
u=0
对于所有t
。并且可能存在与计算所花费的时间成比例的系统误差偏差。e.timestamp 可能会在第一次和第二次使用之间发生变化。
我不会说您用于编码的语言,但根据您所展示的代码,下面的代码应该更接近工作(显然您必须
velocity[]
在正确的范围内声明。我引入了一个新变量dt = time - otime...
并重命名dta
为,otime
因为它是前一个时间戳值而不是时间差。我确实想知道时间间隔的缩放是否也可能是错误的,以及传感器是否真的以 SI m/s^2 单位返回加速度。时间戳值是否真的以纳秒为单位测量?各种传感器校准比例因子都很重要,因此您需要查看手册。
你不知道。加速度计存在很多问题,不适合测量距离。
1)即使它们完美运行,双重积分(从加速度->速度->距离)也会导致传感器中的自然噪声被极大放大。
2)加速度计本质上是有噪声的。它们需要经过严格过滤才能获得不错的结果。除非您是 DSP 专家,否则您不太可能做好这件事。
3)加速度计不是为此设计的。它们会达到最大值——它们可以测量的最大加速度是最大值,超过这个值就无法再增加。这个最大值取决于传感器的具体型号,但你可以通过慢跑轻松达到这个值。
4)加速度计测量加速度,而不是速度。因此,如果您以恒定的 1m/s 速度行进,加速度计将始终测量 0(忽略噪音)。因此,即使您的移动速度为 1m/s,您也会看到 0 运动。换句话说,当您将加速度积分到速度中并得到 时
v= v_0+a(t)*t
,加速度计无法测量 v_0 项。当您再次积分到距离 时x(t)= x_0+v_0*t+1/2a(t)^2
,x_0 和 v_0 项都归零,这是一个重大错误。5)倾斜/旋转。静坐时将手机拿出来,然后快速旋转手腕。你会看到旋转离心力产生的加速度峰值。但你没有移动。你也许可以通过读取陀螺仪并进行一些数学运算来消除这一现象,但陀螺仪也会产生噪音。
这就是为什么加速度计从不用于距离计算的原因。如果您需要距离,请使用 GPS 或基于网络的定位。两者都比加速度计更准确。
现在你说你想测量到 0.15 米的精度。我认为没有任何方法可以做到这一点。即使在露天条件下,GPS 也不是那么准确 - 在完美的大气条件下大约为 5 米。也许机密的军事硬件可以接近,但在商用手机上,预计误差会超过 10 米,如果在市中心或山区,偶尔会跳到 100 米,如果在室内,则跳到 5 米以上。如果你想在特定位置进行测量,你可以设置 BLE 信标并使用距离三角测量,但即使这样也不太可能达到这种精度。他们的技术不适合这样做。
您提到了 ARCore - ARCore 的功能非常不同。当它测量距离时,它不知道自己在世界上的位置。它使用计算机视觉来尝试找出图像中物体的位置,然后估计到该物体的距离。它根本不检测手机的移动(好吧,它确实有一种模式,它会使用 GPS 让你将物体放置在 GPS 坐标处,但那是 ARCore 的完全不同的子系统)。