在 Android 智能手表上记录数据时出现随机间隙 [英] Random gaps while recording data on Android smartwatch

查看:32
本文介绍了在 Android 智能手表上记录数据时出现随机间隙的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用运行 WearOS 的 Fossil Gen 5 智能手表来记录来自加速度计、陀螺仪 (32 Hz) 和 PPG 传感器 (64 Hz) 的传感器数据.我正在为每个传感器使用一个唯一的 bufferedWriter 对象,以便在创建每个传感器事件时将数据写入 .txt 文件(如下所示):

I'm using a Fossil Gen 5 smartwatch running WearOS to record sensor data from Accelerometer, Gyroscope (32 Hz) and PPG sensor (64 Hz). I'm using a unique bufferedWriter object for each sensor to write data to a .txt file as each sensor event is created (shown below):

void registerSensor(){

    Log.i(TAG,"Sensor Registered");

    try {
        accWriter = new BufferedWriter(new FileWriter(accFile, true));
        gyrWriter = new BufferedWriter(new FileWriter(gyrFile, true));
        ppgWriter = new BufferedWriter(new FileWriter(ppgFile, true));
    } catch (IOException e) {
        e.printStackTrace();
    }

    //just in case
    if (sensorManager == null)
        sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

    listener = new SensorEventListener() {
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {}
        @Override
        public void onSensorChanged(SensorEvent event) {

            switch (event.sensor.getType()) {
                case 65572:
                    String msg1 = "Recording PPG";
                    mData1.setText(msg1);
                    ppgTime = System.currentTimeMillis() + (event.timestamp - SystemClock.elapsedRealtimeNanos()) / 1000000L;
                    try {
                        ppgWriter.write(ppgTime + ", " + event.values[0] + ", " + ambient + "\n");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    break;

                case Sensor.TYPE_ACCELEROMETER:
                    String msg2 = "Recording ACC";
                    mData2.setText(msg2);
                    accTime = System.currentTimeMillis() + (event.timestamp - SystemClock.elapsedRealtimeNanos()) / 1000000L;
                    try {
                        accWriter.write(accTime + ", " + df.format(event.values[0]) + ", " + df.format(event.values[1]) + ", " + df.format(event.values[2]) + ", " + ambient + "\n");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    break;

                case Sensor.TYPE_GYROSCOPE:
                    String msg3 = "Recording GYR";
                    mData3.setText(msg3);
                    gyrTime = System.currentTimeMillis() + (event.timestamp - SystemClock.elapsedRealtimeNanos()) / 1000000L;
                    try {
                        gyrWriter.write(gyrTime + ", " + df.format(event.values[0]) + ", " + df.format(event.values[1]) + ", " + df.format(event.values[2]) + ", " + ambient + "\n");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    break;
            }
        }
    };
    sensorManager.registerListener(listener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),31250); // SensorManager.SENSOR_DELAY_FASTEST);
    sensorManager.registerListener(listener, sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), 31250);
    sensorManager.registerListener(listener, sensorManager.getDefaultSensor(65572), 15625);

}

我希望采样频率在预期值附近徘徊.但是我在所有 3 个传感器流中随机丢失了大约 60 秒的数据块.

I expect the sampling frequency to hover around the intended value. But I'm getting random missing data chunks of ~ 60 s in all 3 sensor streams.

请看这张直观描述问题的图片(我还不能嵌入图片)

我已经对此进行了多次测试,结果相同.我认为某些事件可能会被删除,所以我尝试将所有数据写入一个字符串,然后在超过特定大小后将字符串写入文件.这并没有解决问题.

I've tested this a number of times, with the same result. I thought some events might be dropped, so I tried writing all the data to a String and then writing the String to a file after a certain size is exceeded. This didn't solve the issue.

非常感谢任何帮助或建议!请原谅我的礼仪,因为我是 StackOverflow 的新手.

Any help or suggestions are greatly appreciated! Excuse my etiquette as I'm new to StackOverflow.

推荐答案

如果在屏幕关闭时采样被丢弃,您需要使用唤醒传感器.您可以通过将 true 传递给 sensorManager.registerListener 来实现.而且根据文档,采样频率只是对操作系统的一个提示.

If the samples are being dropped when the screen is off you need to use wakeup sensors. You can do that by passing true to sensorManager.registerListener. And according to the doc, the sampling frequency is only a hint to the os.

这篇关于在 Android 智能手表上记录数据时出现随机间隙的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