4

我正在使用Sensortag cc2541作为通过蓝牙连接到 NEXUX 5 的传感器。所以下面的代码没有典型的onSensorChanged,因为它没有使用手机本身的传感器。相反,它使用 sensortag 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我想要与此类似的东西,但使用我的 sensorTag 库。我已经完成了到目前为止所做的工作,并且做了很多研究。如果有人能帮我找出我的错误在哪里,我很乐意给他们赏金。

4

0 回答 0