correct

Правильное состояние и ковариация ошибки оценки состояния с помощью сигма-точечного фильтра Калмана, или фильтра частиц и измерений

Описание

correct команда обновляет ошибочную ковариацию оценки состояния и оценки состояния extendedKalmanFilter, unscentedKalmanFilter или particleFilter объект с помощью измеренной системы выходные параметры. Чтобы реализовать сигма-точечный фильтр Калмана или фильтр частиц, используют correct и predict команды вместе. Если измерение текущей производительности существует, можно использовать correct и predict. Если измерение отсутствует, можно только использовать predict. Для получения информации о порядке, в котором можно использовать команды, смотрите Используя, предсказывают и корректируют Команды.

пример

[CorrectedState,CorrectedStateCovariance] = correct(obj,y) корректирует оценку состояния и ошибочную ковариацию оценки состояния сигма-точечного фильтра Калмана или объект obj фильтра частиц использование измеренного выхода y.

Вы создаете obj использование extendedKalmanFilter, unscentedKalmanFilter или particleFilter команды. Вы задаете функцию изменения состояния и функцию измерения вашей нелинейной системы в obj. Вы также задаете, являются ли условия шума процесса и измерения дополнением или недополнением в этих функциях. State свойство объектно-ориентированной памяти последнее предполагаемое значение состояния. Примите это на временном шаге k, obj.State x^[k|k1]. Это значение является оценкой состояния за время k, предполагаемое использование измеряло выходные параметры до времени k-1. Когда вы используете correct команда с измеренной системой выход y[k], программное обеспечение возвращает откорректированную оценку состояния x^[k|k] в CorrectedState вывод . Где x^[k|k] оценка состояния во время k, предполагаемое использование измеряло выходные параметры до времени k. Команда возвращает ошибочную ковариацию оценки состояния x^[k|k] в CorrectedStateCovariance вывод . Программное обеспечение также обновляет State и StateCovariance свойства obj с этими откорректированными значениями.

Используйте этот синтаксис, если измерение функционирует h, который вы задали в obj.MeasurementFcn имеет одну из следующих форм:

  • y(k) = h(x(k)) — для аддитивного шума измерения.

  • y(k) = h(x(k),v(k)) — для неаддитивного шума измерения.

Где y(k), x(k), и v(k) измеренный выход, состояния и шум измерения системы на временном шаге k. Единственные входные параметры к h являются шумом измерения и состояниями.

пример

[CorrectedState,CorrectedStateCovariance] = correct(obj,y,Um1,...,Umn) задает дополнительные входные параметры, если функция измерения системы требует этих входных параметров. Можно задать несколько аргументов.

Используйте этот синтаксис, если функция измерения h имеет одну из следующих форм:

  • y(k) = h(x(k),Um1,...,Umn) — для аддитивного шума измерения.

  • y(k) = h(x(k),v(k),Um1,...,Umn) — для неаддитивного шума измерения.

correct команда передает эти входные параметры функции измерения, чтобы вычислить предполагаемые выходные параметры.

Примеры

свернуть все

Оцените состояния осциллятора Ван дер Поля с помощью расширенного алгоритма Фильтра Калмана и измеренных выходных данных. Генератор имеет два состояния и один выход.

Создайте расширенный объект Фильтра Калмана для генератора. Использование ранее записанные и сохраненные функции изменения состояния и измерения, vdpStateFcn.m и vdpMeasurementFcn.m. Эти функции описывают дискретное приближение к осциллятору Ван дер Поля параметром нелинейности \mu равняйтесь 1. Функции принимают шум аддитивного процесса и измерения в системе. Задайте значения начального состояния для двух состояний как [1; 0]. Это - предположение для значения состояния в начальное время k, на основе знания системы выходные параметры до времени k-1, xˆ[k|k-1].

obj = extendedKalmanFilter(@vdpStateFcn,@vdpMeasurementFcn,[1;0]);

