16

3D空間で携帯電話のx、y、z座標を読み取る必要のあるAndroidアプリケーションを開発します。

簡単なコードを書いて、デバイスでテストしたいと思います。

デバイスとエミュレーターの両方でジンジャーブレッドを使用しています。

4

2 に答える 2

17

加速度から位置を取得するには、それを2回統合する必要があります。

加速度を積分すると速度が得られ、速度を積分すると位置が得られます。

ノイズを統合するとドリフトが発生し、ドリフトを統合すると大量のドリフトが発生することに注意してください。Androidセンサーは非常に多くのノイズを生成する傾向があります。

Galaxy S3では、Googleの線形加速度計複合センサーを使用して、5秒で0.02mまでの位置のドリフトを取得することができました。

ジンジャーブレッドに線形加速度センサーを使用できるかどうかはわかりません。できない場合は、統合する前に重力を取り除く必要があります。

まだ読んでいない場合は、ここですべてを読んでください http://developer.android.com/guide/topics/sensors/sensors_motion.html

アンドロイドのモーションセンサーについての素晴らしい話

http://www.youtube.com/watch?v=C7JQ7Rpwn2k

コード:

static final float NS2S = 1.0f / 1000000000.0f;
float[] last_values = null;
float[] velocity = null;
float[] position = null;
long last_timestamp = 0;

@Override
public void onSensorChanged(SensorEvent event) {
    if(last_values != null){
        float dt = (event.timestamp - last_timestamp) * NS2S;

        for(int index = 0; index < 3;++index){
            velocity[index] += (event.values[index] + last_values[index])/2 * dt;
            position[index] += velocity[index] * dt;
        }
    }
    else{
        last_values = new float[3];
        velocity = new float[3];
        position = new float[3];
        velocity[0] = velocity[1] = velocity[2] = 0f;
        position[0] = position[1] = position[2] = 0f;
    }
    System.arraycopy(event.values, 0, last_values, 0, 3);
    last_timestamp = event.timestamp;
}

これで、3D空間での位置がわかりました。サンプリングを開始するとき、電話は静止していると想定していることに注意してください。

あなたが重力を取り除かなければ、それはすぐに非常に遠くなるでしょう。

これはデータをまったくフィルタリングせず、多くのドリフトを生成します。

于 2012-06-27T15:44:33.653 に答える
8

このチュートリアルを読んでください。

上記のチュートリアルの簡単な要約::

まず、 SensorManagerSensorのインスタンスを取得します。
内部onCreate()::

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);

この後、座標を取得するためにオーバーライドonSensorChanged(SensorEvent event)して使用します。event.values[]

@Override
public void onSensorChanged(SensorEvent event) {
    float x = event.values[0];
    float y = event.values[1];
    float z = event.values[2];
}
于 2012-06-17T03:37:10.443 に答える