Использование Matlab для интеграции данных акселерометра в скорость и положение - PullRequest
1 голос
/ 16 февраля 2011

У меня есть данные теста акселерометра, и мне нужно использовать Matlab, чтобы найти скорость и положение.Мне нужны фактические данные для скорости и положения, а не только кумулятивная область под кривой.У меня есть образцы данных, которые я использую, и я смог сделать это с помощью довольно длинного и специфического кодирования векторизации, но мне нужно найти более общий метод.Я не могу просто использовать кривую, а затем оценить площадь, потому что у меня есть дискретные данные и я не могу допустить ошибки.Этот метод по существу расчета площади каждого прямоугольника является наиболее точным способом.Ниже приведены мои попытки:

%Variables

clear

DeltaTime=0.2; %10 Hz sampling rate 

Acceleration=[0, 1, 2, 4, 3, 1, 2]; %Sample random data set

TTime=(0.2:DeltaTime:1.4); 

VelocityL=zeros(size(Acceleration));

VelocityLL=zeros(size(Acceleration));

%Velocity

DeltaVelocityVect=Acceleration*DeltaTime;

VelocityV=[sum(DeltaVelocityVect(1)),sum(DeltaVelocityVect(1:2)),...
    sum(DeltaVelocityVect(1:3)), sum(DeltaVelocityVect(1:4)), sum(DeltaVelocityVect(1:5))...
    sum(DeltaVelocityVect(1:6)), sum(DeltaVelocityVect(1:7))];

%Position

DeltaPositionVect=VelocityV*DeltaTime;

PositionV=[sum(DeltaPositionVect(1)),sum(DeltaPositionVect(1:2)),...
    sum(DeltaPositionVect(1:3)), sum(DeltaPositionVect(1:4)), sum(DeltaPositionVect(1:5))...
    sum(DeltaPositionVect(1:6)), sum(DeltaPositionVect(1:7))];

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

for index=1:length(Acceleration); 
  DeltaVelocityLoop(index)= DeltaTime*Acceleration(index);
end

for index2=1:7
  VelocityL(index2)= sum(DeltaVelocityLoop(index2));
  VelocityLL=VelocityLL+DeltaVelocityLoop(index2);
end

Это моя 10-я попытка, поэтому она включает повторение.VelocityL возвращает тот же вектор, что и DeltaVelocityLoop (без суммирования предыдущих областей, что является целью).VelocityLL просто возвращает общую площадь под кривой, написанную для длины вектора ускорения.Пожалуйста, дайте мне знать, если у вас есть идеи о том, как я могу обойти этот контрольно-пропускной пункт.

Ответы [ 3 ]

4 голосов
/ 16 февраля 2011

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

Я бы рекомендовал просто использовать cumsum () или cumtrapz () для интеграции ваших данных.

1 голос
/ 18 февраля 2011

Если вам нужно что-то быстрое и векторизованное, используйте cumtrapz.Предполагая, что вектор t содержит время измерения, этот вектор acc содержит измерения ускорения и что начальная позиция равна pos0, а начальная скорость равна vel0, я бы написал:

velocity = vel0 + cumtrapz(t,acc);
positions = pos0 + cumtrapz(velocity);

Если у вас есть только несколько точек измерения, cumtrapz может быть одним из лучших решений в отношении точности и простоты.

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

A.

1 голос
/ 16 февраля 2011

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

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

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

...