ネクサス6PのハードウェアセンサーのAndroidのサンプリングレートの変動

ティムL:

私は研究のために、Androidアプリを開発している、と私は4つのネクサス6Pの最新のデバイスすべて持っているので、IM等加速度計、ジャイロスコープ、バロメーターのようないくつかのセンサデータを読み込む工場出荷時のイメージよりも、インストールされていない他のアプリで設定したばかりとはプリインストールされているいったん標準。(加速度計の最大の可能なレートが400Hzのであるので)105 Hzの加速度計ので、例Iのレコードの半分の時間のために、携帯電話の一つは常に遅れているということである今、発生する問題は、だから、念私プレゼントしますサンプルの量について少なくとも私は100Hzのために期待される結果は次のとおりです。

ハーフのための100Hzでの時間をSmapling - > 180000のサンプル

105Hzで半分時間をSmapling - > 189000のサンプル

(これは今加速度計のための単なる一例であるが、各デバイス上のすべての他のセンサでも同じです。デバイス2は、他のすべてのセンサーで同じ悪い結果を取得しながら、だから、デバイスは、他のsenorsに同じ良い結果について取得1,3,4 )。

  • デバイス1:180000のサンプル
  • デバイス2:177273のサンプル< - 遅れている電話
  • デバイス3:181800のサンプル
  • デバイス4:179412のサンプル

問題は、私はほとんど3000サンプルを欠けているデバイス番号2(私はこれがハイレベルで泣いている知っている)であり、この問題についての私の推測では、おそらくハードウェア関連であるということです。だから それが問題(私は、あまりにも、このためのサンプルを提供することができたい場合)400Hzのでそれらを読むことが期待通りに動作も読んでイムどのように多くのセンサーがないので、私はおそらく除外することができ、パフォーマンスの問題かもしれないと。私はまた、最速になるよう400Hzのにサンプリングレートを設定し、同じ結果につながったタイムスタンプに応じて録音を撮ってみました。

だから、念のために私はセンサーのリスナーを登録する方法を提供します:

protected void onCreate(Bundle savedInstanceState){
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    unaccDataSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER_UNCALIBRATED);
}
....
private void Start(){
    sensorManager.registerListener(unaccDataListener, unaccDataSensor, 10000);
}

それでは、私が欲しいが、私はそう上記期待すべきことに、サンプルの量については、少なくとも取得することです少しだけ下に何の問題とも許容されません。だから、誰もが、私は試みることができるか、私は本当に感謝するという問題が発生する可能性がありますどのような他に何についての考えを持っている場合。

何かが欠けているか、私はイム申し訳ありません悪い方法で何かを説明し、私はそれを修正するために全力をしようとされた場合、これはので、私の最初の投稿です。

ジョーディーウィックス:

アンドロイドで私の仕事は、多くのセンサ、と私はハードウェアが可変の品質であることを伝えることができます。私は携帯電話全体で一貫している結果が必要な場合、私は通常、フィルタを使用します。

// Filter to remove readings that come too often
        if (TS < LAST_TS_ACC + 100) {
            //Log.d(TAG, "onSensorChanged: skipping");
            return;
        }

しかし、この手段は、あなただけの最小公分母に一致するように電話機を設定することができます。それが助け場合、私は25Hzを超える任意の多くを得ることはほとんどのアプリケーションでも、医療のもののためにやり過ぎであることがわかります。

また、ヘルプには、必ずいずれかのファイルには、スレッドをオフに行われているの書き込みを作ることができ、バッチで、ファイルへの書き込みなどの高価な操作です。

accelBuffer = new StringBuilder();
accelBuffer.append(LAST_TS_ACC + "," + event.values[0] + "," + event.values[1] + "," + event.values[2] + "\n");

if((accelBuffer.length() > 500000) && (writingAccelToFile == false) ){
                writingAccelToFile = true;

                AccelFile = new File(path2 +"/Acc/"  + LAST_TS_ACC +"_Service.txt");
                Log.d(TAG, "onSensorChanged: accelfile created at : " + AccelFile.getPath());

                File parent = AccelFile.getParentFile();
                if(!parent.exists() && !parent.mkdirs()){
                    throw new IllegalStateException("Couldn't create directory: " + parent);
                }

                //Try threading to take of UI thread

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //Log.d(TAG, "onSensorChanged: in accelbuffer");
                        // Log.d(TAG, "run: in runnable");
                        //writeToStream(accelBuffer);
                        writeStringBuilderToFile(AccelFile, accelBuffer);
                        accelBuffer.setLength(0);
                        writingAccelToFile = false;

                    }
                }).start();

            }

上記のすべてを実行すると、私は合理的に良い結果を持っているが、それは、ハードウェアの違いによる完璧ではありません。

幸運を!

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=192455&siteId=1