Загрузите измеренные выходные данные y от генератора. В этом примере используйте симулированные статические данные в рисунке. Данные хранятся в vdp_data.mat файл.

load vdp_data.mat y

Задайте шум процесса и ковариации шума измерения генератора.

obj.ProcessNoise = 0.01;
obj.MeasurementNoise = 0.16;

Инициализируйте массивы, чтобы получить результаты оценки.

residBuf = [];
xcorBuf = [];
xpredBuf = [];

Реализуйте расширенный алгоритм Фильтра Калмана, чтобы оценить состояния генератора при помощи correct и predict команды. Вы сначала корректируете xˆ[k|k-1] использование измерений во время k добираться xˆ[k|k]. Затем вы предсказываете значение состояния на следующем временном шаге xˆ[k+1|k] использование xˆ[k|k], оценка состояния на временном шаге k это оценивается с помощью измерений до времени k.

Чтобы симулировать измерения данных реального времени, используйте результаты измерений один временной шаг за один раз. Вычислите невязку между предсказанным и фактическим измерением, чтобы оценить, как хорошо фильтр выполняет и сходится. Вычисление невязки является дополнительным шагом. Когда вы используете residual, поместите команду сразу перед correct команда. Если прогноз совпадает с измерением, невязка является нулем.

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

for k = 1:size(y)
    [Residual,ResidualCovariance] = residual(obj,y(k));
    [CorrectedState,CorrectedStateCovariance] = correct(obj,y(k));
    [PredictedState,PredictedStateCovariance] = predict(obj);
    
     residBuf(k,:) = Residual;
     xcorBuf(k,:) = CorrectedState';
     xpredBuf(k,:) = PredictedState';
   
end

Когда вы используете correct команда, obj.State и obj.StateCovariance обновляются с откорректированными ошибочными значениями ковариации оценки состояния и оценки состояния для временного шага k, CorrectedState и CorrectedStateCovariance. Когда вы используете predict команда, obj.State и obj.StateCovariance обновляются с ожидаемыми значениями для временного шага k+1, PredictedState и PredictedStateCovariance. Когда вы используете residual команда, вы не изменяете obj свойства.

В этом примере вы использовали correct перед predict потому что значение начального состояния было xˆ[k|k-1], предположение для значения состояния в начальное время k на основе системы выходные параметры до времени k-1. Если ваше значение начального состояния xˆ[k-1|k-1], значение в предыдущий раз k-1 на основе измерений до k-1, затем используйте predict команда сначала. Для получения дополнительной информации о порядке использования predict и correct, смотрите Используя, предсказывают и корректируют Команды.

Постройте предполагаемые состояния, с помощью значений посткоррекции.

plot(xcorBuf(:,1), xcorBuf(:,2))
title('Estimated States')

Постройте фактическое измерение, откорректированное предполагаемое измерение и невязку. Поскольку измерение функционирует в vdpMeasurementFcn, измерение является первым состоянием.

M = [y,xcorBuf(:,1),residBuf];
plot(M)
grid on
title('Actual and Estimated Measurements, Residual')
legend('Measured','Estimated','Residual')

Оценка отслеживает измерение тесно. После начального переходного процесса невязка остается относительно маленькой в течение запуска.

Загрузите данные об ОДУ Ван дер Поля и задайте шаг расчета.

vdpODEdata.mat содержит симуляцию ОДУ Ван дер Поля параметром нелинейности mu=1, с помощью ode45, начальными условиями [2;0]. Истинное состояние было извлечено с шагом расчета dt = 0.05.

addpath(fullfile(matlabroot,'examples','control','main')) % add example data

load ('vdpODEdata.mat','xTrue','dt')
tSpan = 0:dt:5;

Получите измерения. В данном примере датчик измеряет первое состояние с Гауссовым шумом со стандартным отклонением 0.04.

sqrtR = 0.04;
yMeas = xTrue(:,1) + sqrtR*randn(numel(tSpan),1);

Создайте фильтр частиц и установите функции правдоподобия изменения состояния и измерения.

