Как вы получаете высококачественные необработанные данные акселерометра и гироскопа с мобильного устройства в javascript? - PullRequest
0 голосов
/ 28 февраля 2019

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

Что происходит?Как записать высококачественные, бесшумные, необработанные данные с устройства с помощью 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;
    },
...