Как работать с асинхронными данными в фильтре Калмана - PullRequest
0 голосов
/ 12 июня 2019

Я использую фильтр Калмана, который объединяет данные о трехмерном положении (предоставленные двумя различными алгоритмами компьютерного зрения).Я моделирую проблему с 9-мерным вектором состояния (положение, скорость и ускорение).Однако данные с каждого датчика не поступают одновременно.Поскольку я вычисляю скорость с учетом временного шага между приемом предыдущих данных и текущей точкой данных, две последовательные точки данных могут быть совершенно разными, но разделены лишь очень небольшим временным шагом, что создает впечатление, что положение изменилосьбыстро.

Мне интересно, есть ли у кого-нибудь понимание или направление относительно лучшего способа решения этой проблемы - будет ли сам фильтр Калмана терпимым к такому поведению?Или я должен поместить все данные, полученные в пределах временного окна, в корзину и выполнять цикл обновления / прогнозирования реже для пакета данных?Ресурсы, которые я видел для использования фильтра Калмана в отслеживании объектов, использовали только одну камеру (т.е. синхронные данные), поэтому у меня возникают проблемы с поиском информации, связанной с моим вариантом использования.

Любая помощь очень ценится!Спасибо!

1 Ответ

0 голосов
/ 13 июня 2019

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

Краткое резюме

У вас есть система с двумя независимыми датчиками, которые проводят измерения с разными частотами (30 Гц и 5 Гц) (и, возможно, имеют некоторое временное дрожание). Хорошей новостью является то, что каждого такого измерения вполне достаточно для выполнения шага обновления вашего фильтра Калмана. Каждое измерение имеет отметку времени.

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

Возможное решение

  1. Определите наименьший интервал времени для вызова вашего фильтра Калмана, чтобы ни одно из полученных измерений не пришлось ждать слишком долго для обработки. Мне кажется, что частота 100 Гц может быть хорошим первым выбором. В этом случае ваш dt будет 0,01 с.

  2. Создайте свои матрицы F и Q на основе выбранных dt (они оба сильно зависят от этого значения).

  3. В каждом вызове без измерения выполнить шаг прогнозирования. Как только измерение придет, сделайте обновление. Таким образом, ваша последовательность вызовов будет выглядеть так:

последовательность вызовов:

 init()
 predict()
 predict()
 predict()
 predict()
 update(sensor1)
 predict()
 update(sensor2)
 update(sensor1)
 predict()
 predict()
 update(sensor1)
 predict()
 and so on...
  1. Чтобы справиться с проблемой точности, вы можете использовать опорный сигнал (основную правду). Проанализируйте ошибку в каждом показании датчика для каждого сигнала (x, y, z) по сравнению с эталоном. Фильтр Калмана может хорошо работать ТОЛЬКО с показаниями, ошибка которых обычно распространяется с нулевым средним. Если вы видите какое-то систематическое смещение, возможно, вы сможете от него избавиться. По обнаруженной ошибке вы можете рассчитать стандартное отклонение (и дисперсию), чтобы вы могли сказать своему фильтру, насколько хороши измерения. Это будет ваша R матрица.

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

  3. Настройте элементы вашей Q матрицы и опишите возможную динамику элементов вашего состояния. Меньший элемент Q для позиции сказал бы фильтру не менять его слишком быстро. Поэтому (возможная) низкая производительность ваших датчиков будет частично устранена (представьте, что фильтр низких частот - это интуиция).

Надеюсь, это поможет вам. Пожалуйста, поправьте меня, если я понял что-то не так. Было бы полезно увидеть график показаний вашего датчика (и, если возможно, эталонной траектории).

...