myPF = particleFilter(@vdpParticleFilterStateFcn,@vdpMeasurementLikelihoodFcn);

Инициализируйте фильтр частиц в [2; 0] состояния с модульной ковариацией и использованием 1000 частицы.

initialize(myPF,1000,[2;0],eye(2));

Выберите mean оценка состояния и systematic передискретизация методов.

myPF.StateEstimationMethod = 'mean';
myPF.ResamplingMethod = 'systematic';

Оцените состояния с помощью correct и predict команды и хранилище предполагаемые состояния.

xEst = zeros(size(xTrue));
for k=1:size(xTrue,1)
    xEst(k,:) = correct(myPF,yMeas(k));
    predict(myPF);
end

Постройте результаты и сравните предполагаемые и истинные состояния.

figure(1)
plot(xTrue(:,1),xTrue(:,2),'x',xEst(:,1),xEst(:,2),'ro')
legend('True','Estimated')

rmpath(fullfile(matlabroot,'examples','control','main')) % remove example data

Рассмотрите нелинейную систему с входом u чей x состояния и измерение y развейтесь согласно следующим уравнениям изменения состояния и измерения:

x[k]=x[k-1]+u[k-1]+w[k-1]

y[k]=x[k]+2*u[k]+v[k]2

Шум процесса w из системы дополнение в то время как шум измерения v недополнение.

Создайте функцию изменения состояния и функцию измерения для системы. Задайте функции с дополнительным входом u.

f = @(x,u)(sqrt(x+u));
h = @(x,v,u)(x+2*u+v^2);

f и h указатели на функцию к анонимным функциям, которые хранят функции изменения состояния и измерения, соответственно. В функции измерения, потому что шум измерения является недополнением, v также задан как вход. Обратите внимание на то, что v задан как вход перед дополнительным входом u.

Создайте расширенный объект Фильтра Калмана для оценки состояния нелинейной системы с помощью заданных функций. Задайте начальное значение состояния как 1 и шум измерения как недополнение.

obj = extendedKalmanFilter(f,h,1,'HasAdditiveMeasurementNoise',false);

Задайте ковариацию шума измерения.

obj.MeasurementNoise = 0.01;

Можно теперь оценить состояние системы с помощью predict и correct команды. Вы передаете значения u к predict и correct, которые в свою очередь передают их функциям изменения состояния и измерения, соответственно.

Откорректируйте оценку состояния измерением yK]=0.8 и вход uK]=0.2 на временном шаге k.

correct(obj,0.8,0.2)

Предскажите состояние на следующем временном шаге, учитывая uK]=0.2.

predict(obj,0.2)

Получите ошибку или невязку, между прогнозом и измерением.

[Residual, ResidualCovariance] = residual(obj,0.8,0.2);

Входные параметры

свернуть все

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

  • extendedKalmanFilter — Использует расширенный алгоритм Фильтра Калмана.

  • unscentedKalmanFilter — Использует алгоритм сигма-точечного фильтра Калмана.

  • particleFilter — Использует алгоритм фильтра частиц.

Измеренный системный выход на шаге текущего времени, заданном как N - вектор элемента, где N является количеством измерений.

Дополнительные входные параметры к функции измерения системы, заданной как входные параметры любого типа. Функция измерения, h, задана в MeasurementFcn или MeasurementLikelihoodFcn свойство obj. Если функция требует входных параметров в дополнение к состоянию и значениям шума измерения, вы задаете эти входные параметры в correct синтаксис команд. correct команда передает эти входные параметры измерению или функции правдоподобия измерения, чтобы вычислить оцененные выходные параметры. Можно задать несколько аргументов.

Например, предположите, что ваша функция правдоподобия измерения или измерения вычисляет предполагаемую систему выход y использование системы вводит u и текущее время k, в дополнение к x состояния:

y(k) = h(x(k),u(k),k)

Затем, когда вы выполняете онлайновую оценку состояния на временном шаге k, задайте эти дополнительные входные параметры в correct синтаксис команд:

