【发布时间】:2021-04-05 15:20:30
【问题描述】:
我已经使用 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
几分钟后,奇怪的事情发生了。
这是启动传感器后加速度随时间变化的图表:
这是大约 4 分钟后的样子:
此图显示了每次触发流和给我新数据之间的时间(以毫秒为单位)(经过的毫秒之间的差异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(每 10ms)(图中橙色)。并不是流每 10 毫秒就不断触发一次。取而代之的是,有时加速度计“占用”(我道歉正确的术语是什么)15ms,然后下一次可能只有5ms。随着时间的推移,差异越来越大。例如,在 30 秒后,流在 2 毫秒到 18 毫秒之间触发,但平均仍为 10 毫秒(100 赫兹)。传感器运行的时间越长,间隙就越大(例如 0ms 和 60ms)。 我发现的另一件事是,随着时间的推移,操作系统 (ig) 会将采样率从最初的 100Hz 降低到 20Hz。
【问题讨论】:
-
请展示一个最小的可重现样本
-
@ch271828n 这需要我两到三个小时。如果您对提供所提供的信息没有任何想法,并且对在这个问题上花费大量时间不感兴趣,我认为这对我来说不值得。 ://
-
@NanoKaano 你应该至少发布监听事件的代码和处理陀螺数据的代码。
-
@danypata 我做到了,希望对您有所帮助。函数
newData然后将加速度和经过的毫秒存储到列表中。 -
@NanoKaano 您是否会两次或多次调用此方法?你是否曾经取消过从
listen获得的流订阅。在您的情况下,您似乎对同一个观察者有多个订阅者。
标签: android flutter dart accelerometer android-sensors