Android сенсорный тег азимута для компаса не работает (код Java)

Я использую Sensortag cc2541 в качестве датчика, подключенного к NEXUX 5 через Bluetooth. Таким образом, приведенный ниже код не имеет типичного 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);
            }
        });
    }

}

Функции onUpdateAccelerometer а также onUpdateMagnetometer переопределяют библиотеку сенсорных тегов. Это не проблема. Это то, что внутри проблемы.

также магнитометр и акселерометр получают значения каждые 100 мс.


Я пытаюсь сделать ПРОСТОЙ компас. Единственная разница между моим приложением и обычным компасом заключается в том, что я должен использовать SensorTag и его библиотеку. Я поставил код. Существуют такие методы, как onUpdateAccelerometer и т. Д.... эти методы говорят сами за себя. Point3D имеет x,y,z в качестве полей. градус и указатель - это просто текст для отображения и компаса изображения для поворота. Пожалуйста, взгляните на это простое и короткое приложение, которое я нашел в Интернете. https://www.sendspace.com/file/62ubk7 Я хочу что-то похожее на это, но с библиотеками моего SensorTag. Я положил то, что я сделал до сих пор, и я сделал много исследований. Если кто-то может помочь мне найти, где моя ошибка, я бы с удовольствием дал им награды.

0 ответов

Другие вопросы по тегам