Фильтрация вращательного ускорения (Подходящее использование для фильтра Калмана?)

Я работаю над проектом, в котором стержень прикреплен одним концом к вращающемуся валу. Таким образом, когда вал вращается от 0 до ~ 100 градусов вперед и назад (в плоскости xy), то же самое происходит и со стержнем. Я установил 3-осевой акселерометр на конце движущегося стержня и измерил расстояние акселерометра от центра вращения (т. е. длину стержня) и составил около 38 см. Я собрал много данных, но мне нужна помощь, чтобы найти лучший метод для их фильтрации. Во-первых, вот график необработанных данных:

Исходные данные

Я думаю, что данные имеют смысл: если оно нарастает, то я думаю, что в этот момент ускорение должно линейно возрастать, а затем, когда оно замедляется, оно должно линейно уменьшаться. Если он движется постоянно, ускорение будет равно нулю. Имейте в виду, однако, что иногда скорость меняется (выше) от одного «испытания» к другому. В этом случае было около 120 «проб» или движений/разверток, выборка данных осуществлялась с частотой 148 Гц.

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

спектральная плотность

В чем я надеялся получить помощь, так это найти действительно хороший метод, с помощью которого я могу фильтровать эти данные. Единственное, что снова и снова всплывает (особенно на этом сайте), — это фильтр Калмана. Несмотря на то, что в Интернете есть много кода, который помогает реализовать это в MATLAB, я не смог на самом деле понять его так хорошо, и поэтому пренебрегаю включением моей работы над ним здесь. Итак, подходит ли здесь фильтр Калмана для ускорения вращения? Если да, может ли кто-нибудь помочь мне реализовать его в Matlab и интерпретировать? Есть ли что-то, что я не вижу, что может быть так же хорошо / лучше, что относительно просто?

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

http://cl.ly/433B1h3m1L0t?_ga=1.81885205.2093327149.1426657579

Редактировать: Хорошо, вот график обоих относительных измерений, собранных с акселерометра. Я пренебрегаю измерением вверх и вниз, поскольку акселерометр показывает почти постоянное значение ~ 1 G, поэтому я думаю, что можно с уверенностью сказать, что он не фиксирует большого вращательного движения. Красный, как мне кажется, является центростремительной составляющей, а синий — тангенциальной. Я понятия не имею, как их объединить, поэтому я (может быть, неправомерно?) проигнорировал это в своем посте.

два измерения

А вот данные для другого измерения:

http://cl.ly/1u133033182V?_ga=1.74069905.2093327149.1426657579


person John Alberto    schedule 15.04.2015    source источник
comment
В представленных данных упоминается ось y трехосного акселерометра. Как эта ось была по сравнению с вращением. y показывает центростремительное ускорение (ориентировано радиально) или тангенциальное ускорение (ориентировано тангенциально)?   -  person Hoki    schedule 16.04.2015
comment
Спасибо, что спросили Хоки. Это было то, с чем я боролся некоторое время. Я думаю, что это показывает тангенциальное ускорение, однако размер, который предположительно дает центростремительное ускорение, любопытен. Акселерометр смонтирован хорошо, но не идеально. Так что я думаю, что теряю некоторую информацию из измерения y в измерение z, которое я считал центростремительным.   -  person John Alberto    schedule 16.04.2015
comment
Кроме того, другое измерение обычно постоянно показывает ~1 G (9,8 м/с^2), поэтому я предпочитаю его игнорировать. Поскольку акселерометр вращается вместе со стержнем, а не движется вверх и вниз, я думаю, что могу спокойно игнорировать это. Читая в Интернете, я должен делать какие-то векторные преобразования или использовать вращательные матрицы, но я понятия не имею, как это сделать, поэтому пока оставляю это в покое. Я обновлю свой пост центростремительной составляющей и построю их вместе, чтобы показать вам это.   -  person John Alberto    schedule 16.04.2015


Ответы (2)


Забудьте о фильтре Калмана, см. примечание в конце ответа, почему.

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

n = 30 ; %// length of the filter
kernel = ones(1,n)./n ;
ysm = filter( kernel , 1 , flipud(filter( kernel , 1 , flipud(y) )) ) ; 
%// assuming your data "y" are in COLUMN (otherwise change 'flipud' to 'fliplr')

Примечание: если у вас есть доступ к набору инструментов curvefit, вы можете просто использовать: ys = smooth(y,30) ;, чтобы получить почти такой же результат.

Я получаю: accelfull, который после увеличения выглядит так: accelfull

Вы можете поиграть с параметром n, чтобы увеличить или уменьшить сглаживание.

