加速度计在运行几分钟后同时触发多次

问题描述

我用 Flutter 开发了一个移动应用。 我正在使用 flutter_sensors 包读取加速度数据,每次流被触发并输出新的加速度数据时,我都会使用 Stopwatch class 计算经过的毫秒数,并存储和绘制加速度数据和相应的时间戳.

accelerationZ = [12.79,9.93,8.43,15.96,…,5.13,9.61,12.81] in m/s^2
time = [145922,145923,145952,145960,147900,147913,147936] in ms since start

几分钟后,奇怪的事情发生了。

这是启动传感器后加速度随时间变化图的样子:

Acceleration over time right after starting the sensor

- 1

这是大约 4 分钟后的样子:

Acceleration over time after around 4min

- 2

此图显示了每次触发流并提供新数据之间的时间(以毫秒为单位)(经过的毫秒数之间的差异 time[i+1]-time[i])。橙色为正常状态(图 1)。几分钟后的蓝色显示为损坏状态(图 2)。

time between every timestamp

当一切正常(橙色线)时,每 5 到 15 毫秒就会有新数据到来。

但几分钟后(蓝线)流同时被触发多次(时间差以及此时的图表为零) 然后中断大约 70 毫秒(图中的峰值)然后再次被触发多次。

这对应于图 2 所示的图表。在那里您还可以看到这些时间跳跃和同时多个值。

我的问题是:什么可能导致这种情况?我该如何解决

我很高兴听到任何关于一般改进的建议(例如标题)。非常感谢您的帮助。 如果需要更多信息来帮助我,请告诉我!我很绝望。

这是监听事件的代码

void startSensors() async {
    accelstream = await SensorManager().sensorUpdates(
      sensorId: Sensors.ACCELEROMETER,interval: Duration(milliseconds: 10),);

    stopWatch.start();

    accelstream.listen((SensorEvent event) {
      setState(
        () {
          Vector3 accel = Vector3(event.data[0],event.data[1],event.data[2]);
          newData(accel.z,stopWatch.elapsedMilliseconds)
        },);
    });
}

我的一些发现: 国家随着时间的推移而发展。启动应用程序后,采样率平均为 100Hz(每 10 毫秒)(图中的橙色)。并不是说流每 10 毫秒不断触发一次。相反,有时加速度计“需要”(我道歉正确的术语是什么)15ms,然后可能下一次只有5ms。随着时间的推移,差异越来越大。例如,在 30 秒后,流在 2 毫秒到 18 毫秒之间触发,但平均仍为 10 毫秒(100 赫兹)。传感器运行的时间越长,间隙就越大(例如 0ms 和 60ms)。 我发现的另一件事是,随着时间的推移,操作系统 (ig) 将采样率从最初的 100Hz 降低到 20Hz。

解决方法

您不应该尝试自己确定时间(使用秒表)。事件数据包含事件发生时间的时间戳。您需要改用它,因为可能会有一些延迟(取决于其他情况)。

只存储最后一个事件的时间戳,然后计算新事件到来时的增量。