1

Я пытаюсь получить рывку устройства Android, выраженного в углах эйлера.Получить угол поворота Эйлера на устройстве Android

Чтобы быть ясным, я не хочу «Азимут» (который является углом к ​​магнитному северу). Мне нужно вращение оси «z» устройства андроида, как показано на этом рисунке.

enter image description here

Это (ИМХО) должна быть ось используется в некоторых автомобильных игр, чтобы определить количество рулевого управления.

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

Может ли кто-нибудь указать мне в правильном направлении?

+0

Этот звук, подобный гироскопу, - http://developer.android.com/guide/topics/sensors/sensors_motion.html#sensors-motion-rotate. Но я не знаю, каков фактический вопрос. –

+0

Итак, на картинке поворот на 90 градусов повернет телефон от портрета к пейзажу. Это то, что вы хотите? Если так, то я уже ответил, что на http://stackoverflow.com/questions/11175599/how-to-measure-the-tilt-of-the-phone-in-xy-plane-using-accelerometer-in-android/ 15149421 # 15149421 с использованием только акселерометра. –

+0

Я отправлю ответ, который позволит вам определить вращение оси z независимо от положения устройства завтра. В то же время вы должны прочитать мой ответ по адресу http://stackoverflow.com/questions/32372847/android-algorithms-for-sensormanager-getrotationmatrix-and-sensormanager-getori/35390001#35390001, чтобы получить подробный ответ на то, что getOrientation делает так, что вы можете понять ответ, который я опубликую. –

ответ

1

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

Плоская здесь означает, что высота тона не превышает 25 или более 155 градусов, а не в противном случае.
Когда устройство переходит от плоского к неровному, и наоборот, в пользовательском интерфейсе, вероятно, есть некоторые противоречия.

Зарегистрируйтесь для TYPE_GRAVITY и TYPE_MAGNETIC_FIELD (необходимо для ремонта) и выполните расчет ниже.

  • getRotationMatrix

    а [0] а [1] [2]
    а [3] [4] [5]
    а [6] [7] [ 8]

  • Вычислить pitch = Math.asin(-R[7])

  • Использование pitch для определения плоскостности устройства (я думаю, вы можете использовать менее 45 и более 135 для определения плоскостности, вы просто должны Эксперимент, чтобы увидеть, если значение azymuth правильно)
  • , если устройство не является плоским вращение Math.atan2 (а [6], а [7])

  • Если устройство является плоским, чтобы начать с получить начальный azymuth = Math.atan2(R[1], R[4]), а затем принять разницу с последующим azymuths, чтобы получить поворот.

  • Если переход устройства из плоского в неровный, не должно быть никаких проблем, то поворот - это просто поворот, который не является плоским.

  • Если устройство переходит из не плоского в плоское, вам необходимо получить начальный номер azymuth. Этот начальный номер azymuth может быть установлен в направлении задней камеры Math.atan2 (-a [2], -a [5]), если устройство находится в вертикальном положении, и только вращение вокруг оси z, то это направление не должно меняться. При повторности это, вероятно, изменится на несколько градусов, поэтому вам нужно будет усреднить.

Все математика для Math.atan2 за исключением (а [6], а [7]) объясняются в Android: Algorithms for SensorManager.getRotationMatrix and SensorManager.getOrientation()
Итак, позвольте мне дать объяснение найти вращение, когда устройство не является плоским.

Как указано в приведенной выше ссылке, вы должны указать фиксированный вектор и вектор, который меняется, который вы хотите рассчитать угол между ними. В этом случае вектор, который изменяется, является вектором, лежащим в устройстве y-оси, а фиксированный вектор является проекцией вектора силы тяжести в плоскость xy устройства. В матрице вращения над последней строкой находится нормализованный вектор силы тяжести в координате устройства, поэтому проекция на плоскость xy устройства (a [6], a [7]). Теперь простая тригонометрия показывает, что Math.atan2 (a [6], a [7]) - это угол между осью устройства y и проекцией силы тяжести. (Нарисуйте картинку, если вы ее не увидите).

+0

Здравствуйте, @Hoean Nguyen, Спасибо за ваши усилия. Я очень ценю это. Я попытался понять как это, так и ответ на ссылку, но мне может быть недостает некоторого математического фона (или отсутствие изображений может сдержать меня). Я хотел бы узнать больше, как все работает, но тем временем я мог бы решить это, выполнив Math.atan2 (gX, gY), где gX - значения [0] и gY значения [1] TYPE_GRAVITY. –

Смежные вопросы