0

私は現在、LSM9DS0センサーを搭載したIntelデバイスの歩数計アプリケーションに取り組んでいます。私の要件は、ネイティブ アプリケーション ガイドで公開されているアプリケーション コード インテルを使用して歩数計を開発することです。

このコードは、以下の共有 pdf のセクション 6.1.4 にあります。

http://download.intel.com/support/edison/sb/edison_nag_331192003.pdf

実際のところ、似たようなコードをいくつか見つけましたが、Androidバージョン

public StepDetector() {
    int h = 480; // TODO: remove this constant
    mYOffset = h * 0.5f;
    mScale[0] = - (h * 0.5f * (1.0f / (SensorManager.STANDARD_GRAVITY * 2)));
    mScale[1] = - (h * 0.5f * (1.0f / (SensorManager.MAGNETIC_FIELD_EARTH_MAX)));
}

public void setSensitivity(float sensitivity) {
    mLimit = sensitivity; // 1.97  2.96  4.44  6.66  10.00  15.00  22.50  33.75  50.62
}

public void addStepListener(StepListener sl) {
    mStepListeners.add(sl);
}

//public void onSensorChanged(int sensor, float[] values) {
public void onSensorChanged(SensorEvent event) {
    Sensor sensor = event.sensor; 
    synchronized (this) {
        if (sensor.getType() == Sensor.TYPE_ORIENTATION) {
        }
        else {
            int j = (sensor.getType() == Sensor.TYPE_ACCELEROMETER) ? 1 : 0;
            if (j == 1) {
                float vSum = 0;
                for (int i=0 ; i<3 ; i++) {
                    final float v = mYOffset + event.values[i] * mScale[j];
                    vSum += v;
                }
                int k = 0;
                float v = vSum / 3;

                float direction = (v > mLastValues[k] ? 1 : (v < mLastValues[k] ? -1 : 0));
                if (direction == - mLastDirections[k]) {
                    // Direction changed
                    int extType = (direction > 0 ? 0 : 1); // minumum or maximum?
                    mLastExtremes[extType][k] = mLastValues[k];
                    float diff = Math.abs(mLastExtremes[extType][k] - mLastExtremes[1 - extType][k]);

                    if (diff > mLimit) {

                        boolean isAlmostAsLargeAsPrevious = diff > (mLastDiff[k]*2/3);
                        boolean isPreviousLargeEnough = mLastDiff[k] > (diff/3);
                        boolean isNotContra = (mLastMatch != 1 - extType);

                        if (isAlmostAsLargeAsPrevious && isPreviousLargeEnough && isNotContra) {
                            Log.i(TAG, "step");
                            for (StepListener stepListener : mStepListeners) {
                                stepListener.onStep();
                            }
                            mLastMatch = extType;
                        }
                        else {
                            mLastMatch = -1;
                        }
                    }
                    mLastDiff[k] = diff;
                }
                mLastDirections[k] = direction;
                mLastValues[k] = v;
            }
        }
    }
}

Github で利用可能な完全な Android ソース コード

https://github.com/bagilevi/android-pedometer

私の問題は、これらのコードを使用して完璧な設計ドキュメントを作成できないことです。説明が必要です

  1. スケール値はどのように計算されますか? ここではどこからともなくランダムな定数が使用されているように見えます

    int h = 480; // TODO: remove this constant
    mScale[0] = - (h * 0.5f * (1.0f / (SensorManager.STANDARD_GRAVITY * 2)));
    mScale[1] = - (h * 0.5f * (1.0f / (SensorManager.MAGNETIC_FIELD_EARTH_MAX)));
    
  2. これらのmLimit値はどのように計算されますか?

    もし (diff > mLimit)

  3. インテルのコードの発言

    v = vSum / 2300;

    しかしAndroidコードの発言

    v = vSum / 3;

  4. ベクトル合計の計算は、両方のコードで似ています。ここで実際に続いた式はどれですか?

これらのことをまっすぐにするために誰か助けてください

4

1 に答える 1

0

その仕組みはただの試行錯誤のアルゴリズムだと分かった

これらの定数値は、環境、デバイス、デバイスのパッキング、加速度計の感度などに基づいて変更される場合があります。

于 2015-09-16T05:18:33.060 に答える