私は現在、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
私の問題は、これらのコードを使用して完璧な設計ドキュメントを作成できないことです。説明が必要です
スケール値はどのように計算されますか? ここではどこからともなくランダムな定数が使用されているように見えます
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)));
これらのmLimit値はどのように計算されますか?
もし (diff > mLimit)
インテルのコードの発言
v = vSum / 2300;
しかしAndroidコードの発言
v = vSum / 3;
ベクトル合計の計算は、両方のコードで似ています。ここで実際に続いた式はどれですか?
これらのことをまっすぐにするために誰か助けてください