Я пытаюсь запрограммировать компас с Android с помощью ускорителя и датчика магнитного поля, теперь мне интересно, как получить правильный угол для моего компаса.
Я читаю значения акселерометра и датчика магнитного поля в "accele" и "magne" соответственно. Чтобы получить угол, я выполняю следующее:
float R[] = new float[9];
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, accele, magne);
if(success) {
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);
azimuth = orientation[0]; // contains azimuth, pitch, roll
....
Позже, я использую матрицу вращения, чтобы поместить мою иглу:
rotation.setRotate(azimuth, compass.getWidth() / 2, compass.getHeight() / 2);
canvas.drawBitmap(needle, rotation, null);
Теперь в документации на getOrientation говорится, что ориентация [0] должна быть вращением вокруг оси z. В документации для TYPE_ORIENTATION говорится, что "азимут, угол между магнитным северным направлением и осью y, вокруг оси z (от 0 до 359). 0 = север, 90 = восток, 180 = юг, 270 = запад".
Мой азимут, однако, не находится между 0 и 359, а около -2 до 2. Что такое азимут от getOrientation и как его преобразовать под углом?