Подшипник компаса Android

Я пытаюсь получить направление компаса в градусах (т.е. 0-360), используя следующий метод:

float[] mGravity;
float[] mGeomagnetic;
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
        mGravity = event.values;
    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
        mGeomagnetic = event.values;
    if (mGravity != null && mGeomagnetic != null) {
        float R[] = new float[9];
        float I[] = new float[9];
        boolean success = SensorManager.getRotationMatrix(R, I, mGravity,
                mGeomagnetic);
        if (success) {
            float orientation[] = new float[3];
            SensorManager.getOrientation(R, orientation);
            float azimut = orientation[0];
            bearing.setText("Bearing: "+ azimut);
        }
    }
}

Значение азимута (т.е. orientation[0]) должно быть 0‹=азимут‹360, но я получаю только значения от -3 до 3, когда поворачиваю свое устройство. Может кто-нибудь, пожалуйста, скажите мне, в чем может быть проблема, пожалуйста?


person duncanportelli    schedule 01.03.2013    source источник


Ответы (2)


Значения в радианах, вы должны преобразовать в градусы дуги

int azimut = (int) Math.round(Math.toDegrees(orientation[0]));
person Hoan Nguyen    schedule 01.03.2013
comment
Большое спасибо @Hoan Nguyen - person duncanportelli; 01.03.2013
comment
ориентация [0], кажется, только обеспечивает разницу с момента последнего чтения. Я преобразовал свое значение в градусы, но значения все еще очень малы. Есть ли способ получить фактический пеленг устройства (0–360 градусов) за одно чтение? - person Andrew Kelly; 20.01.2015
comment
Это не разница, это фактический азимут относительно магнитного севера. Что-то не так с вашим кодом, если ваше чтение всегда имеет небольшое значение. - person Hoan Nguyen; 21.01.2015
comment
Выяснилось, что мой компас не был откалиброван, после выполнения движения в виде восьмерки (по запросу другого скачанного мной приложения компаса, которое также отображало неверные значения), значения, которые я получаю, теперь соответствуют моим ожиданиям. - person Andrew Kelly; 21.01.2015

Это правда, что это в радианах. Спасибо, Хоан. Я добавил некоторую логику, чтобы получить пеленг в градусах от 0 до 360, потому что, если бы я преобразовал его только в градусы, я бы получил значения от -180 до 180.

float azimuthInRadians = orientation[0];
float azimuthInDegress = (float)Math.toDegrees(azimuthInRadians)+360)%360;
person duncanportelli    schedule 01.03.2013