Серый сигнал — ваш исходный сигнал. Я сильно подозреваю, что шумовые всплески, которые вы получаете, вызваны только вибрациями вашего удилища. (в зависимости от соотношения длины и поперечного сечения вашего удилища вы можете получить значительные вибрации на конце 38-сантиметрового удилища. Эти вибрации примут форму колебаний вокруг основного несущего сигнала, что определенно похоже на то, что я вижу в ваш сигнал).


Примечание. Фильтр Калмана является излишним для простой фильтрации зашумленных данных. Фильтр Калмана используется, когда вы хотите вычислить значение (положение, если я следую вашему примеру) на основе какого-то зашумленного измерения, но для уточнения вычислений фильтр Калмана также будет использовать прогноз положения на основе предыдущего состояния (положение ) и инерциальные данные (например, как быстро вы вращались). Для этого прогноза вам нужна «модель» поведения вашей системы, которой у вас, похоже, нет.

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

Посмотрите на краткий рисунок, объясняющий процесс фильтра Калмана в этой статье в Википедии: фильтр Калмана, и прочитайте на, если вы хотите понять это больше.

person Hoki    schedule 15.04.2015
comment
Спасибо за очень развернутый ответ Хоки. Один последующий вопрос: вы думаете, что затухание, которое происходит с этим методом, нормально? Наверное, да, но я просто хотел услышать ваше мнение. Также спасибо за объяснение о фильтре Калмана. Я не думаю, что упомянул об этом в своем первоначальном посте, но на самом деле я также собираю данные о местоположении и времени, поэтому вычисление скорости для меня не составляет труда. Возможно, я смогу изучить фильтр Калмана (и понять, почему он так чертовски популярен) в будущем в качестве упражнения. - person John Alberto; 17.04.2015
comment
О, еще один вопрос. Меня немного беспокоит смещение (от нуля), наблюдаемое в данных. Теоретически должно быть ноль нет? После разговора с некоторыми людьми это может быть связано с ориентацией моего акселерометра (он не идеален). По-видимому, мне следует использовать матрицы вращения для преобразования измерений в другую систему координат, в которой одна ось испытывает ускорение g, а вращение стержня влияет только на другую ось, но я не уверен, как это сделать. Как вы думаете, вы можете помочь здесь, или это требует другого вопроса? - person John Alberto; 17.04.2015
comment
@ДжонАльберто. Это определенно другой вопрос, и, вероятно, было бы лучше на другом сайте SO, больше связанном с обработкой сигналов. Что касается затухания, это зависит от того, что вас интересует. Если вы хотите отслеживать движение вала (низкая частота) и игнорировать вибрации стержня, то этот способ подходит. Если вы хотите изучить колебания стержня, то вам нужно держать высокие частоты. Что касается смещения (смещения нуля), смещение ~ 3 градуса вашего ускорения даст вам смещение 0,05G в ваших данных ... вполне возможно. - person Hoki; 17.04.2015
comment
Вау, как ты это вычислил? Ты сделал это в своей голове? Сумасшедший. Я могу пойти дальше и задать еще один вопрос, связанный с этим смещением. Обработка сигнала правильная? - person John Alberto; 17.04.2015

Я предложу вам ФНЧ, но вместо Калмана обычную инерциальную модель первого порядка. Я разработал фильтр с полосой пропускания до 10 Гц (~~0,1 частоты вашего семпла). Дискретная модель имеет следующее уравнение:

y[k] = 0.9418*y[k-1] + 0.05824*u[k-1]

где u — ваш измеренный вектор, а y — вектор после фильтрации. Это уравнение начинается с образца номер 1, поэтому вы можете просто присвоить 0 образцу номер 0.

person Rafał P    schedule 15.04.2015
comment
Есть ли простой метод/функция для их реализации в Matlab? В качестве альтернативы я могу, вероятно, просто перебрать данные и реализовать вашу модель как функцию, верно? - person John Alberto; 16.04.2015
comment
да, это просто - у вас уже есть свой вектор (данные u), затем вы делаете цикл for i=2:length(u) y(i) = 0.9418*y(i-1) + 0.05824*u(i-1); end, конечно, перед циклом вам нужно инициализировать первый образец: y(1)=0; - person Rafał P; 16.04.2015
comment
Спасибо Рафал. Я думаю, действительно интересно, насколько ваш ответ похож на ответ Хоки, но я думаю, что соглашусь с его. Это очень-очень незначительно, но пики после использования метода Хоки выравниваются немного лучше, чем у вас (это всего лишь крошечное смещение). Хотя масштаб очень похож или почти одинаков. Кроме того, я вижу, что использую ваш метод во многих других приложениях, поэтому я очень ценю ваш ответ. Если бы я мог, +1 снова. - person John Alberto; 17.04.2015