Как найти расстояние смещения с помощью датчика акселерометра в смартфоне Android?

У меня есть один смартфон Android, содержащий датчик ускорения, датчик компаса и датчик гироскопа. Я хочу рассчитать расстояние смещения с помощью этих датчиков.

Я уже пробовал с основным методом, т.е.,

final velocity = initial velocity + ( acceleration * time taken)
distance = time taken * speed

Но я не могу получить правильное смещение. Каждый раз, когда я пытался получить одно и то же смещение, я получаю разные результаты.


person vishnu vigneshwar    schedule 29.09.2014    source источник
comment
Практически невозможно использовать датчики телефона для расчета перемещений. Вот связанный с этим вопрос: stackoverflow.com/questions/7829097 /   -  person JiTHiN    schedule 29.09.2014
comment
есть ли какие-либо другие специальные датчики для расчета расстояния. @РИХАН ДЖИТИН   -  person vishnu vigneshwar    schedule 29.09.2014
comment
Вы пробовали использовать Step Counter API. Это не совсем измерение смещения. Но проверьте, полезно ли это.   -  person JiTHiN    schedule 29.09.2014
comment
я уже пробовал API подсчета шагов для пешеходов, но теперь я пытаюсь внедрить его в свою колесную машину с дистанционным управлением, поэтому я не знал, что делать. @РИХАН ДЖИТИН   -  person vishnu vigneshwar    schedule 29.09.2014
comment
Телефон привязан к машине?   -  person JiTHiN    schedule 30.09.2014
comment
да, смартфон будет прикреплен к приборной панели автомобиля @rIHaN JiTHiN   -  person vishnu vigneshwar    schedule 14.11.2014


Ответы (2)


Уравнение, которое вы, возможно, ищете, выглядит следующим образом:

Velocity = (Gravity*Acceleration)/(2*PI*freq)

Правильное использование единиц для этого уравнения (метрики) будет

Gravity = mm/s squared = 9806.65
Acceleration = average acceleration over 1 second
Frequency = Hz (of the acceleration waveform over 1 second)

Например, если вы собрали данные со всех трех осей акселерометра, вы должны сделать следующее, чтобы получить форму волны ускорения (в необработанных значениях) для трехмерного пространства:

inputArray[i] = sqrt(X*X + Y*Y + Z*Z);

После того, как данные собраны, используйте только то количество выборок в осциллограмме, которое было бы собрано (если есть задержка в 1 мс между значениями, используйте только 1000 значений).

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

for(i = 0; i < 1000; i++){
    if(inputArray[i] < 0){
        inputArray[i] = inputArray[i] - (inputArray[i]*2);
    }
}

Как только вы получите среднее ускорение, вам нужно выполнить приведенное выше уравнение.

static double PI = 3.1415926535897932384626433832795;
static double gravity = 9806.65;

double Accel2mms(double accel, double freq){
    double result = 0;
    result = (gravity*accel)/(2*PI*freq);
    return result;
}

Примером может быть то, что среднее ускорение составляет 3 gs за 1 секунду при качании:

ПРИМЕЧАНИЕ. Этот расчет основан на синусоидальной форме сигнала, поэтому частота будет представлять физическое движение акселерометра, а не частоту дискретизации.

Accel2mms(3, 1);

3 gs за 1 секунду с частотой 1 (1 колебание в одном направлении) = 4682,330468 мм/с или 4,7 метра.

Надеюсь, это что-то вроде того, что вы ищете.

Имейте в виду, что этот расчет основан на синусоидальной форме волны, но адаптирован для расчета на основе одного движения (частота 1), поэтому он может быть не очень точным. Но по идее должно работать.

person Sam    schedule 07.10.2014
comment
Если частота равна 0,5, метод по-прежнему возвращает мм/с? - person Ajay; 01.07.2016
comment
Я пытаюсь сделать больше расчетов, хотя это будет менее точным. - person Ajay; 01.07.2016
comment
Как сказано в сообщении, результаты этого расчета теоретически будут правильными, но с частотой 1 точность входных данных должна быть точной, чтобы результат был точным. Это уравнение изначально использовалось для анализа сигналов акселерометра, и, таким образом, частота 0,5 в качестве входных данных привела бы к бесполезным результатам, поскольку период ускорения нельзя сократить вдвое, поскольку общее ускорение, испытываемое за этот период времени или расстояние, скорее всего, не было бы линейным. - person Sam; 01.07.2016
comment
Потрясающе спасибо! Но эквивалентна ли частота времени, затраченному на движение? - person Ajay; 01.07.2016
comment
Нет, совсем нет. Для вашего использования вы могли бы технически полностью исключить переменную freq из уравнения и иметь простую функцию преобразователя для любого случая ускорения. - person Sam; 01.07.2016

Как упоминал @rIHaNJiTHiN в комментариях, нет надежного способа получить смещение от датчиков 2-го и 3-го порядка (датчиков, которые измеряют производные смещения, такие как скорость и ускорение).

GPS — единственный способ измерения абсолютного смещения, хотя его точность и достоверность не так высоки на коротких расстояниях и коротких промежутках времени (а также в некоторых местах с плохим сигналом).

person Adi Shavit    schedule 29.09.2014