Я получаю данные «низкого качества» с датчиков движения / ориентации мобильного устройства, и я не понимаю, почему или как получить данные хорошего качества.Я предполагаю, что у многих других есть такая же проблема, и, возможно, они не понимают, что это так, если они не очень внимательно изучили свои данные.
Что происходит?Как записать высококачественные, бесшумные, необработанные данные с устройства с помощью javascript так же, как это делают другие приложения, доступные в магазине приложений?Разве JS API не предоставляет лучшие данные / мне нужно по какой-то причине использовать нативный код для доступа к лучшим данным?Не уверен, для чего были написаны другие приложения. Это не просто проблема частоты дискретизации / интервала (хотя это еще одна проблема ... она дискретизируется неравномерно), это проблема шума в самих точках данных.
Я могу получить данные, которые соответствуют движению и ориентации, но, похоже, они имеют высокий уровень шума / низкое качество и / или для них была проведена какая-то бесполезная предварительная обработка.Я не очень понимаю, что происходит.
Я потратил довольно много времени на чтение различной информации в Интернете, например:
https://developers.google.com/web/updates/2017/09/sensors-for-the-web
https://developer.mozilla.org/en-US/docs/Web/API/Detecting_device_orientation
Как получить доступ к данным акселерометра / гироскопа из Javascript?
Я также пробовал различные библиотеки npm / github.
Однако этоЯсно, что я все еще не могу получить необходимые данные с устройства.
Спустя довольно много времени, я узнал, что event.acceleration.x на самом деле НЕ ускорение, а какое-топлохо документированной высокочастотной фильтрованной версии «accelerationInc включаяGravity», которая является более необработанным измерением от акселерометра.На практике это означает, что если вы пытаетесь измерить относительно медленные движения, они будут в значительной степени или полностью отфильтрованы из сигнала, представляемого event.acceleration.x.Используемый фильтр верхних частот на самом деле не подходит для моих целей, и я еще не нашел документацию о фактических параметрах фильтра ... подразумевается, что это просто "ускорение без гравитации", что не правильно.
Еще большая проблема в том, что данные, которые я получаю, «шумные».Я знаю, что это не ограничивается самим датчиком устройства, потому что я использовал несколько сторонних приложений для записи акселерометра (например, Accelerometer Meter от keuwlsoft) и данные, которые они производят, выглядят «хорошо» ... это означает, что они явномалошумные представления фактического движения устройства.Данные, которые я записываю с использованием приведенного ниже кода, которые я записал в файл, представляют собой гораздо более шумные версии похожих данных.
Полагаю, я мог бы опубликовать снимки экрана со следами данных, если это было бы полезно, хотя я и неНа самом деле не знаю, как публиковать изображения на SO.
Кстати, это кроссплатформенное приложение для мобильных устройств / cordova ... в настоящее время записывает данные на Android Pixel 3 с помощью cordova.
Спасибо за вашу помощь.
Ниже приведено ядро кода, который я сейчас использую:
window.addEventListener("devicemotion", Motion.handleMotionEvent, true);
Motion.handleMotionEvent= function(event) {
val = Motion.get(event,'x',false);
}
Motion.get: function(event,type,testing) {
if (testing) return Math.random();
var result;
switch(type) {
case "x": result = event.acceleration.x;break;
case "y": result = event.acceleration.y;break;
case "z": result = event.acceleration.z;break;
case "xg": result = event.accelerationIncludingGravity.x;break;
case "yg": result = event.accelerationIncludingGravity.y;break;
case "zg": result = event.accelerationIncludingGravity.z;break;
case "alpha": result = event.rotationRate.alpha;break;
case "beta": result = event.rotationRate.beta;break;
case "gamma": result = event.rotationRate.gamma;break;
default: console.log('Invalid Motion.get');
}
return result;
},