Я ищу решение, которое заменяет устаревший датчик Android Sensor.TYPE_ORIENTATION
.
Наиболее распространенное решение - объединить Sensor.TYPE_ACCELEROMETER
и Sensor.TYPE_MAGNETIC_FIELD
, а затем вычислить матрицу вращения с помощью _ 4_ и получить углы Эйлера с помощью _ 5_. Другое известное решение - использовать Sensor.TYPE_ROTATION_VECTOR
, что также приводит к матрице вращения и углам Эйлера с помощью SensorManager#getOrientation
К сожалению, при повороте мобильного устройства они ведут себя совершенно иначе, чем TYPE_ORIENTATION
. Попробуйте оба типа, когда ваш телефон лежит на столе, а затем поверните его вверх (наклон) на 90 ° (теперь экран обращен прямо к вам). Вычисленные углы Эйлера азимута и крена становятся действительно необычными (причина того, что называется проблемой Gimbal lock) в то время как значения градусов, полученные с помощью TYPE_ORIENTATION
, довольно стабильны (не точны, но вполне приемлемы). Каждое значение (рыскание, тангаж и крен) TYPE_ORIENTATION
кажется своего рода "прогнозируемым" градусом без проблемы с блокировкой карданного подвеса.
Как можно получить аналогичные градусы (для рыскания, крена и тангажа) без использования устаревшего датчика TYPE_ORIENTATION
(возможно, из матрицы вращения)? Как алгоритм TYPE_ORIENTATION
делает это внутри?