Javascript 'deviceorientation' event - какие датчики он измеряет?

Если у меня есть простая веб-страница и script, это выглядит так:

<body>
    <div id="alpha">a</div>
    <div id="beta">b</div>
    <div id="gamma">g</div>
</body>

<script>
window.addEventListener('deviceorientation', function(event) {
    var alpha = event.alpha;
    var beta = event.beta;
    var gamma = event.gamma;

    document.getElementById("alpha").innerHTML = alpha;
    document.getElementById("beta").innerHTML = beta;
    document.getElementById("gamma").innerHTML = gamma;

}, false);
</script>

Я могу открыть его в мобильном Firefox для Android, и он выведет 3 номера, которые выглядят следующим образом:

89.256125
3.109375
0.28125

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

Другая проблема заключается в изменении шага, по какой-то причине заголовок тоже меняется, даже если я фактически не изменю заголовок. Мне просто интересно, почему это так и как это можно исправить?

Кроме того, поскольку гироскоп измеряет скорость angular, я предполагаю, что этот прослушиватель событий интегрирует его автоматически - алгоритм интеграции так же хорош, как любой? Использует ли акселерометр для коррекции дрейфа?

В этом видеоролике google tech, с 15:00 до 19:00, спикер говорит об исправлении дрейфа, присущего гироскопу, с помощью ускорителя, а также для калибровки ориентации по отношению к гравитации: http://www.youtube.com/watch?v=C7JQ7Rpwn2k Как я могу это сделать?

Спасибо за любые идеи, которые могут быть у всех.

Ответ 1

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

Я заметил, что значения для "alpha" действительно шумные - они отскакивают без остановки, даже если телефон находится в состоянии покоя на моем столе, в то время как остальные два остаются устойчивыми.

Это общая проблема с углами Эйлера, постарайтесь избежать их, если сможете.

Кстати, Sensor Fusion на устройствах Android: революция в обработке видео, которую вы связываете, объясняет это в 38:25.

Кроме того, поскольку гироскоп измеряет скорость angular, я полагаю, что это прослушиватель событий интегрирует его автоматически - это интеграция алгоритм так хорош, как любой? Использует ли он акселерометр для коррекции дрейфовать?

Да, дрейф гироскопа корректируется с помощью акселерометра (и магнитометра, если есть). Это называется слиянием датчиков.

В этом видеообращении google tech, с 15:00 до 19:00, спикер беседует об исправлении дрейфа, присущего гироскопу, с помощью ускорителя, а также калибровки ориентации по отношению к гравитация: http://www.youtube.com/watch?v=C7JQ7Rpwn2k Как бы я пошел об этом?

Если у вас есть ориентация, то кто-то уже сделал все это для вас. Вам не нужно ничего делать.

Ответ 2

Все значения ориентации также очень шумны для меня. Shakily рука, углы Эйлера, магнитные помехи, ошибка производства,... Кто знает?

Я сделал небольшое экспоненциальное сглаживание. То есть я заменил флуктуирующее событие. Сглаженное значение, которое удобно назвать альфа:

alpha = event.alpha + s*(alpha - event.alpha), with 0 <= s <= 1;

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

  • Если s = 0, то сглаженное будет точно наблюдаемым значением и сглаживание не будет.
  • Если s = 1, альфа остается постоянной, что действительно является слишком эффективным сглаживанием.
  • В противном случае альфа находится где-то между наблюдаемым и сглаженным значением. Фактически, это (взвешенное) среднее значение между последним наблюдением и историей. Отсюда следует изменение значений с некоторым эффектом демпфирования.
  • Если s мало, то процесс близок к последнему наблюдению и быстро адаптируется к последним изменениям (а также к случайным колебаниям). Затухание мало.
  • Если s около 1, процесс более вязкий. Он лениво реагирует на случайные колебания (а также на изменение центральной тенденции). Затухание велико.
  • Не пытайтесь выйти за пределы диапазона 0..1, так как это приводит к контуру обратной связи, и вскоре альфа начинает расходиться с большими и большими колебаниями.

  • Я использовал s = 0,25, после тестирования, что не было существенной разницы для s между 0,1 и 0,3.

Важно: При использовании этого метода не забудьте инициализировать альфу, вне функции addEventListener:

var alpha = guestimate (= here 0);

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

Ответ 3

Используйте направленную косинусную матрицу или фильтр калмана. Вы можете использовать акселерометр для построения графика или гироскопа или их комбинации. Дрейф может быть рассчитан с небольшим количеством машинного обучения. Я думаю, что motion fusion является частью пакета калибровки инструментов Texas. Я могу ошибаться. Но его не трудно проверить. умножьте 3 вращательные матрицы, будьте великими.. http://www.itu.dk/stud/speciale/segmentering/Matlab6p5/help/toolbox/aeroblks/euleranglestodirectioncosinematrix.html