1

Blackberryプログラムで利用可能なx/y /zG力値と「方向」データを理解しています。

私の質問は、回転/方向のRAW-DATAをどのように抽出できるかということです。(プログラマーが「Blackberry-Spirit-Level」アプリで使用するものなど)

「Orientation」APIは、ある程度の浮動小数点数ではなく、のORIENTATION_TOP_UPような定数を返すようです。ORIENTATION_RIGHT_UP

4

1 に答える 1

1

デバイスの向きの角度を直接取得する方法はないと思いますが、AccelerometerSensor言及したクラスから入手できる生データを使用してそれらを計算できます。

APIドキュメントに示されている例を見ると、生のX、Y、Z加速度データを取得できます。次に、三角法を使用して角度を計算します。たとえば、Z軸が真下を向いた状態で保持されている(移動していない、または地球に対して加速していない)デバイスは、重力による加速度であるGに等しいZ加速度値を与えます。

デバイスが他の角度で保持されている場合、その軸に沿った加速度値は、軸間の角度の正弦/余弦と、地球に向かう垂直線によって減少します。

このサンプルコードは、これらの角度のいくつかを取得する方法を示しています。

public void run()
{
    // open channel
    Channel rawDataChannel = AccelerometerSensor.openRawDataChannel( Application.getApplication() );
    // create raw sample vector with three components - X, Y, Z
    short[] xyz = new short[ 3 ];
    while( isRunning() ) {
        // read acceleration
        rawDataChannel.getLastAccelerationData( xyz );
        // process the acceleration
        process( xyz );
        // sleep for maintaining query rate
        try {
            Thread.sleep( 500 );
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    // close the channel to stop sensor query routine
    rawDataChannel.close();
}

private void process(short[] xyz) {

    short X = xyz[0];
    short Y = xyz[1];
    short Z = xyz[2];

    final double roll = MathUtilities.atan2(X, Z) * 180.0 / Math.PI;
    final double pitch = MathUtilities.atan2(Y, Math.sqrt(X*X + Z*Z)) * 180.0 / Math.PI;
    final double tilt = MathUtilities.acos(Z / Math.sqrt(X*X + Y*Y + Z*Z)) * 180.0 / Math.PI;

    UiApplication.getUiApplication().invokeLater(new Runnable() {
        public void run() {
            String output = "Angles are {" + roll + ", " + pitch + ", " + tilt + "}";
            textField.setText(output);
        }
    });
}

ロールピッチ、およびチルトの意味については、このドキュメントを参照してください。そこから数学が生まれました。

その他の問題

これは私が作成した本番アプリのものではないため、コードは徹底的にテストされていません。角度の符号が間違っているか、方程式が不安定であるか、またはそのようなものである可能性があります。

また、生の加速度計データを使用している場合は、キャリブレーション機能を実装する必要があります。あらゆる種類のスマートフォンレベルのアプリを実行すると、その方法の例が表示されます。したがって、上記で計算された結果は、キャリブレーション定数によって調整する必要があります。

最後に、生の加速度計データはノイズが多い可能性があるため、使用方法によっては、データのフィルタリング/平滑化も必要になる場合があります。

これは、出発点となることを目的としています。幸運を!

于 2012-12-01T06:59:48.073 に答える