2016-01-20 3 views
-1

У меня есть приложение для Android, которое требует наклона устройства для обработки в реальном времени. устройство наклонено на поверхностиОриентация устройства Android, расчет шага не согласован

Мне хотелось рассчитать угол, для этого я использовал project in github для вычисления значения высоты тона. но значения тангажа, возвращаемые этим методом, неточны при нескольких тестах. в значении основного тона в большинстве случаев имеется некоторый предел погрешности.

И такая же программа, протестированная на другом телефоне, показывает другое значение тангажа в том же положении (укладка телефонов на столе).

есть ли способ получить точные значения высоты тона на нескольких устройствах.

Я использовал s6 и один плюс 2 устройства.

+0

Используйте SensorListeners напрямую, используя 'onSensorChanged()' FYI: http://developer.android.com/reference/android/hardware/SensorListener.html – zIronManBox

ответ

0

Матрица вращения определяется путем применения рулона сначала, затем высоты тона и, наконец, вращения рыскания. Вы можете получить телефон в том же положении, если сначала применить подачу, затем сверните и снова, наконец, рыскание. Вот почему вы ожидаете определенный шаг, но вы получаете неточные значения.

Чтобы убедиться в этом, поиграйте с телефоном, введя его в определенную случайную позицию, применив угловые повороты в определенном порядке, а затем попытайтесь добраться до того же положения с помощью другого порядка вращения (хорошее положение, чтобы попробовать телефон в вертикальном положении, как держать его перед лицом и слегка наклоняться в сторону).

Большую часть времени вы будете использовать код как этот

int rotation = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation(); 
if(rotation == 0) // Default display rotation is portrait 
    SensorManager.remapCoordinateSystem(Rmat, SensorManager.AXIS_MINUS_X, SensorManager.AXIS_Y, R2); 
else // Default display rotation is landscape 
    SensorManager.remapCoordinateSystem(Rmat, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, R2); 

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

общественного абстрактного недействительными onSensorChanged (датчик INT, плавать [] значения) Добавлено в уровне 1

API Called, когда значения датчика изменились. Длина и содержание массива значений варьируются в зависимости от того, какой датчик контролируется. Подробные сведения о возможных типах датчиков см. В разделе SensorManager.

Определение используемой системы координат.

Ось X относится к горизонтальной оси экрана (малый край в портретном режиме, длинный край в ландшафтном режиме) и указывает вправо.

Ось Y относится к вертикальной оси экрана и указывает на верхнюю часть экрана (начало координат находится в нижнем левом углу).

Ось Z указывает на небо, когда устройство лежит на спине на столе.

ВАЖНОЕ ПРИМЕЧАНИЕ. Ось заменяется при изменении ориентации экрана устройства. Чтобы получить доступ к незанятым значениям, используйте индексы 3, 4 и 5 в значениях [].

SENSOR_ORIENTATION, SENSOR_ORIENTATION_RAW:

Все значения углов в градусах.

значения [0]: азимут, вращение вокруг оси Z (0 < = азимут < 360). 0 = Север, 90 = Восток, 180 = Юг, 270 = Запад

значения [1]: Шаг, вращение вокруг оси X (-180 < = шаг < = 180), с положительными значениями при перемещении оси z к оси у.

значения [2]: рулон, вращение вокруг оси Y (-90 < = рулон < = 90), с положительными значениями, когда ось z перемещается к оси x.

Обратите внимание, что это определение рыскания, высоты тона и валка отличается от традиционного определения, используемого в авиации, где ось X расположена вдоль длинной стороны плоскости (хвост к носу).

И разница между телефонами ожидается.