Как рассчитать смещение на магнитный север с помощью Android? - PullRequest
0 голосов
/ 16 марта 2019

Я ищу способ рассчитать смещение на север.Я могу заставить его работать, когда устройство находится в альбомной или портретной ориентации, но с другой ориентацией оно отправляет неправильное чтение.Вы сделали что-то подобное?В настоящее время я использую данные от акселерометра и магнитометра, но я думаю, что с формулой что-то не так.

public class Compass {

    private SensorManager mSensorManager;
    private Sensor accelerometer;
    private Sensor magnetometer;
    private CallbackContext callbackContext;
    private JSONObject data = new JSONObject();

    @Override
    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
        super.initialize(cordova, webView);
        mSensorManager = (SensorManager) cordova.getActivity().getSystemService(Context.SENSOR_SERVICE);
        accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        magnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);        
    }

    @Override
    public void onDestroy() {
        mSensorManager.unregisterListener(listener);
    }

    private SensorEventListener listener = new SensorEventListener() {

        float [] gravity;
        float [] geomagnetic;

        public void onSensorChanged(SensorEvent event) {

            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                gravity = event.values;
                try {
                    data.put("acc_x", event.values[0]);
                    data.put("acc_y", event.values[1]);
                    data.put("acc_z", event.values[2]);
                } catch(JSONException e) {}
            }

            if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
                geomagnetic = event.values;
                try {
                    data.put("mag_x", event.values[0]);
                    data.put("mag_y", event.values[1]);
                    data.put("mag_z", event.values[2]);
                } catch(JSONException e) {}
            }

            if (gravity != null && geomagnetic != null) {

                float[] rotationMatrix = new float[9];
                float[] inclinationMatrix = new float[9];
                float[] adjustedRotationMatrix = new float[9];

                if (SensorManager.getRotationMatrix(rotationMatrix, inclinationMatrix, gravity, geomagnetic)) {

                    float[] orientation = new float[3];
                    SensorManager.getOrientation(rotationMatrix, orientation);
                    float degree = (float) Math.toDegrees(orientation[0]);

                    SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, adjustedRotationMatrix);
                    SensorManager.getOrientation(adjustedRotationMatrix, orientation);
                    float remapped = (float) Math.toDegrees(orientation[0]);

                    try { 
                        data.put("north_portrait", degree);
                        data.put("north_landscape", remapped);
                    } catch(JSONException e) {}

                }
             }
        }

        public void onAccuracyChanged(Sensor sensor, int accuracy) {}

    };

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...