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

问题描述 投票:0回答:2

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

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

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

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

- 1

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

- 2

此图显示了每次触发流并为我提供新数据之间的时间(以毫秒为单位)(经过的毫秒数之间的差异

time[i+1]-time[i]
)。橙色为正常状态(图1)。蓝色表示几分钟后损坏的状态(图 2)。

当一切正常时(橙色线),每 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 毫秒)(图中橙色)。并不是流每 10ms 不断触发一次。相反,有时加速度计“需要”15 毫秒(我不知道正确的术语是什么,我很抱歉),然后也许下一次只需要 5 毫秒。随着时间的推移,差异越来越大。例如,30 秒后,流在 2 毫秒到 18 毫秒之间触发,但平均仍为 10 毫秒 (100 Hz)。传感器运行的时间越长,间隙就越大(例如 0 毫秒和 60 毫秒)。 我发现的另一件事是,随着时间的推移,操作系统 (ig) 会将采样率从最初的 100Hz 降至 20Hz。

android flutter dart accelerometer android-sensors
2个回答
1
投票

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

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


0
投票

我特别要求 100Hz,但我也遇到了与此线程中描述的相同的问题,并通过系统 Nano 调用进行验证。所以 SENSOR_DELAY_NORMAL 不是问题。

© www.soinside.com 2019 - 2024. All rights reserved.