Из всего, что я узнал из вашего вопроса и нашего разговора в комментариях, позвольте мне сначала кратко описать проблему и предложить решение.
Краткое резюме
У вас есть система с двумя независимыми датчиками, которые проводят измерения с разными частотами (30 Гц и 5 Гц) (и, возможно, имеют некоторое временное дрожание). Хорошей новостью является то, что каждого такого измерения вполне достаточно для выполнения шага обновления вашего фильтра Калмана. Каждое измерение имеет отметку времени.
Другим важным моментом является то, что измерения (возможно) имеют низкую точность, поэтому изменение положения выглядит не правдоподобным.
Возможное решение
Определите наименьший интервал времени для вызова вашего фильтра Калмана, чтобы ни одно из полученных измерений не пришлось ждать слишком долго для обработки. Мне кажется, что частота 100 Гц может быть хорошим первым выбором. В этом случае ваш dt
будет 0,01 с.
Создайте свои матрицы F
и Q
на основе выбранных dt
(они оба сильно зависят от этого значения).
В каждом вызове без измерения выполнить шаг прогнозирования. Как только измерение придет, сделайте обновление. Таким образом, ваша последовательность вызовов будет выглядеть так:
последовательность вызовов:
init()
predict()
predict()
predict()
predict()
update(sensor1)
predict()
update(sensor2)
update(sensor1)
predict()
predict()
update(sensor1)
predict()
and so on...
Чтобы справиться с проблемой точности, вы можете использовать опорный сигнал (основную правду). Проанализируйте ошибку в каждом показании датчика для каждого сигнала (x, y, z)
по сравнению с эталоном. Фильтр Калмана может хорошо работать ТОЛЬКО с показаниями, ошибка которых обычно распространяется с нулевым средним. Если вы видите какое-то систематическое смещение, возможно, вы сможете от него избавиться. По обнаруженной ошибке вы можете рассчитать стандартное отклонение (и дисперсию), чтобы вы могли сказать своему фильтру, насколько хороши измерения. Это будет ваша R
матрица.
Если у вас нет эталона, вы можете провести некоторые измерения, стоя на месте. Таким образом, ваша исходная позиция будет постоянной, и вы сможете взглянуть на разброс показаний.
Настройте элементы вашей Q
матрицы и опишите возможную динамику элементов вашего состояния. Меньший элемент Q для позиции сказал бы фильтру не менять его слишком быстро. Поэтому (возможная) низкая производительность ваших датчиков будет частично устранена (представьте, что фильтр низких частот - это интуиция).
Надеюсь, это поможет вам. Пожалуйста, поправьте меня, если я понял что-то не так.
Было бы полезно увидеть график показаний вашего датчика (и, если возможно, эталонной траектории).