Событие javascript «ориентация на устройство» — какие датчики он измеряет?

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

<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

Где, когда я поворачиваю устройство, числа меняются в зависимости от оси вращения. Я заметил, что значения «альфа» действительно зашумлены — они постоянно прыгают, даже если телефон находится на моем столе, в то время как два других остаются стабильными. Я понимаю, что альфа моя рубрика. Тогда мне любопытно, получает ли он значение «альфа» от компаса (у которого есть проблемы с шумом), а два других — от гироскопа?

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

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

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

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


person Joey    schedule 16.06.2012    source источник
comment
Вы читали dev.w3.org/geo/api/spec-source -ориентация.html   -  person mplungjan    schedule 16.06.2012
comment
Как получаются цифры: Вот как (Внимание, страшная математика впереди)   -  person Derek 朕會功夫    schedule 16.06.2012
comment
Эта спецификация W3 определенно полезна. Я думаю, я должен был знать, что существует. Я понимаю математику в нем, так как раньше изучал линейную алгебру.   -  person Joey    schedule 16.06.2012
comment
Я сделал все возможное, чтобы ответить на ваши вопросы. Есть одна вещь, которую я не получил. Не могли бы вы уточнить это: когда я меняю тон, по какой-то причине меняется и заголовок, даже если я на самом деле не меняю заголовок. Мне просто интересно, почему это так и как это можно исправить?   -  person Ali    schedule 16.06.2012


Ответы (3)


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

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

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

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

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

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

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

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

person Ali    schedule 16.06.2012
comment
Спасибо за объяснение. На самом деле я очень рад, что мне не нужно заново изобретать слияние сенсоров. Единственное, что я до сих пор не могу понять, это то, как ему удается указывать на истинный север, а не на магнитный север? Он не знает моей широты или долготы. - person Joey; 16.06.2012
comment
Хороший вопрос, я могу только догадываться. Вы правы, он может измерять только магнитный север. Однако угол между гравитацией и магнитным севером можно использовать для оценки широты. Кроме того, GPS или поставщик услуг могут сообщить устройству (довольно точное) географическое местоположение. Итак, я не знаю. С чего ты взял, что он знает истинный север? Насколько у вас отличается истинный и магнитный север? - person Ali; 16.06.2012
comment
Ну, это дает мне показания севера (альфа = 0 или 360) на несколько градусов по часовой стрелке от того места, где мое приложение компаса говорит мне, что это север. И я живу недалеко от Сиэтла, где разница между магнитным севером и истинным севером значительна, поскольку магнитный север находится над Аляской. - person Joey; 16.06.2012
comment
Интересный. Как я уже говорил, я могу только догадываться, но в принципе устройство могло узнать свое географическое положение от поставщика услуг. Это было доступно более 10 лет назад. Теперь у нас также есть GPS. Мой дядя жил в Сиэтле, и я посетил его в 1990 году :) - person Ali; 17.06.2012

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

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

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

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

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

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

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

var alpha = guestimate (= here 0);

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

person AlainD    schedule 30.12.2012
comment
Сглаживание более двух образцов может помочь? - person ErikE; 30.12.2012
comment
Суть экспоненциального сглаживания заключается в том, что вы сглаживаете сглаженное значение + новый образец, так что практически говоря, вы сглаживаете множество образцов. - person Ted Brownlow; 15.06.2020
comment
Да, это точный принцип экспоненциального сглаживания. Вы можете показать, что это средневзвешенное значение с весом w_t = s^t (отсюда и название экспоненциальное). Это среднее значение за всю историю со значениями, имеющими все меньший и меньший вес с течением времени. - person AlainD; 17.06.2020

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

person user3735965    schedule 12.06.2014