4

Bluetooth経由でNEXUX 5に接続されたセンサーとしてSensortag cc2541を使用しています。onSensorChangedしたがって、電話自体のセンサーを使用していないため、以下のコードには典型的なものはありません。代わりに、センサータグ cc2541 のメソッドを使用します。

私は簡単なコンパスを作りたいと思い、いくつかの調査を行い、次のことを思いつきました。

私がインターネットで読んだことから、方位角はコンパスの方向 (Z 周り) である必要があります。しかし、正しい読みが得られません。

センサーの向きaccelerometerを示す写真も含めました。magnetometer

加速度計の向き

加速度計

磁力計の向き

磁力計

コード

public class ManagerListener extends SensorTagLoggerListener implements SensorTagListener {

    private float[] gravityData = new float[3];
    private float[] geomagneticData  = new float[3];
    private double azimuth,pitch,roll;

    @Override
    public void onUpdateAccelerometer(SensorTagManager mgr, Point3D acc) {
        super.onUpdateAccelerometer(mgr, acc);

        gravityData[0] = (float)acc.x;
        gravityData[1] = (float)acc.y;
        gravityData[2] = (float)acc.z;

    }

    @Override
    public void onUpdateMagnetometer(SensorTagManager mgr, Point3D b) {
        super.onUpdateMagnetometer(mgr, b);

        geomagneticData[0] = (float) -b.y;
        geomagneticData[1] = (float) b.x;
        geomagneticData[2] = (float) -b.z;

        float I[] = new float[9];
        float R[] = new float[9];
        boolean success = SensorManager.getRotationMatrix(R, I, gravityData, geomagneticData);

        if (success)
        {
            float orientationMatrix[] = new float[3];
            SensorManager.getOrientation(R, orientationMatrix);
            azimuth = Math.toDegrees(orientationMatrix[0]);
            pitch = Math.toDegrees(orientationMatrix[1]);
            roll = Math.toDegrees(orientationMatrix[2]);
        }

        final float rotation = (float) azimuth;
        final String xyz = "Azimuth:\t" + String.valueOf(Math.round(azimuth)) + 
                           "\nPitch:\t" + String.valueOf(Math.round(pitch)) + 
                           "\nRoll:\t" + String.valueOf(Math.round(roll));

        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                degree.setText(xyz);
                pointer.setRotation(rotation);
            }
        });
    }

}

関数onUpdateAccelerometeronUpdateMagnetometerは、センサー タグ ライブラリのオーバーライドです。それは問題ではありません。問題の中身です。

また、磁力計と加速度計の両方が 100 ミリ秒ごとに値を取得します。


私は単純なコンパスをやろうとしています。私のアプリと通常のコンパスの唯一の違いは、SensorTag とそのライブラリを使用する必要があることです。コードを載せました。onUpdateAccelerometer などのメソッドがあります...これらのメソッドは一目瞭然です。Point3D には、フィールドとして x、y、z があります。度とポインターは、表示するテキストと回転するコンパス画像です。インターネットで見つけたこのシンプルで短いアプリを見てください https://www.sendspace.com/file/62ubk7これに似たものが欲しいのですが、センサータグのライブラリが必要です。私はこれまでに行ったことをまとめ、多くの調査を行いました。誰かが私の間違いを見つけるのを手伝ってくれたら、喜んで報奨金をあげます。

4

0 に答える 0