2

Web を検索しても関連する回答が見つからなかったため、加速度計を使用した Android デバイスの軸周りの360 度回転の検出に関する質問を投稿しています。たとえば、ランドスケープ モードでの y 軸の周り: 開始位置で y 値が 0 であるとします (デバイスは地面に対して平らです)。電話機を前方に 90 度回転させた場合、前方y = -10に 180 度傾けるとy = 0、 で 270 度、y = +10で 360 度になりy = 0ます。では、事前に指定された方向にのみデバイスが完全に回転したことを検出するには、コードはどのようになるでしょうか?

@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
    // assign directions
    x = event.values[1];
    y = event.values[0];
    z = event.values[2];

        ???
    }
}

編集: getRotationMatrix() メソッドを使用して成功しました。

private float[] r = new float[9];
private float[] i = new float[9];
private float[] v = new float[3];

private float[] accValues = new float[3];
private float[] geoValues = new float[3];

private int azimuth, pitch, roll;

@Override
public void onSensorChanged(SensorEvent event) {

    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        accValues = event.values.clone();
    }

    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
        geoValues = event.values.clone();
    }

    boolean success = SensorManager.getRotationMatrix(r, i, accValues,
        geoValues);

    if (success) {
        SensorManager.getOrientation(r, v);

        azimuth = v[0] * (180 / Math.PI);
        pitch = v[1] * (180 / Math.PI);
        roll = v[2] * (180 / Math.PI);
    }
}
4

1 に答える 1

1

次のようなものを試すことができます:

`
@オーバーライド

public void onSensorChanged(SensorEvent event) {

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

x = event.values[1];
y = event.values[0];
z = event.values[2];

if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
x1 = event.values[1];
y1 = event.values[0];
z1 = event.values[2];

}

}`

このコードにより、加速度と方向の変化を検出できるはずです。したがって、方向の変化があったために加速度計の Y 値が 0 から 0 に戻ったとしても、完全な回転がありました (ただし、まだクリーニングする必要があります)。このコードは、電話がある方向に 180° 移動してから 180° 戻るケースを排除するためのものです (電話をもう一度上下に回します))。

好奇心から、電話を 360° 回転させる必要があるのはなぜですか? スマートフォンを 360°回転させてみましたが、簡単にはできません。

于 2013-07-02T08:59:26.820 に答える