Этот пример показывает, как выполнить нелинейную оценку состояния в Simulink™ для системы с несколькими датчиками, действующими на уровне различных частот дискретизации. Блок Extended Kalman Filter в System Identification Toolbox™ используется, чтобы оценить положение и скорость объекта с помощью радарных измерений и GPS.
Тулбокс имеет три блока Simulink для нелинейной оценки состояния:
Расширенный Фильтр Калмана: Реализует расширенный алгоритм Фильтра Калмана дискретного времени первого порядка.
Сигма-точечный фильтр Калмана: Реализует алгоритм сигма-точечного фильтра Калмана дискретного времени.
Фильтр частиц: Реализует алгоритм фильтра частиц дискретного времени.
Эти блоки поддерживают оценку состояния с помощью нескольких датчиков, действующих на уровне различных частот дискретизации. Типичный рабочий процесс для использования этих блоков следующие:
Смоделируйте свой объект и использование поведения датчика функции Simulink или MATLAB.
Сконфигурируйте параметры блока.
Моделируйте фильтр и анализируйте результаты завоевать доверие в производительности фильтра.
Разверните фильтр на своем оборудовании. Можно сгенерировать код для этих фильтров с помощью программного обеспечения Simulink Coder™.
Этот пример использует блок Extended Kalman Filter, чтобы продемонстрировать первые два шага этого рабочего процесса. Последние два шага кратко обсуждены в разделе Next Steps. Цель в этом примере состоит в том, чтобы оценить состояния объекта с помощью шумных измерений, обеспеченных радаром и датчиком GPS. Состояния объекта являются его положением и скоростью, которые обозначаются как xTrue в модели Simulink.
Если вы интересуетесь блоком Particle Filter, смотрите пример "Параметр и Оценка состояния в Simulink Используя Блок Фильтра частиц".
addpath(fullfile(matlabroot,'examples','ident','main')) % add example data open_system('multirateEKFExample');
Алгоритм расширенного фильтра Калмана (EKF) требует функции изменения состояния, которая описывает эволюцию состояний от одного временного шага до следующего. Блок поддерживает следующие две функциональных формы:
Шум аддитивного процесса:
Неаддитивный шум процесса:
Здесь f (..) функция изменения состояния, x является состоянием, и w является шумом процесса. u является дополнительным, и представляет дополнительные входные параметры f, например, системные входные параметры или параметры. Аддитивный шум означает, что следующее состояние и шум процесса связаны линейно. Если отношение нелинейно, используйте неаддитивную форму.
Функцией f (...) может быть функция MATLAB, которые выполняют ограничения MATLAB Coder™ или Функциональный блок Simulink. После того, как вы создаете f (...), вы задаете имя функции и является ли шум процесса дополнением или недополнением в блоке Extended Kalman Filter.
В этом примере вы отслеживаете северные и восточные положения и скорости объекта на 2-мерной плоскости. Предполагаемые количества:
Вот индекс дискретного времени. Используемое уравнение изменения состояния имеет неаддитивную форму, где вектор состояния и является шумом процесса. Фильтр принимает, что это - нулевое среднее значение, независимая случайная переменная с известным отклонением. A и матрицы G:
где шаг расчета. Третья строка модели A и G восточная скорость как случайный обход:. в действительности положение является непрерывно-разовой переменной и является интегралом скорости в зависимости от времени. Первая строка A и G представляет дискретное приближение этому кинематическому отношению:. вторые и четвертые строки A и G представляют то же отношение между северной скоростью и положением. Эта модель изменения состояния линейна, но радарная модель измерения нелинейна. Эта нелинейность требует использования нелинейного средства оценки состояния, такого как расширенный Фильтр Калмана.
В этом примере вы реализуете функцию изменения состояния использование Функционального блока Simulink. Для этого
Добавьте блок Simulink Function
в свою модель от библиотеки Simulink/User-Defined Functions
Нажмите на имя, показанное на Функциональном блоке Simulink. Отредактируйте имя функции, и добавьте или удалите аргументы ввода и вывода по мере необходимости. В этом примере именем для функции изменения состояния является stateTransitionFcn
. Это имеет один выходной аргумент (xNext) и два входных параметра (x, w).
Хотя это не требуется в этом примере, можно использовать любые сигналы от остальной части модели Simulink в Функции Simulink. Для этого добавьте блоки Inport
от библиотеки Simulink/Sources
. Обратите внимание на то, что они отличаются, чем ArgIn
и блоки ArgOut
, которые установлены через подпись вашей функции (xNext = stateTransitionFcn (x, w)).
В Функциональном блоке Simulink создайте свои блоки Simulink использования функции.
Установите размерности для аргументов x, w ввода и вывода и xNext во вкладке Signal Attributes блоков ArgOut
и ArgIn
. Тип данных и размерности порта должны быть сопоставимы с информацией, которую вы предоставляете в блоке Extended Kalman Filter
.
Аналитический якобиан функции изменения состояния также реализован в этом примере. Определение якобиана является дополнительным. Однако это уменьшает вычислительную нагрузку, и в большинстве случаев увеличивает точность оценки состояния. Реализуйте Функцию Якоби как функцию Simulink, потому что функция изменения состояния является функцией Simulink.
open_system('multirateEKFExample/Simulink Function - State Transition Jacobian');
Блоку Extended Kalman Filter также нужна функция измерения, которая описывает, как состояния связаны с измерениями. Следующие две функциональных формы поддерживаются:
Аддитивный шум измерения:
Неаддитивный шум измерения:
Здесь h (..) функция измерения, и v является шумом измерения. u является дополнительным, и представляет дополнительные входные параметры h, например, системные входные параметры или параметры. Эти входные параметры могут отличаться от входных параметров в функции изменения состояния.
В этом примере радар, расположенный в начале координат, измеряет область значений и угол объекта на уровне 20 Гц. Примите, что оба из измерений имеют приблизительно 5%-й шум. Это может быть смоделировано следующим уравнением измерения:
Здесь и условия шума измерения, каждый с отклонением 0.05^2. Таким образом, большинство измерений имеет ошибки меньше чем 5%. Шум измерения является недополнением, потому что и просто не добавляются к измерениям, но вместо этого они зависят от состояний x. В этом примере радарное уравнение измерения реализовано с помощью Функционального блока Simulink.
open_system('multirateEKFExample/Simulink Function - Radar Measurements');
GPS измеряет восточные и северные положения объекта на уровне 1 Гц. Следовательно, уравнение измерения для датчика GPS:
Здесь и условия шума измерения с ковариационной матрицей [10^2 0; 0 10^2]. Таким образом, измерения точны приблизительно до 10 метров, и ошибки являются некоррелироваными. Шум измерения является дополнением, потому что шумовые условия влияют на измерения линейно.
Создайте эту функцию и сохраните ее в файле с именем gpsMeasurementFcn.m
. Когда шум измерения является дополнением, вы не должны задавать шумовые условия в функции. Вы обеспечиваете это имя функции и ковариацию шума измерения в блоке Extended Kalman Filter.
type gpsMeasurementFcn
function y = gpsMeasurementFcn(x) % gpsMeasurementFcn GPS measurement function for state estimation % % Assume the states x are: % [EastPosition; NorthPosition; EastVelocity; NorthVelocity] %#codegen % The %#codegen tag above is needed is you would like to use MATLAB Coder to % generate C or C++ code for your filter y = x([1 2]); % Position states are measured end
Сконфигурируйте блок Extended Kalman Filter, чтобы выполнить оценку. Вы задаете имена функций изменения состояния и измерения, начальное состояние и утверждаете ошибочную ковариацию и характеристики шума процесса и измерения.
Во вкладке System Model диалогового окна блока задайте следующие параметры:
Изменение состояния
Задайте функцию изменения состояния, stateTransitionFcn
, в Функции. Поскольку у вас есть якобиан этой функции, выберите Jacobian и задайте Функцию Якоби, stateTransitionJacobianFcn
.
Выберите Nonadditive
в Шуме Процесса выпадающий список, потому что вы явным образом утвердили, как шум процесса влияет на состояния в вашей функции.
Задайте ковариацию шума процесса как [0.2 0; 0 0.2]. Как объяснено в разделе Plant Modeling этого примера, условия шума процесса задают случайный обход скоростей в каждом направлении. Диагональные термины приблизительно получают, насколько скорости могут переключить один шаг расчета функции изменения состояния. Недиагональные условия обнуляются, который является наивным предположением, что скоростные изменения в северных и восточных направлениях являются некоррелироваными.
Инициализация
Задайте свою лучшую оценку начального состояния в начальном состоянии. В этом примере задайте [100; 100; 0; 0].
Задайте свою уверенность в вашем оценочном предположении состояния в Начальной ковариации. В этом примере задайте 10. Программное обеспечение интерпретирует это значение, как истинные значения состояния, вероятно, будут в вашей первоначальной оценки. Можно задать отдельное значение для каждого состояния установкой Initial covariance
как вектор. Можно задать взаимные корреляции в этой неуверенности путем определения его как матрицы.
С тех пор существует два датчика, нажимают Add Measurement, чтобы задать вторую функцию измерения.
Измерение 1
Задайте имя своей функции измерения, radarMeasurementFcn
, в Функции.
Выберите Nonadditive
в Шуме Измерения выпадающий список, потому что вы явным образом утвердили, как шум процесса влияет на измерения в вашей функции.
Задайте ковариацию шума измерения как [0.05^2 0; 0 0.05^2] на обсуждение в разделе Sensor Modeling - Radar.
Измерение 2
Задайте имя своей функции измерения, gpsMeasurementFcn
, в Функции.
Эта модель датчика имеет аддитивный шум. Поэтому задайте шум измерения GPS как Additive
в Шуме Измерения выпадающий список.
Задайте ковариацию шума измерения как [100 0; 0 100].
Во вкладке Multirate, поскольку эти два датчика действуют на уровне различных частот дискретизации, выполняют следующую настройку:
Выберите Enable multirate operation
.
Задайте шаг расчета изменения состояния. Шаг расчета изменения состояния должен быть самым маленьким, и все шаги расчета измерения должны быть целочисленным кратным шаг расчета изменения состояния. Задайте шаг расчета Изменения состояния как 0,05, шаг расчета самого быстрого измерения. Хотя не требуемый в этом примере, возможно иметь меньший шаг расчета для изменения состояния, чем все измерения. Это означает, что будут некоторые шаги расчета без любых измерений. Для этих шагов расчета фильтр генерирует прогнозы состояния с помощью функции изменения состояния.
Задайте Измерение 1 шаг расчета (Радар) как 0,05 секунды и Измерение 2 (GPS) как 1 секунда.
Проверьте производительность Расширенного Фильтра Калмана путем симуляции сценария, куда объект перемещается в квадратном шаблоне со следующими маневрами:
В t = 0, объект запускается в
Это направляется на север в до t = 20 секунд.
Это направляется на восток в между t = 20 и t = 45 секунд.
Это направляется на юг в между t = 45 и t = 85 секунд.
Это направляется на запад в между t = 85 и t = 185 секунд.
Сгенерируйте истинные значения состояния, соответствующие этому движению:
Ts = 0.05; % [s] Sample rate for the true states [t, xTrue] = generateTrueStates(Ts); % Generate position and velocity profile over 0-185 seconds
Моделируйте модель. Например, посмотрите на фактические и предполагаемые скорости в восточном направлении:
sim('multirateEKFExample'); open_system('multirateEKFExample/Scope - East Velocity');
График показывает истинную скорость в восточном направлении и его расширенные оценки Фильтра Калмана. Фильтр успешно отслеживает изменения в скорости. Многоскоростная природа фильтра является самой очевидной в области значений времени t = 20 - 30 секунд. Фильтр делает большие исправления каждую секунду (частота дискретизации GPS), в то время как исправления из-за радарных измерений видимы каждые 0.05 секунды.
Подтвердите оценку состояния: валидация недушистой и расширенной производительности Фильтра Калмана обычно делается с помощью обширных симуляций Монте-Карло. Для получения дополнительной информации смотрите, Подтверждают Онлайновую Оценку состояния в Simulink.
Сгенерируйте код: Недушистые и Расширенные блоки Фильтра Калмана поддерживают генерацию C и Кода С++ с помощью программного обеспечения Simulink Coder™. Функции, которые вы предоставляете этим блокам, должны выполнить ограничения программного обеспечения MATLAB Coder™ (если вы используете функции MATLAB, чтобы смоделировать вашу систему), и программное обеспечение Simulink Coder (если вы используете Функциональные блоки Simulink, чтобы смоделировать вашу систему).
Этот пример показал, как использовать блок Extended Kalman Filter в System Identification Toolbox. Вы оценили положение и скорость объекта от двух различных датчиков, действующих на различных уровнях выборки.
close_system('multirateEKFExample', 0); rmpath(fullfile(matlabroot,'examples','ident','main')) % remove example data
Расширенный фильтр Калмана | Фильтр частиц | Сигма-точечный фильтр Калмана