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