【问题标题】:Impossibility to change the rate of the accelerometer无法改变加速度计的速率
【发布时间】:2012-02-20 09:34:11
【问题描述】:

我必须从我的 Android 手机收集加速度计数据,所以我编写了一个小程序来完成这项工作。

经过一些测试,我发现我的 Nexus S 加速度计的速率在手机处于活动状态时是始终每秒 50 个值,在手机处于睡眠状态时是每秒 6 个值(PARTIAL_WAKE_LOCK ),无论我要求的价格是多少(NORMALUIGAMEFASTEST)。

所以我决定安装一个在 Internet 上找到的用于测试加速度计速率的应用程序:http://samoht.fr/tuto/accelerometers-frequency-on-android-with-code

但我得到了同样的“错误”:无论我要求什么速率,当手机处于活动状态时,它总是每秒 50 个值。

我不明白为什么我的手机会这样。有问题吗:

  • 与 Nexus S 相关?
  • 特定于我的手机?
  • 与 Android 4 相关?

编辑:我已经在另一个 Nexus S (Android 4) 上测试了该程序,我也遇到了同样的问题。 所以它似乎消除了上面列出的一种可能性:它不仅与我的手机有关。

【问题讨论】:

  • 我已经在华硕变压器平板电脑上尝试过代码,我也遇到了同样的问题。所有传感器延迟都使用 50 Hz 的频率。我也会寻找答案的。
  • 您可以使用模拟器在各种配置上进行尝试,以确定它是依赖于操作系统还是依赖于设备。我敢打赌,该值取决于您的硬件并且无法更改...另外,请阅读:stackoverflow.com/questions/4224223/…
  • 谢谢,我会用模拟器试试!

标签: android accelerometer android-sensors nexus-s rate


【解决方案1】:

我在不同的智能手机上进行了一些测试。结果如下:

Samsung Galaxy Teos
-------------------
* When awake
    Normal: 4.17 Hz
    UI: 8.43 hz
    Game: 16.93 Hz
    Fastest: 109.42 Hz

* When asleep
    The phone sends null values (0), whatever the mode I chose


Samsung Nexus S
---------------
* When awake
    Normal: 49.51 Hz
    UI: 49.51 hz
    Game: 49.51 Hz
    Fastest: 49.51 Hz

* When asleep
    6.06 Hz, whatever the mode I chose

LG Nexus 5
----------
* When awake
    Normal: 15.39 Hz
    UI: 15.4 Hz
    Game: 50.05 Hz
    Fastest: 196.74 Hz

* When asleep
    Normal: 4.96 Hz
    UI: 15.41 Hz
    Game: 50.12 Hz
    Fastest: 198.53 Hz

LG Nexus 4
----------
* When awake
    Normal: 15.75 Hz
    UI: 15.74 Hz
    Game: 48.86 Hz
    Fastest: 195.85 Hz

* When asleep
    Normal: 5.5 Hz
    UI: 15.74 Hz
    Game: 49.16 Hz
    Fastest: 196.75 Hz


Samsung Galaxy Nexus
--------------------
* When awake
    Fastest: 125 Hz

* When asleep
    It sends data


Samsung Galaxy Note 2
---------------------
* When awake
    Fastest: 100 Hz

* When asleep
    The phone does not send anything


Samsung Galaxy S3 and S3 Mini
-----------------------------
* When awake
    Fastest: 100 Hz

* When asleep
    Fastest: 100 Hz


HTC Wildfire
------------
* When awake
    Normal: 4 Hz
    UI: 12 hz
    Game: 22.2 Hz
    Fastest: 38.40 Hz

* When asleep
    The phone does not send anything, whatever the mode I chose


HTC Desire
----------
* When awake
    Normal: 4.36 Hz
    UI: 11.9 hz
    Game: 23.3 Hz
    Fastest: 47.27 Hz

* When asleep
    The phone does not send anything, whatever the mode I chose

请注意,测试是使用部分唤醒锁执行的。没有它,Nexus S 在睡眠时根本不提供数据。

还有一个有用的智能手机列表,加速度计在睡眠时发送(或不发送)兼容数据:http://www.saltwebsites.com/2012/android-accelerometers-screen-off

【讨论】:

  • 您好 Romain,您能否给我一些指示,了解您如何在不同模式下测试不同手机的费率?
  • 嗨 Nisarg,我使用此应用程序测试设备频率:samoht.fr/tuto/accelerometers-frequency-on-android-with-code 幸运的是我的公司拥有几台设备,因此我可以测试我在回答中引用的设备。
  • 嗨 Romain,非常感谢...我会试试这个!!
【解决方案2】:

在采集数据时不要通过 USB 将手机连接到 PC,因为在采集过程中数据仅记录在 SD 卡中。当手机通过 USB 连接到 PC 时,无法将文件保存到 SD 卡中。

所以在收集数据时尝试断开 USB。

【讨论】:

  • 我已经测试了你的应用程序,确实频率约为 16-17 Hz。你是怎样做的 ?是通过检查 onSensorChanged() 方法中的值吗?如果是这样,它并不能解决我的问题。
  • 顺便说一句,用 cmets 代替答案回答我 ;)
  • 我们没有使用 SensorChanged() 方法。相反,我们通过代码(通过使用最快)获取最大样本数,并通过对应于每秒 15 个样本的算法执行下采样。希望这对你也有用。
  • 谢谢,但我不明白您如何 1) 获取最大样本数和 2) 在不获取加速度计值的情况下执行下采样(据我所知,只能这样做通过注册一个监听器并实现onSensorChanged())
  • 我们使用命令 SENSOR_DELAY_FASTEST 从加速度计获取最大采样率。然后 csv 文件以对应于 (1/15) 的间隔更新。简而言之,我们从加速度计中获取最大数量的样本,但只有部分样本被记录到 csv 文件中。样本在 (1/15) 秒后记录,而加速度计数据在 (1/90) 秒后获取。
【解决方案3】:

不幸的是,正如其他答案所建议的那样,您设置的延迟(或采样率)只是您的应用程序所需的最小值(对于系统)的建议,但是,这可能会根据正在运行的其他应用程序或您的设备进入而发生巨大变化在省电模式(关闭 CPU 等)。我能够获得较好的采样率的一种方法是记录来自服务的数据,使该服务成为前台服务并使用标志 PARTIAL_WAKE_LOCK 进行电源锁定。

我把代码放在这个要点中 https://gist.github.com/julian-ramos/6ee7ad8a74ee4b442530

该要点的代码比您需要的要多,但请注意接下来的两种方法

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
//        //Power management
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
        wl.acquire();
.....}

以上代码防止操作系统关闭CPU

现在让这个服务成为前台服务

NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(getApplicationContext())
                        .setContentTitle("Title")
                        .setContentText("hola")
                        .setContentIntent(viewPendingIntent);



        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

        not=notificationBuilder.build();
        notificationManager.notify(notificationId,not );
        startForeground(notificationId, not);

与普通服务不同,上述代码使服务成为操作系统的优先级。例如,前台服务的示例是音乐播放器。

使用此代码,即使在手表自动关闭屏幕后,我也能够获得所需的采样率。

【讨论】:

    【解决方案4】:

    检查这个应用程序 无论设备型号如何,我们都将采样频率固定在 14-15 https://market.android.com/details?id=singh.pal.ajeet&feature=search_result#?t=W251bGwsMSwxLDEsInNpbmdoLnBhbC5hamVldCJd 如需任何帮助,请发送电子邮件至 developer.virtuoid@gmail.com

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多