2015-07-09 4 views
0

Если у вас есть список значений образцов в координатах с акселерометра.Как вычислить расстояние с помощью образцов с акселерометра смартфона?

accel[0]= {accelX0, accelY0, accelZ0} 
... 
accel[t]= {accelXt, accelYt, accelZt} 
... 
accel[tMax] = {accelXmax, accelYmax, accelZmax} 

где t - временная метка. Если пользователь совершает короткое и быстрое движение в направлении, есть ли способ понять, в каком направлении он занят, и сколько расстояния было покрыто между 0 и tMax? Нужно ли интегрировать два раза по каждой оси и выбрать максимальный результат? Мне не нужна особая точность и точность, просто общая ценность для проведения тестов в реальной жизни. Я бы не использовал GPS. Я не использую определенный язык или ОС, меня просто интересует алгоритм.

ответ

1

Вам придется интегрировать вектор ускорения (3D) в два раза по сравнению с «временем».

Для каждого измерения стоимость:

скорость: = акк * delta_t

расстояние: = скорость * delta_t

И сумма все расстояния. Это дает вам общее перемещение расстояния.

delta_t - временной интервал между двумя измерениями. Вы можете взять средний интервал «время до следующего измерения» и «время до предыдущего измерения», если ваши измерения не будут отобранные на одинаковом расстоянии во времени (т. Е. Не в обычных интервалах времени)

Все вычисления выполняются в 3D (т.е. для x, y, z параллельно)

2

Интеграция вектора ускорения однажды даст вам скорость, вторая интеграция даст вам расстояние (лучше использовать методы Рунге-Кутта или аналогичные).

Если вы пройдете 10 метров, остановитесь, поверните на 90 градусов по часовой стрелке, пройдите еще на 10 метров, акселерометр не может сказать, что вы, например, рыскали. Чтобы получить направление, которое вам нужно для датчика-предохранителя * измерения акселерометра с измерениями с помощью гироскопа телефона, а также с измерениями магнитометра.

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

* Поиск IMU sensor fusion (Инерциальная единица измерения), 6 DOF sensor fusion (без магнитометра или 9 с ним).

1

Решение вашей проблемы включает в себя буксирные отдельные части вам приходится иметь дело с:

  1. превращающего ускорения дистанцироваться
  2. компенсации ограничений цифрового акселерометра.

    Acceleration to distance: это легко один - просто интегрировать два раза в течение долгого времени:

  3. выбрать интервал (например, 10мс, 20мс и т.д.) и собирать данные с акселерометра раз каждый интервал; это ваш DT.

  4. сделать математику:

    пример кода:

    while(1) 
    { 
        start = getTimeinMS(); 
    
        velocity += acceleration *DT; 
        displacement += velocity *DT; 
    
        stop = getTimeinMS() 
    
        While (stop-start < DT) 
        { 
         usleep(100) 
        } 
    
    } 
    

    Dealing с цифровым акселерометром: это вторая часть немного сложнее. Вы должны понять и компенсировать две вещи:

  5. акселерометры являются очень шумные устройства

  6. инерция не друг; позвольте мне объяснить - если вы построите выход акселерометра, вы заметите, что движение слева направо будет синей волной. Движение влево-вправо-влево также будет волной sin. И у вас нет простого способа узнать, когда вы перестали двигаться влево-вправо и начали вправо. Я предполагаю, что вы этого не хотите и ищете простое перемещение левого правого movemet (или справа - слева, та же логика).

Если вы понимаете и принимаете то, что я сказал, вы до сих пор приходится иметь дело только с акселерометром шума - не очень сложная задача, так как вы можете найти большое количество информации и примеров о цифровых фильтров. Вы можете начать с rolling average filter и реализовать при необходимости что-то более причудливое.

Надеюсь, это поможет.

Смежные вопросы