[CorrectedState,CorrectedStateCovariance] = correct(obj,y,u(k),k);

Выходные аргументы

свернуть все

Откорректированная оценка состояния, возвращенная как вектор размера M, где M является количеством состояний системы. Если вы задаете начальные состояния obj как вектор-столбец затем M возвращен как вектор-столбец, в противном случае M возвращен как вектор-строка.

Для получения информации о том, как задать начальные состояния объекта, смотрите extendedKalmanFilter, unscentedKalmanFilter и particleFilter страницы с описанием.

Откорректированная ошибочная ковариация оценки состояния, возвращенная как M-by-M матрица, где M является количеством состояний системы.

Больше о

свернуть все

Используя predict и correct Команды

После того, как вы создали сигма-точечный фильтр Калмана, или объект фильтра частиц, obj, чтобы реализовать алгоритмы оценки, используйте correct и predict команды вместе.

На временном шаге k, correct команда возвращает откорректированное значение состояний и ошибочной ковариации оценки состояния с помощью измеренной системы выходные параметры y[k] одновременно шаг. Если ваша функция измерения имеет дополнительные входные параметры Um, вы задаете их как входные параметры к correct команда. Команда передает эти значения функции измерения.

[CorrectedState,CorrectedCovariance] = correct(obj,y,Um)

correct команда обновляет State и StateCovariance свойства объекта с ориентировочными стоимостями, CorrectedState и CorrectedCovariance.

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

[PredictedState,PredictedCovariance] = predict(obj,Us)

predict команда обновляет State и StateCovariance свойства объекта с ожидаемыми значениями, PredictedState и PredictedCovariance.

Если измерение текущей производительности существует в установленный срок шаг, можно использовать correct и predict. Если измерение отсутствует, можно только использовать predict. Для получения дополнительной информации о том, как эти команды реализуют алгоритмы, смотрите Расширенный и Алгоритмы Сигма-точечного фильтра Калмана для Онлайновой Оценки состояния.

Порядок, в котором вы реализуете команды, зависит от доступности результатов измерений y, Us, и Um для вашей системы:

  • correct затем predict — Примите это на временном шаге k, значение obj.State x^[k|k1]. Это значение является состоянием системы во время k, предполагаемое использование измеряло выходные параметры до времени k-1. У вас также есть измеренный выход y[k] и входные параметры Us[k] и Um[k] одновременно шаг.

    Затем вы сначала выполняете correct команда с измеренными системными данными y[k] и дополнительные входные параметры Um[k]. Команда обновляет значение obj.State быть x^[k|k], оценка состояния за время k, предполагаемое использование измерило выходные параметры до времени k. Когда вы затем выполняете predict команда с входом Us[k], obj.State теперь хранилища x^[k+1|k]. Алгоритм использует это значение состояния в качестве входа к correct команда в следующем временном шаге.

  • predict затем correct — Примите это на временном шаге k, значение obj.State x^[k1|k1]. У вас также есть измеренный выход y[k] и вход Um[k] одновременно продвиньтесь, но у вас есть Us[k-1] от предыдущего временного шага.

    Затем вы сначала выполняете predict команда с входом Us[k-1]. Команда обновляет значение obj.State к x^[k|k1]. Когда вы затем выполняете correct команда с входными параметрами y[k] и Um[k], obj.State обновляется с x^[k|k]. Алгоритм использует это значение состояния в качестве входа к predict команда в следующем временном шаге.

Таким образом, в то время как в обоих случаях оценка состояния за время k, x^[k|k] то же самое, если во время k у вас нет доступа к входным параметрам функции перехода текущего состояния Us[k], и вместо этого имейте Us[k-1], затем используйте predict сначала и затем correct.

Для примера оценки состояний с помощью predict и correct команды, смотрите Оценочные состояния Онлайн Используя Расширенные состояния Фильтра Калмана или Оценки Онлайн с помощью Фильтра частиц.

Введенный в R2017b