Фильтр Калмана с разной частотой дискретизации

Кажется, я не могу найти ветку по этой конкретной проблеме, поэтому я публикую ее сам.

Я работаю над большим навигационным проектом, где у меня есть доступ к одометрии транспортного средства и оценке положения, полученной из данных LiDAR. Я могу варьировать выборку из оценки LiDAR от 1 до 20 Гц с различным качеством, а данные одометрии передаются с частотой 40 Гц.

Я реализовал стандартный фильтр Калмана, следуя этим уравнениям (из Википедии):

Прогноз

введите здесь описание изображения

введите здесь описание изображения

Обновить

введите здесь описание изображения

Теперь мой вопрос: как вы (оптимально) используете фильтр Калмана, когда частота дискретизации из разных источников информации различна?


person JakobVinkas    schedule 02.01.2020    source источник
comment
Для фильтра Калмана не требуется фиксированный временной шаг, поэтому вы можете изменять временной шаг, используемый в прогнозировании, чтобы получить время следующего измерения, а затем выполнить обновление. Матрицы F и Q меняются в зависимости от размера временного шага, поэтому их необходимо пересчитывать на лету.   -  person Keith Brodie    schedule 03.01.2020
comment
@KeithBrodie Спасибо за ответ, но вы уверены? Потому что я наткнулся на некоторые статьи, в которых упоминается, что когда интервал выборки отличается, вам нужно либо снизить одну из частот выборки, либо интерполировать другую.   -  person JakobVinkas    schedule 03.01.2020
comment
Я думаю, вы имеете в виду ситуацию, в которой вы наблюдаете только часть ваших измерений. В этом случае вам нужно использовать последовательный фильтр Калмана, поэтому вы можете продолжить обновление, используя только часть вектора измерения.   -  person Anton    schedule 07.01.2020


Ответы (1)


Есть два подхода:

Во-первых, давайте предположим, что итерация представляет собой предсказание фильтра Калмана + обновление

  1. Переменная dt: если вы можете измерить дельту времени между итерациями фильтра Калмана, вы можете запускать новую итерацию каждый раз, когда от любого датчика поступает новое измерение.
  2. Статическая dt: если дельта-время должно оставаться постоянным, вы можете запускать итерации только с фиксированной скоростью. Таким образом, вы должны сохранять измерения датчиков, которые поступают между каждым запуском итерации.

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

  1. предсказывать()
  2. update() с датчиком A
  3. пропустить update() для датчика B, поскольку измерения не получены
  4. update() с датчиком c
  5. повторить

Теоретически этого делать не следует по следующим причинам:

  1. Не предсказывая перед каждым обновлением, вы рискуете, что реальная динамика вашей системы опережает фильтр. Метод update() сравнивает реальное измерение с предсказанным измерением, которое специально рассчитывается на основе предсказанного состояния. Если между прогнозированием() и обновлением() проходит достаточно времени, функция update() по существу сравнивает новые измерения со старыми прогнозами. Если ваш фильтр работает намного быстрее, чем могут измениться состояния вашей системы в реальном мире, то все в порядке. Но если ваш фильтр работает относительно медленно по сравнению с изменениями состояния в реальной системе, вы столкнетесь с запаздыванием/неточностью в оценке состояния фильтром.
  2. Выполнение отдельного обновления для каждого измерения приведет к большому количеству ненужных избыточных математических матричных операций (которые могут быть очень дорогостоящими, если F велико). Предполагая, что ваши F и H имеют недиагональные компоненты (и, таким образом, состояния/наблюдения взаимосвязаны), затем выполните один прогноз и одно обновление со всеми последними измерениями, чтобы свести к минимуму дорогостоящие матричные вычисления. Если F чисто диагонально или его сегменты чисто диагональны, то у вас есть определенные состояния или группы состояний, полностью независимые друг от друга. Чтобы сэкономить на вычислении матриц, вы должны разделить их на разные фильтры Калмана.

Другие предложили, чтобы избежать проблемы 2 выше, вы разделили свою матрицу H (и, следовательно, связанные y, z, S, K) на отдельные, меньшие матрицы для каждого датчика. Таким образом, датчик A будет иметь свои собственные матрицы H,y,z,S,K, датчик B — собственный набор матриц и т. д. Если у вас есть недиагональные элементы в F или H, это не оптимально. Недиагональные элементы подразумевают зависимость состояния от другого состояния, поэтому они будут проявлять ковариантность. K в конечном итоге рассчитывается на основе предсказанной ковариации состояния, а также предсказанной ковариации наблюдения (также имейте в виду, что если у вас есть ковариация состояния, она обычно вводит ковариацию в предсказанные наблюдения через H, не говоря уже о том, что H может создать дополнительную ковариацию сам по себе ). Если вы начнете сегментировать общесистемную матрицу H,S на отдельные матрицы H,S для каждого датчика, вы в конечном итоге урежете отношения между взаимосвязанными состояниями/наблюдениями вашей модели. Это приводит к субоптимальному K, поскольку некоторые ковариации удаляются.

person pcdangio    schedule 09.02.2021